que para hace directorio crear comando carpetas carpeta archivo vim mkdir

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.


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