darudaru

だるだるしてるエンジニア

vimrcの見直し

新年を迎えたので、新たな気持ちでと思いvimrcの見直しを行いました。ほんとは年末のうちにvimrcの大掃除として終わらせたかったけど、終わらなかった。

やったこと

vimのディレクトリ構成の変更

今まで~/.vim配下にvimの設定ファイルを設置していましたが、XDG Base Directoryに準拠したディレクトリ構成に変更しました。どうなったかというとこう。

~/.config
└── vim
    ├── colors
    │   └── molokai.vim
    ├── dein.toml
    ├── deinlazy.toml
    ├── encoding.vim
    ├── mappings.vim
    ├── options.vim
   └── snippets
        └── php_functions.snip

~/,vim配下にvimの設定ファイルやプラグインのソースまで全て設置していた構成から、かなりスッキリした構成になったと思います。
プラグインのソースはどこに行ったかというと、~/.cache/vim配下に設置するようにしています。

XDG Base Directoryの構成への切り替えの手順は、以下のとおり。

1. XDG_CONFIG_HOME、XDG_CACHE_HOMEの環境変数追加
.zprofile
export XDG_CONFIG_HOME=$HOME/.config
export XDG_CACHE_HOME=$HOME/.cache
2. vimのruntimepathに追加
.vimrc
set runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIMRUNTIME

setコマンドの読み込み方法の変更

以前はsetコマンドの設定ファイルを任意のディレクトリに設置し、そのディレクトリ配下のファイルをruntime!で読み込んでいました。この場合、どのファイルから読み込まれるかが不明でちょっと気持ち悪いなと思っていました。encodingの設定とかは最初に読み込んでおきたかったりするし。
なので、setコマンドの設定ファイルは個別に.vimrcで読み込むように変更することに。

.vimrc
function! s:source_rc(path)
    let abspath = resolve(expand(s:config_dir . '/' . a:path))
    if filereadable(abspath)
        execute 'source' abspath
        return
    endif
endfunction
call s:source_rc('encoding.vim')
call s:source_rc('options.vim')
call s:source_rc('mappings.vim')

設定ファイルを読み込むsource_rc関数を作成。あとは読み込みたいファイル順に.vimrcに追加して行くだけ。
ちなみに、vimのscriptでよく「rc」という文字を見かけますが、「run command」の略だそうですよ。

で、見直した新しい.vimrc

.vimrc
set runtimepath=$XDG_CONFIG_HOME/vim,$XDG_CONFIG_HOME/vim/after,$VIMRUNTIME

" load dein
if &compatible
    set nocompatible
endif

let s:config_dir = expand($XDG_CONFIG_HOME . '/vim')
let s:dein_dir = expand($XDG_CACHE_HOME . '/vim/dein')
if !isdirectory(s:dein_dir . '/repos/github.com/Shougo/dein.vim')
    execute '!git clone https://github.com/Shougo/dein.vim' s:dein_dir
endif
execute 'set runtimepath^=' . s:dein_dir

if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)
    call dein#load_toml(s:config_dir . '/dein.toml', {'lazy': 0})
    call dein#load_toml(s:config_dir . '/deinlazy.toml', {'lazy': 1})
    call dein#end()
    call dein#save_state()
endif

filetype plugin indent on
syntax enable

if dein#check_install()
    call dein#install()
endif

" load *.vim
function! s:source_rc(path)
    let abspath = resolve(expand(s:config_dir . '/' . a:path))
    if filereadable(abspath)
        execute 'source' abspath
        return
    endif
endfunction
call s:source_rc('encoding.vim')
call s:source_rc('options.vim')
call s:source_rc('mappings.vim')

余談

ほんとはneovimに切り替えようと思っていました。ただpython周りに設定がうまくいかず断念。vim、neovimの共存を気にしなければよかったのかも…うーん。
neovimで使ってみたいと思っていた:terminalコマンドがvim8にも実装されたこともあり、そんなに頑張って切り替えなくてもいいかも、と思い始め切り替えはやめちゃいました。またneovimで使ってみたい機能を見つけたときに、切り替えてみたいと思います。