Al invocar al vi con el nombre de un fichero, si este no existe lo crea. En la pantalla del vi aparece la posicion actual del cursor resaltada, las lineas en blanco con ~ y en la parte inferior de la pantalla aprece la linea de estado, que muestra el nombre del fichero y el numero de caracteres que contiene. Existen dos modos de operacion en el vi: modo entrada y modo comando. - Se usa el modo entrada(edicion) para aniadir texto al fichero - Se usa el modo comando para introducir comandos que realizan funciones especificas del vi. El modo por defecto es el comando. Puesto que vi no indica en que modo se trabaja en un momento determinado, distinguir entre ambos modos es probablemente el mayor problema que causa confusion entre los nuevos usuarios del vi. Cuando abres por primera vez un fichero vi, siempre esta en modo comando, por lo que antes de poder escribir texto en el fichero debes teclear uno de los comandos de entrada del vi, tales como i (insert), para insertar texto en la posicion actual del cursor, o a (append) para insertar texto despues de la posicion actual del cursor. Cuando se desee regresar al modo comando, basta con presionar Esc. Si en un momento determinado no se sabe en que modo se esta, simplemente pulsando Esc nos aseguramos de que estamos en modo comando, con lo que se podra seguir con el trabajo. Si al pulsar Esc ya se estaba en modo comando, lo unico que pasara es que se oira un pitido. Modo comando Cuando abres un fichero con vi, estas en modo comando. En este modo puedes introducir comandos que implementan un amplio rango de funciones. Muchos de estos comandos constan de una o dos letras y un numero opcional relacionado con distintas funciones. Muchos comandos no requieren pulsar Return para que se ejecuten. Las ordenes que empiezan por dos puntos :, sin embargo, si lo requieren. Las ordenes precedidas por dos puntos son realmente comandos del ex. vi y ex son dos interfaces separadas del mismo programa de edicion de texto. Mientras el vi es una interfaz orientada a la pantalla, ex es una interfaz orientada a linea. El conjunto completo de comandos ex esta disponible dentro de vi. Cuando se edita un fichero con el vi, los cambios no se hacen directamente sobre el fichero. En realidad, se aplican a una copia del fichero que el vi crea en un espacio de memoria temporal llamado buffer. La copia en disco del fichero se modifica solo cuando se graban los contenidos del buffer. Esto tiene sus ventajas y sus inconvenientes. Por un lado, significa que puedes salir de la edicion de un fichero y descartar todos los cambios hechos durante una sesion de edicion, dejando la copia de disco intacta. Por otro lado, podrias perder el contenido no grabado del buffer de trabajo si el sistema cae. l La gente que esta en terminales remotos conectados por lineas de telefono son especialmente vulnerables para las interrupciones no planeadas. La mejor politica es grabar tu trabajo frecuentemente, especialmente cuando haces cambios importantes. AVISO: Procurar no editar un fichero con varias copias del vi al mismo tiempo, pues de este modo no se esta seguro de cual es la copia que esta realmente grabada en disco. Ya sabemos como entrar, como salir? Para grabar nuestro trabajo sin salir del vi basta pulsar la secuencia: Esc :w[return] Para salir cuando no se han hecho modificaciones: Esc :q[return] Para salir cuando se han hecho modificaciones: -si se quieren descartar: Esc :q![return] - si se quieren guardar los cambios: Esc :wq[return] COMANDOS BASICOS DEL vi -MOVIENDOSE POR UN FICHERO Cuando arrancamos el vi, el cursor esta en la esquina superior izquierda de la pantalla del vi. En modo comando, existen ordenes que nos permiten moverlo por toda la pantalla: ciertas teclas de letras, las flechas, el Return, Back space (tecla de borrar), y Space Bar (barra espaciadora). NOTA: Muchos de los comandos del vi son "case-sensitive", es decir, la misma orden tecleada en mayusculas o minusculas puede tener efectos totalmente distintos. Caracter a Caracter Si el teclado esta provisto con flechas, se pueden utilizar para mover el cursor libremente por el texto editado hasta el momento. Si se usa el vi desde un terminal remoto, las flechas pueden no funcionar correctamente, depende del emulador de terminal. En dicho caso las teclas usadas son: . Izquierda: h o SpcBar. . Derecha: l o BckSpc. . Arriba: k. . Abajo: j. Palabra a palabra . Pulsando w (word) nos movemos una palabra hacia la derecha. . Pulsando b nos movemos una palabra hacia la izquierda. Linea a linea . Pulsando ^ nos movemos al comienzo de la linea en la que esta el cursor. . Pulsando $ nos movemos al final de la linea actual. . Pulsando Return nos movemos al comienzo de la linea siguiente. Pantalla a pantalla . Pulsando H (high) nos movemos a la parte superior de la pantalla. . Pulsando L (low) nos movemos a la parte inferior de la pantalla. . Pulsando M (middle) nos movemos a la mitad de la pantalla SCROLL y AV/RE PAGINA Aunque se puede hacer scroll linea a linea con los comandos vistos, cuando el fichero es muy grande, y uno desea moverse del principio al final del mismo, no es demasiado viable esta opcion. Para ello existen una serie de comandos que nos permiten movernos pagina a pagina por el documento: . Pulsando Ctrl-F (scroll forward) se avanza una pantalla, moviendose el cursor a la esquina superior izquierda de la nueva pantalla. . Pulsando Ctrl-D se avanza media pantalla. . Pulsando Ctrl-B (scroll backward) se retrocede una pantalla. . Pulsando Ctrl-U se retrocede media pantalla. INSERTANDO TEXTO vi proporciona muchos comandos para insertar texto, que nos hacen pasar del modo comando al modo de edicion. Aniadir . Pulsando a (append) se inserta texto a la derecha del cursor. . Pulsando A se aÒade texto al final de la linea en la que esta el cursor. Insertar . Pulsando i (insert) se inserta texto a la izquierda del cursor. . Pulsando I se inserta texto al principio de una linea. Abrir una linea . Pulsando o (open) se abre una linea debajo de la posicion actual del cursor . Pulsando O se inserta una linea encima de la actual posicion del cursor. CAMBIANDO TEXTO Cambiar texto implica sustituir una seccion de texto por otra. vi tiene varios modos de hacer esto, dependiendo de las circunstancias. Cambiar una palabra . Para reemplazar una palabra, posicionar el cursor al principio de la palabra a ser reemplazada, teclear cw seguido de la nueva palabra. Cuando se termine de modificar se pulsara Esc . Para cambiar parte de una palabra, colocar el cursor sobre la palabra, a la derecha de la parte a cambiar, y proceder como en el caso anterior. Cambiar una linea Para reemplazar una linea, poner el cursor en cualquier parte de la linea y teclear cc. La linea desaparece, dejando una linea en blanco para el nuevo texto, que puede ser de cualquier longitud. Pulsar Esc para acabar. Cambiar parte de una linea Para reemplazar parte de una linea, colocar el cursor a la derecha de la parte a modificar. Pulsar C, introducir la correccion y pulsar Esc para acabar. Substituir caracteres Para substituir el caracter bajo el cursor por uno o mas caracteres, teclear s seguido del nuevo texto y pulsar Esc cuando se acabe. Reemplazar un caracter Para reemplazar el caracter bajo el cursor por otro caracter, pulsar r, seguido por un unico caracter, pues al pulsar una tecla el vi inmediatamente pasa a modo comando Trasposicionar caracteres Esto es util para fallos tales como escribir qeu en lugar de que. Colocando el cursor sobre la primera letra a mover y pulsando xp, se intercambian las posiciones de ambos caracteres. Partir/Unir lineas Para partir una linea sin afectar al texto, mover el cursor al espacio donde se quiere partir la linea y teclear r (replace) seguido de Return (se reemplazaria el espacio por un return) Para unir dos lineas, colocar el cursor en la linea superior y teclear J. DESHACER CAMBIOS Deshacer el comando previo Pulsando u a continuacion del ultimo comando, se deshacen los cambios producidos por la ejecucion del mismo Deshacer los cambios de una linea Pulsando U se deshacen todos los cambios que se han hecho sobre una linea. Este comando funciona solo si no te has movido de la linea. BORRAR TEXTO Borrar un caracter Para borrar un caracter, posicionar el cursor sobre el caracter a borrar y teclear x. El comando x tambien borra el espacio ocupado por el caracter. Para borrar el caracter anterior a la posicion del cursor pulsar X. Borrar una palabra o una parte de una palabra Para borrar una palabra, posicionar el cursor al principio de la palabra y pulsar dw, entonces se borrara la palabra y el espacio que esta ocupaba. Para borrar parte de una palabra, hay que colocar el cursor a la derecha de la parte a modificar, y teclear dw. Borrar una linea Pulsando dd se borra una linea y el espacio que esta ocupaba Borrar parte de una linea Para borrar todo lo que este a la derecha del cursor, basta con pulsar D. Para borrar todo lo que este a la izquierda del mismo basta con pulsar d0. Borrar hasta el final del fichero Basta con pulsar dG, que borra desde la linea en que estaba el cursor. Borrar desde el principio del fichero Basta teclear d1G, que borra hasta la linea en que estaba el cursor. COPIAR Y MOVER TEXTO- Yank, Delete y Put De la misma manera que muchos procesadores de palabra te permiten copiar y pegar, o cortar y pegar lineas de texto, el vi tambien incluye esta posibilidad, mediante los comandos "yank and put" y "delete and put", respectivamente. Copiar lineas Para copiar una linea son necesarios dos comandos: yy o Y (yank) p (debajo) o P (arriba) Para copiar varias lineas basta con colocarse en la primera linea a copiar y escribir el numero de lineas a copiar seguido por yy (p.e.: 10yy) Pueden usarse los comandos p y P para pegar el texto inmediatamente antes borrado. AVISO: Usar solo los comandos de movimiento de cursor entre el yank o delete y put. Si se borra o copia cualquier otro texto antes de poner el nuevo texto en su lugar, las lineas copiadas o borradas se perderan. Mover lineas Mover una o varias lineas de sitio requiere tambien dos comandos: dd (delete) y p o P. Igual que antes se puede teclear antes de dd el numero de lineas a mover. Usar buffers con nombre Para insertar repetidamente un grupo de lineas en varios lugares dentro de un documento, puedes copiar las lineas a un buffer con nombre. Se especifican los buffers con nombre escribiendo antes del comando comillas dobles y su nombre. Ej: copiar 4 lineas al buffer a--> "a4yy copiar 10 lineas al buffer b--> "b10yy pegar las lineas del buffer a --> "ap o "aP pegar las lineas del buffer b --> "bp o "bP Usar un contador para comandos repetitivos Muchos comandos del vi pueden estar precedidos de un contador que indica cuantas veces repetir la operacion. Muchos de los anteriores permiten contadores. P.e., 3dd repite el comando de borrar una linea 3 veces, 2dw borra dos palabras, y 4x borra 4 caracteres. Tambien se pueden usar contadores para los comandos de moverse por la pantalla, p.e., 3w o 2Ctrl-F. Pulsando un "." se repite la ultima operacion de cambio realizada. Por ejemplo si se borra una linea, y la siguiente operacion a realizar es borrar una linea, basta con pulsar ".". USAR LOS COMANDOS ex Los comandos de ex son mas seguros y convenientes que yank, delete y put cuando se trata de grandes bloques de texto. Mejor que contar lineas en la pantalla y buscar el punto de insercion, se le pueden dar a vi un rango de lineas a mover o copiar y entonces especificar la linea anterior al punto de insercion. (Por supuesto, con un comando de borrado no existe punto de insercion) Visualizar el numero de las lineas o no Para visualizar el numero de cada linea, teclear :set nu[return] Para no visualizarlas, teclear :set nonu[return] Copiar lineas El formato basico del comando de copiar del ex es: :#linea,#linea co #linea[return] donde los dos primeros numeros(separados por coma) especifican el rango de lineas a copiar, y el tercer numero es la linea anterior al punto de insercion. Se pueden usar abreviaturas para especificar los rangos de lineas: - "." denota la linea actual. - "$" denota el final del fichero. Mover lineas El formato basico del comando de mover del ex es similar al de copiar: :#linea,#linea m #linea[return] Borrar lineas :#linea,#linea d[return] BUSCAR Y REEMPLAZAR EN EL vi vi proporciona varios modos de encontrar un string de caracteres en el texto, asi como de reemplazarlo. Encontrar un string Un string es simplemente uno o mas caracteres en fila. Puede incluir letras, numeros, puntuaciones, caracterese especiales, espacios en blanco, tabulaciones, o retornos de carro. Un string puede ser una palabra gramatical o puede ser una parte de una palabra. Para encontrar un string, hay que teclear / seguido del string que se desea buscar, y entonces pulsar return. El vi posiciona el cursor en la siguiente ocurrencia del string. Tecleando n se va a la siguiente ocurrencia del string, y pulsando N a la anterior. Para buscar hacia atras en un fichero se puede usar ? en lugar de /. En este caso, las direcciones de n y N se invierten. Normalmente las busquedas son case-sensitive. Si se quiere que vi ignore mayusculas y minusculas (ignore case) durante la busqueda, teclear: :set ic[return] Para volver al cambio por defecto basta teclear: :set noic[return] Ciertos caracteres especiales(/ & ! . ^ * $ \ ?) tienen un significado especial para el proceso de busqueda y deben especificarse de un modo especial en la busqueda, precediendolos por la barra hacia atras \. Por ejemplo, para buscar algo? hay que teclear: /algo\?[return] Esto es asi porque estos caracteres especiales pueden usarse como comandos para la funcion de busqueda. Refinar la busqueda Se pueden realizar busquedas mas precisas, marcando el string con indicadores de las siguientes caracteristicas: . Principio de linea . Fin de linea . Principio de palabra . Fin de palabra . Comodines Para intentar emparejar el comienzo de una linea, hay que preceder al string a buscar por ^. Por ejemplo, para buscar la siguiente linea que empieza por Sin embargo, habria que teclear: :/^Sin embargo[return] Para emparejar el final de una linea, hay que terminar el string a buscar por un simbolo $. Por ejemplo, para buscar la siguiente linea terminada en nada., habria que teclear: :/nada\.$ Para emparejar el principio de una palabra, teclear \< al principio del string, para emparejar el final de una palabra, teclear \> al final del string. Por ejemplo, para buscar la siguiente ocurrencia de la palabra "nada", no del string, habria que teclear: :/\\[return] Para emparejar cualquier caracter, teclear un punto en el string en la posicion a emparejar. Por ejemplo, para encontrar la siguiente ocurrencia de "disinformation" o misin formation, teclear: /.isinformation Puesto que esta es una busqueda de un string, y no de una palabra, este patron de busqueda puede tambien encontrar tambien palabras como "misinformationalist" y "disinformationism" Para buscar caracteres alternativos en un string, poner las alternativas entre corchetes. El patron de busqueda /[md]string encontrara los strings que comiencen por m o d. Por otro lado, /[d-m]string, encontrara strings que comiencen con cualquier letra de la d a la m. Para emparejar 0 o mas ocurrencias del ultimo caracter, teclear un asterisco en el string. Se pueden combinar corchetes con asteriscos para buscar por alternativas bien definidas. Por ejemplo, para encontrar todos los strings que comiencen con una z y terminen en "isinformation", teclear: /[a-z]*isinformation[return] Reemplazar un string El procedimiento para reemplazar un string esta basado en los procedimientos de busqueda mencionados antes. Todos los caracteres especiales de emparejamiento se pueden usar en una busqueda-reemplazamiento. La forma basica del comando es: :g/string_a_buscar/s//string_reemplazado/g[return] Por ejemplo, para reemlazar todas las ocurrencias de desinformacion por informacion, se teclearia: :g/desinformacion/s//informacion/g[return] Se puede modificar este comando para parar la busqueda y hacer que el vi pida confirmacion antes de realizar el reemplazamiento, mediante la orden gc(consult) A esta orden se le responde tecleando y (yes) o n (no). En el ejemplo anterior seria: :g/desinformacion/s//informacion/gc[return] Para terminar el proceso bastaria con pulsar Ctrl-C Ir a una linea determinada Para ir a la ultima linea de un fichero abierto, se teclea G. Para ir a la linea n del fichero, se teclea n y a continuacion G INSERTAR UN FICHERO EN OTRO vi permite insertar un fichero dentro del que se esta editando. La forma general del comando es: :linea# r nombrefichero Si no se especifica un numero de linea, vi inserta el fichero en la posicion actual del cursor. P.e., si se quiere insertar el fichero prac.c en la linea 84 se escribiria: :84 r prac\.c EDITAR MULTIPLES FICHEROS vi te permite editar multiples ficheros. Para ello, se debe grabar el abierto (:w[return]), y a continuacion escribir :n nuevofich[return]. Para cambiar de un fichero a otro hay que teclear (:n #[return]) Editar una serie de ficheros vi nombre1 nombre2 nombre3 vi nom* los ficheros apareceran para editar en orden alfabetico. Copiar lineas entre ficheros Para copiar lineas de un fichero a otro, hacer lo siguiente: Editar el primer fichero Salvar las lineas que se quieran con el comando yank. Sin salir del vi, editar el fichero donde se van a insertar las lineas :n nuevofich[return] Usar el comando put como siempre. ESTABLECER PARAMETROS DEL vi vi tiene muchas variables que afectan a su comportamiento y aparencia. Puedes ver una lista de estas variablesd con :set all[return] RECUPERACION DE UNA CAIDA Si el sistema cae, los contenidos de tu buffer estan en peligro. A menudo, puedes recuperar parte de tu trabajo rearrancando el vi del siguiente modo: vi -r nomfich donde nomfich es el fichero que estabas editando en el momento de la caida. El sistema te enviara correo despues de que el sistema arranque, diciendo que hay una recuperacion del fichero.