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

vim-localvimrcで編集するファイルパスごとに異なる設定を保持する

vim vac

Vim Advent Calendar 2013 の87日目の記事になります。
今年もまだ続いてるようで安心しました。

はじめに

自分はハードタブよりもスペースでタブを表現するソフトタブの方が好きですし、今までの現場/案件も全てソフトタブでコードを書いてきました。

しかしある日突然そいつはやってきました。
フレームワークを使った案件なのですが、フレームワーク内のコーディング規約を見てみると。

すべてのインデントはスペースではなくタブを使用すべきです。

まじかよ。。。

さすがに無視するわけにもいかないので、嫌々ながらもハードタブを使うことになったのですが、.vimrcにハードタブ用の設定(noexpandtab)を書いてしまうとプロジェクトの内外に関わらず全ての編集作業でハードタブが入り込んでしまうようになりました。
複数人で触る大量のファイルにモードラインを入れるとかありえないし。
一体どうしたもんか。

vim-localvimrcの導入

困っていたところ、ひとつのプラギンを発見しました。

embear/vim-localvimrc · GitHub

このプラギンはファイルパスを遡ってローカル用の.vimrc(デフォルトでは.lvimrc)を探し、存在すれば適用してくれます。
目的のプロジェクトのルートにバッファローカルな設定を行う.vimrcを置いてみます。

$ echo 'setlocal noexpandtab tabstop=4' > /path/to/project/.lvimrc

たったこれだけで問題はバッチリ解決しました。
またバージョン管理を使っている場合は.lvimrcを無視パターンに追加するのを忘れずに。

vim-localvimrcの設定可能な項目を以下に書いておきます。

変数 説明 デフォルト
g:localvimrc_name 対象となるローカル設定ファイルの名前 .lvimrc
g:localvimrc_reverse 0: 下位ディレクトリのものほど設定を優先
1: 上位ディレクトリのものほど設定を優先
0
g:localvimrc_count 読み込みを行う上限数 -1(制限なし)
g:localvimrc_sandbox 0: 設定ファイルの評価をサンドボックスで行わない
1: 設定ファイルの評価をサンドボックスで行う
1
g:localvimrc_ask 0: 設定ファイルが見つかったら即読み込む
1: 設定ファイルが見つかったら読み込みを行うかどうかの確認を促す
1
g:localvimrc_persistent 0: g:localvimrc_askでの選択内容を保持しない
1: Y/N/Aなどの大文字の入力時にのみ保持する
2: 常に保持する
0
g:localvimrc_persistence_file g:localvimrc_persistentの情報を保持するファイル名 $HOME/localvimrc_persistent
g:localvimrc_whitelist 読み込みを許可するための正規表現 (なし)
g:localvimrc_blacklist 読み込みを拒否するための正規表現 (なし)

その他

似たプラギンは他にもあります。

中身をすべて確認したわけではありませんが、今回はとりあえず動かしてみて自分にあってそうなものを選びました。