藻ログ

都会でOLをしています

vimrc分割した

動機

  • お友達が.emacsを分割していて羨ましかった
  • 今まで自分の.vimrcは機能ごとにちまちまfoldingしており, 何かもうダメだの様相を呈していた. *1

.emacs分割のすゝめ | tech.kayac.com - KAYAC engineers' blog

runtime

どうやらruntime使うと特定のファイルを読み込むことができ, source *.vimに近いことができるようだ.

:help runtime

ヘルプを引いてみると, 指定ディレクトリ下全ての*.vimファイルをsourceしたい場合にはruntime!すれば良いらしい.

:ru[ntime][!] {file} ..
			Read Ex commands from {file} in each directory given
			by 'runtimepath'.  There is no error for non-existing
			files.  Example: >
				:runtime syntax/c.vim

			There can be multiple {file} arguments, separated by
			spaces.  Each {file} is searched for in the first
			directory from 'runtimepath', then in the second
			directory, etc.  Use a backslash to include a space
			inside {file} (although it's better not to use spaces
			in file names, it causes trouble).

			When [!] is included, all found files are sourced.
			When it is not included only the first found file is
			sourced.

			When {file} contains wildcards it is expanded to all
			matching files.  Example: >
				:runtime! plugin/*.vim
			This is what Vim uses to load the plugin files when
			starting up.  This similar command: >
				:runtime plugin/*.vim
			would source the first file only.

.vimrcの設定

とりあえず$HOME/.vim/userautoload/以下へ設定ファイルを入れて, 全部読み込むようにする.

runtime! userautoload/*.vim

vimにパスが通っていないディレクトリに置きたい時は

set runtimepath+=dir

とかしてruntimepathに追加すれば良さそう.*2

どう分割するか

basic.vim set number, wrapscan とか基本util
color.vim highlightの設定
maping.vim キーバインドの設定(vim本体)
latex.vim コンパイル, pdfopenの設定が隔離されている...*3
plugins.vim プラグインのロード NeoBundle設定
plugins-*.vim プラグイン毎の設定(プラグイン毎のキーマップ含む)

こんな感じの分割を考えた.
プラグイン毎の設定ファイルは迷ったけど別ファイルで分けることに.
こうして切り分けておけば, pluginを消したいときはplugins-*.vimを*.vim以外にrenameするor別ディレクトリに分けるかすれば良くなる.

ロード順前後問題

E117: Unknown function: submode#map

NeoBundleのプラグイン設定とプラグイン個別の設定を分割していたので, ロード順が前後(個別設定ファイル→プラグイン設定ファイル)してしまう問題が起きてしまった.
指定ディレクトリ下のファイル読み込み順は多分昇順ソートなのかなと思ったものの, もし環境毎に違いが出ると嫌なのでplugin設定ファイルと個別設定ファイルを別々にロードすることにした.
最終的にvimrcとディレクトリ構成をこんな感じにした.

vimrc

runtime! userautoload/init/*.vim
runtime! userautoload/plugins/*.vim

分割後

.vimrc
.vim/userautoload
├── init
│   ├── basic.vim
│   ├── color.vim
│   ├── indent.vim
│   ├── latex.vim
│   ├── mapping.vim
│   ├── plugins.vim      # プラグイン設定
│   └── util.vim
├── plugins                   # プラグイン個別設定
│   ├── plugins-caw.vim
│   ├── plugins-ctrlp.vim
│   ├── plugins-jedi-vim.vim
│   ├── plugins-lightline.vim
│   ├── plugins-neocomplete.vim
│   ├── plugins-neosnippet.vim
│   ├── plugins-syntastic.vim
│   ├── plugins-unite.vim
│   ├── plugins-vim-fugitive.vim
│   ├── plugins-vim-go.vim
│   ├── plugins-vim-latex.disabled
│   ├── plugins-vim-quickrun.vim
│   ├── plugins-vim-snowdrop.vim
│   ├── plugins-vim-submode.vim
│   └── plugins-vimfiler.vim

感想

  • 分割ファイルならどこかでエラーがあっても, 他の設定は生きてて助かった体験ができる
  • プラグイン依存の設定を切り分けられるので管理がしやすくなる
  • 問題が起こったときに原因を分離しやすい
  • 全体の見通しが良くなる
  • 分割過程でvimrcをついでに整理できる

特に依存関係がわかりやすくなったのは非常に良かったと思う. 今後もスッキリ管理を心がけたい.

*1:片付けられない人の部屋みたいになる

*2::set runtimepathとかすれば現在値が確認できる

*3:今はlatexmk + quickrun + vimproc