vim ではタブが使えるんですよ!


みなさん 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 キーをぽんぽん押していくだけです。もし目的のタブ番号がわかっていれば Tab19 を順に押すだけでジャンプできます。

でもぱっと見で何番目のタブというのを判定するのは難しいですね。これはタブ番号を表示させることで解決しましょう。

表示のカスタマイズ

完全なバージョンは 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
デフォルト


120917-0002.png

カスタマイズ後


120917-0003.png

vim のヘルプページに従い、tabline を設定する関数 MyTabLine() と、個々のタブを作る関数 MyTabLabel() に分けて書きました。

  • ホームディレクトリを省く
  • カレントタブ以外はパスを省き、頭文字 + 拡張子だけにする。
  • 可能なら powerline のグリフを使う。
  • タブ番号を表示する。

以上の 4 点のみを変更しました。MyTabLabel() 関数をいじればもっと細かいカスタマイズも可能です。後は好きなようにカスタマイズしてみましょう。

コメントを残す