sábado, 11 de julio de 2015

Manual del editor de texto VI

Este documento pretende ser una guía para el novato en vi, al final se muestran las funcionalidades y la potencia de gvim, el cual puede ser utilizado apoyándose en el uso del ratón.

1. COMO SE INVOCA

La forma normal de invocarlo es:
vi <archivo_texto>
en donde <archivo_texto> puede incluir el path necesario para ubicarlo.
Si <archivo_texto> existe, se carga para ser editado, de lo contrario inicia un archivo vacío con ese nombre.

2. MODOS

Existen 3 modos de edición en vi
  • ESTÁNDAR Es el modo de arranque por defecto, en él se pueden ingresar comandos de movimiento, borrado, búsqueda...
  • EDICIÓN Inserta o reemplaza caracteres en el texto.
  • COMANDO Es el modo que permite entrar y salir del programa, almacenar archivos y modificar las opciones de despliegue
En las versiones antiguas de vi no es posible realizar movimientos alrededor del texto en modo de EDICIÓN.
En las versiones recientes de vi como gvim, el modo de EDICIÓN permite el movimiento entre renglones y caracteres e incluso resaltan las palabras reservadas de varios lenguajes de programación.
En Gnu/Linux es extremadamente útil el uso del botón de la mitad del ratón que permite copiar los textos seleccionados, no solo para la digitación de textos sino para el envío de comandos o la realización de búsquedas.

3. MODO DE COMANDO

Para ingresar al modo de COMANDO debe encontrarse en modo de ESTÁNDAR y presionar la tecla [:], luego se ingresa el comando que se desea y la tecla [Enter] inmediatamente volverá al modo ESTÁNDAR.
Si desea cancelar el comando presione la tecla [Esc] y volverá al modo ESTÁNDAR

3.1. COMANDOS DE USO FRECUENTE

:q  Salir de vi.
:q! Salir de vi descartando los cambios
:x  Guardar los cambios y salir de vi. cambios realizados
:wq Guardar los cambios y salir de vi. :w Almacenar el archivo.
:e! Descartar los cambios y abrir de nuevo la última versión almacenada.

:set ts <#> establece el tamaño de los tabuladores.
:colors <esquema> se utiliza en gvim, el esquema de colores puede ser personalizado o utilizar uno de los estándares: koehler, pablo, evening, elflord y otros que se pueden encontrar en el manual o presionando el tabulador.
:set ruler Se utiliza para que en la última línea aparezca el número de línea, su valor porcentual y el número de carácter en que se encuentra ubicado el cursor.

4. MODO ESTÁNDAR

En este modo es bien útil saber que el caracter ^ se refiere al principio de la línea y $ al final de ella.

4.1. MOVIMIENTOS

