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). |
![]() |
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.
|
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'
Ahora vamos a generar un fichero 'ejemplo.txt' con unas pocas lineas
para hacer unas pocas prácticas..
Vamos a sacar una copia para comprobar luego los cambios.
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').
Veamos como ha quedado.
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.
Vamos a partir del fichero original y le vamos a pasar por la
entrada estándar únicamente las diferencias obtenidas con 'diff -e'
Vemos que falta las instrucciones 'w' y 'q' para salvar y salir
respectivamente así que las añadimos al fichero 'ejemplo.diff'.
Ya tenemos todas las instrucciones necesarias.
Vamos a aplicar los cambios con 'ed'.
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'
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:
Solo si le invita a usar la opción '-h' hágalo.
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.
Ahora si vamos a entrar y a salir en el editor.
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.
Cuadro resumen para el uso de 'vi'
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.
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'.
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.
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.
Está en modo comandos y va a teclear sus dos primeros comandos.
Cuando vea '<ENTER>' en los ejemplos significa que debe pulsar
esa tecla.
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.
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.
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'.
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.
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.
Estamos repitiendo varias veces la línea 'No parece tan difícil de usar.'
Debería quedar finalmente con este aspecto.
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.
Obtendremos un aviso del editor para no perder las últimas modificaciones.
Pero realmente deseamos salir sin salvar así que intentamos de nuevo con
':q!' desde el modo comandos.
Vamos a comprobar que los últimos cambios no se han guardado,
y vamos a ver que permisos tiene este fichero.
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.
Probablemente aparecerá en la linea inferior de su editor una
advertencia de que está en modo solo lectura.
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 '***'.
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.
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'.
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.
Por fin estamos de vuelta en el editor.
Vamos a continuar practicando algunos comandos importantes que
nos quedan.
Con la 'J' mayúscula hemos unido dos líneas en una.
Ahora vamos a pasar al modo entrada para reemplazar.
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
Test
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'.
$ cd /tmp
$ cat <<FIN > ejemplo.txt
> No olvide visitar nuestra web
> http://www.ciberdroide.com
> y esto es todo.
> FIN
$ cp ejemplo.txt ejemplo.txt.original
$ 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
$ cat ejemplo.txt
No olvide visitar nuestra web
http://www.ciberdroide.com
(Tienda Virtual de Linux)
y esto es todo.
$ diff -e ejemplo.txt.original ejemplo.txt
2a
(Tienda Virtual de Linux)
.
$ cp ejemplo.txt.original ejemplo2.txt
$ diff -e ejemplo.txt.original ejemplo.txt > ejemplo.diff
$ cat ejemplo.diff
2a
(Tienda Virtual de Linux)
.
$ cat <<FIN >> ejemplo.diff
> w
> q
> FIN
$ cat ejemplo.diff
2a
(Tienda Virtual de Linux)
.
w
q
$ 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 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.
$ vi -? | less
$ vi -h | less
$ whereis vi
$ whereis vim
$ whereis elvis
$ man vi
$ man vim
$ man elvis
$ man ex
$ man view
$ man ed
$ vi
~ 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
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.
*** --> Comando de uso imprescindible.
** --> Comando de uso muy frecuente.
* --> Comando de uso no tan frecuente.
*** 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.
Se pasa desde el modo entrada (inserción o reemplazo) mediante <ESC>.
. ** 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. . *** 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. . *** 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. . ** / 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. . *** 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. . *** <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.
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 !)
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
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.
$ cd
$ mkdir cursolinux
$ cd cursolinux
$ vi ej-vi1.txt
~
~
~
"ej-vi1.txt" [New File]
:set showmode<ENTER>
:set nu<ENTER>
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
$ vi ej-vi1.txt
:set showmode<ENTER>
:set nu<ENTER>
:3<ENTER>
dd
:1<ENTER>
p
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.
:w ej-vi2.txt
:4<ENTER>
2yy
:3<ENTER>
p
:3<ENTER>
p
:3<ENTER>
p
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.
:q
No write since last change (use ! to override)
:q!
$ 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
$ 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
"ej-vi1.txt" [readonly] 7 lines, 216 characters
:3
:.,$ w trozofinal
:1,. w trozoinicial
:1,$ de
:r trozoinicial
:$
:r !date
:$
:r trozofinal
:w tempfich
:w
'readonly' option is set (use ! to override)
:w!
:!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
:!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
:3<ENTER>
o
Hemos pasado a insertar abriendo una linea.<ESC>
J
: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
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'.
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.
Si quiere hacernos llegar alguna duda, aclaración,
crítica, o contribución personal, utilice nuestro
formulario de contacto y nosotros le contestaremos