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
複製代碼