[Vim] Objetos de texto

Estándar

Una de las cosas que me gustan de los editores de texto es que siempre acabas aprendiendo algo nuevo que desearías haber sabido mucho tiempo atrás. Esto sucede comúmmente con Vim, que al ser uno de los editores más complejos (y completos) que existen multiplica la probabilidad de pasar por alto esa característica que aumenta tu productividad de manera notable.

Esta semana descubrí una de estas características leyendo los RSS a los que estoy suscrito. Me encontré con un artículo de opinión acerca de porque el autor seguía buscando las características de Vim en otros editores más completos, y cuales eran para él las mejores utilidades que tiene este editor con respecto a toda la creciente oferta de editores y IDEs disponible ante nosotros.

Aunque la gran mayoría de esas ventajas ya las conocía (movimiento eficiente sin ratón, búsquedas, multiplataforma, etc.), hubo una que me llamo la atención porque no la conocía, los objetos de texto de Vim (o los Vim Text Objects en inglés). Buscando más información al respecto, encontré un artículo en otro blog que los explicaba bastante bien y es en el que voy a basar para explicar este tema más en profundidad.

Todos los que utilizamos Vim conocemos, o deberíamos por lo menos, los motions, o acciones posibles de movimiento con respecto a la posición actual del cursor en el texto. Estos motions nos ayudan a movernos a través del texto de forma más eficiente. Algunos de los motions mas utilizados son:

  • Palabras: con la tecla w podemos avanzar palabra por palabra en el texto. El opuesto a este movimiento es la tecla b
  • Líneas: el más común. Utilizamos las teclas j y k para mover nuestro curso arriba y abajo entre las lineas del texto.
  • Letras: también muy común. Las teclas h y l nos permiten movernos una letra hacia la izquierda y una letra hacia la derecha respectivamente.
  • Principio y final de linea: Un poco menos conocidos, pero no menos útiles son estos movimientos que podemos realizar con el símbolo ^ y $ respectivamente. Cabe decir que el motion que nos lleva al principio de la línea, nos llevará al primer carácter no blanco de la linea, lo que suele ser lo más interesate. Si queremos ir al principio de la linea real deberemos utilizar 0.
  • Primera ocurrencia de un carácter en la linea: Este es un motion especialmente útil a la hora de sustituir partes de una línea. Utilizando la combinación f y a continuación cualquier carácter, el cursor se situará posterior a la primera aparición del carácter en la línea. Si queremos que el cursor se encuentre delante de dicho carácter utilizaremos t en vez de f.

Estos motions se pueden utilizar, como hemos dicho, para la navegación en el texto, pero su utilidad se desata cuando se combinan con los comandos para la manipulación de texto. Usualmente el esquema utilizado en vim para manipular un texto tiene la siguiente forma:

<número de repeticiones><comando><motion>

De esta manera, si quisieramos borrar dos palabras desde la posición del cursor actual ejecutaríamos el comando:

2dw

Que se explica como dos repeticiones del comando eliminar (delete para la mnemotécnia) aplicado sobre palabras. Al principio esto es difícil de asimilar, pero cuando se usa de manera continuada ya no hay que pensarlo excesivamente a la hora de usarlo y se echa mucho de menos cuando utilizamos un editor que no es Vim. Los comandos más utilizados, y sobre los que váis a ver ejemplos en este post, son eliminar (delete) y cambiar (change).

Eliminar dos palabras con un motion

Eliminar dos palabras con un motion

A menudo nos vemos en la necesidad de borrar todo lo que se encuentra entre un bloque entrecomilleado, y con los comandos anteriores nos puede resultar poco intuitivo pensar cuantas palabras existen entre unas comillas y otras. Hasta ahora el método que andaba utilizando era seleccionar de manera visual (entramos en modo visual con la tecla v desde modo normal), y utilizar uno de los comandos para manipular el texto. Esto es poco eficiente y bastante frustrante cuando se tiene que hacer en repetidas ocasiones.

Los susodichos objetos de texto son abstracciones de estructuras más complejas de texto. Nos ayudan a manejar de manera más eficiente estas situaciones en las que es un bloque concreto de texto el que tenemos que manipular, como en el ejemplo anterior. De esta manera transformamos nuestra estructura de comando anterior por:

<comando><modificador de inclusión><objeto de texto>

La parte del comando ya nos la conocemos, pero las otras dos las vamos a explicar un poco.

Modificador de inclusión

Se trata de un carácter entre dos posibilidades, a o i.

El carácter a implica la manipulación del bloque completo de texto, incluido el delimitador que lo define. Si hablásemos de un texto que se encuentra entre paréntesis, si incluimos este modificador nos estaremos refiriendo tanto al texto del interior, como a los paréntesis en sí mismos.

