參見:
http://blog.csdn.net/swust_long/article/details/6990033
http://www.ibm.com/developerworks/cn/linux/l-vimdiff/
最簡單的開啟新視窗的命令::split
關閉視窗::close, 或 :quit 或 ZZ。但close可以避免在剩下一個視窗的時候不小心退出vim。
關閉除當前視窗以外的所有視窗: :only
vsplit
vnew
Vimdiff的基本用法就是:
# vimdiff FILE_LEFT FILE_RIGHT
或者
# vim -d FILE_LEFT FILE_RIGHT
從我們可以看到一個清晰的比較結果。螢幕被垂直分割,左右兩側分別顯示被比較的兩個檔案。兩個檔案中連續的相同的行被摺疊了起來,以便使用者能把注意力集中在兩個檔案的差異上。只在某一檔案中存在的行的背景色被設定為藍色,而在另一檔案中的對應位置被顯示為綠色。兩個檔案中都存在,但是包含差異的行顯示為粉色背景,引起差異的文字用紅色背景加以突出。
除了用這種方法啟動vim的diff模式之外,我們還可以用分割視窗命令來啟動diff模式:
# vim FILE_LEFT
然後在vim的ex模式(也就是"冒號"模式)下輸入:
: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)
自動折行就是set wrap,讓超過螢幕寬度的字元到下一行顯示。
textwidth設定一行的最大寬度,超過的部分會自動到下一行中,如果設定為0那麼就不會有這種效果了。這個換行是會在行尾加上一個\n的,所以如果printf引號中的內容過長就會有問題了。
而讓我比較困惑的是wrapmargin 按說wrap是折行,也就是超過螢幕寬度的行會自動迴繞然後在下一行繼續,但是這中間沒有\n,也就是本質上還是一行而不是兩行。這個wm第一感覺應該是迴繞的寬度,也就是到一個指定的寬度迴繞而不是換行,即使你的螢幕寬度還有不少。但是實際效果不是那麼回事,設定了wm為80它好像在70多的地方就換行了,注意是換行而不是折行。然後終於找到了關於這個的詳細說明……
The 'wrapmargin' option does almost the same. The difference is that 'textwidth' has a fixed width while 'wrapmargin' depends on the width of the screen. When using 'wrapmargin' this is equal to using 'textwidth' with a value equal to (columns - 'wrapmargin'),
where columns is the width of the
screen.
也就是它設定的是螢幕右邊空白的寬度,也就是字面上margin的大小,實際效果還是折行的。因為我的gnome-terminal全屏之後寬度是153,wm=80那麼相當於tw=153-80=73,所以就有上邊的現象了,清楚了這個,那我還是直接設定tw參數吧……折騰了一下午了
還有關於formatoptions的設定。預設的是fo=tcq,具體資料可以:help fo-table,這裡說說自己添加的幾個參數:
fo+=ro 這兩個參數是自動添加comment leader的
r Automatically insert the current comment leader after hitting
<Enter> in Insert mode.
fo+=mM 這兩個是寬字元相關的,還沒測試
m Also break at a multi-byte character above 255. This is useful for
Asian text where every character is a word on its own.
M When joining lines, don't insert a space before or after a multi-byte
character. Overrules the 'B' flag.