Vim でファイル保存時にディレクトリがなかったら作る

Vim で新規ファイルを作成する時、指定したサブディレクトリがないと保存できない。

# 「hoge/fuga/」ディレクトリが存在しないと保存できない
$ vim hoge/fuga/test.txt

その場でなんとかするなら

:!mkdir -p %:h

とシェルコマンドを打てばディレクトリが作れるのだが、%:h あたりのイディオムを覚えられない。w

そこで、~/.vimrc に次のような処理を組み込んでおくと、ファイル保存時、ディレクトリが存在しなければ作成するかどうか問うように操作できる。

" ファイル保存時にディレクトリがなかったら作成するか問う
augroup vimrc-auto-mkdir
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
  
  function! s:auto_mkdir(dir, force)
    if !isdirectory(a:dir) && (a:force || input(printf('"%s" does not exist. Create? [y/N]', a:dir)) =~? '^y\%[es]$')
      call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
    endif
  endfunction
augroup END

質問なしにディレクトリを自動的に作って保存してほしければ次の処理。

augroup vimrc-auto-mkdir
  autocmd!
  autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'))
  
  function! s:auto_mkdir(dir)
    if !isdirectory(a:dir)
      call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
    endif
  endfunction
augroup END

コレを ~/.vimrc に書いておくだけで良い。