Skip to content

Editor VI

5/mayo/2010

Este es otro artículo del 2006 que desempolve del antiguo sitio web (que ya no existe) y que he decidido republicar en WordPress para beneficio de todos.

Historia de VI

Este editor fue escrito originalmente en la Universidad de California en Berkeley y se pueden encontrar versiones en casi cualquier edición de Unix, incluido Linux y BSD. Al principio cuesta un poco acostumbrarse a él, pero tiene muchas características muy potentes.

Incluso si vi no se convierte en su editor de texto normal, el conocimiento de su uso no será desperdiciado. Es casi seguro que el sistema de Linux que use tendrá alguna variante del editor vi.

Puede ser necesario usar vi mientras instala otro editor, como Emacs. Muchas herramientas de Unix y de Linux, aplicaciones y juegos usan un subconjunto del grupo de comandos de vi.

Los editores de texto en la antiguedad funcionaban en modo de una línea y se usaban típicamente desde terminales no inteligentes de impresión. Un editor típico que operaba en este modo es Ed. El editor es potente y eficiente, y usa una cantidad muy pequeña de recursos del sistema, y funcionaba con las pantallas de aquel entonces. vi ofrece al usuario una alternativa visual con un grupo de comandos notablemente amplio comparado con ed.

El editor ex/vi fue desarrollado en la universidad de California en Berkeley por William Joy. Originalmente se suministraba como una utilidad no soportada hasta su inclusión oficial en la distribución de Unix AT&T System V. Se ha ido haciendo cada vez más popular, incluso con la competencia de los modernos editores de pantalla completa.

Debido a la popularidad de vi existen muchas variantes clónicas y se pueden encontrar varias versiones para la mayoría de los sistemas operativos. Muchos clones han aumentado y modificado el comportamiento original de vi. La mayoría de los clones no soportan todos los comandos originales de vi. No es el propósito de este artículo el incluir todos los comandos disponibles bajo vi o sus variantes.

Aunque no tengas ninguna intención de usar vi como tu editor regular, el conocimiento básico de vi puede ser una ventaja y de gran ayuda en los momentos que debas editar un archivo de configuración del sistema y el ambiente gráfico no arranque.

Introducción

El editor vi tiene dos modos de trabajo: comandos e insercción.

-En el modo comandos todo lo que el usuario introduce es interpretado como una orden que el programa debe realizar;

-En el modo insercción lo que el usuario introduce es texto que será guardado en el archivo.

