Vim, el $EDITOR (II)

Estándar

En la anterior entrada sobre Vim vimos las características principales que nos aporta Vim y sus modos de funcionamiento. En este post nos centraremos en el uso de los comandos que nos proporciona Vim para determinadas funciones que seguro que si probásteis por primera vez el editor leyendo mi post por primera vez, echásteis de menos.

Funciones como abrir un fichero, guardarlo o salir del editor se realizan mediante el uso de comandos dentro del modo normal de Vim. Muchos de estos comandos se introducen en el editor al pulsar la tecla ‘:’ lo cual llevará el cursor a la zona baja del editor, en la barra que nos muestra información. Después de que esto suceda podremos introducir el comando que queramos y pulsar intro para realizarlo.

Comandos básicos

En esta sección comentamos los comandos básicos para el uso de Vim de una manera casi completa. Los comandos que nos pueden hacer perder los cambios no guardados de un fichero, tales como la apertura de otro encima o el cierre del editor, son bloqueados por defecto por Vim y no nos dejará ejecutarlos. Para forzar la pérdida de los cambios realizados antes del último punto de guardado deberemos colocar el símbolo ‘!’ inmediatamente después del comando.

  • :q -> Este comando nos lleva al cierre del editor, y el cierre de la interfaz gráfica en el caso de estar usándola.
  • :cd -> Como si estuviéramos en una terminal, Vim se sitúa en un directorio, por defecto el del usuario, y con este comando podemos cambiarlo, para no tener que poner la ruta completa al editar varios ficheros en el directorio.
  • :pwd -> Al igual que el comando anterior, si hemos usado una terminal alguna vez no será muy difícil adivinar para que sirve, con él veremos la ruta exacta en la que se encuentra el editor.
  • :e <ruta_al_fichero> -> Este es el comando de apertura de un fichero, cabe decir que éste debe estar en la ruta en la que esté el editor en ese momento o tendremos que usar una ruta total o relativa para acceder a él.
  • :w [ruta_y_nombre_del_fichero] -> Este último es muy importante ya que guarda los cambios del fichero que tenemos abierto o crea un nuevo documento con lo que esté escrito en el editor en ese momento si le añadimos el nombre acompañado o no de la ruta al nuevo fichero. El comando puede actuar también como un “guardar como…” si ya tenemos el fichero guardado y le damos un nombre nuevo, lo que copiará el documento con otro nombre.

En todos los comandos en el que se introducen rutas o ficheros del sistema podemos utilizar el autocompletado que utilizaríamos en una terminal, usando el tabulador nos autocompletará la coincidencia más cercana a lo que hayamos escrito y si seguimos pulsando tabulador alternará entre las distintas posibilidades. Este último comportamiento puede ser alterado en el fichero de configuración asociado a Vim (.vimrc) que abordaremos en siguientes posts.

Si usamos Vim acompañado de una interfaz gráfica, por ejemplo gVim en Linux o Windows, posiblemente esta venga acompañada de botones ligados a las funciones anteriores. Yo personalmente recomiendo el uso de una interfaz gráfica porque las configuraciones de esquemas de colores y el tener el proceso aislado en un programa aparte es una ventaja, pero no aconsejo en absoluto el uso de los botones para funcionalidades como abrir un fichero lo que nos llevaría a perder toda la eficiencia que queremos ganar usando Vim.

Ahora nos queda por ver algunos comandos útiles a la hora de editar un fichero y que solemos utilizar a menudo, los comandos de copiar, cotar y pegar en un fichero. A diferencia de los comandos anteriores, y de casi todos los demás, estos comandos se realizan directamente sobre el editor en modo normal, es decir, sin usar los ‘:’ para introducir el comando.

