雖然一直在使用 Vim 寫程式與文檔,但是一直沒有深究其標籤頁 (Tab Page) 功能的具體使用方法。現在開始重視這個問題,畢竟使用 Vim 的時間越來越少了,當然這隻是針對我的所有生命而言。
1 建立新的標籤頁
使用 Vim 在當前工作目錄中建立或開啟某一檔案並開啟新標籤頁顯示檔案內容,操作如下:
:tabnew filename
使用 tabf 指令基於Regex遞迴遍曆當前工作目錄尋找名稱匹配的檔案並為其建立新標籤頁,用法如下:
:tabf filename_re
上述操作的前提是將 Vim 的工作目錄定位到所期望的位置,否則所修改的檔案可能會陰差陽錯儲存到你不知道的某一目錄下。在終端裡使用 Vim 開啟某一檔案時,會預設將目前的目錄作為 Vim 的工作目錄,但是在使用 gvim 時,如果從案頭環境提供的檔案管理工具中直接開啟某一文字檔,gvim 的工作目錄預設是 $HOME。可能你與我一樣,喜歡自動將 Vim 工作目錄遷移到所開啟文字檔的目錄下,解決方案是編輯 $HOME/.vimrc 檔案,添加以下代碼:
"Change work dir to current dir
autocmd BufEnter * cd %:p:h2 gvim 的 remote-tab 功能
gvim 提供了 remote-tab 的功能,可以實現在 gvim 開啟檔案的同時為其建立標籤頁。這裡,“remote” 的概念是指 gvim 好像一個當前正在啟動並執行伺服器程式,在終端下使用 "gvim --remote-tab-silent filename" 這樣的命令時,會將“開啟文檔並為其建立標籤頁”的指令傳遞於當前正在啟動並執行 gvim 進程,gvim 進程便會乖乖地執行這一命令。該功能所能帶來的好處就是只需要開一個 gvim 進程,所有待編輯的檔案都以標籤頁的形式出現在該 gvim 進程中,這樣便於隸屬於某一項目的多分檔案的編輯與管理。
先把你正在啟動並執行所有 gvim 進程都關掉,然後依次執行以下的命令,就可以切身體驗 remote-tab 的功用了。
$ gvim a.txt
$ gvim --remote-tab-silent b.txt
$ gvim --remote-tab-silent c.txt d.txt e.txt
實際應用中,可使用 Shell 提供的別名功能,對 “gvim --remote-tab-silent” 這樣的長命令列進行友好簡化,做法是編輯 $HOME/.bashrc 檔案,向其中添加:
alias vi='gvim --remote-tab-silent'
具體使用什麼別名,要依據個人喜好。我之所以使用 "vi" 作為 "gvim --remote-tab-silent" 命令的別名,是因為我不大常用 vi 這個命令,而且在許多 linux 發行版中,"vi" 預設串連到 "vim" 的。
現在使用 vi 別名來實現前面那個例子:
$ vi a.txt b.txt c.txt d.txt e.txt
以前我習慣使用 "vim" 在終端開啟 vim,使用 "gvim" 開啟 vim GUI,唯獨不大用 "vi" 這個命令,但是從現在開始也許我用的最多的是 vi 指令了。
3 在標籤頁之間跳來跳去
使用 ":tabp" 與 ":tabn" 可分別實現在一組標籤頁中向前或向後切換當前標籤頁,但是這樣太繁瑣了,為了將當前標籤頁切換到相鄰的標籤頁需要摁 7 次鍵。利用 Vim 提供的鍵映射功能,可將 ":tabp" 與 ":tabn" 命令映射到你喜歡的快速鍵上。我熱衷於將 ":tabp" 映射為 "Shift + Left" 按鍵組合,將 ":tabn" 映射為 "Shift + Right" 按鍵組合,做法是編輯 $HOME/.vimrc,添加:
" shift tab pages
map :tabp
map :tabn4 標籤頁的排序
有時開啟多個標籤頁,它們在標籤頁欄中的排列次序並不是我們所希望的,需要手動去調整。許多編輯器支援使用滑鼠拖放來調整標籤頁的次序,但 vim 不可以,目前只能藉助標籤頁編號機制並採用命令模式來解決標籤頁次序調整問題。
在標籤頁欄中,每一標籤頁都是有編號的,從 0 開始,由左至右依次遞增 1。
使用 ':tabm n' 命令可以將當前標籤所對應的編號調整為 'n',即將當前標籤頁的位置調整到編號 'n' 所對應的標籤頁位置。
5 最佳化標籤頁名的顯示
Vim 的標籤欄中,各標籤頁的名稱預設是對應檔案所在路徑全稱的簡寫,譬如 /usr/share/doc/test.txt 檔案所對應的標籤頁名預設是 /u/s/d/test.txt,這樣的標籤頁名看上去有些詭異。我覺得沒有必要顯示標籤檔案的路徑名,因為在大多數情況下,使用者是非常清楚所編輯檔案的 位置,即使一時忘記,也可以使用 ':f' 命令查看檔案名稱。特別是在 gvim 裡,滑鼠往標籤頁名那裡懸掛一下,就會出現一個很小的提示視窗,其中顯示了標籤檔案的路徑全稱。
下面是我對 Vim 標籤頁的 hack,在標籤頁欄中去除當前所編輯檔案的路徑資訊,只保留檔案名稱。
function ShortTabLabel ()
let bufnrlist = tabpagebuflist (v:lnum)
let label = bufname (bufnrlist[tabpagewinnr (v:lnum) -1])
let filename = fnamemodify (label, ':t')
return filename
endfunction
set guitablabel=%{ShortTabLabel()}6 標籤頁與會話
Vim 可以將當前的工作狀態儲存為會話檔案,通過讀取該會話檔案就可以將 vim 工作環境恢複到你上次退出之前的編輯環境。對於當前所開啟的標籤頁組,在下一次編輯時,可以利用 vim 的會話功能將它們一併開啟,快速複原到上一次工作狀態,這樣就可以在 vim 中類比出 IDE 所特有的專案管理功能。
要恢複上次的編輯環境,我們需要儲存會話 (session) 資訊與 viminfo 資訊:
- 會話資訊中儲存了所有視窗的視圖,外加全域設定;
- viminfo 資訊中儲存了命令列曆史、搜尋字串曆史、輸入行曆史、非空的寄存器內容、檔案的位置標記、最近搜尋/替換的模式、緩衝區列表、全域變數等資訊。
對於 vim 會話功能的使用,具體細節請參閱 easwy 的一篇文章《Vim 會話與 info》。為了更方便地使用
vim 會話功能,推薦使用 sessionman.vim外掛程式。
追加:
映射成<Ctrl-TAB>開啟下一個TAB, <Alt-1>開啟第一個TAB, <Alt-2>開啟第二個, ...
if has("gui_running")
:map <silent> <C-S> :if expand("%") == ""<CR>:browse confirm w<CR>:else<CR>:confirm w<CR>:endif<CR>
noremap <M-1> 1gt
noremap <M-2> 2gt
noremap <M-3> 3gt
noremap <M-4> 4gt
noremap <M-5> 5gt
noremap <M-6> 6gt
noremap <M-7> 7gt
noremap <M-8> 8gt
noremap <M-9> 9gt
noremap <M-0> 10gt
noremap <C-TAB> gt
noremap <C-F4> <ESC>:bd<CR>
noremap qt <ESC>:bd<CR>
au BufEnter * simalt ~x "maximum the initial window
else
colorscheme desert"torte
endif