Estoy en el proceso de embellecer algún código fuente usando vim. {1}
He creado un par de macros vim que realizan los pasos individuales: eliminar espacios en blanco al final, eliminar líneas vacías después {
, eliminar líneas vacías antes {
, ese tipo de cosas.
Ahora, quiero crear una macro que ejecute todas las macros individuales en secuencia. Sin embargo, una vez que finaliza la primera macro recursiva (porque ya no puede encontrar coincidencias -> error de coincidencia), mi macro "wrapper" también finaliza.
¿Hay alguna manera de hacer que una macro vim continúe después de que un submacro generó un error?
{1} Yo sé acerca reformatters automáticas. Incluso podría usarlos en mi problema actual. Simplemente mencioné el reformateo de la fuente por el bien del ejemplo. No publique ninguna respuesta sobre este embellecedor fuente o eso. La pregunta no se trata de reformatear el código per se , sino de las macros vim.
Ejemplo:
- Macro 1: recorte de espacios en blanco al final
qw/\s\+$d$@wq
- Macro 2: eliminar líneas vacías antes}
qe/\n\n *}dd@eq
- Macro de envoltura - reenganche, Macro 1, Macro 2 -
qr:retab@w@eq
Cuando ejecuto el reiniciador, @r
se volverá a agrupar, luego ejecutará la Macro 1 hasta que no se encuentren más espacios en blanco al final, luego terminaré ( sin ejecutar la Macro 2).
Aclaración:
Lo que estoy buscando es cómo llamar a un submacro para que cuando ese submacro termine, la macro de llamada continúe.
Si el comando que falla es una sustitución que no encuentra su patrón, por ejemplo,
cuando
foo
no existe en el búfer, puede agregar lae
bandera para ignorar ese error, por ejemplo,Ver
Puedes decirle a Vim que ignore los errores de algunos comandos ex precediéndolos con
:silent!
. VerEditar siguiendo la adición de ejemplo a la pregunta
Macro 1 y Macro 2 son recursivas y ninguna tiene ningún mecanismo explícito para terminar la recursividad. Supongo que se está disparando una de las pruebas internas de Vim para la recursividad ilimitada, lo que genera un error. Si la Macro 1 está generando dicho error, entonces ese error terminará la ejecución de la Macro de envoltura inmediatamente después
@w
.Mi sugerencia sería limitar el número de veces que se ejecutan sus macros reescribiéndolas como: comandos ex y limitando el rango de líneas sobre las que se ejecutan. Por ejemplo:
donde
^M
significa escribir su tecla Intro o Retorno. No los he probado juntos en su Wrapper Macro, pero creo que podrá corregir cualquier error que haya cometido.fuente
/foo
). Si bien,:silent!
efectivamente, el truco del submacro recursivo no abortó la macro de envoltura, ahora el submacro no termina en absoluto ... y sospecho que hacer que de alguna manera termine de nuevo también volvería a terminar la macro de envoltura. Parece que estoy atascado. : - \Lo que funcionó para mí fue una combinación de respuestas de @Peter Rincker y @garyjohn. Por separado, seguía teniendo problemas extraños.
Creo que los caracteres
silent!
en el<leader>rt
, y el tubo entre elendtry
y elw
fueron las claves, simplemente tener el salto de línea después delendtry
error. Lostry
s trabajaron cuando yo acababa de entrar en ellos, pero cuando se ejecuta como una macro no se encontró el error sobre el texto de búsqueda mantendría a ser elevado.fuente
Rutinariamente creo macros sobre la marcha cuando necesito hacer una tarea repetitiva entre muchos archivos. En mi caso, tengo NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) instalado en VIM, que crea una
vsplit
ventana, y a la izquierda, tengo una lista de todos los archivos en El directorio actual. En un ejemplo, necesito encontrar la primera instancia de la cadenaMY_TEST
en el archivo y luego eliminar, si está presente, un prefijo etiquetado comoCUSTOM_PREFIX-
de esa línea, guardar el archivo y luego pasar a la siguiente.Así es como hago que esta macro funcione en aproximadamente 2000 archivos en el directorio actual. Podría escribir un script bash para hacer esto, pero en mi caso es más rápido en VIM. El
+
denota teclas presionadas simulq,a
CTRL+ W,←
↓
ENTER
q
1000, @,a
¡Espero que esto ayude!
fuente