blob: 42cb49aa601a2486a5b3e2fccc5fe2dc581ab86c (
plain) (
tree)
|
|
" Handle a :write operation; prompt for directory creation if needed with
" 'confirm', force it with :write!
function! write_mkpath#(path) abort
" Get all directory elements leading up to directory
let dir = fnamemodify(a:path, ':h')
" Directory exists, we don't need to do anything
if isdirectory(dir)
return
endif
" If :write! was issued, we'll try to create the missing path; failing that,
" if 'confirm' is enabled, and the user responds affirmatively to the
" prompt, that will do, too. Otherwise, we will allow the write to fail.
if v:cmdbang
let mkpath = 1
elseif &confirm
let mkpath = confirm('Create path '.dir.'?', "&Yes\n&No") == 1
else
let mkpath = 0
endif
" Stop here if we're not creating a path
if !mkpath
return
endif
" Create the full required path
call mkdir(dir, 'p')
" Prod Vim into realising the buffer's directory exists now, so that a
" subsequent change of working directory doesn't break it; this doesn't
" appear to be necessary on Windows, for reasons unclear
if !has('win32') && !has('win64')
silent keepalt file %
endif
" Re-run the BufWritePre hook, now that the directory exists and a useable
" filename has been set; this will start this function again from the top,
" but stop when it sees the directory now exists
doautocmd write_mkpath BufWritePre
endfunction
|