Empezando con linux. El editor «vi»

Cuando uno va a escribir sobre el editor «vi», parece que se tenga que justificar. Y un poco si que lo ha de hacer, realmente «vi» es un editor de otra época, de una época que los editores eran de linea, por lo que presentar un editor a pantalla completa era genial,  aunque nos pueda servir para poder modificar ficheros, la forma de hacerlo que tiene, realmente, no es precisamente cómoda. Entonces ¿porque hablamos de él?: Pues porque es el único editor que es seguro que encontremos en cualquier distribución linux, y que vamos a tenerlo a mano cuando, por problemas, tengamos que arrancar con un sistema mínimo, sin X, o tengamos que gestionar una maquina remota a través de una conexión lenta,  y, bueno, quizás nos apetezca usarlo a veces por un poco de nostalgia, amor a lo retro…. Bromas aparte, veremos que este editor hace algunas cosas muy interesante, por lo que «todo no es malo»

Vamos a empezar haciendo una matización: en la mayoría de sistemas linux, cuando lanzamos «vi», realmente el programa que vamos a levantar es «vim» (si vi era «visual interpreter», vim es «VI improved»)  que aunque es muy semejante, tiene algunas mejoras  (Indicación del modo de trabajo, responde a las flechas, al «Suprimir» y al «Backspace»,…)

Para poder trabajar con «vi» tenemos que empezar entendiendo que este editor tiene tres modos de trabajo:

Modo comando en este modo, podemos escribir comandos de una letra. Hay tantos comandos como letras, teniendo en cuenta que mayúsculas y minúsculas se evalúan de forma distinta.Desde este modo, por medio de algunos comandos, saltaremos a modo edición y a modo ex
Modo edicion en este modo podemos modificar el texto del archivo, según el comando que hayamos utilizado para entrar estaremos en inserción  modificación,…
modo ex El nombre proviene del editor de linea ex, predecesor de vi.En este modo disponemos de gran variedad de comandos para manipular palabras, lineas y ficheros.

Para iniciar vi, teclearemos:

$ vi /ruta/fichero

Aunque para abrir el fichero solo necesitaremos permisos de lectura, para poderlo guardar sera preciso disponer de los permisos de escritura. Tras esa orden, se abre el editor vi en modo comando, si el fichero existe, se presenta su contenido, y si no, se presenta una pantalla vacía para que podamos empezar.

Como hemos dicho, entra en modo comando, con lo que disponemos de los siguientes comandos para movernos por el fichero:

