yujiro's blog

エンジニアリング全般の事書きます

.vimrc の各言語のタブのインデント数を外部ファイルから読み込む形にした

なんか同じ言語でもプロジェクトによってインデント数切り替えたいとかでてきたので実装してみました。

外部ファイルは .vimrc.local にして、ここに let ruby_tabnum = 2 という風に記述しておいてそれを読み込んで設定するといった形にすることにしました。

.vimrc.local というファイル名が適切かどうかわかりませんが、なんかこれを読み込んでるコードをちらっとみたのでこれにしてみます。

このファイルは ignore しておいて、プロジェクトごとにサクッと変えたらすぐインデント数がかわって差分もでない、といった感じです。

因みに私のdotfiles は

GitHub - bamboo-yujiro/dotfiles

にあるので、よかったら覗いてください。

まず.vimrcで外部ファイル読み込み

if filereadable(expand("~/dotfiles/.vimrc.local"))
  source ~/dotfiles/.vimrc.local
endif

上記のように書きます。

続いて.vimrc.local です。

"let php_tabnum = 8
let python_tabnum = 4
let ruby_tabnum = 2
let perl_tabnum = 4

php_tabnum がコメントアウトされていますが、設定がない場合でもエラーがでないように.vimrc のほうにデフォルト値を設定しておくようにするので、そのデバッグ用にこうしておきます。

そのうえで、

" 各ファイルフォーマットタブインデント数のデフォルト値
if !exists("php_tabnum") | let php_tabnum = 4 | endif
if !exists("python_tabnum") | let python_tabnum = 4 | endif
if !exists("ruby_tabnum") | let ruby_tabnum = 2 | endif
if !exists("perl_tabnum") | let perl_tabnum = 4 | endif

上記のようにして、設定がない場合もエラーがでないようにlet で定数定義しておきます。

あとは

autocmd FileType php,ctp execute "set tabstop=".php_tabnum
autocmd FileType php,ctp execute "set shiftwidth=".php_tabnum

autocmd FileType python execute "set tabstop=".python_tabnum
autocmd FileType python execute "set shiftwidth=".python_tabnum

上記のようにかいて終了です。

変更前は

autocmd FileType php,ctp :set tabstop=4      

上記のようになっていたのですが、この書き方だと let が展開できないため、execute を使いました。

参考

vim - How do I use variables in my .vimrc? - Stack Overflow


因みに.vimrc のデバッグ

私は echo して :source % という風にします。

例えば上記の場合、.vimrc の下記部分をコメントアウトした上で

"if !exists("php_tabnum") | let php_tabnum = 4 | endif
"if !exists("python_tabnum") | let python_tabnum = 4 | endif
"if !exists("ruby_tabnum") | let ruby_tabnum = 2 | endif
"if !exists("perl_tabnum") | let perl_tabnum = 4 | endif
echo exists("php_tabnum") 

として :source % とすると 0 と出力されます。

基本的にはこれでこと足りると思います。

以上です。