1. ホーム
  2. vim

[解決済み] Vim 保存時に親ディレクトリを作成する

2022-07-12 15:59:19

質問

もし私が vim foo/bar/somefilefoo/bar が既に存在しない場合、Vim は保存を拒否します。

シェルに切り替えるか、あるいは :!mkdir foo/bar を実行することもできますが、私は怠け者です :) Vim がバッファを保存するときに自動的にそうするようにする方法はないでしょうか?

どのように解決するのですか?

augroup BWCCreateDir
    autocmd!
    autocmd BufWritePre * if expand("<afile>")!~#'^\w\+:/' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand('%:h'), 1) | redraw! | endif
augroup END

条件に注意してください。 expand("<afile>")!~#'^\w\+:/' のようなファイルのためのディレクトリを vim が作成しないようにします。 ftp://*!isdirectory とすることで、高価な mkdir の呼び出しを防ぐことができます。

更新 これは、空でない buftype もチェックするものです。 mkdir() :

function s:MkNonExDir(file, buf)
    if empty(getbufvar(a:buf, '&buftype')) && a:file!~#'\v^\w+\:\/'
        let dir=fnamemodify(a:file, ':h')
        if !isdirectory(dir)
            call mkdir(dir, 'p')
        endif
    endif
endfunction
augroup BWCCreateDir
    autocmd!
    autocmd BufWritePre * :call s:MkNonExDir(expand('<afile>'), +expand('<abuf>'))
augroup END