みなさん vim7 から搭載されたタブ機能は使ってますか?
なんか周り見てみると相変わらずコマンドラインから vim filename.txt
で起動して一つ編集したら終わり→次のディレクトリへ……って人が多いんですよね。
別にそれでかまわない、もとい、vim とは本来そういうもんだという人も多いのでしょうが、今や unite や vimfiler などの優れたプラグインも多く、vim を一つ起動すれば、ディレクトリを縦横無尽に行き来していろんなファイルを編集できると思うんです。
せっかくだから、俺はこの Unite + vim-ref を選ぶぜ! – blog.delphinus.dev
https://blog.delphinus.dev/2010/12/vim-ref-with-unite.html
vimfilerとUniteでVimをファイラとして使用する方法 | karakaram-blog
http://www.karakaram.com/vim/vimfiler/
ただそうなると、標準のタブ機能は表示もキーバインドも簡潔すぎて不十分です。今回はカスタマイズで少しだけタブ機能を使いやすくしてみました。
キーバインドのカスタマイズ
標準のキーバインドでは gt
で右のタブへ、gT
で左のタブへ行けるのですが、連続して移動するときに gtgtgt...
とやるのは億劫です。そこで次のように変更してみました。
nnoremap <S-Tab> gt nnoremap <Tab><Tab> gT for i in range(1, 9) execute 'nnoremap <Tab>' . i . ' ' . i . 'gt' endfor
キー | 動作 |
---|---|
<S-Tab> |
右のタブへ |
<Tab><Tab> |
左のタブへ |
<Tab>1 <Tab>2 ... <Tab>9 |
1番目〜9番目のタブへ |
タブを移動するときは Shift キーを押しながら Tab キーをぽんぽん押していくだけです。もし目的のタブ番号がわかっていれば Tab と 1 〜 9 を順に押すだけでジャンプできます。
でもぱっと見で何番目のタブというのを判定するのは難しいですね。これはタブ番号を表示させることで解決しましょう。
表示のカスタマイズ
完全なバージョンは github で公開していますが、個人的な設定も多いので省略したバージョンを載せます。
set tabline=%!MyTabLine() function! MyTabLine() let s = '' for i in range(tabpagenr('$')) " select the highlighting if i + 1 == tabpagenr() let s .= '%#TabLineSel#' else let s .= '%#TabLine#' endif " set the tab page number (for mouse clicks) let s .= '%' . (i + 1) . 'T' " the label is made by MyTabLabel() let s .= ' %{MyTabLabel(' . (i + 1) . ')} ' endfor " after the last tab fill with TabLineFill and reset tab page nr let s .= '%#TabLineFill#%T' " right-align the label to close the current tab page if tabpagenr('$') > 1 let s .= '%=%#TabLine#%999XClose' endif return s endfunction let g:use_Powerline_dividers = 1 function! MyTabLabel(n) let buflist = tabpagebuflist(a:n) let winnr = tabpagewinnr(a:n) let altbuf = bufname(buflist[winnr - 1]) " $HOME を消す let altbuf = substitute(altbuf, expand('$HOME/'), '', '') " カレントタブ以外はパスを短くする if tabpagenr() != a:n let altbuf = substitute(altbuf, '^.*/', '', '') let altbuf = substitute(altbuf, '^.\zs.*\ze\.[^.]\+$', '', '') endif " vim-powerline のグリフを使う if g:use_Powerline_dividers let dividers = g:Pl#Parser#Symbols[g:Powerline_symbols].dividers let left_div = nr2char(get(dividers[3], 0, 124)) let right_div = nr2char(get(dividers[1], 0, 124)) let altbuf = left_div . altbuf . right_div else let altbuf = '|' . altbuf . '|' endif " タブ番号を付加 let altbuf = a:n . ':' . altbuf return altbuf endfunction
vim のヘルプページに従い、tabline
を設定する関数 MyTabLine()
と、個々のタブを作る関数 MyTabLabel()
に分けて書きました。
- ホームディレクトリを省く
- カレントタブ以外はパスを省き、頭文字 + 拡張子だけにする。
- 可能なら powerline のグリフを使う。
- タブ番号を表示する。
以上の 4 点のみを変更しました。MyTabLabel()
関数をいじればもっと細かいカスタマイズも可能です。後は好きなようにカスタマイズしてみましょう。