Oct 02

Macros

Tag: basicoverdrive @ 2:22 am

Emacs, como su propio nombre indica es un Editor de MACroS. Existen ocasiones en las que realizamos una tarea de forma repetitiva, es ahí cuando necesitamos hacer uso de las macros, eso sí, en el momento que las macros no sean lo suficientemente potentes como para resolver dicha tarea, deberemos hacer uso de lisp, el cual, es mucho más potente.

C-x ( : ‘kmacro-start-macro‘; inicia una macro.
C-x ) : ‘kmacro-end-macro‘; finaliza una macro.
C-x e : ‘kmacro-end-and-call-macro‘; ejecuta la última macro definida. Presionando e repite la macro.

F3 : ‘kmacro-start-macro-or-insert-counter‘; inicia una macro. Si es presionado cuando se está definiendo una macro, inserta un contador.
F4 : ‘kmacro-end-or-call-macro‘; finaliza una macro si está en progreso. Si no lo está, invoca la última macro.

Dos formas de crear, guardar y ejecutar macros:

1) Indicamos que queremos comenzar a crear una macro

C-x (

2) Realizariamos una serie de tareas repetitivas

Por ejemplo escribimos: 1 TAB 2 TAB 3

3) Indicamos que queremos dar por finalizada la macro

C-x )

4) Ejecutamos la macro tantas veces como necesitemos

C-x e

Opción alternativa:

1) Indicamos que queemos comenzar a crear la macro

F3

2) Realizariamos una serie de tareas repetitivas

Por ejemplo escribimos: 1 TAB 2 TAB 3

3) Indicamos que queremos dar por finalizada la macro

F4

4) Ejecutamos la macro tantas veces como necesitemos

F4

La diferencia estriba, en que uno nos permite finalizar y ejecutar la macro directamente, o bien ejecutar una macro si esta ha sido definida.

Otro ejemplo para ejecutar una macro de forma repetida sin ir repetición tras repetición, lo cual lo hace mucho más útil para muchas repeticiones:

1) Creamos la macro

Realizar los pasos del 1 al 3 de cualquiera de las dos formas mostradas anteriormente.

2) Le decimos el número de repeticiones

Es decir el último paso de cualquiera de los dos ejemplos anteriores le pasariamos el parametro 100
M-100 F4 o M-100 C-x e
Por alguna extraña razón para pasarle los parametros empleando la tecla meta no puedo realizarlo con la tecla Alt, sino que debo usar Esc y soltar.

Además con C-u C-x ( podremos añadir nuevas tareas a la última macro definida. Decir también podemos aplicar macros sobre regiones mediante M-x apply-macro-to-region-lines.

Más acciones con macros:

C-x C-k n : ‘name-last-kbd-macro’; nombra la última macro creada. Esto es, que guardara en memoria la ultima macro creada por nosotros (se nos preguntara por el nombre de la macro).
(sin keystroke asociada) : ‘insert-kbd-macro‘; inserta una macro nombrada en un fichero, de esta forma podremos guardar los cambios y re-utilizar la macro en un futuro.
C-x q : ‘kbd-macro-query‘; inserta una petición en una definición de macro. [A EXPANDIR]
C-u C-x q : inserta una edición recursiva en una definición de macro. [A EXPANDIR]
C-M-c : ‘exit-recursive-edit‘; sale de una edición recursiva. [A EXPANDIR]
C-x C-k b : ‘kmacro-bind-to-key‘; Asocia una macro a un keystroke. C-x C-k [0-9A-Z] están reservadas.
C-x C-k SPC : ‘kmacro-step-edit-macro‘; edita una macro mientras se ejecuta paso a paso. En el modeline nos mostrara las distintas opciones entre ellas y, n y q (para si, no o salir).
C-x C-k l : ‘kmacro-edit-lossage‘; asocia los últimos 100 keystrokes en una macro.
C-x C-k e : ‘edit-kbd-macro‘; edita una macro. C-x e para la última macro definida, M-x para una macro nombrada, C-h l para macros asociadas a una tecla.
C-x C-k <CR>: ‘kmacro-edit-macro‘; edita la última macro.
C-x C-k C-e : ‘kmacro-edit-macro-repeat‘; edita la última macro de nuevo.

Al igual que existe un kill ring para aquellos elementos eliminados, existe un macro ring para aquellas macros creadas, al cual se acceder o alterar mediante los siguientes keystrokes:

C-x C-k C-t : ‘kmacro-swap-ring‘; transpone la última macro con la anterior.
C-x C-k C-d : ‘kmacro-delete-ring-head‘; elimina la última macro del macro ring.
C-x C-k C-p : ‘kmacro-cycle-ring-previous‘; salta a la macro anterior del macro ring.
C-x C-k C-n : ‘kmacro-cycle-ring-next‘; salta a la siguiente macro del macro ring.
C-x C-k r : ‘apply-macro-to-region-lines‘; aplica la macro a cada línea de una región.

Con esto podemos ahorrar mucho tiempo y ser más productivos, sin embargo, cuando las macros no resuelven tareas complejas que requieren más potencia, debemos plantearnos hacer uso de lisp.

4 Responses to “Macros”

  1. slack says:

    «Probablemente los usuarios de vi/vim no tendrán la más remota idea sobre que es una macro.»

    Tampoco nos pasemos, que vim tiene macros: «qx» en modo comando para empezar a grabar, donde x es el nombre de la macro, realizamos la tarea repetitiva en cuestión, terminamos la macro con «q», y ejecutamos la macro con «@x».

    Ah, y Emacs no es «Emulador de MACroS» sino «Editor MACroS», porque en origen era un conjunto de macros para TECO (véase el FAQ de Emacs ;)

    X-)

    Saludos,
    slack

  2. slack says:

    Vaya, el wordpress me ha jodido el post (un boton de preview estaría genial). Antes del «X-)» debería poner «<pedantic mode off>».

  3. overdrive says:

    muchas gracias por la correcion slack :_) ya lo corrijo

  4. admin says:

    De todas formas queria referirme a que es mas probable que los usuarios de emacs esten familiarizados con las macros, mas que lo de vi/vim debido a que como bien dices emacs es un editor de macros, no que no existiesen :) venga, un saludo y gracias por leerme.

Leave a Reply

You must be logged in to post a comment.