如何仅dp或仅行而不是Vim diff中的整个块?


28

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

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

屏幕截图

我知道两个基本命令

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

但是,这两个命令将写入整个块,在MacVim中为紫色高亮显示。

如果查看第二个块,则可以看到第2行和第3行只有两个不同的词:mysitehobbes3。我只想替换每行而不是整个块。

那么,有什么命令可以替换do dodp每行,而不是整个块呢?还是我必须手动输入呢?

奖励问题:我注意到,一旦手动编辑块,就会丢失紫色突出显示。如何在不重新打开文件的情况下再次“刷新”差异以包括突出显示?

请尽量保持Vim-general的答案与MacVim特定的相反。

Answers:


30

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

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

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

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

:help copy-diffs

3

我还想在差异期间的给定时刻修改一行。因此,我创建了一个简单的地图,并将其放在我的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将关闭/打开diffmode,所以我将其关闭然后重新打开。

还有一个奖励选项是添加

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

这将允许您撤消对另一个文件/窗口的输入错误或不需要的更改,因为仅u的:undo只会撤消当前窗口中的更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.