Vim 分頁列(tabline)設定
預設分頁列的不足
- 無顯示分頁編號。想用 Ngt 跳到第 N 個分頁時,不易判斷 N 要下多少。
- 分頁很多時,超出畫面外的分頁無法顯示。(gVim 會顯示捲動按鈕,故無此問題)
修改方式
修改方式是重寫 tabline 這個選項,實際上頗為麻煩,因為整條 tabline 必須一次輸出,而非設定個別 tab 即可。參考 :help setting-tabline
,其中給的例子也只提示基本功能而已。
受惠於 Vim 7.3 的幾個進化,這才把 tabline 調成比較堪用的狀態。調整如下:
- 顯示分頁編號
- 變更了分頁文字內容
- 僅顯示檔名(不含路徑)
- 顯示是否修改過(+)和分頁中的分割視窗數(n),大致上和預設相同
- 新 buffer 顯示 '[New]' ,無檔案的 buffer 顯示 '[Scratch]'
- 不顯示關閉按鈕(原本擺在分頁列尾端的 'X')
- 使用幾個額外的自訂 highlight group
- 可指定分頁最小/最大寬度
- 分頁過多時,可指定是否自動平均分頁寬度;且可指定此狀況下的最小分頁寬度
- 可指定分頁過長而被截短時,要補上去的省略字串(例:'…')
- 可指定目前分頁左右,至少要顯示幾個分頁
原始碼
gist: 523783 - Vim tabline setting
console 擷圖
gui 擷圖(「分割視窗數」使用了斜體)
選項
因為沒寫成 plugin,只是放在 .vimrc 的 function,所以請直接改原始碼的下列項目:
let tabMinWidth = 0
最小分頁寬度(0: 不限)let tabMaxWidth = 40
最大分頁寬度(0: 不限)let tabMinWidthResized = 15
設定 tabDivideEquel 有效時,採用的最小分頁寬度let tabScrollOff = 5
目前分頁左右至少顯示幾個分頁let tabEllipsis = '…'
分頁過長而被截短時,要顯示的替代文字let tabDivideEquel = 0
分頁總長超出畫面時,是否自動均分各分頁寬度
已知問題
在 Vim 7.3e BETA 測試,全型字和自訂 highlight 有時會造成 tabline 重繪不正確。有先發到 vim-dev 再看看情況。
不幸地 Vim 7.3f 狀況仍然存在。
為什麼要 Vim 7.3?
為了計算字串的實際顯示寬度(column 數),需用到新增的 strwidth()
函數。(目前程式若找不到此函數,就會改用 strlen()
,計算全型字寬度時結果便不正確)
註:關於全型半型甚至無法確定的狀況,可參考 LGJ Notes | 全型字(Full-Width)、半型字(Half-Width)。
此外 Vim 7.3 還新增了滑鼠拖曳分頁調整順序的功能,比起以往只能用 :tabmove N
方便得多。
相關配套調整
- 永久顯示分頁列
set showtabline=2
- gui 也使用純文字的 tabline
set guioptions-=e
- 未知寬度的字以兩個 column 顯示
一般中文字型建議設定set ambiwidth=double
以避免 '…' 等不定寬度的字顯示錯誤。 - 相關 highlight group
因為增加了新的 gorup 而非使用預設值,所以需特別設定下列 highlight。
建議放在自己的 colorscheme 裡面,或寫成 function 在 autocmd ColorScheme 時呼叫,否則根據經驗,Vim 讀取 session 後自訂的 highlight 會被重設。hi TabLine cterm=underline ctermfg=15 ctermbg=242 gui=underline guibg=#6c6c6c guifg=White hi TabLineSel cterm=bold gui=NONE guifg=White hi TabLineNr cterm=underline ctermbg=238 guibg=#444444 hi TabLineNrSel cterm=bold ctermfg=45 guifg=#00d7ff hi TabLineFill cterm=reverse gui=reverse hi TabLineMore cterm=underline ctermfg=White ctermbg=236 gui=underline guifg=White guibg=#303030 hi TabLineSplitNr cterm=underline ctermfg=148 ctermbg=240 gui=underline,italic guifg=#afd700 guibg=#6c6c6c hi TabLineSplitNrSel cterm=NONE ctermfg=148 ctermbg=236 gui=NONE,italic guifg=#afd700 guibg=#303030
有 8 個意見
好東西,有用有推... ^^
好物 + 1
請問一下,為什麼我把你的原始碼貼到 vimrc 後
只有 console 起作用,gvim 卻沒有成功?
謝謝
你有加上 set guioptions-=e 嗎?
guioptions 有 'e' 的話,gVim 就不會理這個設定了。
amazing! 成功了!
非常感謝你!
另外你有打算把這寫成 plugin 嗎@@?
會,這麼長的 code 貼進 vimrc 也不好看。
只是沒有計畫何時做就是了。
整理成 plugin 了
https://github.com/bootleq/vim-tabline
安裝後 set tabline=%!tabline#build() 生效(或者不設 tabline,也會自動設定)
不過舊的選項不再通用
好用耶,推推~
☂