學習vi和vim編輯器(17):vim的多視窗功能(2)
本篇文章主要學習調整視窗尺寸、緩衝區及其與視窗的互動、分頁編輯、關閉與離開視窗。
調整視窗尺寸:
在gvim中,可以使用滑鼠調整視窗尺寸,只需要用滑鼠點擊及拖動視窗邊界即可。如果是在vim中,只要開啟mouse選型(" :set mouse=a "),也能夠用滑鼠調整視窗尺寸。
視窗尺寸調整命令:
^W=:試圖調整所有視窗至相同尺寸(此命令受當前的winwidth和winheight選項值的影響)。如果可用的螢幕塊不能平均劃分,vim也會儘可能地平均分割。
^W-:將當前視窗的高度減少一行。vim中還有一個ex命令:resize,可以明確指定欲減少的視窗尺寸。例如" :resize -n "命令可以將當前視窗減少n行。而且,即使不在一個多視窗編輯會話中(即只開啟一個視窗),vim也能夠減少視窗尺寸,此時空出來的螢幕面積都留給命令列視窗。
^W+:將當前視窗的高度增加一行。用" :resize +n "命令可以將當前視窗增高n行。一旦到達視窗的最大高度,使用這個命令不會再有效果。
:resize n:設定當前視窗的的高度為n行,設定值為絕對尺寸。
^W< 與 ^W>:分別能減少與增加當前視窗的寬度。
^W| :調整當前視窗至可能的最大寬度。也能夠通過vertical resize n命令明確指定如何改變視窗,n定義了視窗的新寬度。
視窗尺寸調整選項:
有些vim選項能夠影響上面講解的尺寸調整命令的行為。
在視窗變為活動中(active)時,winheight和winwidth分別定義視窗的最小高度與寬度。由於vim在分割時的預設行為是平均分配,因此假設平均分割後,兩個視窗的寬度都為55列。若當將winwidth調整為80,則每次vim將游標移動到某個視窗時,該視窗的寬度自動調整為80,另一個視窗則為30。這種行為非常方便,在切換視窗、切換檔案時自動增加視窗的尺寸。
equalalways:讓vim在分割或關閉視窗後,把視窗調整為相同尺寸。
eadirection:定義equalalways的方向,可使用的值為hor、ver、both,分別在水平、垂直、兩個方向上都調整視窗尺寸為相等的。
cmdheight:設定命令列的高度。之前已經講過,在只開啟一個視窗的情況下,減少視窗的高度將增加命令列的高度。設定此選項,即可維持命令列的高度。
winminwidth,winminheight:用於確定調整視窗時的最小寬度和高度。vim把這兩個選項值視為硬性規定,所以視窗尺寸永遠不允許小於這兩個值。
緩衝區及其與視窗的互動:
vim使用緩衝區作為工作對象的容器。在vim中有很多控制緩衝區以及在緩衝區中移動的命令。但是首先需要學習緩衝區的基礎知識。
使用vim編輯器劃分三個視窗,並在三個視窗中分別開啟三個不同的檔案:buffer_one.file,buffer_two.file,buffer_three.file。使用" :ls "或" :files "或" buffers "命令列出緩衝區,如所示:
每個檔案對應一個緩衝區。每個緩衝區都有一個唯一的、不會改變的編號。如果在上述命令後面加上驚嘆號,還能列出每個緩衝區額外的資訊。列出的緩衝區中,首先是緩衝區編號,然後是狀態標誌。狀態標誌的代碼和說明如下:
u:非列出緩衝區,這個緩衝區不會列出,除非使用!。
%或#:%表示當前視窗所用的緩衝區,而#表示使用" :e # "命令跳到的緩衝區(即侯補檔案對應的緩衝區)。
a或h:a表示活動中的緩衝區,即該緩衝區已經載入且可見。h表示隱藏緩衝區,隱藏緩衝區雖然存在,但不能在任何視窗中查看。
-或=:-表示緩衝區把modifiable選項關閉。=表示該檔案是不能把狀態修改為可調整的唯讀檔案。
+或x:+表示緩衝區可調整,x表示緩衝區具有讀入錯誤。
vim的特殊緩衝區:
vim自身使用的一些緩衝區稱為特殊緩衝區。一般而言,這些緩衝區不能被編輯。
quickfix:包含因為我們的命令或位置列表而建立的錯誤清單。
help:包含vim協助檔案。使用":help"命令時,這些協助檔案將放入特殊緩衝區中。
directory:包含目錄的內容,即某個目錄中的檔案清單。它是vim裡的快捷工具,能讓我們在緩衝區中移動,而且可用游標加上enter鍵選擇欲編輯的檔案。
scratch:這些緩衝區包含一般用途的文本。
隱藏緩衝區:
隱藏緩衝區是不在任何當前視窗裡顯示的vim緩衝區。隱藏緩衝區可使得編輯多個檔案變得較為容易。使用隱藏緩衝區需要設定hidden選項。
緩衝區命令:
vim自動在開啟或關閉多個檔案或視窗時管理緩衝區。緩衝區命令幾乎能對緩衝區執行所有操作。接下來介紹兩個緩衝區命令,它們能一次對許多檔案做許多工作。
:windo cmd:該命令是"window do"的簡稱,這個偽緩衝區命令(其實它是個視窗命令)在每個視窗中執行指定命令cmd。它只在當前分頁中動作,若在執行命令時產生錯誤,即停在產生錯誤的視窗,產生的錯誤的視窗隨即成為新的當前視窗。 cmd能夠使用管道符號(|)串聯多個命令,串聯命令中的每一個依次在每個視窗逐一執行。
:bufdo[!] cmd:與windo命令類似,但操作對象是編輯會話中的所有緩衝區,而不僅僅是當前分頁中的可見緩衝區。
接下來列出常見的緩衝區命令:
:ls[!],:files[!],:buffers[!]:列出緩衝區與檔案名稱,如果加上!,則包括非列表緩衝區;
:ball,:sball: 編輯所有參數或緩衝區,每個緩衝區對應一個視窗;
:unhide,:sunhide:編輯所有載入緩衝區,每個緩衝區對應一個視窗;
:badd file:把file加入列表;
:bunload[!]:從記憶體中卸載緩衝區。如果緩衝區修改後未儲存,vim不會讓緩衝區卸載。加上驚嘆號,將忽略vim的警告,強制卸載緩衝區;
:bdelete[!]: 卸載緩衝區並將其從緩衝區列表中刪除,驚嘆號作用同上;
:buffer[n],:sbuffer[n]:移向緩衝區n(sbuffer會開啟一個新視窗);
:bnext[n],:sbnext[n]:移向接下來的第n個緩衝區(sbnext會開啟一個新視窗);
:bNext[n],:sbNext[n],:bprevious[n],:sbprevious[n]:移向前面的第n個緩衝區 (sbNext,sbprevious會開啟一個新視窗);
:bfirst,:sbfirst: 移到第一個緩衝區(sbfirst會開啟一個新視窗);
:blast,:sblast:移到最後一個緩衝區(sblast會開啟一個新視窗);
:bmod [n],:sbmod [n]: 移到第n個修改過的緩衝區(sbmod則會開啟一個新視窗);
在視窗裡追蹤標籤:
vim把vi的標籤功能擴充到視窗裡,對多視窗提供標籤遍曆機制。使得追蹤一個標籤也能在新的視窗裡開啟相關聯的檔案。
使用" :stags[!] "可分割視窗,以顯示找到的標籤的位置。如果沒有找到標籤,則命令失敗且不會建立新視窗。
^W^] 或 ^W] 命令:效果等價於" :stag "。
^Wg]:類似於^W],但在新視窗中,vim執行" :tselect tag "命令,其中tag是游標下的標識;
^Wg^]:類似於^Wg],但在新視窗中執行" :tjump "命令;
^Wf或^W^f:能夠分割視窗並編輯游標所在處的檔案名稱;
^Wgf:在新的分頁中開啟游標所在處的檔案名稱。如果檔案不存在,則不會建立新的分頁;
分頁編輯:
vim允許建立新的分頁,每個分頁各有獨自的行為。在每個分頁中,可以分割螢幕,編輯多個檔案等等。可以在vim與gvim中使用分頁,與分頁編輯相關的命令有:
:tabnew filename :開啟新分頁並編輯新檔案。如果未指定檔案,則vim只開啟一個新分頁並附上空緩衝區;
:tabclose:關閉當前的分頁;
:tabonly:關閉除當前分頁以外的所有分頁;
使用Ctrl+PgUp(向右移動一個分頁)與Ctrl+PgDn(向左移動一個分頁)則可在分頁間左右迴圈移動(實際測試時,在vim中不起作用,在gvim中可行)。
關於分頁編輯,書上的命令過少,這裡補充幾個,更詳細的使用方法可以使用" :help tab-page-commands "。
:tabnext,gt:移動到下一個分頁,而且為迴圈移動(移動到最後一個之後,繼續移動將返回第一個);
:tabnext [count],[count]gt:移動到第count個分頁;
:tabprevious,:tabNext,gT:移動到上一個分頁,而且為迴圈移動;
:tabprevious [count],:tabNext [count],[count]gT: 往回移動count個分頁;
:tabfirst:移動到第一個分頁;
:tablast:移動到最後一個分頁;
關閉與離開視窗:
vim有如下命令來關閉視窗,這些命令有很多細節需要注意,更詳細的說明可以參考vim的協助文檔。
:quit,^Wq,^W^q: 離開當前視窗,如果是螢幕上的最後一個視窗,則離開vim。如果設定了hidden選項,而且該視窗是開啟該檔案的最後一個視窗,則緩衝區隱藏。如果沒有設定hidden選項,而且該視窗是開啟該檔案的最後一個視窗,如果緩衝區有未儲存的修改,則該命令失敗(此時想要強制離開視窗,可在quit命令後面加上!,從而放棄對緩衝區的修改)。
^Wc:關閉當前視窗,如果當前視窗是螢幕上的唯一視窗,該命令執行失敗。
:only,^Wo,^W^O:關閉除當前視窗以外的所有視窗。
本章vim命令總結:
^W=, ^W-, ^W+, :resize n, :resize +n, :resize -n, ^W<, ^W>, ^W|, :vertical resize, winheight選項, winwidth選項, equalalways選項, eadirection選項, cmdheight選項, winminwidht選項,winminheight選項, :ls, :files, :buffers, :windo cmd, :bufdo[!] cmd, :ball, :sball, :unhide, :sunhide, :badd file, :bunload[!], :bdelete[!], :buffer[n], :sbuffer[n], :bnext[n], :sbnext[n], :bNext[n], :sbNext[n], :bprevious[n], :sbprevious[n], :bfirst, :sbfirst, :blast, :sblast, :bmod[n], :sbmod[n], :stags[!], ^W], ^W^], ^Wg], ^Wg^], ^Wf, ^W^f, ^Wgf, :tabnew, filename, :tabclose, :tabonly, ":help tab-page-commands", :tabnext, gt, :tabnext[count], [count]gt, :tabprevious, :tabNext, gT, :tabprevious[count], :tabNext[count], [count]gT, :tabfirst, :tablast, :quit, ^Wq, ^W^q ,^Wc,:only, ^Wo, ^W^O。