rcmdnk's blog
Last update

20130906_lightline_200_200

前回 Cygwin+screenで256 colorを有効にする というのを書いたので、 その表示させたかったVimのステータスラインについて。

lightline

lightlineは Vimのステータスラインを綺麗に表示させてくれるプラグインです。

Vimには元々vim-powerline (とその後継のpowerline) というPythonを使ったプラグインがありましたが、 最近、vim-airline というプラグインが出来て、純粋Vim Scriptなので速いし、 他のプラグインとの融合等もあって嬉しい、 ということで移行した、と言う人が増えていました。

元々vim-powerlineはもっさりする気がして一度入れてから外してましたが、 すごい話題になってたのでまずvim-airlineを入れてみました。

そんな中、lightline というプラグインが登場。 vim-airlineをさらに拡張性高くしたような感じで、さらに 作者の方のブログ 1ではその設計思想まで熱く語られています。

ということで、vim-airlineを導入したばかりでしたが、 lightlineも試してみることに。 ちょっと使ってみてとても拡張性が高いのが楽しい所です。

追記: 2017/09/24

下の方法だとちょっと表示順などをきちんと考えられてないので もうちょっとちゃんとしたのに変更しています。

追記ここまで

取り敢えず置いてみた設定はこんな感じ。

lightline_settings.vim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
" lightline.vim {{{
if ! empty(neobundle#get("lightline.vim"))
  let g:lightline = {
    \"colorscheme": "jellybeans",
    \"active": {
      \"left": [["mode", "filename"], ["fugitive"]],
      \"right": [["lineinfo"], ["fileinfo"]]},
    \"component_visible_condition": {
      \"fugitive": '(exists("*fugitive#head") && ""!=fugitive#head())'},
    \'component_function': {
      \'mode': 'MyMode',
      \'filename': 'MyFileName',
      \'fugitive': 'MyFugitive',
      \'fileinfo': 'MyFileInfo',
      \'lineinfo': 'MyLineInfo',
      \},
    \ 'separator': { 'left': '', 'right': '' },
    \ 'subseparator': { 'left': '', 'right': '' }
    \}
  let g:lightline.inactive = g:lightline.active

  function! MyMode()
    let l:ps = ''
    if &paste
      let l:ps = " P"
    endif
    return lightline#mode() . l:ps
  endfunction

  function! MyFileName()
    let l:fn = expand("%:t")
    let l:ro = &ft !~? 'help' && &readonly ? " RO" : ""
    let l:mo = &modifiable && &modified ? " +" : ""
    return l:fn . l:ro . l:mo
  endfunction

  function! MyFugitive()
    let l:fu = exists('*fugitive#head') ? fugitive#head() : ''
    return winwidth('.') >=
          \  strlen(MyMode()) + 2
          \+ strlen(MyFileName()) + 2
          \+ strlen(l:fu) + 2
          \+ strlen(MyLineInfo()) + 2
          \? l:fu : ''
  endfunction

  function! MyFileInfo()
    let l:ff = &fileformat
    let l:fe = (strlen(&fenc) ? &fenc : &enc)
    let l:ft = (strlen(&filetype) ? &filetype : 'no')
    let l:fi = l:ff . " " . l:fe . " " . l:ft
    return winwidth('.') >=
          \  strlen(MyMode()) + 2
          \+ strlen(MyFileName()) + 2
          \+ strlen(MyFugitive())
          \+ ((exists("*fugitive#head") && ""!=fugitive#head()) ? 2 : 0)
          \+ strlen(l:fi) + 2
          \+ strlen(MyLineInfo()) + 2
          \? l:fi : ''
  endfunction

  function! MyLineInfo()
    let l:cl = line(".")
    let l:ll = line("$")
    let l:cc = col(".")
    let l:li = printf("%4d/%d:%3d", l:cl, l:ll, l:cc)
    return winwidth('.') >=
          \  strlen(MyFileName()) + 2
          \+ strlen(l:li) + 2
          \? l:li : ''
  endfunction
endif
"}}} lightline.vim

プラグインのhelpや レポジトリにあるREADME がかなり詳しいので、取り敢えず追ってくだけでも色々出来るようになります。

上のも関数などはREADMEを追って作ったものを変更したりしています。 ちょっと工夫してるところとしては、表示幅によって表示する項目を変えれるよう、各関数で表示幅とすべての表示文字数を比較して表示するかどうか決めています。

こんな感じで最後までファイル名は残るように。

表示の優先度などが全部の関数がお互いに上手く対応出来るように 書かないといけない様に関数を作ってしまっているので もうちょっと上手く書けないかな、と思うところですが、 取り敢えずは良い感じに欲しい情報を載せる事が出来ました。

ちなみに、上のgifアニメでは、 vim-submode を使ってWindowを動かしています 2

作者の方のブログでは加えて、作者が教える! シリーズもやってくれるみたいで、今後も追っていきたい所です。

Sponsored Links
Sponsored Links

« Cygwin+screenで256 colorを有効にする お気に入りに登録ボタンが使えなくなった@Firefox »

}