augroup BWCCreateDir
autocmd!
autocmd BufWritePre * if expand("<afile>")!~#'^\w\+:/' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand('%:h'), 1) | redraw! | endif
augroup END
Nota: las condiciones expand("<afile>")!~#'^\w\+:/'
evitará vim desde la creación de directorios de archivos como ftp://*
y !isdirectory
prevendrán costosos llamada mkdir.
actualización: sligtly mejor solución que también comprueba buftype no vacío y utiliza 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' es mejor, ya que funciona de caminos existentes no anidados, no genera un error cuando la ruta ya existe, y '%: h' es la ruta completa del archivo actual. Sin embargo, no sé cómo invocar esto automáticamente. Normalmente, esto se hace con automcommands pero el evento 'BufWritePre' no parece funcionar aquí. –
Define una función que verifica si el archivo existe y llama a la escritura 'write' y llama al sistema a' mkdir -p' en 'dirname' de lo contrario, asócielo a' W' ... Soy demasiado flojo para buscar la sintaxis y que la publique como respuesta ... lo sentimos – khachik
supongo que podría combinar ambos sus sugerencias y alias ': W' a' mkdir -p%: H' seguido por el Builting ': write' –