La mejor forma de aprender a utilizar vi es utilizándolo, por ejemplo modificando un archivo existente (sea cuidadoso no editar o modificar un archivo que sea importante, utilice un archivo de prueba o una copia de otro archivo. Por ejemplo haga lo siguiente para crear un archivo nuevo llamado “archivoprueba”:

alex@linux:~> vi archivoprueba

Cuando entra en el editor ingresa a una pantalla negra y el programa se encuentra en el modo comando.

~
~
~
~
~
~
~
~
~
~
~
"archivoprueba" [Fichero nuevo]                          0,0-1        Todo

Para comenzar a ingresar texto inmediatamente, presiona la tecla i (I minúscula) El editor pasará al modo inserción, en el cual podrás escribir el texto que deseas guardar en el archivo.

Cuando hayas terminado, para poder guardar el archivo debes cambiar al modo comando. Esta acción se realiza mediante la tecla ESC el cursor bajará a la última línea. Para indicarle al programa que deseas grabar el documento debes presionar “:w”. Si deseas guardar y salir puedes ingresar “:x” o “:wq” (que significa Write (guardar) y Quit (salir)). Si deseas salir descartando todas las modificaciones digita “:q!” (sin las comillas).

acabo de presionar i y ahora estoy ingresando el texto
que se guardara en el documento.

ahora voy a guardar el documento y salir de vi
presionar ESC y el comando :x

fin

~
~
~
~
~
~
:x

Modo Comando

El editor se inicia en el modo comando. Hay diferentes formas de ir al modo de insercción pero siempre se regresa al modo comando con la tecla ESC. Si no está seguro en que modo se encuentra puedes presionar ESC hasta que oiga un beep, lo cual le indicará que está en el modo comando.

Los comandos básicos de vi son:

i (insert) insertar texto en el archivo
:w (write) Guarda el archivo actual
:q (quit) Salir de vi (si no ha guardado los cambios, vi mostrarán un mensaje de error)
😡 (eXit) Grabar y Salir
:wq (write and quit) Grabar y Salir
:q! (quit) Salir sin guardar los cambios
:e nombre (edit) Edita el archivo “nombre”
:sh (shell) ejecuta un comando del sistema sin salir del editor
:n (next) comienza a editar el siguiente archivo en la lista
a (append) insertar en la siguiente posición del cursor
x Borra caracter bajo el cursor
dw (delete word) Borra una palabra
dd (delete line) Borra una línea
u (undo) Deshacer
U (Undo) Deshacer todos los cambios realizados en la línea actual
O Inserta una línea en blanco

Secuencia de comandos básicos

El editor vi utiliza el editor ex cuando trabaja en modo comandos y siempre es la última línea de la pantalla donde se le indican los comandos al ex. Los comandos admiten repetición que indicará cuantas veces se ejecutará el comando. Por ejemplo dd borra una línea, pero 4dd borrará 4 líneas. La mayoría de los comando no producen salida por pantalla de la acción, pero si cuando la acción es finalizada, por ejemplo cunado ponga 11dd (borrar 11 líneas) vi le dirá ’11 lines deleted’.

Movimientos dentro del archivo

Debes estar en modo comando para moverte dentro del archivo. Generalmente las teclas de cursor funcionan bien (pero pueden no funcionar si está conectado a través de un emulador de terminal – desde un PC por ejemplo – y no coincide la variable TERM de Unix/Linux con la que está emulando, solución: Ver al final de esta página).

La tabla muestra los movimientos más comunes:

Return Siguiente línea
j Siguiente línea
k Línea previa
l Siguiente caracter
h Caracter anterior
Ctrl-F Pantalla siguiente
Ctrl-B Pantalla anterior
Ctrl-D Media pantalla siguiente
Ctrl-U Media pantalla anterior
[[ Inicio documento
H Inicio documento
]] Fin documento
nG Ir a línea n
w una palabra a la derecha
b una palabra a la izquierda
{ fin párrafo
} fin párrafo anterior
/cadena Busca cadena

Para ir a la línea 100 introduzca 100G (si sólo introduce G se moverá hasta el final del archivo).

Las palabras, sentencias, y párrafos tienen especial significado para vi y existen comandos para moverse a través de ellas. Una palabra es cualquier caracter delimitado por blancos o puntuación y también cada símbolo de puntuación es una palabra. Sin embargo si Ud. utiliza la mayúscula del comando de movimiento se saltará la puntuación, por ejemplo B es lo mismo que b y mueve el cursor una palabra hacia atrás pero si hay un punto b se parará ahí pero B no.

Una sentencia es una cadena de texto con un punto final y dos espacios en blanco. Con ) y ( se moverá hacia adelante una sentencia o hacia atrás respectivamente.

Un párrafo es el que termina con dos Enter.

Búsqueda de cadenas de texto

Las búsquedas se realizarán en modo comando y para iniciarlas debe presionar /. Esto causará que el cursor baje a la línea inferior, indique el texto a buscar finalizando con un Enter. Vi comenzará a buscar desde la posición del cursor hacia el final del archivo. Si desea buscar en dirección inversa (hacia el principio del archivo) presione ? en vez de /.

Si desea repetir la busqueda, solo debe ingresar // y presionar Enter.

Cómo instalar KDE 3.5.0 en Suse 10
Sección: Documentación

Versión instalada por defecto: 3.4.2
Versión a instalar: 3.5.0
Conexión a Internet: Si
Espacio requerido en disco: 390 mb.
Extras incluidos: Ninguno

Este árticulo trata de cómo actualizar KDE 3.5 mediante yast.

Para ello abrimos el Centro de Control de YaST, en Software,
pinchamos sobre Cambiar fuente de instalación, ahora en la
nueva ventana pulsamos sobre Añadir y elegimos FTP.... En Nombre
del servidor ponemos: ftp.rediris.es, y en Directorio
del servidor, introducimos:
pub/linux/distributions/suse/pub/suse/i386/supplementary/
KDE/update_for_10.0/yast-source/
y aceptamos(aquí tardará un poco ya que tiene que bajar la
lista de paquetes). Ahora tenemos que activar esta nueva fuente,
pinchando sobre la nueva linea y pulsando en el botón
Activar o Desactivar. Comprobamos que en la columna Estado
pone Activado y le damos a Finalizar.

/ftp

Modo Inserción

Antes de ir al modo inserción recordar que siempre se sale de él presionando la tecla ESC. La tabla siguiente muestra los comando básicos para pasar a modo inserción.

a (append) inserta después del caracter sobre el cual estamos
i (insert) antes de caracter sobre el que estamos
A (append) al final de la línea actual
I (insert) antes del primer caracter diferente de espacio en la línea corriente
o abre una línea en blanco abajo de la actual
O abre una línea en blanco arriba de la actual

Correcciones

La única forma de corregir un error en modo inserción es borrar y reintroducir los caracteres.

Correcciones más complejas pueden ser realizadas desde el modo comandos. La tabla siguiente muestra los comandos que pueden ser utilizados:

x borra caracter
dw (delete word) borra una palabra
dd borra una línea
r (replace) reemplaza un caracter sobre el cursor
R reemplaza una serie de caracteres (sobreescribe, se termina con ESC)
cw (change word) cambia una palabra
s suprime el caracter actual donde se encuentra el cursor y entra al modo inserción
J (Join) unir la línea actual con la siguiente.
. repite el ultimo cambio

Un comando interesante es el punto (.) el cual repite el último cambio hecho en modo inserción. Este puede ser utilizado para cambiar cada ocurrencia de un cadena de texto con otro, por ejemplo: si introducimos el comando /feo para buscar el texto “feo”. Entonces entre el comando cw e introduzca “lindo” para reemplazar feo por lindo. Presione ESC para terminar. Para encontrar la siguiente ocurrencia introduzca el comando n y luego . para repetir el último cambio.

Comandos ex

La flexibilidad de vi se basa en otro editor, el ex. En particular operaciones de búsqueda global y reemplazo están soportadas por ex. Para pasar al modo comandos del ex debe introducir desde el modo comando de vi (no insertando) los dos puntos (:). En este modo el cursor bajará a la última línea de la pantalla y aceptará comandos en modo ex. El comando es ejecutado cuando presiona Enter. Con Ctrl-C el comando es cancelado.

Los comandos ex en vi tienen la siguiente sintaxis:

: dirección comando

Esto significa: Ejecutar el comando sobre las lineas especificas obtenidas desde la dirección indicada. Si dirección es omitida, la línea actual es utilizada.

Direcciones (dentro del archivo):

% todas las lineas del archivo.
x,y<*td> desde la linea x hasta y.
. linea actual.
n linea numero: n.
$ ultima linea del archivo.
x-n n lineas antes de linea x.
x+n n lineas despues de linea x.
/pat/ avanzar hasta la linea que contiene pat.
?pat? retroceder hasta la linea que contiene pat

Algunos comandos son:

s/viejo/nuevo/ substituye la primera coincidencia de “viejo” con “nuevo”
s/viejo/nuevo/g substituye todas las coincidencias de “viejo” con “nuevo”
s/viejo/nuevo/n substituye la n coincidencias de “viejo” con “nuevo”
ya c envia la línea a la memoria temporal “c” o a la memoria general si “c” es omitido.
g direccion cmd ejecuta cmd en todas las lineas que cumplan la condicion de “direccion”.
> mueve a la derecha.
< mueve a la izquierda.
d borra la linea.
! UNIX-cmd ejecuta un comando de Unix/Linux en la linea.
m direccion mueve lineas a “direccion”

Por ejemplo, para mover la primera linea al final del texto, seria:

1   primera linea     (el cursor se encuentra ubicado en esta linea)
2   segunda linea
3   tercera linea
4 linea final
~
~
~
~
~
~
~
~
~
~
:m $

El resultado es:

2   segunda linea
3   tercera linea
4 linea final
1   primera linea
~
~
~
~
~
~
~
~
~
~
:m $

Sobre el editor ex puede ejecutar comando refiriéndose a las líneas del texto. Por ejemplo el punto (.) representa la línea actual, y el $ la última línea. Por lo tanto se pueden combinar tal como .,$ lo cual significaría desde la línea actual hasta hasta la última línea en el archivo. Combinando este tipo de especificación se pueden crear comandos tales como :.+1,$d para borra cada línea desde la actual hasta el fin del archivo. La palabra g puede ser utilizado para realizar el tratamiento como global.

Búsqueda y reemplazo global

El siguiente ejemplo es una búsqueda global con reemplazo para mostrar las capacidades de vi.

Se desea buscar la cadena viejo y sustituirla por nuevo, desde el principio hasta el final del texto:

:1,$s/viejo/nuevo/g

Se desea buscar en todo el archivo la palabra “feo” y reemplazarla por “lindo”:

:g/feo/s//lindo/g

Si se desea utilizar caracteres especiales se debe emplear el \ (backslash). Por ejemplo para reemplazar todos los $ en **:

:g/\$/s//**/g

El Enter también puede ser especificado introduciendo ‘ControlV’.

Referencia rápida

La siguiente tabla da una referencia rápida con lo que soporta vi (generalmente vi tiene los mismos comandos en diferentes sistemas):

Obs: Los comandos comienzan por : y termina con Enter, preste atención a la tecla de Mayúsculas porque los comando se comportan de forma distinta si está presionada o no.

Ingresando a vi
vi file edita file
vi -r file edita la última versión salvada de file (recupera)
vi + n file edita y pone el cursor en la línea n
vi + file ídem anterior, pero a la última línea
vi file1 … filen edita file1 a filen, despues de guardar file1, presione n para pasar al siguiente
vi + /str file edita y sitúa el curso en la línea que contiene str
Salvar y Salir
ZZ o :wq o 😡 guardar y salir
:w file guarda en file
:w! salva y no controla la protección de escritura
n,mw file salva desde la línea n a la m en file
n,mw>> file añade desde n a m al final de file
:q sale (si hay cambios no ejecuta el comando)
:q! sale (si hay cambios los descarta)
Q permite pasar al ex (:vi retorna)
:e! reeditar el archivo actual, descarta los cambios
Comandos de status
:.= imprime línea actual
:= imprime n líneas en el archivo
Ctrl-g imprime status del archivo
:l (ele) imprime los caracteres especiales de la línea actual
Insertar
a agregar texto
A agregar texto después del final de la línea
i insertar
I insertar texto antes del cominezo de la línea
o inserta un línea nueva (abajo)
O inserta una línea nueva (arriba)
Ctrl-V char inserta el char (válido para insertar caracteres de control)
:r file lee file e inserta después de la línea actual
:nr file ídem anterior pero inserta después de la línea n
Deshaciendo
u deshacer último comando
U Restaura la línea al estado original
“np Repite el n-esimo borrado (hasta 9 max)
n repite el último / o ? (búsqueda)
N Ídem anterior pero en orden inverso repite la última (bísqueda)
, ídem anterior pero en orden inverso
. repite el último cambio de texto
Posicionamiento del cursor
{ Marca las secciones cuando está en la primera columna
[[ Hacia atras y principo de sección
]] hacia adelante y principo de sección
Movimientos del cursor
k arriba
j abajo
h izquierda
l (ele) o Space derecha
w o W siguiente palabra (Mayúscula ignora puntuación)
b o B palabra previa
e o E fin palabra
0 o | 1 columna
$ último caracter en la línea
+ o Return 1 caracter de la línea
1 caracter no blanco de la línea
G última línea
G$ último caracter
nG linea n
( comienzo de sentencia
) comienzo de sgte sentencia
{ Comienzo de párrafo
} Comienzo de párrafo sgte
Borrar
<- o Ctrl h borra caracter en modo insertar
Ctrl w borra palabra en modo insertar
Crtl x borra texto insertado en modo insertar
nx borra n caracteres incluyendo el de la posición del cursor
nX borra n caracteres previos al cursor incluido
D borra desde posición actual al fin de línea
ndw borra n palabras
Búsqueda
% busca el comienzo de () [] {}
fchar busca char hacia adelante
Fchar busca char hacia atrás
tchar busca hacia adelante en linea actual
Tchar busca hacia atrás en linea actual
/str busca string
?str busca string hacia atrás
:set ic (ignore case) diferenciar mayúsculas/minúsculas.
:set noic (no ignore case) no diferenciar mayúsculas/minúsculas.
Copiar
nyy o nY copia n líneas en la memoria
p pega las líneas de la memoria en la posición del cursor
P ídem anterior pero antes del cursor
:%!sort o :1,$!sort ordenar el archivo actual
:5,10s/windows/winbugs/2 cambia la segunda coincidencia de windows por winbugs entre las lineas 5 a la 100.
:3,9m$ mueve desde la tercera a la novena linea al final del archivo.
ab ltda. Limitada cuando escriba ltda. será automáticamente reemplzado por Limitada
:g/{/,/}/> desplaza todas las líneas entre un “{” y un “}” hacia la derecha

Ejemplo práctivo: modificar un archivo del sistema

alex@linux:~> cp /etc/samba/smb.conf prueba.txt
alex@linux:~> vi prueba.txt

Luego en vi:

# smb.conf is the main Samba configuration file. You find a full commented
# version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the
# samba-doc package is installed.
# Date: 2005-11-11
[global]
workgroup = WORKGROUP
printcap name = cups
cups options = raw
map to guest = Bad User
include = /etc/samba/dhcp.conf
logon path = \\%L\profiles\.msprofile
logon home = \\%L\%U\.9xprofile
logon drive = P:

[homes]
comment = Home Directories
valid users = %S
browseable = No
read only = No
inherit acls = Yes

:s/WORKGROUP/LABORATORIO

Despues de realizar el cambio, guardar el documento y salir de vi:

# smb.conf is the main Samba configuration file. You find a full commented
# version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the
# samba-doc package is installed.
# Date: 2005-11-11
[global]
workgroup = LABORATORIO
printcap name = cups
cups options = raw
map to guest = Bad User
include = /etc/samba/dhcp.conf
logon path = \\%L\profiles\.msprofile
logon home = \\%L\%U\.9xprofile
logon drive = P:

[homes]
comment = Home Directories
valid users = %S
browseable = No
read only = No
inherit acls = Yes

:x

¿Qué sigue ahora?

Los comandos que acaba de aprender deberían ser suficientes para su trabajo. Sin embargo, solamente ha visto la superficie del editor vi. Hay comandos para copiar material de un lugar del fichero a otro, para mover material de un lugar a otro, para mover texto de un fichero a otro, para ajustar el editor a sus gustos personales, etc. Con todo, hay unos 150 comandos.

Solución a problemas con teclas en un emulador de terminal

cambiar la variable TERM en la consola con
setenv TERM vt100 (en csh) o
TERM=vt100; export TERM (en sh) y
en el emulador seleccione como terminal vt100.

Enlaces:

Anuncios

Los comentarios están cerrados.

A %d blogueros les gusta esto: