【一人 vimrc advent calendar 2017】ディレクトリをオプションに設定した場合にディレクトリも生成する【7日目】

一人 vimrc advent calendar 2017 7日目の記事になります。

'backupdir''undodir' などでディレクトリを設定する場合の注意

さて、、Vim では 'backupdir''undodir' などディレクトリを設定するオプションがいくつかあります。

"バックアップファイルを作るディレクトリ
set backupdir=$HOME/vimbackup

" undo ファイルを保存するディレクトリ
set undodir=$HOME/vimundo

しかし、上記のようなディレクトリを設定するオプションは『ディレクトリが存在しなかった場合』に自動でディレクトリを作成しません。
なので自前でディレクトリを作る必要があります。
また、設定したディレクトリが存在しなくても特にエラーは出力されません。

vimrc 内でディレクトリも作成する

自前でいちいちディレクトリを作成するのはめんどくさいので簡単な Vim script で対応してみましょう。

" ネストしたディレクトリを作成する関数
function! s:mkdir(dir)
    if !isdirectory(a:dir)
       " "p" を渡すことでネストしたディレクトリ全てが作成される
        call mkdir(a:dir, "p")
    endif
endfunction


"バックアップファイルを作るディレクトリ
set backupdir=$HOME/vimbackup
" 設定したディレクトリを生成する
" & をつけてオプションの値を渡していることに注意
call s:mkdir(&backupdir)

" undo ファイルを保存するディレクトリ
set undodir=$HOME/vimundo
call s:mkdir(&undodir)
set undofile

このように vimrc に記述しておけば 'backupdir' などを変更した場合でも自動でディレクトリが生成されます。
ただし、あくまでも vimrc 上でディレクトリを生成しているのでコマンドライン等で 'backupdir'ディレクトリを変更した場合は反映されないので注意してください。
この辺りは autocmd OptionSet を使えばいい感じに自動生成してくれそうですがうーん。

まとめ

  • 'backupdir''undodir' などのディレクトリは Vim 側で自動生成されない
  • めんどくさいことは vimrc で自動化してしまおう


まあ、めんどくさいことは Vim script をさくっと書いてしまうとよいですね。