# Capítulo 4: La gramática de Vim Es sencillo sentirse intimidado por la complejidad de muchos de los comandos de Vim. Si ves a una persona que usa Vim habitualmente ejecutando `gUfV` o `1GdG`, puede que no sepas inmediatamente qué es lo que realizan esos comandos. En este capítulo, voy a romper la estructura general de los comandos de Vim en reglas simples de gramática. Este es el capítulo más importante de todo el libro. Una vez que entiendas la estructura similar a la gramática de los comandos de Vim, serás capaz de "hablarle" a Vim. Por cierto, cuando me refiero a *lenguaje de Vim* en este capítulo, no estoy refiriéndome a Vimscript (el lenguaje de programación propio para adaptar y crear complementos de Vim). Aquí se refiere al patrón general de los comandos del modo normal de Vim. ## Cómo aprender un lenguaje El inglés no es mi lengua nativa. Aprendí inglés cuando tenía 13 años. Tuve que hacer tres cosas para aumentar mis habilidades linguísticas: 1. Aprender las reglas gramáticas 2. Incrementar mi vocabulario 3. Practicar, practicar y practicar De igual manera, para hablar el lenguaje de Vim, necesitas aprender las reglas gramáticas, incrementar tu vocabulario y practicar hasta que puedas ejecutar los comandos sin necesidad de pensarlos. ## Reglas gramáticas Solo necesitas saber una regla gramática para hablar el lenguaje de Vim: ``` verbo + sustantivo ``` ¡Eso es todo! Esto es equivalente a decir en inglés estas frases: (en español aunque se entienden y se construyan de manera similar, quedan un poco forzadas y poco coloquiales, pero son aplicables las mismas reglas): - *"Comer (verbo) un donut (sustantivo)"* - *"Patear (verbo) un balón (sustantivo)"* - *"Aprender (verbo) el editor Vim (sustantivo)"* Ahora necesitas construir tu vocabulario con verbos de Vim básicos y sustantivos. ## Vocabulario ### Sustantivos (Movimientos) Hablemos de los movimientos como sustantivos. Los movimientos son utilizados para movernos por el texto en Vim. También hay sustantivos de Vim. En la lista a continuación veremos algunos ejemplos de movimientos: ``` h Izquierda j Abajo k Arriba l Derecha w Mover el cursor hacia adelante al principio de la palabra siguiente } Saltar al siguiente párrafo $ Ir al final de la línea ``` Aprenderás más sobre los movimientos en el capítulo siguiente, así que no te preocupes demasiado si todavía no entiendes algunos de los mencionados. ### Verbos (Operadores) De acuerdo a lo que podemos leer en la ayuda de Vim mediante el comando `:h operator`, Vim tiene 16 operadores. Sin embargo, en mi experiencia, con aprender estos 3 es suficiente para el 80% de las necesidades a la hora de editar mis textos: ``` y Copiar un texto (*yank* en Vim sería la acción de copiar, de ahí la letra `y`) d Eliminar un texto y guardarlo en el registro (*delete* en Vim sería la acción de eliminar, de ahí la letra `d`) c Eliminar un texto, guardarlo en el registro y comenzar en el modo de insertar ``` Ahora que ya conoces los sustantivos y verbos básicos, ¡Vamos a aplicar nuestras reglas gramáticas! Supongamos que tenemos la siguiente expresión en un texto: ```javascript const learn = "vim"; ``` Estas serían las acciones que queremos realizar construidas a partir de la gramática de Vim y sus correspondientes comandos: - Para copiar (*yank*) todo desde la ubicación actual del cursor hasta el final de la línea: `y$`. - Para eliminar desde la ubicación actual del cursor hasta el principio de la siguiente palabra: `dw`. - Para cambiar el texto desde la posición actual del cursor hasta el final de párrfo actual, di: `c}`. Los movimientos también aceptan números de conteo como argumentos *(Veremos esto más en profundidad en el siguiente capítulo)*. Si necesitas subir tres líneas, en vez de presionar la letra If you need `k` 3 veces, simplemente puedes ejecutar `3k`. Contar funciona a la hora de conjugar la gramática de Vim. - Para copiar dos caracteres a la izquierda: `y2h`. - Para eliminar las siguientes dos palabras: `d2w`. - To change the next two lines: `c2j`. Ahora mismo, quizás tengas que pensar bastante para construir comandos simples. Pero no creas que solo te pasa a ti. No estás solo. Cuando al principio comencé, tuve dificultades similares pero progresé rápidamente en el tiempo. Y también te pasará a ti. Como nota complementaria, las operaciones que afectan a una línea completa son las tareas más comunes a la hora de editar texto, y por eso Vim te permite realizar operaciones que implican a la línea completa tecleando los operadores que ya conocemos dos veces seguidas. Por ejemplo, `dd`, `yy`, y `cc` lo que hace es **eliminar**, **copiar** y **cambiar** el contenido de la línea completa. ¡Intenta esto con otros operadores! Espero que todo comience a tener sentido poco a poco. Pero todavía no he terminado. Vim tiene otro tipo más de sustantivos: objetos de texto. ### Más sustantivos (Objetos de texto) Imagina que estás en algún lugar dentro de un paréntesis, como por ejemplo `(hello vim)` y necesitas eliminar la frase entera dentro del paréntesis. ¿Cómo puedes hacer esto rápidamente? ¿Hay una manera de borrar el "grupo" dentro del que estás? La respuesta es sí. Los textos a menudo vienen estructurados. A menudo están puestos dentro de paréntesis, comillas, corchetes, llaves y cosas similares. Vim tiene una manera de capturar esta estructura con los objetos de texto. Los objetos de texto son usados con operadores. Hay dos tipos de objetos de texto: ``` i + objeto Dentro del objeto de texto a + objeto Fuera del objeto de texto ``` Dentro del objeto del texto selecciona el objeto del interior *sin* los espacios en blanco o los objetos que lo rodean. Fuera del objeto de texto selecciona el objeto interior *incluyendo* los espacios en blanco y los objetos que lo rodean. La selección de fuera del objeto de texto siempre selecciona más texto que la selección de dentro del objeto de texto. Así que si tu cursor está en algún lugar dentro del paréntesis dentro de la expresión `(hello vim)`: - Para eliminar el texto dentro del paréntesis sin borrar el propio paréntesis, ejecuta: `di(`. - Para eliminar el paréntesis y el texto interior, ejecuta: `da(`. Echemos un vistazo a un ejemplo diferente. Supongamos que tenemos esta función de Javascript y tu cursor está en la palabra "Hello": ```javascript const hello = function() { console.log("Hello Vim"); return true; } ``` - Para eliminar por completo el texto "Hello Vim": `di(`. - Para eliminar el contenido de la función (rodeado por `{}`): `di{`. - Para eliminar la palabra "Hello": `diw`. Los objetos de texto son muy potentes porque puedes seleccionar diferentes objetos desde una misma ubicación, como hemos visto en el ejemplo anterior. Puedes borrar objetos dentro de un par de paréntesis, el bloque de la función entera o una palabra. Además, cuando ves `di(`, `di{`, o `diw`, te haces una buena idea de qué objetos están representando (un par de paréntesis, un par de llaves y una palabra). Echemos un vistazo a un último ejemplo. Supongamos que tenemos estas etiquetas (*tags* en inglés) de código HTML: ```html
Paragraph1
Paragraph2