轉載自:https://www.ibm.com/developerworks/cn/linux/l-vimdiff/linux
源程序文件(一般是純文本文件)比較和合並工具一直是軟件開發過程當中比較重要的組成部分。如今市場上不少功能很強大的專用比較和合並工具,好比 BeyondCompare;不少IDE 或者軟件配置管理系統,好比Eclipse, Rational ClearCase都提供了內建的功能來支持文件的比較和合並。vim
當遠程工做在Unix/Linux平臺上的時候,恐怕最簡單並且處處存在的就是命令行工具,好比diff。惋惜diff的功能有限,使用起來也不是 很方便。做爲命令行的比較工具,咱們仍然但願能擁有簡單明瞭的界面,可使咱們可以對比較結果一目瞭然;咱們還但願可以在比較出來的多處差別之間快速定 位,但願可以很容易的進行文件合併……。而Vim提供的diff模式,一般稱做vimdiff,就是這樣一個能知足全部這些需求,甚至可以提供更多的強力 工具。在最近的工做中,由於須要作不少的文件比較和合並的工做,所以對Vimdiff的使用作了一個簡單的總結。咱們先來看看vimdiff的基本使用。ide
啓動方法工具
首先保證系統中的diff命令是可用的。Vim的diff模式是依賴於diff命令的。Vimdiff的基本用法就是:ui
# vimdiff FILE_LEFT FILE_RIGHT |
或者spa
# vim -d FILE_LEFT FILE_RIGHT |
圖一就是vimdiff命令的執行結果的畫面。命令行
從上圖咱們能夠看到一個清晰的比較結果。屏幕被垂直分割,左右兩側分別顯示被比較的兩個文件。兩個文件中連續的相同的行被摺疊了起來,以便使用者能 把注意力集中在兩個文件的差別上。只在某一文件中存在的行的背景色被設置爲藍色,而在另外一文件中的對應位置被顯示爲綠色。兩個文件中都存在,可是包含差別 的行顯示爲粉色背景,引發差別的文字用紅色背景加以突出。code
除了用這種方法啓動vim的diff模式以外,咱們還能夠用分割窗口命令來啓動diff模式:ip
# vim FILE_LEFT |
而後在vim的ex模式(也就是"冒號"模式)下輸入:ci
:vertical diffsplit FILE_RIGHT |
也能夠達到一樣的效果。若是但願交換兩個窗口的位置,或者但願改變窗口的分割方式,可使用下列命令:
1. Ctrl-w K(把當前窗口移到最上邊)
2. Ctrl-w H(把當前窗口移到最左邊)
3. Ctrl-w J(把當前窗口移到最下邊)
4. Ctrl-w L(把當前窗口移到最右邊)
其中1和3兩個操做會把窗口改爲水平分割方式。
接下來試試在行間移動光標,能夠看到左右兩側的屏幕滾動是同步的。這是由於"scrollbind"選項被設置了的結果,vim會盡力保證兩側文件的對齊。若是不想要這個特性,能夠設置:
:set noscrollbind |
可使用快捷鍵在各個差別點之間快速移動。跳轉到下一個差別點:
]c |
反向跳轉是:
[c |
若是在命令前加上數字的話,能夠跳過一個或數個差別點,從而實現跳的更遠。好比若是在位於第一個差別點的行輸入"2]c",將越過下一個差別點,跳轉到第三個差別點。
文件比較的最終目的之一就是合併,以消除差別。若是但願把一個差別點中當前文件的內容複製到另外一個文件裏,可使用命令
dp (diff "put") |
若是但願把另外一個文件的內容複製到當前行中,可使用命令
do (diff "get",之因此不用dg,是由於dg已經被另外一個命令佔用了) |
若是但願手工修改某一行,可使用一般的vim操做。若是但願在兩個文件之間來回跳轉,能夠用下列命令序列:
Ctrl-w, w |
在修改一個或兩個文件以後,vimdiff會試圖自動來從新比較文件,來實時反映比較結果。可是也會有處理失敗的狀況,這個時候須要手工來刷新比較結果:
:diffupdate |
若是但願撤銷修改,能夠和日常用vim編輯同樣,直接
<ESC>, u |
可是要注意必定要將光標移動到須要撤銷修改的文件窗口中。
在比較和合並告一段落以後,能夠用下列命令對兩個文件同時進行操做。好比同時退出:
:qa (quit all) |
若是但願保存所有文件:
:wa (write all) |
或者是二者的合併命令,保存所有文件,而後退出:
:wqa (write, then quit all) |
若是在退出的時候不但願保存任何操做的結果:
:qa! (force to quit all) |
比較和合並文件的時候常常須要結合上下文來肯定最終要採起的操做。Vimdiff 缺省是會把不一樣之處上下各 6 行的文本都顯示出來以供參考。其餘的相同的文本行被自動摺疊。若是但願修改缺省的上下文行數,能夠這樣設置:
:set diffopt=context:3 |
能夠用簡單的摺疊命令來臨時展開被摺疊的相同的文本行:
zo (folding open,之因此用z這個字母,是由於它看上去比較像摺疊着的紙) |
而後能夠用下列命令來從新摺疊:
zc (folding close) |
下圖是設置上下文爲3行,並展開了部分相同文本的vimdiff屏幕:
在沒法使用圖形化的比較工具的時候,或者在須要快速比較和合並少許文件的時候,Vimdiff是最好的選擇。