各種 IDE 大行其道的同時爽航,傳統(tǒng)的命令行工具以其短小精悍,隨手可得的特點仍有很大的生存空間秋秤,這篇短文介紹了一個文本比較和合并的小工具:vimdiff拖刃。希望能對在 Unix/Linux 系統(tǒng)上進行開發(fā)的朋友有所幫助。
源程序文件(通常是純文本文件)比較和合并工具一直是軟件開發(fā)過程中比較重要的組成部分☆砉眨現(xiàn)在市場上很多功能很強大的專用比較和合并工具徘键,比如 BeyondCompare;很多IDE 或者軟件配置管理系統(tǒng)遍蟋,比如Eclipse, Rational ClearCase都提供了內(nèi)建的功能來支持文件的比較和合并吹害。
當遠程工作在Unix/Linux平臺上的時候,恐怕最簡單而且到處存在的就是命令行工具匿值,比如diff赠制。可惜diff的功能有限挟憔,使用起來也不是很方便钟些。作為命令行的比較工具,我們?nèi)匀幌M軗碛泻唵蚊髁说慕缑姘硖罚梢允刮覀兡軌驅Ρ容^結果一目了然政恍;我們還希望能夠在比較出來的多處差異之間快速定位,希望能夠很容易的進行文件合并……达传。而vim提供的diff模式篙耗,通常稱作vimdiff迫筑,就是這樣一個能滿足所有這些需求,甚至能夠提供更多的強力工具宗弯。在最近的工作中脯燃,因為需要做很多的文件比較和合并的工作,因此對vimdiff的使用做了一個簡單的總結蒙保。
一辕棚、啟動方法
首先保證系統(tǒng)中的diff命令是可用的,vim的diff模式依賴于diff命令邓厕。
vimdiff的基本用法就是:
# vimdiff ? ? ? ? ? ? ?FILE_LEFT ? ????FILE_RIGHT
# vimdiff ? -d ? ? ? ?FILE_LEFT ? ??FILE_RIGHT??//左右豎屏
# vimdiff ? -o ? ? ? ? FILE_LEFT ? ??FILE_RIGHT?//上下橫屏
vimdiff命令的執(zhí)行結果
從上圖我們可以看到一個清晰的比較結果逝嚎。屏幕被垂直分割,左右兩側分別顯示被比較的兩個文件详恼。
兩個文件中連續(xù)的相同的行被折疊了起來补君,以便使用者能把注意力集中在兩個文件的差異上。
只在某一文件中存在的行的背景色被設置為藍色昧互,而在另一文件中的對應位置被顯示為綠色挽铁。
兩個文件中都存在,但是包含差異的行顯示為粉色背景硅堆,引起差異的文字用紅色背景加以突出屿储。
除了用這種方法啟動vim的diff模式之外,我們還可以用分割窗口命令來啟動diff模式渐逃,也可以達到同樣的效果:
# vim FILE_LEFT
然后在vim的ex模式(也就是"冒號"模式)下輸入:
:vertical diffsplit ?FILE_RIGHT
如果希望交換兩個窗口的位置够掠,或者希望改變窗口的分割方式,可以使用下列命令:
1.Ctrl-w ?K(把當前窗口移到最上邊)
2.Ctrl-w ?J(把當前窗口移到最下邊)
3.Ctrl-w ? H(把當前窗口移到最左邊)
4.Ctrl-w ? L(把當前窗口移到最右邊)
二茄菊、光標移動
試試在行間移動光標疯潭,可以看到左右兩側的屏幕滾動是同步的。
這是因為"scrollbind"選項被設置了的結果面殖,vim會盡力保證兩側文件的對齊竖哩。
如果不想要這個特性,可以設置:
:set noscrollbind
可以使用快捷鍵在各個差異點之間快速移動
跳轉到下一個差異點:]c
反向跳轉是:[c
如果在命令前加上數(shù)字的話脊僚,可以跳過一個或數(shù)個差異點相叁,從而實現(xiàn)跳的更遠。
如果在位于第一個差異點的行輸入"2]c"辽幌,將越過下一個差異點增淹,跳轉到第三個差異點。
三乌企、文件合并
文件比較的最終目的之一就是合并虑润,以消除差異。
如果希望把一個差異點中當前文件的內(nèi)容復制到另一個文件里加酵,可以使用命令:
dp?(diff "put")
//從當前復制到另一個
如果希望把另一個文件的內(nèi)容復制到當前行中拳喻,可以使用命令:
do(diff "obtain")
//從另一個復制到當前
之所以不用dg(diff "obtain")哭当,是因為dg已經(jīng)被另一個命令占用了
指定范圍的合并
1.先指定范圍1-100行,再用另外一個窗口的不同處替換當前:
:1,100 diffg?或者:1,100 diffget
這里冗澈,等同于do(diff obtain)不過指定了范圍钦勘,如果有緩沖還可在diffg后面指定緩沖名字
2.先指定范圍1-100行,再用另外一個窗口的不同處替換當前:
:1,100 diffpu?或者??:1,100 diffput
這里渗柿,等同于dp(diff put)不過指定了范圍个盆,如果有緩沖還可在diffpu后面指定緩沖名字
如果希望手工修改某一行,可以使用通常的vim操作朵栖。
如果希望在兩個文件之間來回跳轉,可以用下列命令序列:
Ctrl-w, w
在修改一個或兩個文件之后柴梆,vimdiff會試圖自動來重新比較文件陨溅,來實時反映比較結果。但是也會有處理失敗的情況绍在,這個時候需要手工來刷新比較結果:
:diffupdate
如果希望撤銷修改门扇,可以和平常用vim編輯一樣,直接:
?u
注意:一定要將光標移動到需要撤銷修改的文件窗口中
四偿渡、同時操作兩個文件
比較和合并告一段落之后臼寄,可以用下列命令對兩個文件同時進行操作。
同時退出:
:qa (quit all)
如果希望保存全部文件:
:wa (write all)
或者是兩者的合并命令溜宽,保存全部文件吉拳,然后退出:
:wqa (write, then quit all)
如果在退出的時候不希望保存任何操作的結果:
:qa! (force to quit all)
五、上下文的展開和查看
比較和合并文件的時候經(jīng)常需要結合上下文來確定最終要采取的操作适揉。
vimdiff 缺省是會把不同之處上下各 6 行的文本都顯示出來以供參考留攒,其他的相同的文本行被自動折疊。
如果希望修改缺省的上下文行數(shù)嫉嘀,可以這樣設置:
:set diffopt=context:3
用簡單的折疊命令來臨時展開被折疊的相同的文本行:
zo (folding open)
用下列命令來重新折疊:
zc (folding close)
之所以用z這個字母炼邀,是因為它看上去比較像折疊著的紙
注意:展開折疊需要將光標移至折疊處
下圖是設置上下文為3行,并展開了部分相同文本的vimdiff屏幕:
六剪侮、結論
在無法使用圖形化的比較工具的時候拭宁,或者在需要快速比較和合并少量文件的時候,vimdiff是最好的選擇瓣俯。
參考資料
vim主頁:http://www.vim.org
vim中文幫助:http://man.chinaunix.net/newsoft/vi/doc/help.html
vi/vim使用進階:
http://easwy.com/blog/archives/advanced-vim-skills-catalog/
http://www.ibm.com/developerworks/cn/linux/l-vimdiff/
http://hi.baidu.com/_jg_/blog/item/ff62e6d5d9ecf315a08bb77c.html
http://hi.baidu.com/nkhzj/blog/item/e6b5a7017222100a1d958307.html