Artículo 3: EL Editor VIM

Autor: (c) Santiago Romero
Revista: Solo Linux (Prensa Técnica) Septiembre-2000


VIM (VI Improved) es la evolución lógica del editor estándar en los entornos UNIX. Conocer VIM implica la posibilidad de editar ficheros de una manera uniforme en cualquier sistema Linux y UNIX, así como muchas otras ventajas que veremos a continuación.


Conocer el editor VIM (figura 1) es fundamental para los usuarios de Linux. Vim es un estándar dentro de este S.O. Y por si fuera poco suele ser el editor por defecto del sistema. Saber configurarlo, manejarlo y realizar con él las tareas diarias de edición es básico para un usuario de Linux, y puede además reportarnos ciertas ventajas que comentaremos en este artículo.


editor vim

En principio Vim suele parecer bastante complicado, sobre todo por la existencia del modo comando, que no vemos en otros editores de texto plano. En la presente entrega (tal y como haremos en las futuras con otros programas) se intentará mostrar al lector el uso básico, intermedio y avanzado de Vim de forma que cada cuál adecúe el contenido del artículo a sus conocimientos de uso de GNU/Linux. El objetivo es que un usuario que nunca ha tocado Vim aprenda a utilizarlo, y que un usuario habitual de Linux descubra en Vim las ventajas que no le dan otros editores de texto (como sustituciones de cadenas o macros, mapeado de teclas y coloreado de sintaxis).

Lo primero que debemos hacer es instalar Vim. Hay varios paquetes que conforman el editor vim, siendo normalmente los siguientes:

    vim-minimal-5.3-7
    vim-enhanced-5.3-7
    vim-X11-5.3-7
    vim-common-5.3-7

El paquete vim-minimal contiene los ficheros mínimos para poder ejecutar Vim (más concretamente, el editor VI), mientras que el paquete vim-enhanced ya contiene el editor VIM propiamente dicho. Vim-X11 contiene gvim, una version para Xwindow de VIM que dispone de GUI y menúes para hacer de Vim un programa algo más interactivo en cuanto al uso del ratón. Finalmente, vim-common contiene los ficheros comunes a todos ellos (configuraciones, ficheros de sintaxis, etc.) y que deberemos instalar si se desea usar cualquiera de los anteriores. Para nuestras primeras pruebas se recomienda instalar los 4 paquetes (ya sea vía rpm, dpkg, apt-get, tar.gz o desde los fuentes).


Gvim


EL FICHERO DE CONFIGURACION DE VIM: .VIMRC

Vim utiliza un fichero de configuración global llamado /etc/vimrc. Las opciones que se incluyan en dicho fichero afectarán a todos los usuarios de Vim en el sistema. En lugar de configurar Vim en dicho fichero es mucho más apropiado crear un fichero .vimrc en nuestro directorio HOME de forma que las opciones allí incluidas afecten sólo a nuestro usuario (además no siempre se tiene acceso al root de una máquina Linux). Utilizando nuestro todavía editor favorito (hasta que completemos el aprendizaje de Vim) creamos un fichero .vimrc que contenga lo siguiente:

  " Mi .vimrc:  Los comentarios empiezan por dobles comillas.
  set tabstop=3      " tamaño de los tabuladores
  set sw=3        
  set ai             " autoindentado de líneas al pulsar enter
  set sm
  set ruler          " nos dice la fila y columna del cursor
  set nocompatible   " Usar funcionalidades de Vim (no compatible con VI)
  set novisualbell
  set noerrorbells

Tras crear el fichero (podemos obviar la inclusión de los comentarios de la derecha, creados sólo para informar al lector del significado de cada opción) salimos grabando y nos preparamos para el uso de VIM.


UTILIZACION BASICA DE VIM

El editor se arranca con vim <nombre_de_fichero> o con vim a secas si aún no hemos decidido qué abrir o qué crear. Una vez dentro, en VIM hay que diferenciar 2 modos de funcionamiento: modo de inserción y modo comando. En el modo de inserción VIM se comporta como un editor de texto "normal y corriente". Es decir, lo que se teclea se inserta en pantalla en la posición actual del cursor, como hace edit, el joe, emacs, etc. En el modo comando las teclas que se pulsan no se escriben en el texto sino que son comandos para que VIM haga determinadas cosas que nos faciliten el trabajo. En particular de momento hay que quedarse con 2 teclas: la tecla 'i' que permite que pasemos a modo inserción y la tecla ESC que hace que pasemos a modo comando.

