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
mkdir -p %:h
ネストされた存在しないパスに対して機能し、パスが既に存在し、%:h
現在のファイルの完全パスである場合にエラーを発生させないため、より優れています。ただし、これを自動的に呼び出す方法はわかりません。通常、これはautomcommandsで行われますが、BufWritePre
イベントはここでは機能しないようです。