我如何只 dp 或者只执行行而不是 Vim diff 中的整个块?

我如何只 dp 或者只执行行而不是 Vim diff 中的整个块?

我目前正在使用 MacVim (Snapshot 64)“Split Diff by...”菜单选项。

该文件是Django的我settings.py从1.3.1版本到1.4版本的新文件。

截屏

我知道两个基本命令

  1. do从另一侧“获取”(并替换)一个块。
  2. dp将一个块“放”(并替换)到另一侧。

但是这两个命令会写入整个块,在 MacVim 中是紫色突出显示。

如果你看一下第二个块,你可以看到第 2 行和第 3 行只有 2 个单词不同:mysitehobbes3。我只想替换每行不是整个街区。

那么,有什么命令可以替换 dododpper line 而不是整个块,或者我必须手动输入它?

附加问题:我注意到,一旦我手动编辑一个块,紫色高亮就会消失。如何在不重新打开文件的情况下再次“刷新”差异以包含高亮?

请尽量使答案符合 Vim 的通用性,而不是特定于 MacVim 的。

答案1

有很多方法可以做到这一点。

  1. 选择要从源缓冲区获取的目标缓冲区中的行范围并使用:diffget。例如,您可以使用 直观地选择行范围V,然后键入:diffget
  2. 选择源缓冲区中要放入目标缓冲区的行范围并使用:diffput。例如,要将当前行放入另一个缓冲区,请键入:.diffput
  3. 使用 yank 和 put。选择源缓冲区中要复制到目标缓冲区的行范围,使用 将其复制Y,将光标移动到目标缓冲区并使用p或将其放置在您想要的位置P,然后删除您不想要的行。
  4. 如上所述进行复制,但在目标缓冲区中,直观地选择要替换的行范围(不一定是相同的行数)并键入"0p。这将使用 0(零)寄存器,该寄存器始终包含最近复制的文本。

要“刷新”显示以显示正确的突出显示,请执行:diffupdate或简单地执行:diffu。有时这还不够,您需要将光标移到另一个窗口才能完成刷新。

您可以在以下位置阅读更多有关复制差异的信息

:help copy-diffs

答案2

我还想在 diff 期间在特定时刻修改一行。因此我创建了一个简单的映射并将它们放在我的 vimrc 文件中。

nnoremap <silent> <leader>dp V:diffput<cr>
nnoremap <silent> <leader>dg V:diffget<cr>

您可以使用 do 代替 dg,但我更习惯于使用“diffget”而不是 [o]btain。

为了给您带来奖励,我仅使用了两次另一个简单的地图:

nnoremap <silent> <leader>df :call DiffToggle()<CR>

现在,df 将关闭/打开差异模式,所以我只需将其关闭然后再打开。

还有一个额外选项是添加

nmap <silent> <leader>du :wincmd w<cr>:normal u<cr>:wincmd w<cr>

这将允许您撤消另一个文件/窗口上的拼写错误或不必要的更改,因为 :undo of just u 只会撤消当前窗口中的更改。

答案3

另一种方法是diffput在命令前面加上您感兴趣的行范围。因此,在您的示例中,您将在左侧窗格中发出以下命令:

:15,16diffput

相关内容