2009-03-06 5 views
7

Me gustaría guardar la acción de repetición única actual (esto es lo que sucede cuando presiona.), Luego ejecute una macro y luego restaure el. acción (porque las macros generalmente lo cambian).Copia de seguridad: restablezca la acción de repetición actual (.) En VIM

¿Esto es posible?

Como alternativa, es posible escribir una macro sin cambiar la corriente. ¿acción? Creo que podría intentar hacer todo en el modo de comando, pero no estoy seguro si eso es posible.

Antecedentes: estoy escribiendo una función de buscador de archivos (como command-T en TextMate, vea http://github.com/mdemare/fuzzy_file_finder), y quiero hacer los menos cambios posibles en el entorno del usuario, por lo que los cambios tienen que ocurrir en la función . Actualmente, cuando cambias archivos usando esta función, tu. la acción se sobrescribe, lo cual es muy desagradable.

Respuesta

10

En VIM puede crear una macro que se ejecutará ninguna de las modificaciones que normalmente se puede hacer en el modo normal sin alterar la funcionalidad de rehacer [.] envolviendo esas ediciones en un usuario definido :function y luego ejecutar esa función con una clave :map ped.

Ejemplo

La mejor manera de ver es con un ejemplo. Supongamos que desea agregar el texto yyy al final de la línea actual cada vez que presiona la tecla F2, pero no desea que esto interfiera con el comando de rehacer [.].

Así es como se hace:

  1. Abrir una nueva ventana de vim y ejecutar los siguientes comandos:

    :fu JL() 
        normal Ayyy 
        endfu 
    :map <F2> :call JL()<Enter> 
    
  2. Ahora añadir un poco de texto, digamos xxx, escribiendo Axxx<Esc>

  3. Ahora presione la tecla [F2] y debería ver xxxyyy

  4. Finalmente, pulse la tecla [.] y debería ver xxxyyyxxx

Justo lo que quería!

Por qué esto funciona

Esto funciona debido a la naturaleza de la forma VIM ejecuta el comando rehacer. VIM realiza un seguimiento de los caracteres de un comando a medida que lo escribe. Cuando presiona la tecla [.], vuelve a colocar esos caracteres en el búfer del teclado para volver a ejecutarlos. Desafortunadamente, una simple macro q funciona de la misma manera: inserta caracteres en el búfer y al hacerlo sobrescribe el búfer de rehacer. El comando :normal hace esto también, pero cuando se coloca dentro de una función definida por el usuario obviamos esta limitación porque el código que ejecuta la función definida por el usuario guarda y restaura el búfer de rehacer durante la función definida por el usuario.

Todo esto sucede en eval.c y getchar.c en el código fuente de VIM. Busque saveRedobuff para ver qué está pasando.

4

Puede registrar una acción en un registro para usarlo más adelante. Prensa q seguido por un registro (az, AZ, 0-9 o " son identificadores de registros válidos), aplique el comando/acciones deseadas y la prensa q para detener la grabación . el comando se puede recuperar pulsando @ seguido por el registro .

Para obtener instrucciones más detalladas, consulte la sección complex repeat del Vim documentation.

NOTA: Por desgracia, la secuencia de qa.qu no va a hacer exactamente lo que quiere ya que el . El comando repetirá la última acción actual y no la última acción en el momento en que se grabó el comando.

+0

Lo sé, eso no es lo que quise decir en absoluto. Eso es lo que llamo una macro, y cambia el. acción. –

+0

Bueno, entonces supongo que tu respuesta es no ... –

4

La única forma en que puedo pensar en ayudarte: Remapear '.' para guardar un historial de acciones, que luego puede recuperar si es necesario. Para ideas sobre estas líneas, vea el plugin repeat.vim.

+0

¿Cómo se recupera la última acción reasignando '.'? ¿Cómo se almacena/modifica la última acción? –

+0

@monjardin: Realmente no sé esas respuestas, pero me encontré con el complemento vim que parecía que podría estar haciendo esas cosas, así que lo mencioné como una posible inspiración. –

Cuestiones relacionadas