Esta página puede ser redistribuida libremente bajo los términos de la licencia GPL. Vease ( GPL texto original ) o si lo prefiere (Traducción española no oficial de la GPL) Al margen de las obligaciones legales que se derivan del uso de esta licencia rogamos sea respetada la referencia a su lugar de publicación original www.ciberdroide.com. y a su autor original Antonio Castro Snurmacher (Madrid 01/01/2000).

Ausencia de Garantía

Esta ausencia de garantía se hace extensa a cualquier tipo de uso de este material y muy especialmente a las prácticas, ejercicios, y de ejemplos que encuentre en estas páginas. Deberá trabajar siempre salvo indicación contraria con un SO Linux y con un usario distinto de 'root' sin privilegios especiales. Como directorio de trabajo se procurará usar el directorio '/tmp' o algún otro que no contenga información valiosa. Tampoco se considera buena idea practicar en una máquina que contenga información valiosa.

Todo esto son recomendaciones de prudencia. En cualquier caso si algo sale mal toda la responsabilidad será únicamente suya. En ningún caso podrá reclamar a nadie por daños y perjuicios derivados del uso de este material. Para más información lea el contenido de la licencia GPL y abstengase de hacer prácticas si no está dispuesto a asumir toda la responsabilidad.

EL EDITOR VI (primera parte)

Introducción

En primer lugar vamos a dedicar bastante esfuerzo a explicar porque aprender 'vi'. Quizás pensó que este capítulo no era para usted porque ya sabe usar otro editor. También vamos explicar la necesidad de dedicar dos largos capítulos a este editor.

Cuando finalice este capítulo podrá editar sus ficheros con 'vi' y hacer bastante trabajo útil pero para ello quizas necesite algo más de esfuerzo que en capítulos anteriores y no porque sea dificil sino porque tendrá que practicar bastante por su propia cuenta.

Otra cosa será sacarle el máximo partido a 'vi'. En un segundo capítulo dedicado a 'vi' veremos opciones más avanzadas. Son opciones que quizás no necesite usar tan frecuentemente pero cuando tenga oportunidad de usarlas comprenderá la potencia el editor 'vi'.

Muchos editores actuales permiten usar distintos tipos de letras y generan documentos con un aspecto precioso que además coincide lo que se ve en pantalla cuando se edita, y con lo que saldrá por la impresora. Está claro que 'vi' no sirve para esto. 'vi' está diseñado para editar ficheros en formato de texto estándar. Pero aunque solo sirva para este formato de texto lo hace muy bien y siempre tendremos oportunidad de usarlo porque a un compilador, o a un interprete le da igual la estética.

Son muchos los editores disponibles en Linux pero desde un principio dijimos que este curso podría servir en gran medida para aprender otros SO tipo Unix. El editor 'vi' está presente desde hace mucho tiempo en un montón de sistemas tipo Unix. Aquí explicaremos solo unos pocos aspectos de 'vi' con la idea de que pueda realizar con razonable soltura la edición de un texto en 'vi'. Con muy pocos comandos de 'vi' se pueden hacer muchas cosas y 'vi' es un editor que para ciertas tareas resulta de una potencia increíble. El que escribe estas lineas lo está haciendo con 'vi' y lleva muchos años usando este editor prácticamente para casi todo y le saco un gran partido, pero cada vez que me encuentro con alguién que sabe bastante de 'vi' aprendo algo nuevo. 'vi' es un editor muy práctico sin tener que conocerlo a fondo pero en manos de un experto resulta de una eficacia espectacular.

'vi' es un editor de lineas interactivo y ha sido muy criticado. Una de las razones para ello es que tiene varios estados o formas de funcionamiento y si uno pasa de un estado a otro sin darse cuenta y continua tecleando cosas, puede ocurrir un pequeño destrozo en el fichero que está editando. Otro inconveniente de 'vi' es que requiere un poquito de aprendizaje. Hay muchísima gente que está acostumbrada a usar otros editores más intuitivos y porque no decirlo más cómodos, y rechazan a 'vi' como algo prehistórico. Otra cosa que suele criticarse es que se usan letras del teclado para cosas tan normales como el movimiento del cursor y la paginación del texto pero este es un claro ejemplo del condicionamiento de la cultura de Microsoft y de los PCs. 'vi' fue diseñado para que se pudiera usar en una gran variedad de sistemas y terminales. El uso de las teclas de flechas puede lograrse mediante la adecuada configuración de 'vi'. Uno de los puntos fuertes de 'vi' es su adaptabilidad.

