2011-06-02 9 views
15

Me tipo muy rápido y darse cuenta de que a veces accidentalmente guardar un archivo con el nombre de ; o : (tipo I :wq y se introduce a veces un error tipográfico).evitar guardar archivos con determinadas denominaciones en Vim

¿Hay alguna forma de escribir una macro que rechace guardar archivos que coincidan con ciertos nombres?

+3

Supongo que podría usar un autocomando con 'BufWritePre' para advertirle y no escribir archivos comenzando con'; * '. Pero ahora tengo sueño y lo intentaré cada vez que me despierte ... si aún no me lo han respondido. – abcd

Respuesta

17

Una solución simple pero eficaz sería definir un autocontrol que coincida con nombres de archivo potencialmente mal escritos, que emite una advertencia y finaliza el guardado.

:autocmd BufWritePre [:;]* throw 'Forbidden file name: ' . expand('<afile>') 

Tenga en cuenta que el comando :throw es necesario hacer Vim deja de escribir los contenido de un búfer.

Con el fin de evitar que E605 de error debido a una excepción no capturada, uno puede emitir un error al usar la carrera :echoerr comando en el bloque try. (:echoerr eleva su mensaje de error como una excepción cuando se llama desde el interior una construcción try. Ver :help :echoerr.)

:autocmd BufWritePre [:;]* 
\ try | echoerr 'Forbidden file name: ' . expand('<afile>') | endtry 

Si alguna vez es necesario guardar un archivo con un nombre que coincida con el patrón utilizado en lo anterior auto-comando, uno puede anteponer un comando de escritura con :noautocmd o establecer la opción eventignore en consecuencia (ver :help :noautocmd y :help eventignore para más detalles), por ejemplo

:noa w :ok.txt 
+0

Esto es genial (y tengo una función de guardado previo que hace algo muy similar), pero ¿hay alguna manera más sutil de evitar el guardado durante BufWritePre? Lanzar un error de esta manera da como resultado 'E605: Excepción no capturada'. Sería bueno si un mensaje pudiera hacerse eco en lugar del feo mensaje de error. –

+0

@Prince: Desafortunadamente, no hay otra manera de terminar la acción que desencadena el evento 'autocmd', que lanzar una excepción, hasta donde yo sé. Sin embargo, es posible deshacerse del error 'E605' envolviendo' throw' en 'try' -'catch'-la respuesta se actualiza. –

+0

Supongo que necesita 'echohl ErrorMsg | echom 'Nombre de archivo sospechoso:' .v: excepción | echohl NONE' en lugar de 'echoerr': echoerr no debe usarse porque 1. proporciona información no necesaria sobre el contexto de error aquí 2. dependiendo del contexto, puede o no transformarse en una excepción. Por último, odio el 'echoerr': las excepciones por sí mismas no son buenas, ya que crean puntos de salida ocultos adicionales para todas las funciones de la pila hasta que se encuentra' try..catch', pero 'echoerr' empeora ya que hace que los puntos de salida dependen del contexto. Una vez tuve un 'buen' tiempo para depurar un problema con 'echoerr'. – ZyX

Cuestiones relacionadas