Minireceta: vim

Vim es el típico editor que todos queremos usar cuando seamos mayores. En partícular parece bastante complicado al principio pero cuando lo usas no puedes vivir sin él :) . Lo primero de todo es instalarlo: yo tengo los siguientes paquetes:

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

Una vez instalados (vía rpm, dkpg, apt-get o lo que sea) lo primero que debemos hacer es crearnos un .vimrc en nuestro directorio HOME para que podais ir haciendo nuestras primeras pruebas (más adelante nos haremos .vimrc más complejos).

Con vuestro (por poco tiempo) actual editor favorito creais un .vimrc en vuestro home que contenga lo siguiente (ya explicaremos qué hace cada cosa en su momento):

  " Mi .vimrc:  Los comentarios empiezan por dobles comillas.
  set tabstop=3
  set sw=3
  set ai
  set sm
  set ruler
  set nocompatible
  set novisualbell
  set noerrorbells

Bien, salimos grabando y nos preparamos. 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 tecleais lo meteis en pantalla en la posición actual del cursor, como el edit, el joe, etc. En el modo comando las teclas que se pulsan no se escriben en el texto sino que son comandos para que VIM haga 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 casi siempre en modo comando a menos que estemos tecleando varios párrafos o líneas seguidas). Vamos a ver lo que hemos aprendido hasta ahora:

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

No sólo queremos introducir texto, queremos también movernos por él para subir arriba (por ejemplo) y corregir algo… para ello podemos movernos con las teclas de los cursores (arriba, abajo, izq, der) 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.

Bueno, 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 con SUPR o la tecla de borrado, o bien en modo comando con la tecla x.

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.

Podéis abrir ficheros con ":e fichero", buscar cadenas con "/cadena", o insertar ficheros en la posición del cursor con ":r fichero". Por otra parte, también podéis aplicar filtros al texto completo o a un texto seleccionado (y esto es REALMENTE útil como veréis más abajo). Las macros también serán muy útiles (eso más adelante).

Resumen de teclas:

    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.
    /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.

    <numero> ^a       Sumar <numero> al prox nº tras el cursor.
    <numero> ^x       Restar <numero> al prox nº tras el cursor.

Gestión de 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.

(fijaos que algunos comandos NO llevan los ':' delante)

Ejemplos y pruebas

Algunos ejemplos interesantes:

   :r !ls /      (el tabulador completa directorios y ficheros).
   :% !sort      (ordenación alfabética de las líneas).
   4dd           (borramos 4 líneas)

Probad 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 sabeis, dado que Linux tiene gran cantidad de mini-comandos que se aplican a la entrada estándar, con este método podeis hacer al texto LO QUE SEA, justificarlo, corregirlo con ispell, cualquier cosa que se os ocurra

Fichero de configuración: .vimrc

  set tabstop=3
  set sw=3                -> Usar tabuladores de 3 espacios.
  set ai                  -> AutoIndent.
  set sm
  set ruler               -> Regla.
  set nocompatible        -> Estilo VIM (no vi).
  set novisualbell        -> No \b visual.
  set noerrorbells        -> No pitidos.
  set ttyfast
  set tw=72               -> Tamaño máximo de línea.
  syntax on/off           -> Syntax Highlighting.
                             (ver /usr/share/vim/syntax).
  ab _atajo cadena        -> Sustituciones de macros.
                             Ejemplo: ab _email compiler@iname.com
  map comando funcion     -> macros. Para introducir carácteres
                             especiales se usa CTRL+V en Insert mode.
                             Ejemplos:
                             map ^[c ^[I//^[j
                             map º {!}par 70j^M}
                             nmap  >>   vip:s/^/><space>/<CR>
                                 vmap  >>      :s/^/><space>/<CR>
                             (etc...)

Sustituciones con ab

Sobre ab, tiene una gran utilidad. Supongamos que vuestra página es una URL bastante larga y estais hartos de escribir esto en las news cada vez que alguien pregunta lo mismo en el ecol.misc (¿os suena? :). En ese caso poneis en vuestro .vimrc algo como:

  ab _mipagina http://www.sromero.org

Tras eso, las próximas veces que entreis en VIM cuando querais escribir la direccion de vuestra pagina, en modo inserción tecleais _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 (la cadena de sustitución no puede tener espacios pero la frase posterior sí). Incluso podeis 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. Tambien se puede insertar simplemente como retorno de carro para modo insercion, etc.

Ejemplo (cambiad las teclas <> por la pulsación de las mismas, todo esto en modo inserción):

  ab _prueba Linea 1<CTRL+V><ESC>jiLinea 2
  ab _prueba2 Linea 1<CR>Linea 2

Esto funciona así: al teclear prueba VIM escribe "Línea 1", luego encuentra un ESC (pasar a modo comando) y luego los comandos 'j' (pasar a la siguiente línea, bajando el cursor) e 'i' (pasar a modo inserción). Finalmente escribe "Línea 2" en la posición del cursor (es decir, hemos introducido una macro de 2 líneas). El CTRL+V se usa para poder introducir una tecla especial en un texto (como el ESCAPE, el INTRO, etc).

Hay otras macros útiles (sacadas de mi .rc y de la página de Ferkys):

  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 compilerARROBAiname.com
  ab _coment1 /*======================================================*/
  ab <img> <img src="" alt="">

Como veis, uso macros para páginas, emails, reglas, comentarios de C, para crear páginas HTML, etc.

Además pueden servir para autocorrección de errores comunes:

  iab Saludso Saludos

Mappings

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
<code>

Visualmente (en el fichero) queda como:

<code>
  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 podemos comentar con cualquier línea de código C y que automáticamente se avance a la ste línea. 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. Si mirais la documentación de mutt podreis ver que también es posible usar nombres para las teclas, como <F1>, <ESC>, 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^M}          (recordad que ^M = CTRL+V y ENTER)

Ahora escribid algo, pulsad º en modo comando y será automáticamente formateado y justificado a 70 columnas. Par es inteligente y también dejará los > al principio de las líneas correctamente (aunque este sistema es sólo para párrafos).

Más ejemplos (probadlos en casa):

  map ^Y ^[dd
  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 pipear a 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

Por último, para programadores, probad un "syntax on" en el fichero de configuración. Para cambiar los colores id a /usr/share/vim/syntax editando c.vim, asm.vim, etc. y syntax.vim.

Finalizando

Este tutorial es una simple guía a los comandos más básicos que os podeis encontrar en VIM. De hecho tiene tantas cosas que si se domina VIM la edición de textos es casi un chiste :) … para más información visitad la página VI Lovers (http://www.thomer.com/thomer/vi/vi.html) o el tutorial de *puntero_loco y Ferkys. También hay bastante info en http://www.vim.org. No os olvideis de man vim ni de /usr/doc/vim.


<Volver a la sección de GNU/Linux>