我使用vim作为我的主要编辑器。 / fix / diff / fix)。

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

评论

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

我的bashrc vd(){diff $ @> / dev / null;如果[[$? -eq 1]];然后 ; vimdiff -c'windo set语法= off'$ @; fi;我用vd file1 file2调用它。它使用diff来确定文件是否不同,并且只有这样才能打开vimdiff。否则,我留在外壳中。我也禁用了Vim中的语法突出显示,因为我发现它在进行区分时会分散注意力。仅适用于两个文件。

#1 楼

vim内置了此功能(带有正确的命令行标志)。相同的位置相距folded,因此您无需查看相同的代码或滚动查看大量相同的代码。

但是还有一个包装器应用程序vimdiff可以使用正确的标志正确地调用vim。外部差异工具。因此,很容易将vimdiff设置为git的差异工具。差异。

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

vim -d <file1> <file2>


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

评论


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

–伊兹卡塔
2015年2月8日在23:27



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

–丰富
2015年2月10日,11:15

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

–科迪民意测验
2015年2月12日在4:49

对我来说,即使在git config --global diff.tool vimdiff之后,git diff仍然显示一切,就像我什么都没改变一样。

– Hi-Angel
16年9月1日在15:17

尝试git difftool

–马丁·约克
16年9月1日在16:25

#2 楼

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

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

对于垂直拆分:

:vs otherFile


或水平分割:

:split otherFile


将光标切换到不同的分割屏幕:

ctrl+w ctrl+w


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

:diffthis


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

:diffthis


要关闭“差异模式”:

:diffoff


评论


为了避免在缓冲区之间切换,您也可以使用:windo diffthis

–statox♦
18年10月2日,14:50

@statox:也适用于diffoff,因此:windo diffthis和:windo diffoff可以启动和停止两个打开的窗口的diff。或缩写:windo difft和diffo!。

–沃尔夫森
20-10-5在13:14

如果从一个打开的文件File1开始,您也可以使用:vert diffs File2在右侧的垂直分割中打开File2并与File1进行比较。

–沃尔夫森
20-10-5在13:17

#3 楼

您可以在当前登录用户的.gitconfig(或%homepath%)目录下的%userprofile%文件中放置以下提到的设置: vimdiff也是外部差异工具。

#4 楼

以下是我的git配置:

https://github.com/tracyone/dotfiles/blob/master/.gitconfig

[core]
editor = vim
[diff]
tool = vimdiff
[merge]
tool = vimdiff
conflictstyle = diff3
[difftool]
prompt = 0


#5 楼

对于NeoVim,您可以使用以下命令设置~/.gitconfig

git config --global merge.tool nvim
git config --global mergetool.keepBackup false
git config --global mergetool.nvim.cmd $'nvim -d $LOCAL $REMOTE $MERGED -c \'$wincmd w\' -c \'wincmd J\''


您的~/.gitconfig应该看起来像:

[merge]
    tool = nvim

[mergetool]
    keepBackup = false

[mergetool "nvim"]
    cmd = nvim -d $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J'


请参阅Nvim文档:diff,以获取有关如何根据自己的喜好配置它的更多信息。

#6 楼

我只能看到三种将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

评论


如果仅打开一个文件::vert diffs File2与File2进行比较。

–沃尔夫森
20-10-6在13:39



#7 楼

这是我的工作:


打开带有第一个文件的窗口(如果要粘贴数据,则打开文本内容)
使用:vnew打开下一个文件/窗口(使两个窗口都打开)并排放置)或:new(使窗户处于顶部和底部)。如果您要在第二个窗口中打开特定文件,则可以包含以下路径::vnew /path/to/secondfile.txt

使用F8切换自定义功能,以打开和关闭diff模式

这是我的~/.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


评论


您可以使用:diffthis和diffoff命令!因此您不必自己设置所有diff选项(例如,cursorbind也由diffmode设置)

–克里斯蒂安·布拉班特(Christian Brabandt)
19年4月17日在16:49

#8 楼

.vimrc在diff模式(下半部分)中采用了一些有用的命令。如果在普通模式下编辑,则设置将被重置(上部)。您可以将其简单地复制到.vimrc文件中。
nmap <silent> <F2> :exec &nu==&rnu? "se nu!" : "se rnu!"<CR>
inoremap <Esc>Oq 1
inoremap <Esc>Or 2
inoremap <Esc>Os 3
inoremap <Esc>Ot 4
inoremap <Esc>Ou 5
inoremap <Esc>Ov 6
inoremap <Esc>Ow 7
inoremap <Esc>Ox 8
inoremap <Esc>Oy 9
inoremap <Esc>Op 0
inoremap <Esc>On .
inoremap <Esc>OQ /
inoremap <Esc>OR *
inoremap <Esc>Ol +
inoremap <Esc>OS -
inoremap <Esc>OM <Enter>
nnoremap <Esc>OQ B                      "       /
nnoremap <Esc>OR E                      "       *
if &diff
        map <Esc>Oq zc                  "       1       close a fold
        map <Esc>Or <down>              "       2       cursor down
        map <Esc>Os ]c                  "       3       next diff
        nmap <Esc>Ot <left>             "       4       curosor left
        nnoremap <Esc>Ou <c-w>w         "       5       jump to next file
        map <Esc>Ov <right>             "       6       cursor right
        map <Esc>Ow zo                  "       7       open a fold
        map <Esc>Ox <up>                "       8       curosor right
        map <Esc>Oy [c                  "       9       prefious diff
        map <Esc>Op 0                   "       0       0
        nmap <Esc>On .                  "       .       .
        nmap <Esc>OQ B                  "       /       back one word
        nmap <Esc>OR E                  "       *       end of word
        nmap <Esc>Ol dp                 "       -       diffput
        nmap <Esc>OS do                 "       +       diffget
        nmap <Esc>OM :diffupdate        "       Enter
endif

当然,您可以更改我的设置。如果要在“ 0”上放置另一个命令,请在“ Op”之后立即更改该命令,例如带有在折叠和展开之间切换的“ za”:
    nmap <Esc>Op za                   "       0       0

请注意,根据键的不同,“ map”和“ nmap”的用法也不同。