Si invoco vim foo/bar/somefilepero foo/baraún no existo, Vim se niega a guardar.
Sé que podría cambiar a un shell o hacerlo :!mkdir foo/bardesde Vim, pero soy vago :) ¿Hay alguna manera de hacer que Vim lo haga automáticamente cuando guarda el búfer?

mkdir -p %:hes mejor porque funciona para rutas anidadas no existentes, no genera un error cuando la ruta ya existe y%:hes la ruta completa del archivo actual. Sin embargo, no sé cómo invocar esto automáticamente. Normalmente, esto se hace con comandos automáticos, pero elBufWritePreevento no parece funcionar aquí.writey llama al sistemamkdir -pdedirnameotra manera, asignarlo aW... soy demasiado perezoso para buscar la sintaxis y la publicación, como una respuesta ... Lo siento:wparamkdir -p %:hseguir el edificio:writeRespuestas:
Tenga en cuenta las condiciones:
expand("<afile>")!~#'^\w\+:/'evitará que vim cree directorios para archivos comoftp://*y!isdirectoryevitará llamadas costosas a mkdir.Actualización : solución ligeramente mejor que también comprueba el tipo de búfer no vacío y utiliza
mkdir():fuente
call mkdir(expand('%:h'), 'p')podría ser más portátil.Según las sugerencias de mi pregunta, esto es lo que terminé con:
Esto define el
:Wcomando. Idealmente, me gustaría tener todos:w!,:wq,:wq!,:walletc funcionar de la misma, pero no estoy seguro si es posible sin reimplementar básicamente a todos con funciones personalizadas.fuente
:W, mi pantalla se vuelve casi en blanco. Intentaré eliminar mis opciones anteriores y dar mi opinión.Agregué esto a mi ~ / .vimrc
cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/Si necesito crear el directorio en el que estoy, escribo
:mk.y lo reemplaza con "! Mkdir -p / ruta / a / mi / archivo /" y me permite revisar el comando antes de invocarlo.fuente
Hice
:saveas!crear el directorio si faltaba: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bbfuente
Este código le pedirá que cree el directorio con
:w, o simplemente lo haga con:w!:fuente
Creo que logré hacer esto en tres líneas, combinando lo que otros dicen en esta respuesta.
Esto parece funcionar:
Intenta crear la carpeta automáticamente al guardar un búfer. Si sucede algo malo (es decir, problemas de permisos), simplemente se cerrará y dejará que falle la escritura del archivo.
Si alguien ve defectos obvios, publique un comentario. No estoy muy versado en vimscript.
EDITAR: Notas gracias a ZyX
fuente
%en tales scripts. Vim no se va a escapar símbolos especiales: por ejemplo, si está editando un archivo con el nombre/mnt/windows/Documents and Settings/User/_vimrcque va a terminar con cuatro nuevos directorios:/mnt/windows/Documents,./and,./Settingsy./Settings/User. Y, por cierto,:executeaquí no es necesario .system()función para llamadas de shell completamente silenciosas, pero no necesita ambas:executey%:p:h::silent !mkdir -p %:p:hfunciona exactamente como lo que ha escrito (aunque puede que lo necesite:redraw!al final, en este caso:executees útil), pero es mejor usarlocall system('mkdir -p '.shellescape(expand('%:p:h'))). Hacer uso:execute '!command' shellescape(arg, 1)(con el segundo argumento de shellescape) si se tiene que utilizar en lugar de las explosionessystem(). Utilice bangs si el argumento de escape contiene nuevas líneas.:source ~/.vimrc) (para esto esaugroupyautocmd!son), vista desechada después de iniciar shell comandos (para eso esredraw!), crear directorios de basura en caso de usar pseudo-archivos (en el primer código recortado, se verifica solo haciendo coincidir el nombre del archivo con un patrón, pero en el segundo también verifico&buftype) y una llamada de shell inútil en el directorio de casos existe (isdirectory()condición).%expansión como para sugerir su uso a nadie. Los pseudoarchivos se utilizan en una gran cantidad de complementos (por ejemplo, fugitive o my aurum), por lo que vale la pena cuidarlos. Dotar de recursos a vimrc también es una práctica común. Puede tener lo que quiera en el vimrc, pero no lo sugiera como respuesta. El uso de la:silent! call mkdir(expand('%:p:h'), 'p')variante resuelve dos de los puntos que mencioné y el tercero que no mencioné:!mkdirno va a funcionar en Windows.