読者です 読者をやめる 読者になる 読者になる

gvimの.vimrc上書きに負けないDRYなvimrcを書く

最近zenburnというvimのcolorschemeがお気に入りです.
このcolorschemeはターミナルとGUIの両方に対応していて大変便利です.

問題

しかし~/.vimrcに

colorscheme zenburn

と記述するとターミナルでは良いのですがmacvimでは以下のような惨状となってしまいます.

これについてMacVim-kaoriyaの開発者の方に質問したところ,zenburn.vimないの

set background=dark

などの設定が上書きされてしまっていたようで,
~/.gvimrcの方に書けばよいことがわかりました

GUIに関係しない設定、たとえば tabstop, shiftwidth, expandtab, wrap, showmatch などの設定はホームフォルダ/.vimrcにて設定することをオススメします。

GUIに関する設定、たとえば columns, lines, guioptions, transparency, antialias, colorscheme などの設定は ホームフォルダ/.gvimrcにて設定することをオススメします。

  1. MacVim.app/Contents/Resources/vim/vimrc
  2. ホームフォルダ/.vimrc または _vimrc
  3. MacVim.app/Contents/Resources/vim/gvimrc
  4. ホームフォルダ/.gvimrc または _gvimrc

の順番で読み込まれます。

しかしzenburnはターミナルとGUIの両方に対応しており二度手間です.
また,colorschemeを変更する際にはvimrcとgvimrcの両方を書き換える必要がありDRYではありません.

解決

以下のように記述しターミナルでは.vimrcで,GUI(gvim, macvim)では.gvimrcで設定が読み込まれるようにします.

~/.vimrc

if !has('gui_running')
  source ~/.vim/vimrc
end

~/.gvimrc

source ~/.vim/vimrc

~/.vim/vimrc

colorscheme zenburn

...
...
...

これでただしく表示されるようになりました.


不満

vimの設定について管理するファイルが1つから3つに増えてしまいました.
vimrcに記述した内容でもユーザが明示的に指定ものは上書きしないようにしてもらえるとうれしいのですが………


もっとスマートなやり方があったらぜひ教えて下さい

追記

thincaさんのコメントをみながら.vimrcだけで完結するように書いてみた

" カラースキーム
let scheme = 'zenburn'
augroup guicolorscheme
  autocmd!
  execute 'autocmd GUIEnter * colorscheme' scheme
augroup END
execute 'colorscheme' scheme

colorschemeコマンドの引数に変数の中身の文字列をどうやって渡せばいいか悩んだ.
不格好だけどとりあえず動いている