我目前正在使用 MacVim (Snapshot 64)“Split Diff by...”菜单选项。
该文件是Django的我settings.py
从1.3.1版本到1.4版本的新文件。
我知道两个基本命令
- do从另一侧“获取”(并替换)一个块。
- dp将一个块“放”(并替换)到另一侧。
但是这两个命令会写入整个块,在 MacVim 中是紫色突出显示。
如果你看一下第二个块,你可以看到第 2 行和第 3 行只有 2 个单词不同:mysite
和hobbes3
。我只想替换每行不是整个街区。
那么,有什么命令可以替换 dodo和dpper line 而不是整个块,或者我必须手动输入它?
附加问题:我注意到,一旦我手动编辑一个块,紫色高亮就会消失。如何在不重新打开文件的情况下再次“刷新”差异以包含高亮?
请尽量使答案符合 Vim 的通用性,而不是特定于 MacVim 的。
答案1
有很多方法可以做到这一点。
- 选择要从源缓冲区获取的目标缓冲区中的行范围并使用
:diffget
。例如,您可以使用 直观地选择行范围V
,然后键入:diffget
。 - 选择源缓冲区中要放入目标缓冲区的行范围并使用
:diffput
。例如,要将当前行放入另一个缓冲区,请键入:.diffput
。 - 使用 yank 和 put。选择源缓冲区中要复制到目标缓冲区的行范围,使用 将其复制
Y
,将光标移动到目标缓冲区并使用p
或将其放置在您想要的位置P
,然后删除您不想要的行。 - 如上所述进行复制,但在目标缓冲区中,直观地选择要替换的行范围(不一定是相同的行数)并键入
"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