Por el contrario, el modificador i implica la exclusión del delimitador. Para los que nos gustan las nmemotécnias debemos saber que el carácter i se refiere a inner (interno en español), y el carácter a a la construcción utilizada en inglés para refererise a un objeto, es decir que en inglés diríamos delete a parenthesized expression (elimina una expresión entre paréntesis), lo que incluiría los paréntesis.

Objetos de texto

Vim define unos objetos de texto disponibles en cualquier instalación del editor, pero la lista se puede ampliar mediante configuración del editor de manera externa. Aqui podemos ver algunos de los objetos de texto disponibles inicialmente:

  • Palabras: Si, las palabras además de utilizarse para motions, también se utilizan para objetos de texto. De hecho este es el objeto de texto más simple que existe en Vim y por supuesto su carácter asignado es la w.
  • Frases: En este caso la separación entre frases se considera un punto y un espacio. Tanto en este caso como en el anterior, el modificador i hace que no se manipule el espacio que sigue al bloque de texto, mientras que el modificador a si que lo incluye.
  • Párrafos: Se define un párrafo como un bloque de texto separado del siguiente por una línea en blanco. Como podéis imaginar, los modificadores harán que el comando influya en la linea en blanco posterior o no.

Hasta aquí los bloques de texto más básicos. Puede no parecer una gran ventaja frente a las motions por el momento, pero hay una diferencia muy importante entre un tipo de comando y el otro. Los comandos que utilizan bloques de texto no requieren que el cursor este en ninguna posición en particular. Si queremos borrar una palabra completa utilizando un motion deberemos posicionar nuestro cursor al principio de la palabra y pulsar dw. Si nos encontramos en cualquier situación dentro de la palabra el comando borrará desde el cursor hasta el final de la palabra, porque el motion no se refiere al bloque de texto, sino al movimiento hasta el final de la palabra. Conforme el bloque de texto se hace más grande la utilidad de esta característica crece; no cabe decir que situarse al principio de una palabra es sencillo y rápido, pero al principio de una frase no tanto, y al principio de un párrafo aún menos.

Sin embargo, esto no se queda en esos pocos objetos de texto, sino que existen algunos más útiles y enfocados al código fuente, como los siguientes:

  • Entrecomilleados: Utilizando como objeto de texto los carácteres , o ` podemos lograr ejecutar un comando sobre un texto rodeado por estos caracteres.
  • Paréntesis, corchetes y llaves: Para manipular texto entre estos delimitadores tan comunes en todos los lenguajes de programación actuales, tendremos que usar sus caracteres de cierre. Asi, el comando di) nos permitirá borrar el interior de una expresión entre paréntesis.
  • Etiquetas de marcado: Probablemente uno de los objetos de texto más útiles, éste nos permite ejecutar un comando sobre el texto que se encuentre entre una etiqueta de marcado en lenguajes como HTML o XML.

Estos objetos de texto son aún más interesantes que los anteriores porque nos permiten ejecutar comandos desde cualquier parte de la linea en la que se encuentran. Es decir, si nos encontramos en una linea como la siguiente

if x == "hola mundo":
    return True

y nuestro cursor se encuentra en la linea en la que se define el if, podemos utilizar el comando

ci"

el cual nos borrará el texto entrecomilleado y situará el cursor dentro de las comillas dobles, sin necesidad de movernos en ningún momento. Útil y sorprendente a partes iguales. Si en la línea se encontraran varios literales rodeados por comillas dobles, el comando se ejecutaría sobre la primera ocurrencia de la linea, o si estamos dentro de uno de esos literales, sobre ese en concreto. A continuación podéis ver el efecto:

Cambiar texto entrecomilleado con objetos de texto en Vim

Cambiar texto entrecomilleado con objetos de texto en Vim

Cómo todo en Vim, esto es susceptible de ser asignado a un atajo personalizado, y si somos desarrolladores web o editamos mucho XML en nuestro día a día quizás nos convendría crear nuestro propio atajo para modificar el texto de una etiqueta. Todo es susceptible de ser personalizado en Vim. También existen otros objetos de texto que el autor del post original comenta, pero que son mucho más específicos, y cabe la posibilidad de crear nuevos por nosotros mismos.

¡A convertirse en más productivo!

Anuncios

Un comentario en “[Vim] Objetos de texto

  1. kentkornerstoane

    Soy el autor del artículo de opinión al que se refiere éste. Los objetos de texto son la prueba que le doy cuando me encuentro con algún editor nuevo. Si no tiene la idea de objetos de texto, ni cosa similar, no vale la pena seguir con ese editor. Los objetos de texto demuestran que el editor entiende algo del contenido, y así puede facilitarme el manejo del contenido. ¡Buen tutorial!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s