Quizás una de las más poderosas razones para aprender 'vi' es que 'vi' forma parte de la cultura de los SO tipo Unix. Muchas personas acostumbradas a trabajar por ejemplo con Windows asumirán como estándar cosas que no lo son y cuando se encuentran algo diferente intentan aprovechar al máximo sus conocimientos anteriores.

Generalmente existe una exageradísima tendencia a continuar usando el primer editor que se aprendió y luego se cambia solo de editor obligado por circunstancias poderosas. Nosotros hemos decidido que en posteriores lecciones asumiremos que usted ya sabe usar 'vi'. Pronto tendrá que hacer sus primeros programas en shell-script. Entonces necesitará un editor y nada mejor que 'vi'.

En este curso se le da mucha importancia a la cultura Unix. Para una persona que aprende 'vi' surgen varias oportunidades para aplicar lo que sabe en comandos distintos de 'vi'. La forma de trabajar de 'vi' ha tenido mucho impacto en otros programas. Puede encontrar juegos, hojas de cálculo utilidades, etc que usan cosas parecidas a 'vi'. Ya vimos 'sed' que usa comandos similares a algunos comandos de 'vi' y ahora vamos a ver a continuación algunas nociones de otro editor ('ed') que es otro buen ejemplo de lo que estamos comentando.

'ed' versus 'vi'
Dado que 'vi' está pensado para su uso interactivo desde un terminal no resulta muy apropiado de usar en combinación con otros programas mediante redirección de entrada salida. En el capítulo anterior de expresiones regulares vimos como 'sed' se podía usar como filtro de entrada salida. Existe un editor llamado 'ed' que es capaz de editar texto en modo no interactivo. Para ello se suele recurrir a un script que proporcionará a 'ed' las instrucciones adecuadas. Somos de la opinión de que las lecciones que no dejan ver rápidamente cual es su utilidad y que no se practican están condenadas al olvido. Por eso queremos evitar que piense en términos de "para que necesito yo conocer esto de ed". Por eso más tarde comentaremos algo de 'diff' combinado con 'ed'. Así comprenderá mejor la utilidad del editor 'ed'.

Ahora vamos a generar un fichero 'ejemplo.txt' con unas pocas lineas para hacer unas pocas prácticas..

$ cd /tmp
$ cat <<FIN > ejemplo.txt
> No olvide visitar nuestra web
> http://www.ciberdroide.com
> y esto es todo.
> FIN

Vamos a sacar una copia para comprobar luego los cambios.

$ cp ejemplo.txt ejemplo.txt.original

Ahora generamos un fichero con las instrucciones para editar el fichero anterior. Deseamos que primero localice la linea que contiene 'www.ciberdroide.com' y a continuación añada una linea (comando 'a') '(Tienda Virtual de Linux)'. Salimos al modo comandos (comando '.') Salvamos (comando 'w') y salimos (comando 'q').

$ cat <<FIN > ejemplo.ed
> /www.ciberdroide.com/
> a
> (Tienda Virtual de Linux)
> .
> w
> q
> FIN
$ ed ejemplo.txt < ejemplo.ed 

73
http://www.ciberdroide.com
99

Veamos como ha quedado.

$ cat ejemplo.txt

No olvide visitar nuestra web
http://www.ciberdroide.com
(Tienda Virtual de Linux)
y esto es todo.

Podemos ver las diferencias con el original usando el comando 'diff'. El comando diff es un comando que sirve para señalar diferencias entre dos ficheros pero con la opción -e estas diferencias se expresan en una forma adecuada para ser interpretadas por 'ed'. Veamos como funciona.

$ diff -e ejemplo.txt.original ejemplo.txt

2a
(Tienda Virtual de Linux)
.

Vamos a partir del fichero original y le vamos a pasar por la entrada estándar únicamente las diferencias obtenidas con 'diff -e'

$ cp ejemplo.txt.original ejemplo2.txt
$ diff -e ejemplo.txt.original ejemplo.txt > ejemplo.diff
$ cat ejemplo.diff

2a
(Tienda Virtual de Linux)
.

Vemos que falta las instrucciones 'w' y 'q' para salvar y salir respectivamente así que las añadimos al fichero 'ejemplo.diff'.

$ cat <<FIN >> ejemplo.diff
> w
> q
> FIN
$ cat ejemplo.diff