Inicialmente estamos en modo comando, de modo que pulsando 'i' podemos introducir texto y pulsando ESC volvemos al modo comando (es muy útil estar en todo momento en modo comando a menos que estemos tecleando varios párrafos o líneas seguidas). En resumen:

    ESC             Pasar a modo comando.
    i               Pasar a modo inserción.

De este modo ya podemos introducir texto en un fichero nuevo o ya existente. Pero no sólo queremos introducir texto, queremos también movernos por él para subir arriba (por ejemplo) y corregir algo, o bajar, o, en definitiva, mover el cursor para posicionarnos donde deseemos introducir texto. Para ello en VIM podemos movernos con las teclas de los cursores (arriba, abajo, izquierda, derecha) en modo inserción o comando (en ambos). En modo comando hay otras teclas de movimiento especiales para hacerlo compatible con el editor VI (en vi no se usan los cursores). Estas teclas son:

    h,j,k,l         Teclas de movimiento.

Supongamos que subimos un par de líneas del texto que en teoría deberíamos haber escrito), y queremos añadir algo: pulsamos la tecla 'i' y escribimos lo que nos apetezca. Podemos borrar en modo comando con la tecla 'x'. En VIM (con una terminal correctamente configurada) se podrán utilizar las teclas DELETE y BACKSPACE (SUPRIMIR Y BORRAR) para realizar el borrado como en cualquier editor de texto normal.

Ya sabemos pasar de modo comando a inserción y viceversa. También sabemos introducir texto y borrarlo. Ahora es el momento de aprender a grabar el fichero que hemos creado. En modo comando esto se hace con :w (pulsamos ESC, la tecla de ':' y luego la w, seguido de INTRO, y podremos ver como todo esto aparece en la barra de estado de abajo). También tenemos :x para salir grabando y :q! para salir sin grabar.

Podemos abrir ficheros con ":e fichero", buscar cadenas con "/cadena", o insertar ficheros en la posición del cursor con ":r fichero". También es posible insertar la salida de un comando dentro del fichero que estamos editando: ":r ! ls " insertará en la posición actual del cursor la salida de la ejecución del comando ls.

Finalmente, en cualquier momento podemos obtener ayuda general en línea en el programa con ":help", o ayuda más concreta sobre un tema en concreto con ":help tema". La ventana de ayuda (porque Vim soporta multiventana) se cierra como cualquier otra: con ":q!".

Mediante esta sencilla introducción ya podemos hacer un uso básico de vim para las tareas estándar de edición de textos en el sistema. Probablemente algún lector pensará "demasiadas teclas para hacer cosas tan habituales". Tal vez, pero si tal lector continúa leyendo las posibilidades y funcionalidades que le ofrece Vim tal vez cambie de opinión con respecto a la gran cantidad de tiempo que ahorrará mediante el uso de este impresionante editor.


USO AVANZADO DE VIM

Veamos un ejemplo de fichero de configuración de Vim comentando sólo las líneas que aún no conocemos (eliminando las vistas en la creación de nuestro primer .vimrc):

  set ttyfast          " terminal rápida.
  set tw=72            " tamaño máximo de línea.
  syntax on            " Syntax Highlighting.
  ab _atajo cadena     " Sustituciones de macros.
  map comando funcion  " macros.

Algunas de las cosas más destacables de este fichero son:

syntax on: Esta opción activa el coloreado de sintaxis de Vim. Esto hará que al editar ciertos archivos especiales (código fuente C/C++, archivos html, ficheros de configuración, scripts perl/awk/bash, etc.) se utilice un modo de coloreado de las palabras clave, números, etc. que permitan hacer más agradable la edición de dicho fichero (igual que hacen los IDEs de Borland con colores para determinadas palabras clave, como puede verse en la figuras 2). Esto es muy útil para programadores y para usuarios que desean editar sus ficheros de configuración con algo de vistosidad para diferenciar las opciones de los comentarios, etc. Si no se activa en el .vimrc se puede hacer en cualquier momento con :syntax on.


syntax highlighting

