lightline.vimのtablineを設定してみた

## はじめに

Vimのタブのところに、どこのディレクトリのファイルなのかのヒントが欲しいときがあります。そして、それはできるだけシンプルなものがいいです。たとえば、ディレクトリ名の頭文字を含むものです。

<img width="530" alt="スクリーンショット 2017-02-26 19.31.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/29884/5631c2c0-1362-3794-cb61-764e269ea72f.png">

<img width="529" alt="スクリーンショット 2017-02-26 19.28.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/29884/8191ed05-4053-e135-3f6d-08912a692803.png">

私はlightline.vimを使っているので、それに合わせる必要がありました。

今回はその設定を紹介します。

## 設定

設定は下記になります:

``` vim
if $TERM == 'screen'
    set t_Co=256
endif

set background=dark
let g:solarized_termcolors=256
colorscheme solarized

let g:lightline = {
      \ 'colorscheme': 'solarized_dark',
      \ 'active': {
      \   'left': [ [ 'mode', 'paste' ],
      \             [ 'fugitive', 'filename' ] ]
      \ },
      \ 'component_function': {
      \   'readonly': 'LightlineReadonly',
      \   'modified': 'LightlineModified',
      \   'fugitive': 'LightlineFugitive',
      \   'filename': 'LightlineFilename'
      \ },
      \ 'separator': { 'left': '', 'right': '' },
      \ 'subseparator': { 'left': '|', 'right': '|' }
      \ }

function! LightlineModified()
  if &filetype == 'help'
    return ''
  elseif &modified
    return '+'
  elseif &modifiable
    return ''
  else
    return '-'
  endif
endfunction

function! LightlineReadonly()
  if &filetype == 'help'
    return ''
  elseif &readonly
    return 'x'
  else
    return ''
  endif
endfunction

function! LightlineFugitive()
  return exists('*fugitive#head') ? fugitive#head() : ''
endfunction

function! LightlineFilename()
  return ('' != LightlineReadonly() ? LightlineReadonly() . ' ' : '') .
       \ ('' != expand('%:t') ? expand('%:t') : '[No Name]') .
       \ ('' != LightlineModified() ? ' ' . LightlineModified() : '')
endfunction

let g:lightline.tab = {
      \ 'active': [ 'tabnum', 'filename', 'modified' ],
      \ 'inactive': [ 'tabnum', 'filename', 'modified' ]
      \ }

let g:lightline.tab_component_function = {
      \ 'filename': 'LightlineTabFilename',
      \ 'modified': 'lightline#tab#modified',
      \ 'readonly': 'lightline#tab#readonly',
      \ 'tabnum': 'lightline#tab#tabnum' }

function! LightlineTabFilename(n) abort
  let buflist = tabpagebuflist(a:n)
  let winnr = tabpagewinnr(a:n)
  let _ = pathshorten(expand('#'.buflist[winnr - 1].':f'))
  return _ !=# '' ? _ : '[No Name]'
endfunction
```

## 少し設定の解説

先頭に、私はターミナルでGNU Screenを使っていますので、その設定とカラースキームの設定があります。

LightlineTabFilename(n)のところ以外はlightline.vimの設定チュートリアルにあるものです。

LightlineTabFilename(n)のアイデアは、ファイル名ではなく相対パスを取得して、その相対パスをpathshortenで変換して、表示させるというものです。

pathshortenを試してみるにはVimを開いて、`:echo pathshorten('~/.vim/autoload/myfile.vim')`を試すのがいいと思います。名前の通りパスを短くしてくれます。

気をつけなければいけないところは、tab_component_functionで指定する関数は引数を一つ受け取るというところです。（filenameコンポーネントのときだけかもしれませんが、その関数が受け取る値はカレントタブページの番号です。なので、仮引数をnとせずtabnrにしたほうがわかりやすいかもしれません。）

動かすためには、いくつかのプラグインをインストールするか、不要なところを削る必要があります。どちらでもお好みのほうを試していただければと思います。

## 参考URL

- [Vimの便利な画面分割＆タブページと、それを更に便利にする方法](http://qiita.com/tekkoc/items/98adcadfa4bdc8b5a6ca)
- ['tabline' を活用しよう - 永遠に未完成](http://thinca.hatenablog.com/entry/20111204/1322932585)
- [lightline.vim#Configuration tutorial](https://github.com/itchyny/lightline.vim/blob/master/README.md#configuration-tutorial)
- [lightline.vim/autoload/lightline/tab.vim](https://github.com/itchyny/lightline.vim/blob/master/autoload/lightline/tab.vim)