2a
(Tienda Virtual de Linux)
.
w
q

Ya tenemos todas las instrucciones necesarias. Vamos a aplicar los cambios con 'ed'.

$ ed ejemplo2.txt < ejemplo.diff

73
y esto es todo.
99

$ cat ejemplo2.txt

No olvide visitar nuestra web
http://www.ciberdroide.com
(Tienda Virtual de Linux)
y esto es todo.

En lugar de guardar varias versiones de un gran fichero que sufre pequeñas diferencias de vez en cuando se podría guardar una sola versión y unos pequeños ficheros con esas diferencias ocurridas entre una versión y la siguiente. De esta forma podrían aplicarse secuencialmente para ir recuperando sucesivamente las versiones anteriores en caso de necesidad. Cuando se desarrolla una aplicación se van introduciendo sucesivamente cambios en los programas y para poder recuperar versiones antigüas habría que ir salvando y conservando cada nueva versión. Los programas que se utilizan para el mantenimiento de distintas versiones de una aplicación suelen basarse en esta idea para ahorrar espacio de almacenamiento.

'vim' versus 'vi'
En Linux existe un editor 'vi' muy mejorado que se llama 'vim'. Este editor es muy similar a 'vi' pero con importantes mejoras. La más importante sin lugar a dudas es la capacidad de deshacer retrocediendo uno a uno en los últimos cambios realizados. Esto permite recuperar aquello de los destrozos que dijimos antes. También permite resaltar la sintaxis de ciertos ficheros como. shell-script, html, lenguaje C, y otros muchos lenguajes. Este y otros detalles lo hacen muy adecuado para programar. El manejo del cursor en los distintos modos del editor resulta mucho más cómodo y un montón de cosas más.

Mas adelante veremos que se pueden usar distintas opciones para que el editor funcione en la forma que nosotros queramos. 'vim' puede ejecutarse en modo compatible 'vi' (:set compatible) pero es mejor usar el modo no compatible que nos proporcionará las agradables ventajas sobre el 'vi' tradicional que antes comentamos. (:set nocompatible) Generalmente en Linux se instala 'vim' como sustituto de 'vi' de forma que aunque usted teclee 'vi' en realidad puede estar ejecutando 'vim' o 'elvis' u otros similares. Salgamos de dudas:

$ vi -? | less

Solo si le invita a usar la opción '-h' hágalo.

$ vi -h | less

Compruebe en las primeras lineas si se trata de 'vim'. Si ya ha entrado por error en editor salga mediante <ESC> :q<ENTER> Continuemos averiguando cosas.

$ whereis vi
$ whereis vim
$ whereis elvis
$ man vi
$ man vim
$ man elvis
$ man ex
$ man view
$ man ed

Ahora si vamos a entrar y a salir en el editor.

$ vi

Ya está dentro del editor. Compruebe si sale información relativa al tipo de editor y salga tecleando ':q' Para significar que estamos en el editor 'vi' pondremos el fondo azul oscuro y las letras en amarillo son las que salen en pantalla y en blanco las que introducimos nosotros.


~                      VIM - Vi IMproved
~
~                         version 5.3
~                   by Bram Moolenaar et al.
~
~                 Vim is freely distributable
~        type  :help uganda<Enter>     if you like Vim
~
~        type  :q<Enter>               to exit
~        type  :help<Enter>  or  <F1>  for on-line help
~        type  :help version5<Enter>   for version info
~
~
:q

Cuadro resumen para el uso de 'vi'
A continuación se describen una serie de comandos de uso frecuente en 'vi'. Se destacan los que se consideran más importantes con un mayor numero de asteriscos. En una primera lectura le recomendamos que empiece a utilizar y a aprender aquellos comandos marcados con '***' que son los más importantes. Le aconsejamos que no pase de lección hasta que no se aprenda como mínimo los comandos calificados con '***'. Al final del capítulo como es costumbre pondremos un test pero solo haremos preguntas sobre comandos calificados con '***' que serán los que practicaremos de forma especial en este capítulo.

Hemos agrupado toda esta información en un único cuadro para que sea su chuleta, para usar y aprender 'vi'. Solo se incluyen los comandos que suponemos serán de la mayor utilidad para un usuario novato y dado que hay varias formas de hacer una misma cosa hemos elegido por usted y hemos clasificado de forma totalmente subjetiva una serie de comandos para que inicialmente tenga que aprender solo un reducido número de ellos. También se incluyen otros comandos para que pueda ser usado como un cuadro de consulta bastante completo.

        ***       --> Comando de uso imprescindible.
        **        --> Comando de uso muy frecuente.
        *         --> Comando de uso no tan frecuente.

