有馬総一郎のブログ

(彼氏の事情)

2020年11月22日 20:46:14 JST - 3 minute read - Vim

Windows版GVimにlightline.vimを導入したらめっちゃくちゃ嵌った

Software Design 2020年8月号を見ると VimVisual Studio Code の比較記事が載ってたので購入した。そこで今更ながら itchyny/lightline.vimについて知ったのでインストールしてみた。

普通ならそれで終わる話だが、私の場合、上手く行かない…。以下は全て Vim — KaoriYa1でのGVimでの話。

NeoSolarizedの罠

まず色が付かない。ハッハッハ、 README.md

statusline.vim

If the statusline is not coloured like

と丁寧にあるだろ、ちゃんと読め。と言われるだろうが、システム変数にTERM=xterm-256color追加して

if !has('gui_running')
  set t_Co=256
endif

をやっても駄目である。あれこれやった結果。colorscheme NeoSolarizedだとそうなってしまう。colorscheme solarizedだと色が付く。WindowsだけでUbuntuのNeovimだと起きない。

‘colorscheme’: ‘solarized_dark’の罠

良し!色が付いた。じゃあ、今自分が使ってるのは、colorscheme solarizeddark だからstatuslinesolarized dark にしよう。

let g:lightline = {
      \ 'colorscheme': 'solarized dark',
      \ }
lightline.vim: Could not load colorscheme solarized dark.

ははん、solarized_darkとアンダースコアなんだな。

lightline.vim: Could not load colorscheme solarized_dark.

ああ、どうして!

darkは不要で、&backgroundの値で自動で切り替えてくれるようになったのだった…

Fix solarized themes colors by ericbn · Pull Request #175 · itchyny/lightline.vim · GitHub

_gvimrcという罠

じゃあ、

let g:lightline = {
      \ 'colorscheme': 'solarized',
      \ }

で設定すれば良いのか!と _gvimrc に記述するも、statusline はデフォルトのままである。

If the colors of the statusline do not change, move the settings of g:lightline before setting the editor colorscheme.

のとおりcolorscheme solarizedの前でg:lightlineを定義しても、駄目なのである。

結果、 _vimrc でやらないと機能しない。なので _vimrcg:lightlineを定義する。すると色が変わった!lightのままで…あれ?

statusline.vim

GVIMでカラースキーム「solarized」のdarkが反映されませんでした · Issue #82 · itchyny/lightline.vim · GitHub

という問題が挙がっているが、結局これは

solarized_darkを使って下さい。

ということで終わっている。

順番としては

  1. _vimrc
  2. lightline.vim\autoload\lightline\colorscheme\solarized.vim
  3. _gvimrc

で読み込まれている。

厄介なことに _vimrcset background=darkしても solarized.vim での lightline#colorscheme#background()light のままなのである。

if lightline#colorscheme#background() ==# 'light'
  let [ s:base03, s:base3 ] = [ s:base3, s:base03 ]
  let [ s:base02, s:base2 ] = [ s:base2, s:base02 ]
  let [ s:base01, s:base1 ] = [ s:base1, s:base01 ]
  let [ s:base00, s:base0 ] = [ s:base0, s:base00 ]
endif

を削除すれば目的は逹せられるが、せめて _vimrc _gvimrc 内の編集だけで片付けたい。なので、

  1. _vimrc ではg:lightlineを定義しない。
  2. _gvimrcg:lightlineを定義する。
  3. _gvimrccall lightline#init()する。
let g:lightline = {
      \ 'colorscheme': 'solarized',
      \ }
set background=dark
colorscheme solarized
call lightline#init()

という力技で成し遂げた。これだと、 _gvimrc で定義したとおり動いてくれる。しかし、一度でも _vimrclet g:lightlineすると、 _gvimrccall lightline#init()しても、再設定してくれない。

こんなに頑張らんでも

使えばいいじゃんと思わなくもないけど…しかし気になったのは、WindowsでVimを使う人はかなり少なく、殆どのVimmerはMacVimなりNeovim使ってるのだろうか。


  1. VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Jan 6 2020 01:10:51)
    MS-Windows 64 ビット GUI/コンソール 版
    適用済パッチ: 1-87 ↩︎