ab y map: Como veremos a continuación, estas 2 opciones son tan útiles que por sí solas ya justifican el uso de Vim como editor de textos para correo, news, programación, etc.


COMANDOS AB e IAB

El comando ab tiene una gran utilidad. Supongamos que teneis una página bastante larga y de recomendación frecuente a la gente que pregunta en las listas de correo o de news, como por ejemplo http://www.ctv.es/USERS/sromero/linux/linux.html. Supongamos que dicha página es una página de soluciones sobre Linux (que lo és :-) y que la recomendais habitualmente cada vez que alguien hace una pregunta que está contestada allí. En ese caso es recomendable poner en nuestro .vimrc algo como:

  ab _mipagina http://www.ctv.es/USERS/sromero/linux/linux.html

A partir de ese momento, cuando deseemos escribir la direccion de vuestra pagina, en modo inserción tecleamos _mipagina y al darle a espacio tras esta cadena (es decir, no seguir escribiendo letras) VIM sustituye la cadena por la frase que viene después en el .vimrc (la cadena de sustitución no puede tener espacios pero la frase posterior sí), de modo que hemos escrito una dirección completa con tan sólo un par de letras.

La utilidad es infinita:

 ab hispa http://www.hispalinux.es
 ab salu2 Saludos a todos.
 ab chao Chao a todos y saludos...

Incluso podemos incluir comandos especiales dentro de ella (que simulen la pulsación de determinadas teclas) para por ejemplo incluir saltos de línea y por tanto cadenas con varias líneas. Esto se hace en modo inserción con CTRL+V y los comandos VI de bajar y subir líneas, o usando los nombres de las teclas.

  ab _prueba Línea 1<CR>Línea 2

Donde <CR> hay que escribirlo tal cual (< seguido de CR seguido de >) y cuyo significado es Retorno de Carro, es decir, equivale a pulsar ENTER.

La tecla CTRL+V se usa para poder introducir una tecla especial en un texto (como el ESCAPE, el INTRO, etc). Esto nos permitiría insertar un ESCAPE en cualquier macro, aunque tambien podemos usar simplemente el nombre de tecla <ESC>.

Hay otras macros útiles serían:

  ab _guia http://www.ctv.es/USERS/sromero/guialinux/guialinux.html
  iab _hora <C-R>=strftime("%H:%M")<CR>
  iab _fecha <C-R>=strftime("%a %b %d %T %Z %Y")<CR>
  iab _ruler 1234567890123456789012345678901234567890123456789012(y más)
  ab _ecol es.comp.os.linux.
  ab _email nopARROBAtodolinux.org
  ab _coment1 /*======================================================*/
  ab <img> <img src="" alt="">

Como puede verse, es posible usar macros para páginas, emails, reglas, comentarios de C, para crear páginas HTML, programación, atajos para el correo y news, direcciones, etc. Además pueden servir para autocorrección de errores comunes:

  iab Saludso Saludos
  iab sal2u salu2
  iab bemos vemos

Cuando tecleemos incorrectamente alguna de las tres palabras sustituidas anteriores, ésta será reemplazada por la versión correcta de la misma, gracias a la sustitución de cadenas. Si hacemos determinados errores habituales casuados por nuestra velocidad de tecleado, esto puede reducirlos al mínimo, dejando muy limpios nuestros mensajes de correo y news (Vim puede usarse integrado con cualquier cliente de correo y news, como veremos en próximas entregas).


COMANDOS MAP, NMAP, VMAP y MAP!

Pero aún no lo hemos visto todo... También tenemos el comando map que es, si cabe, aún más útil. Este comando del .vimrc nos permite crear verdaderas macros de teclado (que no de sustitución) con las que hacer maravillas en modo comando. El formato de map es:

map tecla teclas
Donde 'tecla' es la tecla que pulsaremos en modo comando para ejecutar el comando, y "teclas" son las teclas que simulará nuestro comando. (Para introducir teclas especiales recordad que hace falta CTRL+V en modo inserción). Ejemplos:

  map <CTRL+V><ALT+C> <CTRL+V><ESC>^I//<CTRL+V><ESC>j
(para introducir lo anterior, donde pone <CTRL+V> pulsar en modo inserción CONTROL+V, donde pone <ALT+C> pulsar ALT+C, y donde pone <ESC> pulsar la tecla ESC).