Estos comandos pueden ser utilizados habiendo seleccionado el texto mediante el modo visual (o seleccionando con el ratón, si tenemos disponible esta característica) o pueden ir acompañados de otros comandos que veremos después que son llamados movements (movimientos en nuestro idioma) y que complementan terriblemente bien los comandos clásicos del copiar y pegar. Tenemos los siguientes comandos entonces:

  • y -> Copiar (del inglés yank, volcar o tirar). Este comando nos llevará el texto elegido a un registro especial para poder pegarlo posteriormente.
  • c -> Cortar. Lo mismo que el anterior sólo que el texto desaparecerá del buffer.
  • p -> Pegar. Volcaremos el contenido del registro de copiado en la posición del cursor. Podemos usar este comando tantas veces consecutivas como queramos ya hayamos copiado o pegado previamente ya que el registro no se elimina hasta que no volquemos otro contenido. Si utilizamos el comando ‘P’ (nótese que es mayúscula) insertaremos el texto antes del cursor, mientras que si lo hacemos en minúsculas lo volcaremos después.
  • d -> Eliminar.

Si repetimos el comando, pulsamos la tecla dos veces, el objeto del comando es la línea en la que está situada el cursor. dd, por tanto, elimina la línea en la que estamos. En este caso, dd y cc realizan la misma acción, vuelcan el contenido de la línea al registro de copia, pero cc entra en modo insertar después de ejecutar el comando (lo que sucede también cuando lo usamos con un movimiento).

Además, estos comandos pueden recibir rangos de actuación antes del comando. Es decir, con un ejemplo, podríamos insertar el comando 1,3dd lo que borraría las líneas de la 1 a la 3. Si ya añadimos un movimiento al comando veríamos cosas tan raras, pero a la vez tan útiles a veces, como 3dw que eliminaría las tres palabras siguientes al cursor (contando la que está situada justo debajo). Os invito a probar estos comandos para que entendáis mejor su funcionamiento, pero siempre en un fichero de prueba o si lo hacéis con un fichero real acordaos del :q!

Otros comandos básicos son los comandos de búsqueda. deshacer, rehacer y repetir comandos anteriores y se corresponden con los siguientes comandos.

  • / -> Comando de búsqueda. Cuando lo pulsamos nos vemos dirigidos a la barra inferior de comandos pudiendo escribir un criterio de búsqueda. Cuando queramos buscar la palabra que hemos escrito pulsaremos intro y nos llevará a la siguiente coincidencia en el fichero. Para navegar por las demás coincidencias usaremos n y N para buscar en el sentido de la búsqueda o en sentido contrario.
  • ? -> Lo mismo que el anterior pero realiza una búsqueda en sentido inverso.
  • u -> Deshacer. Como ya comentamos en los modos de Vim, el editor deshará el último cambio, normalmente asociado al último espacio de tiempo que hemos estado en el modo de inserción.
  • Control+r -> Rehacer el último cambio deshecho.
  • U -> Deshacer hasta el último cambio guardado. Equivalente a :e! (volver a cargar el fichero).
  • . -> Repetir el último comando realizado. Se pueden repetir casi todos los comandos e incluso la última inserción en el modo insertar. Si realizamos, por ejemplo, aHolaESC (escribimos “Hola” a la derecha del cursor) y después pulsamos . repetiremos la misma inserción.

Movimientos

Con esto ya podríamos proceder a la edición de un fichero como si de otro editor se tratara, pero tenemos que tener en cuenta ciertas consideraciones a la hora de movernos a través del fichero. Existen teclas de movimientos asociadas a los movimientos normales que haríamos con los cursores habituales de los teclados en Vim y debemos usarlas para facilitar a los dedos el acomodarse en el teclado y no separar tus manos de las teclas de escritura, que son las que realmente te interesan cuando estás programando. Estas funciones de movimientos pueden resultar altamente incómodas al principio, cuando se comienza a usar Vim, pero con el paso del tiempo llegan a ser una adicción y no podrás vivir sin ellas si llegas a usar este editor de una manera regular.

Estos comandos además nos fuerzan a salir del modo de inserción de manera habitual, lo que es muy aconsejable. Para una persona que viene de usar un editor normal suele ser la tónica general el estar siempre en un modo de escritura, Vim no funciona así y algunos comandos toman como diferenciación entre cambios en el fichero no la pulsación de una tecla sino desde el momento que entras en el modo de inserción hasta que sales de él, muy útil a la hora de usar el deshacer y el rehacer.

Los comandos básicos de movimientos están asociados a las teclas h, j, k, l. Estas teclas deben quedar grabadas a fuego en vuestra memoria ya que son las que tendréis que usar y acostumbraros. Uno de los principales motivos de la rapidez de edición en un fichero son estas cuatro teclas y su proximidad, lo cual unido a las teclas de entrada al modo de inserción son una combinación efectiva a la par que productiva. Las teclas que se sitúan debajo de nuestros dedos índice y corazón, es decir j y k, se usan para el movimiento entre línas, abajo y arriba respectivamente. Sin embargo, las teclas h y l son para el movimiento entre caracteres, izquierda y derecha respectivamente. Parece fácil a simple vista, en la práctica dominar y usar únicamente estas teclas no lo es tanto. Si os véis tentados a usar los cursores, paráos a pensarlo un momento. Usarlas no es, ni mucho menos, un pecado mortal, pero si se puede evitar os ayudaréis a superar esa curva de aprendizaje de la que hablábamos en el post anterior.

Otros comandos para el movimiento más fluido dentro de un fichero son:

  • Control+d -> Avanzamos media página (mnemotecnia, d = down).
  • Control+u -> Retrocedemos media página (mnemotecnia, u = up).
  • Control+f -> Avanzamos una página completa (comparable a la tecla avpag, mnemotecnia, f = forward).
  • Control+b -> Retrocedemos una página completa (comparable a la tecla repag, mnemotecnia, b = backward).
  • H -> Lleva el cursor a la parte alta de la parte del fichero mostrado en estos momentos en pantalla.
  • M -> Lleva el cursor a la parte media de la parte del fichero mostrado en estos momentos en pantalla.
  • L -> Lleva el cursor a la parte baja de la parte del fichero mostrado en estos momentos en pantalla.
  • gg -> Ir al principio del fichero.
  • G -> Ir al final del fichero.
  • nG -> Ir a la n-sima línea del fichero.
  • $ -> Ir al final de la línea.
  • ^ -> Ir al primer carácter significativo de la línea.
  • 0 -> Ir al primer carácter de la línea.
  • w -> Mover el cursor al primer carácter de la siguiente palabra.
  • b -> Mover el cursor al primer carácter de la palabra anterior.
  • % -> Mueve el cursor alternando entre los caracteres de apertura y cierre de bloque del bloque inmediatamente superior.
  • f <caracter> -> Nos movemos a la siguiente aparición del carácter en la línea.
  • F <caracter> -> Nos movemos a la anterior aparición del carácter en la línea.
  • z<Enter> -> Sitúa la línea en la que nos encontramos en el centro de la pantalla.

Existen muchos más movimientos que podemos usar dentro de Vim, pero estos son a mi parecer los más interesante y los que más uso yo en mi uso diario. Existen además saltos a etiquetas que podemos situar en el código, invisibles eso si, pero yo les veo más inconvenientes que ventajas así que nos las vamos a mencionar por el bien de no liar más la madeja.

Son unos cuantos movimientos, no pretendáis aprenderlos todos de un tirón porque puede ser costoso. Al principio podemos tener la tentación de usar el ratón para posicionarnos en una zona de la pantalla, pero con estos comandos de movimientos tenemos todos los movimiento que pudiéramos necesitar cubiertos.

Buffers, Windows y Tabs

Ya sabemos como editar un fichero en concreto, como movernos por él, pero ¿qué hay de la edición de muchos ficheros? Un proyecto generalmente tiene muchos ficheros que tenemos que editar y normalmente tenemos que ver varios al mismo tiempo e incluso trabajar con varios a la vez. Como ya se me habrá escapado en algún momento anterior de la entrada, Vim trata a los ficheros abiertos como buffers y realiza los cambios en ellos hasta que guardamos el fichero lo cual volcará el contenido del buffer en el fichero. Es posible abrir varios buffers en la misma instancia (no usaremos la palabra ventana por no confundirnos posteriormente) e incluso verlos simultáneamente o en “pestañas” distintas.

