如何将vim用作差异工具?


101

我使用vim作为主要编辑器。

我还想使用vim来比较文件并修改文件,同时进行diff修复简单的更改(而不是大多数diff技术,它们是diff / fix / diff / fix的循环)。

另外,还有一些简单的方法可以将vim集成到源代码控制工具/站点使用的diff工具中(我特别想到git,但是我相信其他人会对与其他源代码控制工具/站点集成感兴趣)。


1
你应该尝试vim-fugitive它添加命令,:Gdiff并且:Gvdiff如果您的当前缓冲区是由git管理的,那么这两个命令都可以让您看到当前缓冲区的并排差异。当您在某些文件上存在合并冲突时,它还会帮助您解决三个窗口布局中的冲突
rbernabe

我的bashrc中有这个简单的函数,我vd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }可以通过调用它vd file1 file2。它用于diff确定文件是否不同,只有在不同的情况下才打开vimdiff。否则,我留在外壳中。我也禁用了Vim中的语法突出显示,因为我发现它在进行区分时会分散注意力。仅适用于两个文件。
罗夫(Rolf)

Answers:


122

vim内置了此功能(带有正确的命令行标志)。

vim -d <file1> <file2>

这将在视图中打开每个文件并突出显示差异。
任何相同的代码都将folded消失,因此您无需查看相同的代码或滚动浏览大量相同的代码。

但是,还有一个包装器应用程序vimdiff可以使用正确的标志正确地调用vim。

vimdiff source1.cpp source2.cpp

如果您使用的是git,则可以设置外部diff工具。因此,很容易将vimdiff设置为git的diff工具。

git config --global diff.tool vimdiff

使用vimdiff时,您可以编辑任何一侧,并且diff突出显示会保持同步,以显示差异。

注意:从git diff编辑时。如果您尝试编辑文件的存储库存储版本,则退出时,所做的更改将被放弃(git不信任您的原始版本,因此您将其与tmp副本区别开来),但是您可以将本地副本编辑为您喜欢的内容,并且将其保存在当前版本中。

一些在以下方面有用的基本命令 vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

我用来与vimdiff配合使用的其他vim设置

if &diff
    highlight! link DiffText MatchParen
endif

这将关闭突出显示已更改的代码位。因此,已更改的行将突出显示,以便我可以发现更改,但已更改的实际文本会在该行上突出显示(因为未突出显示)。


还可以处理多达4个缓冲区,非常适合比较配置文件
Izkata 2015年

34
:diffthis当Vim已经运行时,您也可以使用该命令来启动diff。
丰富

11
和:diffoff将其关闭。我认为链接到vim的文档将是有益的:vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll

1
即使对我来说git config --global diff.tool vimdiffgit diff仍然显示一切,就像我什么都没改变一样。
Hi-Angel'9

2
尝试git difftool
马丁·约克

13

如果您正在编辑一个打开的文件并希望将其与另一个文件进行比较而不关闭当前文件:

在拆分屏幕中打开新文件:

对于垂直分割:

:vs otherFile

或水平分割:

:split otherFile

将光标切换到其他拆分屏幕:

ctrl+w ctrl+w

在文件中调用“差异模式”:

:diffthis

切换到其他文件并调用“差异模式”:

:diffthis

要关闭“差异模式”:

:diffoff

5
为了避免您可以使用缓冲区之间的切换:windo diffthis过于
statox

4

您可以将下面提到的设置放在当前登录用户的(或)目录中的.gitconfig文件中:%homepath%%userprofile%

[diff]
    tool = vimdiff

这将使git bash工具也可以开始使用vimdiff作为外部diff工具。



2

我只能看到三种将vim用作difftool的情况。简要介绍如下:

  • 对于git difftool,将以下内容放入您的中~/.gitconfig

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • 要将vim作为两个文件的差异工具打开,可以执行以下操作:

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • 要获取当前活动缓冲区的差异视图,即在当前活动标签页中分配了窗口的所有缓冲区,您可以执行以下操作:

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

有关更多信息,请参见 :h diff


1

这是我的工作:

  • 打开带有第一个文件的窗口(如果要粘贴数据,则打开文本内容)
  • 使用:vnew(使两个窗口并排)或:new(使窗口处于顶部和底部)打开下一个文件/窗口。如果您要在第二个窗口中打开特定文件,则可以包含以下路径::vnew /path/to/secondfile.txt
  • 使用F8切换自定义功能,以打开和关闭比较模式

这是我中的自定义函数~/.vimrc

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction

您可以使用该命令:diffthisdiffoff!因此您不必自己设置所有的diff选项(例如,cursorbind也由diffmode设置)
Christian Brabandt,
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.