# 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 libre. 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 conocer los sustantivos y verbos básicos, ¡Vamos a aplicar nuestras reglas gramáticas! Supongamos que tenemos la siguiente expresión en un texto: ``` 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. ## More Nouns (Text Objects) Imagine you are somewhere inside a pair of parentheses like `(hello vim)` and you need to delete the entire phrase inside the parentheses. How can you quickly do it? Is there a way to delete the "group" you are inside of? The answer is yes. Texts often come structured. They are often put inside parentheses, quotes, brackets, braces, and so on. Vim has a way to capture this structure with text objects. Text objects are used with operators. There are two types of text objects: ``` i + object Inner text object a + object Outer text object ``` Inner text object selects the object inside *without* the white space or the surrounding objects. Outer text object selects the object inside *including* the white space or the surrounding objects. Outer text object always selects more text than inner text object. So if your cursor is somewhere inside the parentheses in the expression `(hello vim)`: - To delete the text inside the parentheses without deleting the parentheses: `di(`. - To delete the parentheses and the text inside: `da(`. Let's look at a different example. Suppose you have this Javascript function and your cursor is on "Hello": ``` const hello = function() { console.log("Hello Vim"); return true; } ``` - To delete the entire "Hello Vim": `di(`. - To delete the content of function (surrounded by `{}`): `di{`. - To delete the "Hello" string: `diw`. Text objects are powerful because you can target different objects from one location. You can delete the objects inside the pair of parentheses, the function block, or the whole word. Moreover, when you see `di(`, `di{`, and `diw`, you get a pretty good idea what text objects they represent (a pair of parentheses, a pair of braces, and a word). Let's look at one last example. Suppose you have these HTML tags: ```
Paragraph1
Paragraph2