para - Vim: crear directorios principales al guardar
crear un archivo en solaris (6)
Si invoco vim foo/bar/somefile
pero foo/bar
aún no existe, Vim se niega a guardar.
Sé que podría cambiar a un shell o hacerlo :!mkdir foo/bar
de Vim pero soy perezoso :) ¿Hay alguna manera de hacer que Vim lo haga automáticamente cuando guarda el búfer?
Agregué esto a mi ~ / .vimrc
cnoremap mk. !mkdir -p <cr>=expand("%:h")<cr>/
Si necesito crear el directorio en el que estoy, :mk.
y reemplaza eso con "! mkdir -p / path / to / my / file /" y me permite revisar el comando antes de invocarlo.
Con base en las sugerencias a mi pregunta, esto es lo que terminé con:
function WriteCreatingDirs()
execute '':silent !mkdir -p %:h''
write
endfunction
command W call WriteCreatingDirs()
Esto define el comando :W
Idealmente, me gustaría tener todo :w!
, :wq
:wq!
, :wall
etc funciona igual, pero no estoy seguro si es posible sin básicamente reimplementarlos todos con funciones personalizadas.
Creo que logré hacer esto en tres líneas, combinando lo que otros dicen sobre esta respuesta.
Esto parece hacer el truco:
if has("autocmd")
autocmd BufWritePre * :silent !mkdir -p %:p:h
end
Intenta crear la carpeta automáticamente al guardar un búfer. Si ocurre algo malo (es decir, problemas de permisos), se cerrará y dejará que el archivo escriba fallará.
Si alguien ve defectos obvios, publique un comentario. No soy muy versado en vimscript.
EDITAR: notas gracias a ZyX
- Esto no funcionará si sus carpetas tienen espacios en ellos (aparentemente no se escaparon correctamente o algo así)
- O si está haciendo pseudo archivos.
- O si está buscando su vimrc.
- Pero hijo, es corto.
Hice :saveas!
cree el directorio si falta: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bb
Este código le pedirá que cree el directorio con :w
, o simplemente lo haga con :w!
:
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("''" . a:dir . "'' does not exist. Create? [y/N]") =~? ''^y/%[es]$'')
call mkdir(iconv(a:dir, &encoding, &termencoding), ''p'')
endif
endfunction
augroup END
augroup BWCCreateDir
autocmd!
autocmd BufWritePre * if expand("<afile>")!~#''^/w/+:/'' && !isdirectory(expand("%:h")) | execute "silent! !mkdir -p ".shellescape(expand(''%:h''), 1) | redraw! | endif
augroup END
Tenga en cuenta las condiciones: expand("<afile>")!~#''^/w/+:/''
evitará que vim cree directorios para archivos como ftp://*
y !isdirectory
evitará costosas llamadas a mkdir.
Actualización : una solución ligeramente mejor que también comprueba si hay buftype no vacío y usa 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