LINEA DE COMANDOS
***vi Editar un nuevo fichero
***vi <fichero> Editar un fichero. (Si el fichero es de solo lectura lo editara en modo solo lectura.
*vi <fichero1> <fichero2> <fichero3> ... Editar varios ficheros sucesivamente.
**vi -R <fichero>Editar en modo solo lectura.
**vi -r <fichero>Editar recuperando modificaciones no salvadas.
MODO COMANDOS
Se pasa desde el modo entrada (inserción o reemplazo) mediante <ESC>.
Movimientos del cursor
.
**h Carácter anterior
**<ENTER> Linea siguiente
**j Linea siguiente
**k Linea anterior
**<ESPACIO> Carácter siguiente
**l Carácter siguiente
*L Ultima linea de la pantalla
*H Primera linea de la pantalla
*M Linea central de la pantalla
*<CTRL+B> Retroceso de página
*<CTRL+F> Avance página
*+ Primer carácter de la linea siguiente
*- Primer carácter de la linea anterior
*$ Desplazarse al final de linea.
*0 Desplazarse al principio de linea.
Modo entrada de texto
.
***i Pasar a modo entrada insertando.
***R Pasar a modo entrada reemplazando.
**a Avanzar el cursor y pasar a modo entrada insertando.
***o Insertar una linea después de la actual y pasar a insertar.
*O Insertar una linea antes de la actual y pasar a insertar.
Corregir
.
***u Deshacer última modificación. (En vim se pueden ir deshaciendo los
los últimos cambios en otros editores vi solo se deshace el último cambio).
***<CTRL+R> En 'vim' sirve para deshacer el último comando 'u'
**U Recuperar linea completa.
Buscar
.
**/ Busca una cadena de caracteres, hacia delante.
*? Busca una cadena de caracteres, hacia atrás.
*n Siguiente en la búsqueda.
*N Anterior en la búsqueda.
Copiar, Mover, y borrar lineas
.
***dd Borrar una linea.
***<n>dd borrar <n> lineas.
***yy Meter una linea en el buffer.
***<n>yy Meter <n> lineas en el buffer.
***p Copiar la linea del buffer después de la línea actual.
*P Copiar la linea del buffer antes de la línea actual.
Varios
.
***<CTRL+L> Refrescar pantalla. (Útil cuando se descompone la pantalla)
**<CTRL+G> Visualiza el nombre del fichero, numero de lineas totales y en que linea estamos.
***J Une la línea actual con la siguiente.
**. Repetir último comando.
***: Pasar al modo ex (Modo comandos)
***ZZ Terminar salvando si hubo cambios.
MODO EX
Se pasa desde el modo de comandos al modo ex con ':'
Se puede forzar a entrar directamente en este modo
usando la opción '-e' o ejecutando el comando 'ex'.
** :<#linea> Ir a una linea.
* :e <fichero> Pasa a editar de forma simultanea otro fichero.
* :e # Volver al fichero anterior.
*** :w Salvar. (No puede sobreescribir si se entró con vi -R)
*** :w! Salvar forzando (Cuando falla :w).
** :x Salir salvando si es necesario.
*** :w <fichero> Salvar con otro nombre. (No puede existir el fichero)
*** :w! <fichero Salvar con otro nombre forzando.(Permite sobreescribir)
*** :r <fichero> Lee un fichero y lo carga en el lugar indicado por la posición actual del cursor.
** :r !<comando Ejecuta en una subshell el comando y guarda el resultado
del mismo en la posición indicada por el cursor.
*** :q Salir si no hay modificación.
*** :q! Salir sin salvar cambios.
** :wq Salir salvando cambios.
* :sh Ejecutar una subshell (se retorna con exit).
* :g/<s1>/p Visualizar lineas que tienen <s1>
* :g/<s1>/s//<s2>/g Sustituir globalmente <s1> por <s2>.
* :g/<s1>/s//<s2>/gc Ídem pero pidiendo confirmación.
* :n Siguiente documento.
* :args Mirar ficheros a editar.
* :ab m n Abreviaturas. Teclear 1 se sustituye por 2
* :unab m Desabreviar.
* :map m n Crear macro (m hace n) (Ver ejemplos con macros)
* :map! m n Crear macro en modo inserción (m hace n)
* :unmap m Destruir macro m
* :unmap! m Destruir macro de inserción m.
* :cd Cambiar de directorio actual.
** :set nu Activar visualización de números de línea
** :set nonu Activar visualización de números de línea
** :set all Ver todas las opciones con sus valores.
** :set nocompatible Opción de 'vim' para no obligar a ser compatible 'vi'
*** :set showmode Para visualizar siempre el modo en que nos encontramos.
*** :!<comando> Ejecutar un comando en una subshell.(Ver ejemplos con !)
Muchos de estos comandos
pueden aplicarse dentro de un
rango de líneas especificado.
Un número de línea (#linea) puede venir como:
Un punto . Línea actual
Un punto .-N N Líneas antes de la actual
Un punto .+N N Líneas después de la actual
Un número N Línea N
Un $ $ Ultima línea.
Un $ % Desde la última a la primera línea (Abreviatura de 1,$).
*** :#linea1, #linea2 w <fichero> Salvar desde 1 hasta la 2 en <fichero>
** :#linea1, #linea2 co #linea3 Copiar desde 1 hasta 2 en 3.
** :#linea1, #linea2 mo #linea3 Mover desde 1 hasta 2 en 3.
** :#linea1, #linea2 de Borrar desde 1 hasta 2.
** :#linea1, #linea2 s/<s1>/<s2> Sustituir la primera ocurrencia en cada linea desde 1 hasta la 2 la cadena <s1>
por la cadena <s2>
** :#linea1, #linea2 s/<s1>/<s2>/c Sustituir la primera ocurrencia en cada linea desde 1 hasta la 2 la cadena <s1>
por la cadena <s2> con confirmación.
** :#linea1, #linea2 s/<s1>/<s2>/g Sustituir todas las ocurrencias en cada linea desde 1 hasta la 2 la cadena <s1>
por la cadena <s2>
** :#linea1, #linea2 s/<s1>/<s2>/gc Sustituir todas las ocurrencias en cada linea desde 1 hasta la 2 la cadena <s1>
por la cadena <s2> con confirmación

Sería conveniente que sacara por la impresora esta información para usarla a modo de chuleta en sus primeras prácticas con 'vi'.

Existe otra forma de aplicar comandos dentro de un rango de lineas. Desde el modo de comandos pulsando 'v' se pasa al modo 'vi' o modo 'visual'. Entonces moviendo el cursor marcamos todo el rango de lineas que queramos tratar y pulsando ':' pasamos al modo 'ex' para aplicar el comando que queramos. Cualquier comando que se pueda introducir en 'vi' estando en el modo de 'ex' puede ser incluido en un fichero .exrc en el $HOME que servirá para que 'vi' ejecute esos comandos cada vez que arranque. Se usa mucho para definir macros y para activar determinadas opciones con set pero eso lo veremos en otro capítulo.

Practicando lo más esencial de 'vi'.
Si no se usa ninguna opción inicial vi empezará en modo comandos. Para pasar al modo entrada hay varias formas pero recomendamos que se aprenda de momento solo. i, a, o, R. Ya hemos descrito estas funciones en 'chuleta-vi.txt' y practicaremos con ellas más adelante.

Del modo entrada (Insertar o reemplazar) se sale con <ESC>.

Normalmente trabajábamos en '/tmp' como directorio temporal pero esta vez vamos a crear un directorio nuestro de trabajo para poder conservar nuestro trabajo el tiempo que queramos. Para ello crearemos un directorio 'cursolinux' y nos situaremos en él para trabajar.


$ cd
$ mkdir cursolinux
$ cd cursolinux
$ vi ej-vi1.txt

Dado que no existía ningún fichero 'ej-vi1.txt' estaremos editando un fichero nuevo y dependiendo del editor usado (nosotros usaremos 'vim') aparecerá algo del tipo.


~
~
~
"ej-vi1.txt" [New File]

Está en modo comandos y va a teclear sus dos primeros comandos. Cuando vea '<ENTER>' en los ejemplos significa que debe pulsar esa tecla.

:set showmode<ENTER>
:set nu<ENTER>

Acabamos de activar la visualización del modo de funcionamiento y la visualización de los números de línea. Ninguna de estas cosas son necesarias para editar un fichero pero a nosotros nos van a ayudar a ver más claro lo que hacemos.

Ahora pulsaremos la 'i' y aparecerá en la linea inferior el indicador de que estamos en modo entrada para inserción. Desde este modo introduciremos las siguientes lineas de texto.

     1  Estamos practicando con el editor vi.<ENTER>
     2  No parece tan difícil de usar.<ENTER>
     3  Ya voy por la tercera linea y no ha ocurrido nada grave.<ENTER>
     4  <ENTER>
     5  <ENTER>
     6  Como he saltado un par de líneas voy por la linea seis.<ENTER>
     7  De momento no escribo nada más.<ESC>
    ZZ

Con la tecla <ESC> salimos al modo comandos y con 'ZZ' (mayúsculas) desde el modo comandos salimos salvando el fichero. Ahora vamos a volver a editarlo.

$ vi ej-vi1.txt

Volvemos a activar los modos 'showmode' y 'nu' y nos situamos en la línea 3 y la borramos con 'dd' luego nos situamos en la primera línea y hacemos 'p' que copiará la linea eliminada a continuación de la línea primera. 'dd' guarda siempre en un buffer la información eliminada para poder recuperarla con 'p'. Podríamos haber borrado cinco lineas de golpe usando '5dd' y las cinco líneas habrían sido guardadas en el buffer para su posible recuperación con 'p'.

:set showmode<ENTER>
:set nu<ENTER>
:3<ENTER>
dd
:1<ENTER>
p

Pero ahora la línea 2 dice que es la tercera así que intente usted mismo borrar una de las líneas vacías y situarla como segunda línea usando de nuevo 'dd' y 'p'. Esta vez mueva de linea usando 'j' desde el modo comandos para bajar a la linea siguiente y 'k' para subir a la línea anterior. Si el teclado está configurado en su editor para manejar correctamente las teclas de flechas podrá hacer esto mismo usando las teclas flecha abajo y flecha arriba en sustitución de la 'j' y la 'k' respectivamente. Si algo sale mal borre el fichero y vuelva a empezar procurando no volver a meter la pata. Bueno el caso es que el fichero debería quedar con este aspecto.

     
    1 Estamos practicando con el editor vi.
    2 
    3 Ya voy por la tercera linea y no ha ocurrido nada grave.
    4 No parece tan difícil de usar.
    5 
    6 Como he saltado un par de líneas voy por la linea seis.
    7 De momento no escribo nada más.

Vamos a sacar una copia de este fichero modificado con otro nombre, y luego vamos a duplicar varias veces el contenido de las líneas cuatro y cinco usando '2yy' (guarda en el buffer dos lineas) y 'p' para (copia el contenido del buffer en la línea actual). Asegurese que está en modo comandos. Pulse <ESC> si no está seguro y teclee los comandos siguientes. Advierta que algunos comandos empiezan por ':' y terminan por <ENTER> mientras que otros no.

:w ej-vi2.txt
:4<ENTER>
2yy
:3<ENTER>
p
:3<ENTER>
p
:3<ENTER>
p

Estamos repitiendo varias veces la línea 'No parece tan difícil de usar.' Debería quedar finalmente con este aspecto.

     
    1 Estamos practicando con el editor vi.
    2 
    3 Ya voy por la tercera linea y no ha ocurrido nada grave.
    4 No parece tan difícil de usar.
    5 
    6 No parece tan difícil de usar.
    7 
    8 No parece tan difícil de usar.
    9 
   10 No parece tan difícil de usar.
   11 
   12 Como he saltado un par de líneas voy por la linea seis.
   13 De momento no escribo nada más.

Como hemos visto con '2yy' hemos metido en el buffer dos lineas en lugar de una. Para meter una sola linea habría bastado usar 'yy' o '1yy'. Ahora vamos a salir pero sin guardar ninguno de los cambios realizados. Primero intentaríamos salir sin más con ':q' desde el modo comandos.

:q

Obtendremos un aviso del editor para no perder las últimas modificaciones.


No write since last change (use ! to override)

Pero realmente deseamos salir sin salvar así que intentamos de nuevo con ':q!' desde el modo comandos.

:q!

Vamos a comprobar que los últimos cambios no se han guardado, y vamos a ver que permisos tiene este fichero.

$ cat ej-vi1.txt

Estamos practicando con el editor vi.
No parece tan difícil de usar.
Ya voy por la tercera linea y no ha ocurrido nada grave.


Como he saltado un par de líneas voy por la linea seis.
De momento no escribo nada más.
$ ls -l ej-vi1.txt

-rw-r--r--   1  xxxx xxxx   216 ago 12 18:24 ej-vi1.txt

La información de permisos puede ser diferente. Recuerde que dijimos que los permisos de un fichero cuando se crea dependen de la 'umask' pero ahora solo nos interesa comprobar efectivamente tenemos permisos para leer y escribir en este fichero. Vamos a eliminar los permisos de escritura del fichero y vamos a intentar editarlo nuevamente.

$ chmod 444 ej-vi1.txt
$ ls -l ej-vi1.txt
-r--r--r--   1  xxxx xxxx   216 ago 12 18:24 ej-vi1.txt
$ vi ej-vi1.txt

Probablemente aparecerá en la linea inferior de su editor una advertencia de que está en modo solo lectura.


"ej-vi1.txt" [readonly] 7 lines, 216 characters

Bueno a pesar de ello vamos a intentar hacer cambios y como estamos practicando continuaremos con una serie de comandos que aún no hemos visto y que teníamos clasificados con '***'.

:3
:.,$ w trozofinal
:1,. w trozoinicial
:1,$ de
:r trozoinicial
:$
:r !date
:$
:r trozofinal
:w tempfich
:w

'readonly' option is set (use ! to override)

Permitió escribir otros ficheros pero se niega a sobrescribir el fichero que estamos editando con los cambios porque está en modo solo lectura y sugiere que usemos '!' para forzar su escritura.

:w!

En este caso estamos forzando la situación y estamos escribiendo en un fichero en el que no tenemos permisos pero puesto que somos propietarios del mismo el editor puede manejar los permisos para dar permiso de escritura, sobrescribir el fichero y volver a cambiar los permisos dejando los permisos originales.

Podemos ejecutar comandos desde el editor así que porque no miramos los permisos con 'ls -l'.

:!ls -l

total 6
-r--r--r--   1 xxxx xxxx       304 ago 12 19:11 ej-vi1.txt
-r--r--r--   1 xxxx xxxx       304 ago 12 19:11 ej-vi1.txt~
-rw-r--r--   1 xxxx xxxx       216 ago 12 18:28 ej-vi2.txt
-rw-r--r--   1 xxxx xxxx       304 ago 12 19:09 tempfich
-rw-r--r--   1 xxxx xxxx       147 ago 12 19:06 trozofinal
-rw-r--r--   1 xxxx xxxx       126 ago 12 19:06 trozoinicial

Press RETURN or enter command to continue

Debemos pulsar <ENTER> para volver al editor Puesto que podemos ejecutar cualquier comando también podemos ejecutar bash como una subshell. Aprovecharemos para ver los procesos activos.

:!bash
bash-2.01$ ps

  PID TTY STAT TIME COMMAND
  221   2 S    0:00 -bash
  893   2 S    0:00 vi ej-vi1.txt
  944   2 S    0:00 bash
  951   2 R    0:00 ps
bash-2.01$ exit

exit

1 returned

Press RETURN or enter command to continue

Por fin estamos de vuelta en el editor. Vamos a continuar practicando algunos comandos importantes que nos quedan.

:3<ENTER>
o
Hemos pasado a insertar abriendo una linea.<ESC>
J

Con la 'J' mayúscula hemos unido dos líneas en una. Ahora vamos a pasar al modo entrada para reemplazar.

:3<ENTER>
R
XXXXXXXXXXXXXXXXX<ESC>sertar abriendo una linea.  Ya voy por la tercera linea y no ha ocurrido nada grave.

<ESC>
<CTRL+G>


"ej-vi1.txt" [Modified][readonly] line 4 of 10 --40%-- col 44

Desde el modo comandos podemos consultar el nombre del fichero, cuantas lineas tiene en total, en que línea y columna estamos, y otras cosas con solo pulsar <CTRL+G> .

Ahora utilice varias veces el comando 'u'. Si está en 'vim' verá como se deshacen retrocediendo secuencialmente en las últimas modificaciones que hemos realizado. Luego si está usando 'vim' use <CTRL+R> para avanzar de nuevo en las últimas modificaciones hasta recuperarlas todas. Para terminar salga con ':q!'

Practique con la combinación de 'yy' o 'nyy' y 'p'. O con la combinación 'dd' o 'ndd' y 'p'. Se usan mucho para copiar o trasladar pequeños bloques de información.

Para mover una linea hacer 'dd', luego situarse en la posicion destino y hacer 'p'. Para mover varias lineas hacemos algo parecido. Borramos primero varias lineas y luego desde la posición destino hacemos 'p'. Para copiar en lugar de mover usaríamos 'yy' en lugar de 'dd'.

Bueno utilice su propia imaginación e investigue y practique por su cuenta. Esta lección no le obliga a digerir conceptos nuevos pero si requiere iniciativa para practicar con el editor.

Existe un comando que lo hemos marcado como esencial cuando en realidad se usa poquísimo pero es un comando que conviene conocer porque en el momento más inesperado puede ser necesario usarlo. Con este comando el editor redibuja totalmente el contenido de la pantalla. Esto puede ser necesario porque a su terminal podría llegarle información desde otro proceso. Por ejemplo un mensaje de error del sistema o un aviso de su administrador para que finalice antes de 10 minutos. Quizás su administrador es de los que repite el mensaje más de una vez y a cada mensaje recibido su pantalla queda totalmente destrozada. No pasa nada. Pulse <CTRL+L> y todo volverá a la normalidad. Esto puede ocurrirle cuando este usando otro programa distinto de 'vi' y quizás pueda usar gualmente <CTRL+L>.

Recuperar la información perdida por muerte prematura del editor
Otra cosa que debe saber es que cuando 'vi' recibe una señal para finalizar ordenadamente guardará el contenido de lo que está editando en un fichero de seguridad. Para recuperar esta información necesitará usar 'vi -r fichero'. Como ejercicio libre le proponemos que empiece a editar un fichero que llamaremos 'prueba-kill.txt'. Escriba unas cuantas cosas y sin salvar nada, pase a otro terminal y envíe un kill con el valor por defecto (15 = SIGTERM). Para eso primero tendrá que averiguar el pid del proceso vi. Por ejemplo use 'ps | grep vi'. Supongamos que averigua que su pid es 445. Bastaría hacer 'kill 445'. Esto finalizará la edicion del fichero 'prueba-kill.txt'. No edite este fichero con 'vi prueba-kill.txt' porque perderá todos los cambios. En cambio si edita con 'vi -r prueba-kill.txt' si los recuperará. En este punto salve y continue editando cosas y antes de salvar los nuevos cambios vuelva a averiguar el pid desde otro terminal. Supongamos que el nuevo pid fuera 448. Envíe esta vez la señal SIGKILL no enmascarable mediante 'kill -9 448'. Comprobará que esta vez el editor no será capaz de recuperar los cambios. Por ejemplo si ocurre un apagado normal (shutdown) del sistema mientras está usted editando o mientras usted está ausente del terminal con la sesión de edición abierta, tampoco ocurrirá nada. La razón de esto, es que el sistema primero envía a todos los procesos activos una señal de SIGTERM para que finalicen ordenadamente. Después de esto y pasados unos segundos se supone que la mayoría de los procesos habrán terminado. (A los restantes procesos les enviará un SIGKILL para matarlos incondicionalmente ). Cuando le ocurra esto tendrá que volver a entrar en sesión con login y seguramente recibirá una notificación en su correo advirtiendo de la existencia de un fichero que debe ser editado con la opción '-r' para recuperar información volcada durante la finalización prematura de 'vi'.

Test
Puede comprobar sus conocimientos respondiendo el siguiente test.
Para ello seleccione las opciones que se ajusten a la verdad y luego pulse el boton para ver el resultado de su test.

1 'vi' es un editor diseñado para un uso interactivo.
2 'vi' es muy adecuado para editar programas de ordenador en formato texto.
3 Con 'diff' se pueden obtener las diferencias entre dos ficheros.
4 'vim' debe usarse con la opción 'set compatible' cuando se usa en ficheros de Microsoft.
5 Arrancando el editor con 'vi -R' se recuperan modificaciones no salvadas.
6 Pulsando 'i' desde el modo comandos, se pasa a insertar texto.
7 Tecleando '3DD' desde el modo comandos, se borran 3 lineas.
8 Tecleando 'yyp'desde el modo comandos, se duplica una línea.
9 Pulsando <CTRL+L> desde el modo inserción, se refrescará la pantalla.
10 Tecleando 'zz' desde el modo comandos, se finaliza y se guardan los cambios.
11 Tecleando ':1,5 w /tmp/copia<ENTER>' desde el modo comandos, guarda las 5 primeras líneas en '/tmp/copia'.
12 Tecleando ':!ls<ENTER>' desde el modo comandos, ejecutaremos el comando 'ls'.

Resultado del test

Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos
contacto