Si invoco vim foo/bar/somefile
pero foo/bar
aún no existo, Vim se niega a guardar.
Sé que podría cambiar a un shell o hacerlo :!mkdir foo/bar
desde Vim, pero soy vago :) ¿Hay alguna manera de hacer que Vim lo haga automáticamente cuando guarda el búfer?
mkdir -p %:h
es mejor porque funciona para rutas anidadas no existentes, 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 comandos automáticos, pero elBufWritePre
evento no parece funcionar aquí.write
y llama al sistemamkdir -p
dedirname
otra manera, asignarlo aW
... soy demasiado perezoso para buscar la sintaxis y la publicación, como una respuesta ... Lo siento:w
paramkdir -p %:h
seguir el edificio:write
Respuestas:
Tenga en cuenta las condiciones:
expand("<afile>")!~#'^\w\+:/'
evitará que vim cree directorios para archivos comoftp://*
y!isdirectory
evitará 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
:W
comando. Idealmente, me gustaría tener todos:w!
,:wq
,:wq!
,:wall
etc 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/_vimrc
que va a terminar con cuatro nuevos directorios:/mnt/windows/Documents
,./and
,./Settings
y./Settings/User
. Y, por cierto,:execute
aquí no es necesario .system()
función para llamadas de shell completamente silenciosas, pero no necesita ambas:execute
y%:p:h
::silent !mkdir -p %:p:h
funciona exactamente como lo que ha escrito (aunque puede que lo necesite:redraw!
al final, en este caso:execute
es ú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 esaugroup
yautocmd!
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é:!mkdir
no va a funcionar en Windows.