vimdiff命令是Vim提供的文件差别比较工具,vimdiff的做用与打开Vim时增长启动参数 -d 彻底一致,即 vimdiff file1 file2
等价于 vim -d file1 file2
。下文仅以vimdiff工具的使用为例讲解Vim针对文件差别比较提供的能力。html
默认状况下,vimdiff打开的窗口都是垂直分割的 (等价于启动Vim时使用了 -O
参数),若是想使用水平分割Vim窗口的方式显示文件的diff结果,可使用 vimdiff -o file1 file2
。关于Vim多窗口显示下的窗口切换等操做,能够参考Vim窗口分割方法。vim
若是真正diff的某个文件进行了修改,vimdiff会自动从新比较文件参与,若是实时diff失败了,能够经过Vim命令行窗口 :diffupdate
来手工刷新比较结果。bash
若是已经打开了Vim,仍然能够经过Vim命令行命令 :diffsplit
、:diffthis
或 :diffpatch
三个命令进入diff模式。工具
打开Vim的diff窗口后,可使用 :qa
命令退出全部窗口,关于Vim的退出,推荐阅读14种退出Vim的方法及区别。ui
默认状况下,被diff的两个文件中连续相同的多个行会被折叠起来,只在某一文件中存在的行以蓝色背显示,而在另外一文件中的对应位置将显示绿色;两个文件中都存在但包含差别的行会以粉色背景显示,而引发差别的文字将用红色背景突出显示。this
能够经过Vim命令行模式或在Vim配置文件中使用 :highlight
命令对vimdiff的各类配色进行个性化设置,例如,:highlight DiffAdd
可用来设置新增行的颜色,:highlight highlight DiffText
可用来设置具备差别的文件的颜色。spa
xterm 可支持显示 256 种颜色,能经过数字直接引用对应的颜色,例如,一个可用的个性化vimdiff配色方案以下:命令行
" 新增的行 "
highlight DiffAdd ctermbg=235 ctermfg=108 guibg=#262626 guifg=#87af87 cterm=reverse gui=reverse
" 删除的行 "
highlight DiffDelete ctermbg=235 ctermfg=131 guibg=#262626 guifg=#af5f5f cterm=reverse gui=reverse
" 差别的行 "
highlight DiffChange ctermbg=235 ctermfg=103 guibg=#262626 guifg=#8787af cterm=reverse gui=reverse
" 差别的文字 "
highlight DiffText ctermbg=235 ctermfg=208 guibg=#262626 guifg=#ff8700 cterm=reverse gui=reverse
复制代码
上述配置的显示效果以下图所示。code
默认状况下,在某个窗口中移动光标时,对应的另外一侧屏幕也会同步进行滚动。能够在Vim普通模式下使用 ]c
命令正向跳转到当前diff结果的下一个差别点,若是要反向跳转到上一个差别点,可使用 [c
命令。cdn
此外,如谈谈Vim中的操做符和动做命令一文所介绍,还能够在跳转命令前加上执行次数指示Vim 重复执行 相应次数的跳转命令,实现一次跳过多个差别点的效果。
例如,若是当前光标位于第 1 个差别点,普通模式下执行 2]c
命令后会直接跳过下一个差别点,将光标跳转到第 3* 个差别点处。
默认状况下,vimdiff会把不一样之处上下各 6 行的文本显示出来以供参考。其余的相同文本行会被自动折叠。若是但愿修改缺省的上下文行数,能够经过 diffopt=context
选项进行设置,例如,:set diffopt=context:10
将设置diff相同文本的上下文行数为10。
也能够用Vim折叠命令 zo
来展开被折叠的相同文本行,若是但愿从新折叠相同的文本行,能够在Vim普通模式下使用 zc
命令进行折叠关闭操做。此外,无论是打开仍是关闭Vim折叠,均可以使用 za
命令,推荐阅读Vim代码折叠。
大多数状况下,对文件进行diff操做后都会进行文件合并。针对当前光标所在差别点,若是但愿把当前文件中的内容复制到另外一个文件里,可使用 dp
命令 (dp的含义是diff put)。
相似地,若是但愿把另外一个文件的内容复制到当前行中,可使用 do
命令 (do的含义是 diff get,但因为 dg
已经做为Vim diff模式的设置选项 digraph
的缩写形式,因此使用diff obtain来表示)。
Vim的配置文件 .vimrc能够显式地针对Vim diff模式进行差别化设置,对应配置的基本结构以下:
if &diff
" vim diff 模式下的特殊配置 "
set nonu
else
....
endif
复制代码