lunes, noviembre 30, 2015

vim: registros y macros (I)

vim utiliza una serie de registros internos para manejar el texto que se está editando. Si consultamos la ayuda con :help registers veremos que hay nueve tipos distintos. En esta entrada me voy a centrar en los llamados registros con nombre, aquellos que se identifican con una letra del alfabeto (de la a a la z). Éstos sólo los usa vim cuando se referencia a los mismos de manera específica.

Hay varios comando que se le puede especifar el registro destino donde queremos que se almacene los resultados del mismo. Por ejemplo, si se quiere copiar las 4 primeras líneas de un fichero al registro a:

:1,4y a

Puede verse el contenido del registro a con los datos copiados con:

:register a

Si se quisiera insertar el contenido del registro a al final del fichero se podría hacer de la siguiente manera:

:$pu a

Esta no deja de ser una manera de usar el conjunto de registros con nombre de vim como una especie de block de notas donde podemos poner texto e ir pegando según nos convenga. Una propiedad interesante que tienen los registros es que su contenido puede ser interpretado como una secuencia de pulsaciones que son órdenes de vim, es decir, los registros se utilizan para definir macros.

Por ejemplo, supongamos que queremos usar el registro a de tal manera que cuando se ejecute la macro vim automáticamente realice los siguientes pasos:

  • Vaya a una nueva línea
  • Pase a modo de inserción
  • Inserte un texto.
  • Situe el cursor en una determinada posición en el texto insertado.

Para grabar una macro usamos la orden ql, introducimos las órdenes de vim que nos interese y cuando terminamos pulsamos q. Para ejecutar una macro se utiliza @l. En ambos casos l es el nombre del registro que queremos usar. Cuando vim está grabando una macro de esta manera, aparecerá la palabra recording en la línea de comando. Un ejemplo de una macro grabada esa manera es el siguiente:

$a^M<p style="text-indent: 30px;">^M^M</p>^[

El comando anterior sólo lo utilizo para que se vea lo que podemos hacer con vim en una macro. No está preparado para poder copiarse directamente a nuestro $HOME/.vimrc, ya que tiene caracteres de control que no están correctamente en el texto.

Lo interesante es poder mapea estas macros a secuencias de teclas, de tal manera que las mismas se ejecuten de manera automática al pulsarlas. Por ejemplo, si quiero que la macro anterior, grabada en el registro a se ejecute al pulsar F1, sólo en el modo normal del editor:

:nmap <F1> @a

La limitación más importante que tiene el mecanismo de registros es que son globales a vim, no están personalizados por cada buffer de texto que estemos editando, con lo cual las macros que hayamos grabado, serán iguales para todo vim. Esto, sin embargo, puede tener cierta solución usando los eventos de BufRead / BufEnter, para ir definiendo las macros de acuerdo a nuestros intereses en ciertos buffers de texto.

Referencias

No hay comentarios: