みなさん 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() 関数をいじればもっと細かいカスタマイズも可能です。後は好きなようにカスタマイズしてみましょう。
