VIM Usage (Tips & Tricks) - Chapter IV

De vuelta con el mini-curso de Vim.

Esta vez conoceremos algunos comandos de recorta, pinta y colorea así como la edición de múltiples ficheros.

Cabe destacar el uso de vimdiff para la fácil y rápida comparación de ficheros y la creación de macros para dejar que Vim haga por nosotros esos procesos repetitivos en la edición de ficheros.

Allá vamos...

Copy, Cut & Paste
O recorta, pinta y colorea

El proceso para seleccionar una porción de texto y bien, cortarlo o copiarlo para luego pegarlo en otro lugar del fichero que estamos editando sería el siguiente:

  1. Nos posicionamos en el lugar en el que comenzaremos la selección de texto
  2. Presionamos v si deseamos seleccionar palabras o bien V si deseamos seleccionar líneas completas
  3. Nos posicionamos en el lugar en el que deseamos finalizar la selección
  4. Presionamos y si deseamos copiar el texto seleccionado o bien d si deseamos cortarlo
  5. Nos posicionamos en el lugar en el que deseamos pegar el texto
  6. Presionamos p si deseamos pegarlo justo detrás de la posición del cursor o bien P si deseamos pegarla delante del cursor

Fácil, ¿no?. El caso es que, en cuanto realicemos otra selección, la anterior se perderá. Podemos guardar las selecciones de texto más usadas y utilizarlas más tarde cuando queramos utilizando los registros. Para ello simplemente tendremos que indicar el nombre del registro en el que deseamos guardar la selección antes de cortarla o copiarla al registro.

Ejemplos:

"xy
Copia el texto seleccionado y lo guarda en el registro de nombre x
"fd
Corta el texto seleccionado y lo guarda en el registro de nombre f

Para pegar el contenido de un registro simplemente debemos indicar el nombre del registro desde el que deseamos pegar antes del comando pegar (p).

Ejemplos:

"xp
Pega el contenido del registro de nombre x en la posición del cursor
"fp
Pega el contenido del registro de nombre f en la posición del cursor

Llegará un momento en el que no nos acordemos de qué guardamos ni en qué registro. Para ello podemos examinar el nombre y contenido de los registros ejecutando:

:registers

El nombre de los registros se clasifica en:

Registros de 0-9
Es un histórico de las selecciones utilizadas recientemente. 0 como más reciente y 9 como menos reciente
Registros de a-z
Registros del usuario. En estos registros se pueden guardar nuestras selecciones. Si copiamos algo en ellos el contenido anterior se pierde
Registros de A-Z
Mismos registros del usuario a-z con la diferencia de que al utilizar este nombre el contenido de la selección se agrega al contenido que hubiera previamente en el registro
Registros Especiales:
"%
Contiene el nombre del fichero actual
"#
Contiene el nombre del siguiente fichero en el buffer, en el caso de que tengamos varios abiertos. (Veremos más adelante cómo hacer esto)
".
Contiene el último texto insertado
":
Contiene el último comando ejecutado

Uso de Múltiples Ficheros

Si estamos dentro de un fichero y posicionamos el cursor encima del nombre de otro fichero podremos abrirlo cómodamente empleando:

gf

En el caso de que no hayamos guardado los cambios no nos dejará abrirlo ya que se perderán. Para abrir cualquier fichero sin guardar los cambios del actual podemos utilizar:

:e path/file

De este modo cargamos el fichero file en el buffer. Podemos cargar más ficheros en el buffer y cortar o copiar texto entre ellos. Para ver los ficheros que tenemos abiertos en el buffer ejecutamos:

:buffers

Este comando nos mostrará el número de buffer, el nombre del fichero y la línea en la que nos encontramos en ese fichero. Para cambiarnos a otro buffer, simplemente tecleamos:

:buffer num_buffer

Indicando en número de buffer en num_buffer nos desplazaremos al fichero almacenado en el mismo. Para cerrar un buffer sin necesidad de cerrar Vim, empleamos:

:bd

De este modo cerramos el buffer en el que estemos en ese momento.

Vim - Diff & Patch

Mediante vimdiff podemos comparar dos ficheros dentro del mismo editor y realizar las modificaciones necesarias en los mismos. Para ello ejecutamos vimdiff desde la línea de comandos de este modo:

vimdiff file1 file2

O bien

vim -d file1 file2