Los movimientos se pueden realizar con las flechas del teclado o con los caracteres:
  • k Subir.
  • j Bajar.
  • h Izquierda.
  • l Derecha.
  • ^,0 Inicio de línea.
  • $ Fin de línea.
  • w,W Siguiente palabra (word).
  • b,B Anterior palabra (back).
  • <#>| Ir al caracter <#> de la línea.
  • t<c> Ir a la siguiente ocurrencia del caracter <c> en la línea.
  • T<c> Ir a la anterior ocurrencia del caracter <c> en la línea.

  • :<#> Ir a la línea <#>.
  • G Final del archivo.
  • <#>G Ir a la línea <#>.
  • H Cursor al principio de la pantalla.
  • M Cursor en la mitad de la pantalla.
  • L Cursor al final de la pantalla.

  • [Ctrl] B Página anterior (Backward).
  • [Ctrl] F Página siguiente (Forward).

  • % Sobre un corchete o paréntesis busca al compañero.

  • } Avanzar un párrafo.
  • { Retroceder un párrafo.

4.2. BÚSQUEDAS

  • /<cadena> Avanza hasta la siguiente ocurrencia de <cadena>
  • ?<cadena> Avanza hasta la anterior ocurrencia de <cadena>
  • n Repite la última búsqueda de cadena en el sentido especificado.
  • N Repite la última búsqueda de cadena en el sentido contrario.
  • `` Vuelve a la posición del cursor antes de la búsqueda.
  • /<cadena>/<#> Avanza hasta <#> líneas después de la siguiente ocurrencia de <cadena> (<#> puede ser negativo, muy útil para indentación y sustituciones)

cadena, por supuesto, es una expresión regular

4.3. MULTIPLICACIÓN DE MOVIMIENTOS

Si se antepone un número a un movimiento se multiplica éste
  • <#>w, <#>W Avanzar <#> palabras
  • <#>b, <#>B Retroceder <#> palabras
  • <#>[Ctrl] F Avanzar <#> páginas
  • <#>[Ctrl] B Retroceder <#> páginas
  • <#>} Avanzar <#> párrafos
  • <#>{ Retroceder <#> párrafos
  • <#>l Avanzar <#> caracteres
  • <#>h Retroceder <#> caracteres
  • <#>k Subir <#> líneas
  • <#>j Bajar <#> líneas
Igual con las flechas del teclado.

5. MODO DE EDICIÓN

Al ingresar uno de los siguientes caracteres estando en el modo ESTÁNDAR se ingresa al modo de EDICIÓN hasta el momento en que se presione la tecla [Esc].

5.1. INSERCIÓN

  • a Empieza a insertar justo después del cursor (se puede multiplicar con <#>)
  • i Empieza a insertar justo antes del cursor (se puede multiplicar con <#>)
  • A Empieza a insertar al final de la línea (se puede multiplicar con <#>)
  • I Empieza a insertar al inicio de la línea (se puede multiplicar con <#>)
  • o Nueva línea debajo de la línea actual (se puede multiplicar con <#>)
  • O Nueva línea arriba de la línea actual (se puede multiplicar con <#>)

5.2. SUBSTITUCIÓN

  • r Reemplaza el caracter después del cursor por el siguiente caracter quese digite y queda en modo estándar (se puede multiplicar con <#>).
  • R Reemplaza los caracteres de la línea por los que se digiten.
  • s Elimina un caracter y queda en modo de EDICIÓN (se puede multiplicar con <#>s).
  • S Elimina la línea actual y queda en modo de EDICIÓN.

6. MODO ESTÁNDAR

6.1. BORRADO

  • x Elimina el caracter bajo el cursor (se puede multiplicar con <#>x).
  • X Elimina el caracter anterior al cursor (se puede multiplicar con <#>X).
  • dd Elimina la línea actual. (se puede multiplicar con <#>dd).
Si se utiliza la secuencia:
d<comando de movimiento>
se puede obtener el efecto del borrado hasta el final del movimiento (incluso si se está multiplicando el comando de movimiento):
  • dw Elimina la siguiente palabra.
  • d<#>w Elimina las siguientes <#> palabras.
  • db Elimina la anterior palabra.
  • d$ Elimina hasta el final de la línea.
  • d<#>b Elimina las anteriores <#> palabras.
  • d<#>G Elimina desde la posición actual hasta la línea <#>
  • d/<cadena> Elimina hasta la siguiente ocurrencia de <cadena>
  • ... ...

6.2. CAMBIOS

cc Cambiar la línea actual (se puede multiplicar con <#>).
~ Cambiar entre mayúsculas y minúsculas (se puede multiplicar con <#>).

Igual que con el comando de borrado "d" el comando de cambio "c" puede
utilizarse combinado con comandos de movimiento.

6.3. INDENTACIÓN

  • >> Indentar la línea actual (se puede multiplicar con <#>).
  • << Desindentar la línea actual (se puede multiplicar con <#>).
Igual que con el comando de borrado d el comando de indentación > y < puede utilizarse combinado con comandos de movimiento.

6.4. REPETICIÓN DE COMANDOS

Tanto los movimientos como inserciones, eliminados, cambios e indentanciones pueden repetirse utilizando el comando ".", igualmente el comando "." puede multiplicarse utilizando un <#> precediéndolo.

6.5. DESHACER

u Deshace el último comando de edición.
U Deshace todos los comandos de edición sobre la línea actual.
[Ctrl] R Rehace los cambios deshechos con los comandos "u" o "U" (solo
implementado en nuevas versiones de vi).

6.6. MOVER Y COPIAR TEXTO

Siempre que se elimina un texto vi lo almacena en la memoria en un "buffer especial", adicionalmente con las teclas "y" e "Y" se puede enviar un pedazo de texto a la memoria para ser copiado en otro lugar del texto, igual que otros comandos puede multiplicarse anteponiéndole un <#> o combinarlo utilizando comandos de movimiento.
yy, Y Copiar a memoria la línea actual (Yank).
p Pegar el contenido de la memoria justo antes del cursor/línea.
P Pegar el contenido de la memoria justo después del cursor/línea.

7. SUBSTITUCIONES

Adicionalmente, en el modo de COMANDO, es posible indicarle a vi que realice sustituciones utilizando expresiones regulares.

7.1. SINTAXIS

:<región>s/<exp_reg>/<cadena>/<opción>
Significado: substituya en la <región> las ocurrencias de la <exp_reg> por la <cadena> de acuerdo a la <opción> especificada.
<región> puede ser:
  • % todo el archivo
  • <#1>,<#2> entre la línea <#1> y la <#2>
  • . solo la línea actual
  • $ solo la última línea
  • .+<#> desde la línea actual hasta <#> líneas después.
  • .-<#> desde la línea actual hasta <#> líneas antes.
  • $-<#> desde la última línea hasta <#> líneas antes.
  • g/<exp_reg1>/ todas aquellas líneas que contengan la expresión regular
  • <exp_reg> es una cadena de caracteres que puede contener los siguientes caracteres especiales:
  • ^ Indica el principio de la línea.
  • $ Indica el final de la línea.
  • \ Se utiliza para proteger el siguiente caracter (útil para indicar caracteres / en las expresiones regulares).
  • . Un caracter cualquiera.
  • * Uno o mas caracteres cualquiera.
  • \< Utilizado al principio de la expresión regular indica que es el inicio de la palabra
  • \> Utilizado al principio de la expresión regular indica que es el final de la palabra
  • [<conjunto de caracteres>] Indica que el caracter puede coincidir con cualquiera del conjunto de caracteres, el cual puede ser de las siguientes formas:
    • <c1><c2>...<cn>: Todos los caracteres indicados en la lista.
    • <c1>-<c2> : Los caracteres en orden alfabetico/ascii entre
    • <c1> y <c2>.
    • ^<c> : Todos los caracteres menos <c>.
<cadena> cadena por la cual se substituirá la expresión regular

<opción>
  • Sin opción solo reemplaza la primera ocurrencia en cada línea.
  • g Todas las ocurrencias en cada línea.
  • c Pide confirmación de la substitución.

7.2. EJEMPLOS

  • :.s/gat[oa]//g elimina cualquier ocurrencia de gato y gata en la línea actual.
  • :%s/199[0-9]//g elimina cualquier ocurrencia de 1990, 1991, ..., 1999
  • :.,$s/p[aeiou]s[oe]//g elimina cualquier ocurrencia de paso, peso, piso, poso, puso, pase, pese, pise, pose, puse entre la línea actual y el final del archivo
  • :1,.s/sex[^o]//g elimina cualquier ocurrencia de sex y un caracter que no sea "o" desde el principio y la línea actual.
  • :15,50s/casa/choza/g substituye las ocurrencias de casa por choza entre las líneas 15 y 50.

8. Utilidades adicionales

  • J Junta en una sola línea la actual y la siguiente (se puede multiplicar con <#>).
  • [Ctrl] G Información de la posición actual y del archivo en edición.
  • [Ctrl] L Refresca la pantalla (cuando un mensaje del sistema interrumpe el programa)

8.1. OPCIONES DE DESPLIEGUE

  • :set nu Muestra el número de línea de cada una.
  • :set nonu Oculta los números de línea.
  • :set wrap Muestra las líneas completas en la pantalla.
  • :set nowrap Muestra únicamente la porción de cada línea que cabe en la pantalla.
  • :set ai Habilita la autoindentación
  • :set noai Deshabilita la autoindentación
  • :set eb "error bell"
  • :set noeb ...
  • :set ic "ignore case" no distingue mayúsculas/minúsculas en las búsquedas
  • :set noic ...
  • :set sm "show matc" cuando se digita un corchete/parentesis indica el compañero.
  • :set nosm ...
  • :set all informa las opciones habilitadas.

8.2. CARACTERES ESPECIALES

En algunos archivos texto es importante insertar caracteres del estilo [Ctrl] M los cuales se pueden insertar utilizando la secuencia:
  • [Ctrl] V <Letra>

8.3. EJECUCIÓN DE COMANDOS DEL SISTEMA

  • :!<comando> Ejecuta el comando especificado en UNIX.
  • :!!<comando> Ejecuta el comando especificado en UNIX con la línea actual como entrada estándar (!<movimiento> envía al programa por la entrada estándar la región de texto que cubre el movimiento).

8.4. ESPAÑOL

Al realizar documentos en español es importante saber que si el ambiente opone resistencia para colocar las tíldes la secuencia: [Ctrl] K ' <vocal> genera la <vocal> tildada.

8.5. OPCIONES POR DEFECTO

En el archivo ~/.exrc se deben colocar las opciones que el usuario desee tener por defecto, adicionalmente el comando:
  • :source <archivo_texto>
permite cargar un archivo de texto predefinido con los comandos que se desee aplicar al archivo.

8.6. MANEJO DE ARCHIVOS

El comando para leer e insertar un archivo insertándolo en la línea actual es
  • :r <archivo_texto>
Para generar nuevos archivos se utiliza
  • :<región> w <archivo_texto>
Si el archivo destino ya existe hay que utilizar:
  • :<región> w! <archivo_texto> para sobreescribirlo.
  • :<región> w >> <archivo_texto> para escrbir al final del archivo.

9. GVIM o vim-X11

Esta es una versión de vim optimizada para Xwindows que soporta el manejo del ratón, permite seleccionar con el puntero las áreas que se desean repetir o manipular. (cuando hablemos de puntero nos referiremos al puntero del mouse y cuando hablemos de cursor nos referiremos al cursor de texto que titila).
  • Para seleccionar un área puedo hacer click y arrastrar el puntero, con ello selecciono el texto.
  • Si hago doble-ckick se selecciona toda la palabra bajo el puntero y si arrastro el puntero tras el doble-click va seleccionando de palabra en palabra.
  • Si hago triple-click: se selecciona toda la línea bajo el puntero y si arrastro el puntero tras el triple-click va seleccionando de línea en línea
  • Si hago cuadruple-click y arrastro el puntero, puedo seleccionar un bloque de caracteres, es la opción más útil cuando se está codificando software.
Una vez seleccionado el bloque se pueden hacer muchas cosas, por ejemplo: 
  • botón medio del ratón pega bajo el puntero lo seleccionado (no importa si es en otra ventana de gvim)
  • y copia la selección para pegarla en otro sitio (se usa cuando no es visible el sitio donde se desea pegar la selección, de lo contrario se hace presionando el botón medio del ratón)
  • p pega el contenido seleccionado a partir de la posición del cursor.
Esto funciona incluso cuando se selecciona un bloque de caracteres con el cuadruple-click. Igualmente, al seleccionar con el cuadruple-click un bloque de texto se pueden hacer cosas como:
  • c cambia todo el bloque por el texto que se digite hasta que se presione [ESC]
  • r reemplaza el bloque por el caracter que se digite a continuación.
  • >> indenta el bloque seleccionado
  • << desindenta el bloque seleccionado
Con estas guías, y conociendo las otras funcionalidades de gvim, uno se puede poner creativo e intentar nuevas cosas, es bastante intuitivo y generalmente funciona lo que a uno se le ocurre.

Espero haya sido de utilidad esta guía, cualquier comentario que tengan o si desean que se agregue un capítulo que crean que hace falta y es de utilidad, háganmelo saber y con gusto lo añadiré.

No hay comentarios:

Publicar un comentario