タブに表示された長いファイル名の末尾を省略する

Vim にはタブページ機能がある。Vim なので当然、タブの表示のカスタマイズをすることが可能だ。設定は 'guitablabel' オプションで行う*1

これをいじっていたところ、一つ問題に直面した。「タブにファイル名を表示させ、長いファイル名は末尾を省略したい」とする。しかし、'guitablabel' オプションでは、長いファイル名の省略は先頭に対して行われてしまう*2

当然 Vim script の出番。以下が、「タブに表示された長い(=10文字を超えた)ファイル名の末尾を省略する」コードである。.vimrc に貼りつけてロードすれば、設定が有効になる。

function! GuiTabLabel()
    let label = expand("%:t")
    if strlen(label) > 10  "ファイル名が11文字以上の場合、末尾を切り詰めて10文字にする。
      let label = strpart(label, 0, 10) . ".."
    endif
    return label
endfunction

set guitablabel=%{GuiTabLabel()}

ちなみにこのスクリプトはマルチバイトには対応していない。マルチバイトのファイル名も扱えるようにするには、strlen() と strpart() の マルチバイト対応版を使えば可能である。

以下が、マルチバイト版のコードになる。

"" マルチバイト対応 strlen() と strpart()
""" via http://vimwiki.net/?ScriptSample%2F16
function! StringLength(str)
  return strlen(substitute(a:str, ".", "x", "g"))
endfunction

function! StringPart(str, start, len)
  let bend = byteidx(a:str, a:start + a:len) - byteidx(a:str, a:start)
  if bend < 0
    return strpart(a:str, byteidx(a:str, a:start))
  else
    return strpart(a:str, byteidx(a:str, a:start), bend)
  endif
endfunction

function! GuiTabLabel()
  let label = expand("%:t")
  let length = StringLength(label)
  if length > 10   "ファイル名が11文字以上の場合、末尾を切り詰めて10文字にする。
    let label = StringPart(label, 0, 10) . ".."
  endif
  return label
endfunction

set guitablabel=%{GuiTabLabel()}

*1:設定方法はだいたい 'statusline' と同じ。'statusline' の設定方法については、「http://memo.officebrook.net/20050512.html#p01」によくまとまっている。

*2:末尾を省略させる設定方法は、調べた限りでは無かった。