Contacto

Nos puedes enviar un artículo a publicar (si te fue útil, seguro que a otros también).
Nos puedes sugerir temas/profundidad de interés.
correo-e - perfil

Busquedas

El editor vi

 Vi es el editor de texto más común en equipos con linux / unix. Hasta el momento, no he encontrado un equipo con alguno de estos sistemas operativos, que al teclear "vi" en la linea de comando, tenga la desagradable respuesta de "orden no encontrada".
 Por esto es importante tener algunos conocimientos básicos de esta maravillosa herramienta. Si bien forma parte en todo curso de linux, pienso que hay que conocerlo, aunque no se trabaje directamente sobre sistemas unix* (todavía no has tenido que conectarte por ssh a un server de producción, y modificar un html, jsp, css o cualquier archivo de configuración ? es cuestión de tiempo :-) )

 Antes de ingresar al fantástico mundo de vi con ejemplos, algunos conceptos previos que son importantes.

 Estando en el editor, podemos estar en dos estados o modos posibles, estos son conocidos como "modo edición" (insert mode), o "modo de comando" (command mode).
 El modo por defecto cuando ingresamos al editor, es el 'modo comando', el cual nos permite ... ingresar ordenes para que el editor las ejecute, como ser, cambiar al modo edición, guardar el documento, salir del editor, etc.
 Es posible ingresar comandos complejos, lo que hace a la potencia y popularidad de este editor.
 Los comandos diferencian entre mayúscula y minúscula, por lo que el comando 'r' tiene un comportamiento diferente al comando 'R'.

 El 'modo edición' es el que nos permite ingresar, modificar el texto.

 Si bien al comienzo puede resultar un poco complejo, no es necesario recordar todos los comandos para poder trabajar. Muchos de los comandos, son iniciales de la palabra en ingles que hace la tarea ("d" delete, "i" insert).
 Los comandos que no comienzan con un carácter especial (como ':', '/', y otros), no necesitan que se ingrese el 'ENTER'.

 Es importante tener presente que este editor no formateas texto, por ejemplo, no puedes marcar una palabra como 'negrita', o subrayado.
 Si esa es tu necesidad, tendrás que usar otro editor, o escribir la etiqueta necesaria (por ejemplo, <b>texto</b> para indicar 'negrita' en html).

 Comenzar con vi
      Algunos de nosotros, cuando hemos escuchamos / leído por primera vez las virtudes de este editor, probamos ingresar en el primer equipo que encontramos, y tuvimos la sorpresa de no poder salir del editor (no es muy intuitivo al comienzo).
  Por esto, los primeros pasos son poder: ingresar, editar, guardar el documento, salir.

 1) Ingresar a vi :  desde la linea de comandos (por ejemplo, en un xterminal, simplemente hacemos:
    vi [nombre_archivo] : nombre_archivo es opcional. Si existe el archivo, se abre para su edición. Si no se ingresa [nombre_archivo], al guardar el documento se tiene que indicar el nombre, desde el propio editor.
 
   Vamos a editar un nuevo archivo, en el directorio actual, ejecutando en la linea de comandos:
    vi ejemploVi.txt  (recordar que por defecto, ingresamos en modo comando).

 2) Editar texto: tenemos que pasar del modo comando al modo edición, para esto simplemente tecleamos la letra:
   i  (i de 'insert'). Al teclear 'i' ya es posible ingresar texto.

 3) Salir de vi:
  3.1) Pasar a modo comando.
        Para salir, lo primero es estar en modo comando. Para esto simplemente apretamos la tecla de escape ("ESC").
        Luego podemos salir con "ZZ", ":q", ":q!" (ver las notas a continuación).
 
  3.2) Guardamos el doc y salimos del editor.
       Estando en modo comando, ingresamos
   ZZ   guarda el documento en el archivo indicado cuando se inició vi, y sale del editor.
       También es posible salir con los siguientes comandos (notar que comienzan con "dos puntos" (":"). Esto significa que son comandos "ex", y se tiene que apretar la tecla 'ENTER' para finalizar.
   :q  Se sale de vi, pero no se indica que guarde. Si no se hizo modificaciones, ya estamos fuera de vi.
       Si se hicieron modificaciones, vamos a tener algún mensaje similar al siguiente:
        ' E37: No se ha guardado el fichero desde el último cambio (añada ! para forzar). '
        ' No write since last change (:quit! overrides) '

       Lo que se indica es claro, se hicieron modificaciones, y no se guardaron.
       Podemos guardar el archivo, y luego salir (ver comando ZZ antes) con el comando ":wq", o podemos salir sin guardar los datos, ingresando
    :q!  Sale de vi sin almacenar las ultimas modificaciones.

  Para Guardar documento
   :wq  Guarda el documento y sale de vi (igual que el comando ZZ anterior)
   :w    Guarda el documento actual sin salir de vi. Si no se dio un parámetro para el nombre al ejecutar vi, tenemos un mensaje de error
   :w [ruta_y_nombre_archivo]  Guarda el documento con el nombre de archivo indicado, sin salir de vi.
   :w!  Obliga a guardar el archivo, en el caso de mensajes del tipo "archivo ya existe", "archivo de solo lectura"
          Tener en cuenta que se tiene que tener los permisos adecuados sobre para poder sobre-escribir el archivo.

  En este punto ya podemos trabajar de forma sencilla con nuestro editor favorito (perdón, no siempre se puede ser imparcial :-D )
 Conocemos como
   iniciar vi ( vi [ruta_y_nombre_archivo]
   pasar a Modo Edicion (presionar la letra 'i')
   pasar a Modo Comando (presinar la tecla 'ESC')
   guardar el archivo (" :w ", " :w [ruta_y_nombre_archivo] " o " ZZ " para guardar y salir)
   salir del editor ( " :q ", " :q! " sale sin guardar cambios, " :qw " para guardar y salir )

 Como desplazrse en el editor vi.
      Siempre podemos desplazarnos por medio de las flechas de desplazamiento un carácter o línea por vez, pero podemos hacerlo por medio de otras teclas estando en modo comando (evitando mover las manos del centro del teclado).

 Teclas de desplazamiento
   h  Desplaza a la izquierda un carácter.
   j  Baja una línea
   k  Sube una línea
   l  Desplaza a la derecha un carácter 

 A estos comando, podemos agregarle un número previo, multiplicando por ese número la acción.
 Por ejemplo, 33h, mueve el cursor 33 posiciones a la izquierda, 9j baja el cursor 9 lineas.

  Nota: Esta forma de usar números para multiplicar una acción, se repite en la mayoría de los comandos (cuando tiene sentido).

 Otros comandos de desplazamiento
   0  Desplaza al comienzo de la línea (el dígito numérico 'cero').
   $  Desplaza al final de la línea.
   e  Se desplaza al final de la palabra, o primer puntuación.
   E  Se desplaza al final de la palabra, ignorando la puntuación.

   w  Se desplaza a la siguiente palabra. Si hay algún símbolo de puntuación antes de la siguiente palabra, se detiene en éste símbolo (por ejemplo, una coma).
   W  Se desplaza a la siguiente palabra, pero sin detenerse en los símbolos de puntuación que puedan haber antes.
   b  Se desplaza a la palabra anterior. Si hay algún símbolo de puntuación antes de la siguiente palabra, se detiene en éste símbolo (por ejemplo, una coma).
   B  Se desplaza a la palabra anterior, sin detenerse en los símbolos de puntuación que puedan haber antes.
   G  Se desplaza a la última línea.
       Agregando un dígito previo, se desplaza a esa línea. Por ejemplo, 22G se desplaza a la línea 22.
   +  Se desplaza al primer carácter de la siguiente línea.
   -   Se desplaza al primer carácter de la línea anterior.

  Para estos desplazamientos, también son válidos los multiplicadores, por ejemplo, 5b desplaza el cursor 5 palabras anteriores a la posición actual.


  Comandos para manejo de texto.

 Eliminar Texto
  x    elimina el carácter donde está el cursor en este momento.
  X    elimina el carácter anterior al cursor en este momento.
        ambos usan multiplicadores, por ejemplo,
  3x  elimina 3 caracteres
 
  dd  elimina toda la linea. Se puede combinar con multiplicadores, por  ejemplo
  3dd  elimina 3 lineas.
  dw   elimina hasta la siguiente palabra (o signo de puntuación), desde donde esté el cursor.
  d$   elimina desde el cursor hasta el final de la línea.
  D    elimina desde el cursor hasta el final de la línea (igual que d$).

Ingreso y Modificación de Texto
  i   como vimos antes, pasamos a modo edición, permitiendo modificar/agregar texto desde donde esté el cursor en ese momento.
  I   pasa a modo edición, colocando el cursor al comienzo de la línea.
  a  pasa a modo edición, moviendo el cursor un lugar a la derecha.
  A  pasa a modo edición, colocando el cursor al final de la línea.
  o  pasa a modo edición, agregando una linea en blanco debajo de la actual, y moviendo el cursor a esa línea para comenzar la edición.
  O  pasa a modo edición, agregando una linea en blanco sobre la actual, y moviendo el cursor a esa línea para comenzar la edición.
  r  sobrescribe el carácter en donde está el cursor. Luego de ingresar el nuevo carácter, el editor queda en modo comando.
  R  similar a 'r', sobrescribe texto. Pasa a modo edición, pero sobrescribe el texto anterior, a medida que insertamos el nuevo texto. Para salir de este modo, se tiene que apretar la tecla "ESC" pasando a modo comando.
  ~   cambia entre mayúsculas y minúsculas el carácter donde esta el cursor.
        Podemos agregar multiplicadores, por ejemplo
  5~  intercambia las mayúsculas / minúsculas de los 5 caracteres desde donde esta el cursor.

  c    se usa para reemplazar una cantidad determinada del texto, luego de lo cual, permanecemos en modo edición.
       Se indica la cantidad de texto a modificar, agregando a este comando un comando de movimiento. Por ejemplo, con <i><b> c2w </b></i> se indica que se quiere modificar, desde el cursor, hasta la segunda palabra.
  cc  remplaza toda la linea donde está el cursor.
  c$  remplaza desde donde esta el cursor, al final de la linea.
  C   remplaza desde donde esta el cursor, al final de la linea ( igual que c$ )
  c0  remplaza desde donde esta el cursor, al principio de la linea.
  s    elimina el carácter donde esta el cursor, y permanece en modo edición.
  S   remplaza toda la linea donde está el cursor (similar a cc ).

  J   Une dos líneas

Copiar Texto
    El comando 'y' es usado para copiar texto en un buffer, y luego pegamos este texto con el comando 'p'.
 yy    copia toda la línea, admine multiplicadores, por ejemplo
 2yy  copia dos líneas.
 yw   copia desde el cursor, hasta la proxima palabra.
 y$   copia desde el cursor, al final de la línea.
  Y    copia desde el cursor, al final de la línea (igual que y$ )
 y0   copia desde el cursor, al comienzo de la línea.

 p   pega el texto copiado en el buffer (por ejemplo, alguno de los comandos con y anteriores), luego del cursor.
 P   pega el texto copiado en buffer antes del cursor.

 Deshacer acciones    Si se cometieron errores, podemos deshacer las acciones con los siguientes comandos.
 u    deshace la última acción. Dependiendo de la versión o clon de vi que se use, pueden deshacerse varias acciones previas.
 U   deshace todos los cambios en la línea.
 CTRL-R   en vim, retrocede el comando 'u' realizado.

 Búsquedas
     Para buscar texto dentro del documento
  /patron_a_buscar   busca desde el cursor hacia delante, el 'patron_a_buscar' (ej. /linux ).
  ?patron_a_buscar   busca desde el cursor hacia atrás, el 'patron_a_buscar'.
  n   repite la última búsqueda.
  N   repite la última búsqueda, en sentido contrario.

Ver número de líneas en vi
 :set number
 :set nu       con estos dos comandos, se muestran los números de líneas.
 :set nonumber
 :set nonu   con estos últimos dos comandos, se oculta el número de línea.

 Ejecutar comandos del shell desde vi
    Sin salir de vi, es posible ejecutar comandos del shell, sin necesidad de salir, agregando :! antes del comando, por ejemplo
  :! ls   ejecuta el comando 'ls', mostrando el resultado en pantalla.
  :! mkdir /tmp/ejemplo  crea el directorio 'ejemplo' dentro de '/tmp'
  :shell  obtenemos un shell, estamos en un terminal, por lo que podemos trabajar normalmente en un terminal linux. Para regresar al editor, ejecutamos 'exit' .
  :sh  idem que :shell

  Sustituir texto
     Para esto se usa el comando ":s". Por defecto, actúa sobre la línea actual, y el primer patrón encontrado, a continuación, varios ejemplos.

  :s/texto_a_reemplazar/nuevo_texto/   Reemplaza en la linea actual, la primer ocurrencia de 'texto_a_reemplazar' por 'nuevo_texto'.
  :s/texto_a_reemplazar/nuevo_texto/g  Reemplaza todas las ocurrencias de 'texto_a_reemplazar' en la linea actual, por 'nuevo_texto'.
          Con /g se indica que el comando lo haga de forma 'global' (para la línea).
  :linea_inicial,linea_final s/texto_a_reemplazar/nuevo_texto 
  :linea_inicial,linea_final s/texto_a_reemplazar/nuevo_texto/g  Estos últimos dos comandos actúan igual que los 2 anteriores, pero actuando desde 'linea_inicial' hasta 'linea_final'.

  :2,4 s/9/ nueve /g   En este ejemplo, se reemplaza el número '9' por la palabra ' nueve ', en todas las ocurrencias encontradas, entre las líneas 2 y 4.
  :1,$ s/9/<b>nueve<\/b>/g  se reemplaza el número '9' por 'nueve ', o sea, en html, estamos cambiando por 'nueve' en negrita.
         Con :1,$ se indica que lo haga desde la primer línea hasta el final de las líneas ($).
         Dado que dentro del patrón tenemos el carácter '/', se tiene que ingresar con el caracter de escape, quedando '\/b'

No hay comentarios: