使用vimdiff复制更改的推荐方法是什么?


117

比较文件和更新源代码存储库时,我喜欢使用vimdiff。要将更改从一个文件复制到另一个文件,我通常使用如下键序列:

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

Vim,作为键盘快捷键的掌握者,肯定应该有一种更简单的方式来执行相同的任务。有一个吗?您使用什么来手动更新源代码更改?


2
感谢您将我对“这不是应该的东西”的含糊理解引入一个有意义的问题。得出的答案是我很久以前就应该学到的。
Caleb 2012年

1
您问题的最佳答案在这里:stackoverflow.com/questions/5288875/…–
erik

Answers:


181

do(差异获取)和dp(差异放置)是您所需要的。这是此上下文中其他有用的普通模式命令的一小部分。

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

注:
这两个dodp,如果你是一个块或正常模式下块只有一个行上而不是在视觉模式下工作。在可视模式下选择文本行时,必须使用常规命令

  • :'<,'>diffget
  • :'<,'>diffput

另请参阅:h copy-diffs

:diffupdate 将重新扫描文件以进行更改。


4
真正。最初,整个(连续的)块被复制,因此我感到很困惑。这样,再加上diff模式自动隐藏相同的行,我发现自己在思考两个窗格中的每个动作之前,在想“到底发生了什么?”。假设您已更改其中一个文件的缩进;然后我想一切都会发生。对于更细粒度的控制(即,视觉选择),我发现需要完整的命令:[range]diffget:[range]diffput
Alex Leach 2012年

8
您可以将可视模式与diffget和一起使用diffput:①进入可视模式并标记一些文本/行。②然后键入:diffput将选择的行推送到另一个文件,或:diffget从另一个文件获取选择的行。
erik

6
嗨,有人知道对于仅一行来说,是否有等效的“做”(获得差)?假设您有一个不同的代码块(多于一行),用光标在这些代码的任何一行“执行”,仅这些代码下面的那一行将获得整个代码块的差异---但是我只想获得一个线的差异。每次我必须在视觉上选择这行,然后是“ diffget”,这有点乏味...
witswit 2015年

12
重要的是要注意,撤消命令仅在已更改的缓冲区中起作用,因此,如果您使用dp并改变了主意,则需要切换到另一个缓冲区来撤消。
Random832

1
@wiswit:V选择整个行,然后do复制当前vim(8.0)中的特定行,无论其值多少。
dannysauer
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.