k subir
j bajar
h izquierda
l derecha
^,0(cero) inicio linea
$ fin de linea
w,W Siguiente palabra
b,B Anterior palabra
<#>| ir al carácter # de la linea
t<c> Ir a la siguiente aparición del carácter c en la linea
T<c> Ir a la aparición anterior del caracter c en la linea
G Ir a final de archivo
<#>G Ir a la linea #
H Cursor a principio de pantalla
M Cursor a mitad de pantalla
L Cursor a final de pantalla
[Ctrl] B Pagina anterior
[Ctrl] F Pagina siguiente
% Sobre un corchete o paréntesis, busca a su pareja
} Avanza párrafo
{ Retrocede párrafo
BÚSQUEDAS
/<cadena>   Avanza hasta la siguiente aparición de <cadena>
?<cadena>   Avanza hasta la anterior aparición 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 aparicion de <cadena> (<#> puede ser negativo)

Desde este modo, también podemos alterar el texto con:

x Borra el caracter bajo el cursos
X Borra el caracter que esta a la izquierda del cursor
r Reemplaza un caracter
u Deshace el ultimo cambio
. Repite el ultimo comando
J Une dos lineas
dd Elimina linea actual (ver también cortar y pegar)
dw Elimina la siguiente palabra
d#w Elimina # palabras siguientes
db Elimina la palabra anterior
d#b Elimina # palabras anteriores
d$ Borra desde donde esta el cursor hasta fin de linea
d#G Borra desde la posicion actual hasta la linea #
>> Identa la linea un tabulador a derecha
<< Mueve la linea un tabulador a la izquierda
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.

Dentro del modo comando, tenemos la posibilidad de cortar y pegar. Para ello, vi trabaja con buffers identificados por letras (de la a a la z). Los comandos implicados son el dd que corta, el yy que copia y el p que pega.

Si queremos copiar la linea en la que nos encontramos (en modo comando) a otro lugar, podemos indicar

«ayy

Este comando nos copiara en el buffer a el contenido de la linea en la que se encuentra nuestro cursor; a continuacion nos posicionamos en el sitio de destino, y pulsamos

«ap

y nos aparecerá el contenido del buffer a en la posicion del cursor

Si queremos copiar o cortar varias lineas, deberemos anteponer al yy o dd el numero de lineas.

«b4dd

deja en el buffer b 4 lineas a partir de la posicion del cursor, y las borra de la entrada

«bp

nos deja todas las lineas que haya en el buffer b (en este ejemplo 4) en la posición actual del cursor

Por ultimo, estando en modo comando, podemos utilizar los siguientes, para entrar en modo edición:

a empieza a insertar después del cursor
i empieza a insertar delante del cursor
A empieza a insertar al final de la línea
I empieza a insertar al inicio de la línea
o nueva línea debajo de la actual
O nueva línea arriba de la actual

La mayoría de comandos pueden multiplicar su funcionalidad, anteponiendo un numero al comando; por ejemplo 4o (4 + letra 0) insertara 4 lineas debajo de la actual

Cuando queramos salir del modo insert, deberemos pulsar la tecla ESC

Cuando necesitemos entrar en el modo ex, deberemos estar en modo comando (si no lo sabes, pulsa ESC), y a continuación, pulsamos :, Esto nos enviara automáticamente al final de la pantalla y nos aparecerá el indicador del modo ex. Desde esta linea podemos salir de vi, hacer sustituciones, guardar el fichero, salir de vi, o modificar el comportamiento del programa.

Sustituciones:

:<región><orden>/<exp_reg>/<cadena>/<opción>

Veamos que significa cada cosa:

:
Indicador de modo ex
región
region de actuacion;

  • 1,$ – desde la linea 1 al final.
  • 1,5 de la 1 a la 5,
  • .,$ de la linea actual hasta el final,
  • % para indicar el archivo entero,
  • .+<#> o .-<#> desde linea actualhasta <#>lineas despues/antes
  • g/expresion regular> todas las lineas que contengan esa espresion regular
orden
Indica la orden que se esta ejecutandos – Sustitucion
d – Borrar linea
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 que sustituirá a la expresión regular
opción
  • i- no tiene en cuenta mayúsculas y minúsculas
  • g-todas las ocurrencias en la linea
  • pide confirmación antes de realizar cada sustitución

Algunos ejemplos:

:.s/cas[oa]//g
borra todas las apariciones de caso y casa en la linea actual
:%s/200[0-9]//g
borra todas las apariciones de 2000,2001,2002…2009 en todo el fichero
:g/foobar/s/bar/baz/g
trata únicamente las cadenas «foobar» sustituyendo la subcadena «bar» por «baz».Eso significa que las apariciones de toolbar p.ej. no quedaran afectadas

Salir de vi

Para salir de vi, has de estar en modo ex…vale, aclaro  Os acordáis de los tres estados:comando, edición  y ex?, pues os ponéis en modo comando pulsando la tecla ESC, y a continuación podéis pasar a ex pulsando los dos puntos.

Cuando en la parte inferior de la pantalla aparezcan :, estais en modo ex, ahora si quereis salir de vi tenemos los siguientes comandos:

q
Salir de vi; si hemos modificado algo, nos indicara error
q!
Salir de vi descartando los cambios (no avisa)
w
Guardar los cambios
wq
Guardar los cambios y salir de vi
x
Guardar los cambios y salir de vi
e!
Descartar cambios y abrir la ultima version guardada
<#>
ir a linea #
m,nw <nombre fichero>
guarda de la linea m a la n en el fichero  indicado; si al nombre de fichero se le antepone >>, el contenido se añade al fichero

 

 

Para terminar, indicaros las opciones que se pueden indicar en modo ex para cambiar el comportamiento del editor:

  • :set nu/number     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 wrapmargin=5 Establece el margen automático para que salte una palabra a la siguiente linea
  • :set wrapmargin=0 Deshabilita el margen automático
  • :set ai / autoident Habilita la autoindentación
  • :set noai Deshabilita la autoindentación
  • :set ic/ignorecase     «ignore case» no distingue mayúsculas/minúsculas en las búsquedas
  • :set noic Desabilita la orden ignore case
  • :set sm «show matc» cuando se teclea un corchete/paréntesis indica el compañero.
  • :set nosm
  • :set list Muestra caracteres no imprimibles
  • :set nolist oculta los caracteres no imprimibles
  • :set showmode Muestra el modo actual de operación (comando,editor,ex). Por defecto activado)
  • :set noshowmode oculta el modo de operación
  • :set tabstop=4/ts=4  Establece la tabulación a 4 espacios . (en el fichero se insertara el carácter de tabulación, luego este comando solo es para presentación)
  • :set tx Establece el final de linea al estilo MS-DOS (CR/LF)
  • :set notx Establece el final de linea al estilo Unix (LF)
  • :set hlsearch habilita el resaltado en pantalla de los resultados de una búsqueda
  • :set nohlsearch deshabilita el resaltado en pantalla de los resultados de una búsqueda
  • :syntax on/off habilita el resaltado en pantalla para la sintaxis
  • :set all informa las opciones habilitadas.

Aunque estos comandos los puedes entrar en el modo ex, si quieres que queden de forma permanente,  deberás crear en tu usuario un fichero llamado .exrc o .vimrc y grabar en el, los comando que quieras, sin los dos puntos. Cada vez que arranques el vim, leerá ese fichero para configurar la sesión.

Con esto hemos acabado la presentación de este exótico editor…Se que no es precisamente fácil el aprenderlo, pero realmente es muy potente, y si te lo aprendes, mucho mas útil de lo que parece; lastima de la curva de aprendizaje….

Por si os animáis  os adjunto algunos enlaces de distintas hojas de referencia rápida  para ayudar a vuestra memoria.

http://downloads.tuxpuc.pucp.edu.pe/manuales/otros/vi.pdf

http://www.digilife.be/quickreferences/QRC/VIM%20Quick%20Reference%20Card.pdf (en ingles)

http://es.tldp.org/FAQ/vifaq/vi60.html

http://gblinux.wikispaces.com/file/view/vim.pdf

http://www.linuxtotal.com.mx/?cont=info_admon_010

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Linux y etiquetada , , , , . Guarda el enlace permanente.

Una respuesta a Empezando con linux. El editor «vi»

  1. cesar dijo:

    Muchas gracias por la info! muy util, saludos.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.