Cuando tenemos un fichero abierto en Vim y abrimos otro con el comando :e parece que el fichero anterior desaparece, pero sólo desaparece de nuestra vista. El buffer del fichero anterior sigue abierto en un segundo plano esperando a que se vuelva a necesitar para poder verse de nuevo. Algunos comandos para trabajar con buffers son los sigientes:

  • :ls -> Listamos todos los buffers activos (útil para saber que buffers tenemos y que número asociado tienen).
  • :b n -> Mostramos el buffer numerado como n (necesitamos el número que vimos con :ls). También podemos usar este comando poniendo el nombre del fichero asociado al buffer que queremos mostrar en vez del número.
  • :bd n -> Eliminamos el buffer de la lista de ficheros abiertos. Este es uno de los comandos en los que tendremos que usar ‘!’ si lo hemos modificado. Si lo usamos sin ningún número eliminaremos el que estamos viendo.
  • :bn -> Alterna entre los buffers hacia delante.
  • :bp -> Alterna entre los buffers hacia atrás
  • :b# -> Vuelve al último buffer usado.

La lista de buffers es común a la aplicación general, pero podemos mostrar dichos buffers de muchas maneras. Una de ellas es como lo estábamos haciendo hasta ahora, uno a la vez y manteniendo los demás en espera detrás. Primero abordaremos una manera que en el argot de Vim se denomina ventana (del inglés Window) y que definiríamos de una manera más clara, dividir la pantalla para poder ver dos buffers, o más, al mismo tiempo. Algunos de los comandos que nos permiten trabajar con ventanas son:

  • :sp[lit] -> Divide la pantalla en dos mitades horizontales mostrando el buffer actual y el buffer relativo al fichero nombrado (si ya estaba abierto, el buffer que ya existía).
  • :vsp[lit] -> Realiza lo mismo que el comando anterior, pero realizando una división vertical.
  • Control+w j -> Mueve el foco a la ventana que se encuentra debajo de la actual.
  • Control+w k -> Mueve el foco a la ventana que se encuentra encima de la actual.
  • Control+w h -> Mueve el foco a la ventana que se encuentra a la izquierda de la actual.
  • Control+w l -> Mueve el foco a la ventana que se encuentra a la derecha de la actual.
  • Control+w w -> Alterna entre las ventanas abiertas de izquierda a derecha y de arriba a abajo.
  • Control+w W -> Alterna entre las ventanas abiertas de manera contraria al de arriba.
  • Control+w > -> Aumenta la ventana de manera horizontal.
  • Control+w < -> Reduce la ventana de manera horizontal.
  • Control+w | -> Maximizar al máximo la ventana horizontalmente.
  • Control+w + -> Aumenta la ventana de manera vertical.
  • Control+w – -> Reduce la ventana de manera vertical.
  • Control+w _ -> Maximizar al máximo la ventana verticalmente.
  • Control+w = -> Igualar todas las ventanas.

Estos últimos comandos para movernos entre las ventanas abiertas se realizan pulsando control y w y luego pulsando la otra tecla asociada al comando, ya sea soltando la tecla control o no, pero siempre soltando w. Para poder cerrar una ventana, pero no el buffer, podemos usar el comando :q, pero si queremos cerrar el buffer junto con la ventana que visualiza el buffer usaremos el comando :bd.

Por último en este punto, hablaremos de las pestañas o tabs que nos permiten tener ventanas separadas en los archiconocidos tabs de los navegadores o de la mayoría de editores de texto. Esta característica no tiene demasiado tiempo en Vim y permite acercarle a tener todas las características que tiene un editor cualquiera además de sus características añadidas.

  • :tabnew -> Abre un fichero en una nueva pestaña.
  • :tabclose n -> Cierra la n-ésima pestaña.
  • :tabclose -> Cierra la pestaña actual.
  • :tabonly -> Cierra todas la pestañas excepto la actual.
  • :tabn[ext] -> Lleva el foco a la siguiente pestaña.
  • :tabnp[rev] -> Lleva el foco a la pestaña anterior.