El editor Vim se abrirá en modo comparación de ficheros con la ventana dividida en dos, una para cada fichero. Las diferencias entre ambos ficheros serán fácilmente identificadas por los colores de resaltado de nuestra configuración de colores, que ya vimos en capítulos anteriores. Podemos desplazarnos cómodamente entre ellas mediante el uso de:

]c
Avanzamos a la siguiente diferencia
[c
Retrocedemos a la diferencia anterior

Podemos editar cualquiera de los dos ficheros haciendo uso de los buffers como hemos visto antes, teniendo en cuenta que la ventana de edición es la de la izquierda y es donde se cargará el buffer seleccionado. Los cambios se irán reflejando a medida que vayamos modificando los ficheros. Podemos igualar las porciones de los ficheros que sean diferentes, posicionándonos en la misma y tomándola de uno u otro fichero de este modo:

:diffget
Insertamos el texto diferente en el fichero comparado desde el fichero contra el que comparamos, es decir, desde el fichero de la derecha al de la izquierda
:diffput
Insertamos el texto diferente desde el fichero comparado en el fichero contra el que comparamos, es decir, desde el fichero de la izquierda al de la derecha

Por último vamos a ver cómo aplicar un parche al fichero actual desde el Vim para visualizar los cambios que se efctuarán sobre el mismo:

:vert diffpatch patchfile

Aplicamos el parche patchfile sobre el fichero actual y visualizamos los cambios que se efectuarán en el mismo.

Macros

Por último veremos unos comandos que nos ayudarán mucho en esas tareas de edición de texto repetitivas y que tanto nos fascinan...

Imaginemos que tenemos que editar un fichero y aplicarle ciertos cambios todas las líneas, por ejemplo, queremos convertir un fichero CSV en una tabla HTML. Deberíamos aplicarle a cada fila las etiquetas HTML correspondientes, línea por línea, sabiendo que los cambios aplicados son los mismos en cada una.

Tomemos el siguiente ejemplo de fichero, de los números de versiones de Debian, con sus nombres en clave, fecha de salida, arquitecturas soportadas y número aproximado de paquetes:


1.1,Buzz,17/6/1996,1,474;
1.2,Rex,12/12/1996,1,848;
1.3,Bo,2/6/1997,1,974;
2.0,Hamm,24/7/1998,2,1500;
2.1,Slink,9/3/1999,4,2250;
2.2,Potato,15/8/2000,6,3900;
3.0,Woody,19/7/2002,11,8500;
3.1,Sarge,6/6/2005,11,15400;
4.0,Etch,8/4/2007,11,18000;
5.0,Lenny,14/2/2009,12,25000;

Cada campo está separado por una coma y cada registro por punto y coma. Para convertir este fichero en una tabla HTML podríamos crear una macro que se encargue del trabajo tedioso de modificar línea a línea cada registro del fichero. El proceso sería el siguiente:

Nota: He incluido espacios dentro de las etiquetas HTML para que no las parsee el editor.

gg
Nos posicionamos al principio del fichero CSV, teniendo en cuenta que la primera línea es un registro, no los nombres de los campos
qa
Iniciamos la grabación de la macro en el slot a
i< tr >< td >
Incluimos las estiquetas de nueva fila y nueva celda de la tabla
[ESC]/,
Buscamos el final del primer campo, que viene delimitado por una coma
xi< /td >< td >
Eliminamos la coma e incluimos las etiquetas de cierre y apertura de celdas
[ESC]n
Repetimos la búsqueda para el siguiente campo, buscando el final del segundo campo, que viene delimitado por otra coma
xi< /td >< td >
Eliminamos la coma e incluimos las etiquetas de cierre y apertura de celdas
Sucesivamente vamos etiquetando todos los campos hasta llegar al último en el que realizaremos los siguientes pasos...
[ESC]/;
En el último campo debemos buscar el caracter que delimita el final del registro, es decir, un punto y coma
xA< /td >< /tr >
Eliminamos el punto y coma y agregamos al final de la línea las etiquetas de cierre de celda y de fila
[ESC]j^
Avanzamos una línea hacia abajo y nos posicionamos al principio de la misma para continuar la edición con la siguiente línea
q
Por último finalizamos la grabación de la macro

Podemos ejecutar la macro de este modo:

@a
Ejecutamos la macro almacenada en el slot a
5@b
Ejecutamos cinco veces la macro almacenada en el slot b

Y hasta aquí este capítulo. Cada vez se está complicando más la cosa. Espero explicarme de forma clara y que los temas tratados sean de vuestro interés. Para cualquier consulta o sugerencia ya sabéis dónde encontrarme.

Salu2.