Visualmente (en el fichero) queda como:

  map ^[c ^[^I//^[j

Y lo que hace es: cuando pulsemos ALT+C, se ejecuta ESC (pasar a modo comando), seguido de ^ (comando para ir al inicio de una línea), seguido de 'I' (pasar a modo inserción), seguido de // (en modo inserción esto se escribe al principio de la línea, donde estamos gracias a ^), seguido de ESC (pasar a modo comando) y 'j' (avanzar a la siguiente línea). Es decir, gracias a esta macro pulsando ALT+C podremos comentar con // cualquier línea de código C y que automáticamente se avance a la siguiente línea, sea cual sea la posición del cursor. Podemos hacernos también macros para comentar en programación de shell bash (poniendo #), quotear texto en mensajes (poniendo > y asignándoselo a la tecla ALT+Q, con "map ^[q ^[^I>^[j" ), etc.

Otro ejemplo de macros son para justificar párrafos automáticamente. Instalad par (formateador de textos) en vuestro sistema y añadid esta macro:

  map º {!}par 70j<CR>}          (<CR> se escribe tal cual).

Ahora escribid un párrafo de varias líneas, pulsad la tecla 'º' en modo comando y será automáticamente formateado y justificado a 70 columnas (figura 4). Par es inteligente y también dejará los > al principio de las líneas correctamente (aunque este sistema es sólo para párrafos). Recordad que debeis tener instalado par, un reformateador de párrafos bastante bueno y que podeis obtener de los repositorios de paquetes habituales (http://www.freshmeat.net, http://www.debian.org, o http://rpmfind.net ).


justificado con par

Más ejemplos:

  nmap  ##   vip:s/^/#<space>/<CR>
  vmap  ##      :s/^/#<space>/<CR>
  nmap  >>   vip:s/^/><space>/<CR>
  vmap  >>      :s/^/><space>/<CR>
  nmap  cc   vip:s/^/\/\/<space>/<CR>
  vmap  cc      :s/^/\/\/<space>/<CR>

  "Para GnuPG
  map <F2> :.,$!gpg --clearsign -a<c-m>
  map <F3> :.,$!gpg -ea<c-m>
  "(también se admiten nombres para las teclas, como <F2>, <CR>...).

  "Más macros: comentar y descomentar codigo C.
  "para modo comando y modo inserción...
  map ,c ^i//<ESC>j
  map ,d ^:.,.s+\(^\s*\)//+\1<CR>j
  map! ,c <ESC>^i//<ESC>j0i
  map! ,d <ESC>^:.,.s+\(^\s*\)//+\1<CR>j0i

También existe (como puede verse en los últimos ejemplos) la posibilidad de usar map! en lugar de map. map! permite usar macros que funcionan en modo inserción (no hace falta estar dentro del modo comando).

Por último, para programadores, es posible cambiar los colores del syntax on en /usr/share/vim/syntax editando c.vim, asm.vim, etc. y syntax.vim.


RESUMEN COMPLETO DE TECLAS DE VIM

Veamos finalmente en la tabla 1 un resumen de teclas de VIM, que nos permitirán seleccionar texto, trabajar con ficheros, múltiples ventanas, utilizar Vim como entorno de programación, etc. (nótese que algunos comandos NO llevan los ':' delante).

    Tecla             Función
----------------------------------------------------------------------
    ESC               Pasar a modo comando.
    i                 Pasar a modo inserción.
    h,j,k,l           Teclas de movimiento.
    :q!               Salir sin grabar los cambios realizados.
    :x                Salir grabando los cambios.
    :w                Grabar fichero.
    :e fichero        Abrir fichero.
    :r fichero        Insertar fichero en la posición del cursor.
    :r !comando       Insertar salida del comando "" "" "".
    :!comando         Ejecutar comando.
    :make             Compilar si hay Makefile (saltará a los errores).
    /cadena           Buscar cadena en el fichero (valen regexpr).
    !% !comando       Aplicar comando al texto completo.
    !.,$ !comando     Aplicar comando desde el cursor hasta el final.
    :s/cad1/cad2/g    Cambiar todas las cadenas "cad1" por "cad2"
    :.,123s/c1/c2/g   Igual que lo anterior pero hasta la línea 123.
    v                 Modo visual (seleccionar texto con cursores)
        y             Copiar texto seleccionado (en modo visual).
        c             Cortar texto seleccionado (en modo visual).
        p             Pegar texto copiado (en modo visual).
        supr          Borramos el texto seleccionado (en modo visual).
        !comando      Aplicar filtro al texto seleccionado.
                      (ej !par70j habiendo seleccionado texto en v).
    CTRL+v            Modo visual que permite copiar y cortar BLOQUES
                      cuadrados (no sólo líneas), es MUY MUY MUY útil.
    INSERT            Cambiar entre inserción/sobreescritura.
    J                 Subir la línea actual a la anterior.
    dd                Borrar línea actual.
    u                 Undo (deshacer). Útil en nuestros inicios :).
    ^r                Redo (rehacer).
    <numero>dd        Borrar <numero> líneas: ej  6dd
    <numero>yy        Copiar <numero> líneas.
    <numero>p         Repetir el pegado <numero> veces.
    <numero>comando   Repetir comando: "5iHOLA <ESC>" -> 5 HOLAs.
    :help             Ayuda (igual que F1).
    :help topic       Ayuda para el topic especificado.
    SHIFT+K           Página man de la palabra bajo el cursor.
    <numero> ^a       Sumar <numero> al prox nº tras el cursor.
    <numero> ^x       Restar <numero> al prox nº tras el cursor.
    cw                Borra la palabra bajo el cursor y entra en
                      modo inserción (para cambiar palabras).
    <numero>yy        Copiar <numero> líneas desde la posición
                      actual del cursor al buffer de copiado.
    p                 Pegar el buffer de corte.
    <numero>p         Pegar <numero> veces el buffer de corte.

    Multiples ventanas:
    CTRL-w n          Abre una nueva ventana vacía.
    :new fichero      Abre una ventana nueva editando fichero
    CTRL-w w (^W^W)   Cambia el cursor cíclicamente entre ventanas.
    CTRL-w j          Cambia a la ste ventana (abajo).
    CTRL-w k          Cambia hacia la ventana de arriba.
    CTRL-w c (o :q)   Cierra ventana actual
    CTRL-w =          Iguala tamaños.
    CTRL-w _          Maximiza la ventana actual.

El lector debería probar también los siguientes ejemplos:

   :r !ls /             -> el tabulador completa directorios y ficheros
   :% !sort             -> ordenación alfabética de las líneas
   4dd                  -> borramos 4 líneas
   yy10p                -> copiar la línea actual y repetirla 10 veces
   5irepite <ESC>       -> repetir 5 veces la palabra repite
   ;.,$ !comando        -> aplicar comando desde el cursor en adelante.
   :.,150s/cad1/cad2/g  -> reemplazar todos los cad1 por cad2 desde la
                           línea actual hasta la línea nº 150.

Podemos también a seleccionar un texto con 'v' y cuando esté seleccionado hacer :!sort (aparecerá algo como :'<,'>!sort ) y el comando se aplicará sólo al texto seleccionado. Como seguramente sabreis, dado que Linux tiene gran cantidad de mini-comandos que se aplican a la entrada estándar, con este método se le puede hacer al texto (seleccionado o completo) lo que sea, justificarlo, corregirlo con ispell, cualquier cosa que se nos ocurra.


SOBRE TERMINALES

Bajo XWindow se han experimentado fallos con ciertas teclas (INICIO, FIN, CURSORES) bajo determinadas terminales (konsole, xterm). La única terminal que asegura un correcto funcionamiento de vim (a mi entender y con mi configuración del sistema) y que además ocupa muy poca memoria es wterm (recomendada). Bajo consola no existe ninguno de estos problemas. En Debian algunos de estos problemas de terminales se solucionan haciendo la variable de entorno TERM igual XTERM-DEBIAN o XTERM. Esto se haría en bash mediante:

 export TERM=XTERM-DEBIAN


FINALIZANDO

Este tutorial es una simple guía a los comandos más básicos que os podeis encontrar en VIM. Aparte de los comentados hay muchas más posibilidades, y es que este editor es con mucho una de las mejores joyas de edición de textos existentes. Para más información el lector puede visitar la página VI Lovers (http://www.thomer.com/thomer/vi/vi.html) o http://www.vim.org, sin olvidarnos tampoco de man vim, :help y de /usr/doc/vim.

Santiago Romero



Volver a la tabla de contenidos.