Como os habréis podido imaginar, también son aplicables los comandos :q y :bd para cerrar las pestañas. Yo en mi uso diario de Vim no uso demasiado las pestañas, ya que nos llevan a usar casi sin remedio el ratón para cambiar entre ellas (es más instinto que otra cosa) por lo engorroso de los comandos. No obstante podemos crear atajos de teclado para los comandos que nosotros queramos en el fichero de configuración, como veremos en un próximo post de la configuración de Vim.

Conclusión

Con todo esto espero no haberos abrumado demasiado ya que sólo se tratan de comandos que podéis usar o no en vuestro día a día. El único consejo que se me ocurre daros es practicar, practicar y volver a practicar para acostumbraros a los comandos y para elegir los que más os gusten y perfeccionar su uso para ser más productivos. Si tenéis alguna duda, algún comando que no encontréis y os gustaría conocer podéis usar la herramienta :help y :helpgrep incoroporadas en Vim (:help nos dará la ayuda de un comando determinado, suele ser más útil) o comentar en el post e intentaré ayudaros yo mismo.

Algunas páginas de referencia que podéis visitar para encontrar más información son:

vim.org [Información de la documentación y las novedades]

graphical cheatsheet [Una chuleta gráfica sobre un teclado en diferentes lecciones para aclararnos un poco más]

comandos [Un resumen de todos los comandos]

Anuncios

4 comentarios en “Vim, el $EDITOR (II)

  1. Abel

    Una pregunta acerca de la parte superior del blog, que todavía no he llegado a abajo.

    Moverse con hjkl es un poco complicado, aunque se puede llevar. Pero una vez que entras en el modo insertar ya no te puedes desplazar con estos comandos (te escriben la letra), y tienes que estar dando escape todo el rato. ¿Como evitar las flechas si quieres desplazarte en insertar?

    Entre $ y fin veo una diferencia, $ me va al final, pero al último carácter, y fin ( a lo que estoy acostumbrado) después del último. ¿Se puede modificar $ para que vaya como fin?

    • Si, como ya he dicho, moverse con hjkl es bastante complejo en un principio y me alegra que me hagas esa pregunta. Yo también veía el inconveniente de usar el escape porque es una tecla muy lejana, otra opción que también es válida es pulsar contro+c en el modo insert para salir al modo normal. Pero, yo mismo me hice un atajo de teclado de tal manera que cuando pulso jj sale del modo insert al modo normal. Esto se consigue asignando la combinación de teclas mediante el comando :imap jj [menorque]ESC[mayorque] (no me deja ponerlo normal así que sustituye lo que está entre corchetes por el caracter real)

      Si no quieres hacerlo todo el rato, puedes crear el fichero, sino está creado ya, “.vimrc” en tu carpeta personal (/home/usuario) y poner el mismo comando, pero sin ‘:’. Este es el fichero de configuración que nombro varias veces en el post y que veremos en posts siguientes.

      Luego con respecto a la pregunta de $ y fin, los dos realizan la misma tarea en realidad, sólo que $ trabaja al estilo de Vim. Me explico, cuando tu pulsad $ el cursor se posiciona sobre el último caracter, debes pulsar ‘a’ para entrar en el modo insert a la derecha del caracter, vamos para escribir al final. Te aconsejo que uses ‘a’ más que ‘i’ porque suele ser más intuitivo. El comando ‘i’ para mis sólo es útil cuando quiero escribir al principio de una línea. Otra cosa es que si quieres escribir algo al final de la línea o al principio, dos comandos muy útiles que no están en el post son ‘A’ e ‘I’ (los dos en mayúsculas). El primero te lleva al modo inserción directamente al final de la línea e ‘I’ lo mismo, pero al principio de ésta. Prueba también ‘o’ y ‘O’ que sirven para entrar en el modo insertar añadiendo una línea nueva abajo y arriba respectivamente.

      Gracias por el comentario, un saludo!

    • Gracias! Siempre me alegra que a alguien le gusten mis posts 🙂
      En cuando a vim, espero poder postear dentro de poco una configuración (la mía por ejemplo) y explicar algunas cosas básicas de ella.

      Un saludo!

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