Moviendonos por todo Vim

*usr_03.txt* For Vim version 7.2. Última modificación: 21 Jun 2006

VIM USER MANUAL - by Bram Moolenaar

Moviendonos por todo Vim

Antes de que puedas insertar o eliminar texto, el cursor tiene que colocarse en el lugar adecuado. Vim tiene una gran cantidad de comandos para situar el cursor. Este capítulo muestra cómo usar los más importantes. Puedes encontrar una lista de estos comandos abajo |Q_lr|.

|03.1| Movimiento sobre palabras
|03.2| Moverse al principio o al final de la línea
|03.3| Moverse a un carácter
|03.4| Emparejando un paréntesis
|03.5| Moverse a un línea específica
|03.6| Saber dónde estás
|03.7| Desplazar el texto
|03.8| Búsquedas simples
|03.9| Patrones sencillos de búsqueda
|03.10| Uso de marcadores o marcas



Capítulo siguiente: |usr_04.txt| Hacer cambios pequeños
Capítulo anterior: |usr_02.txt| Primeros pasos en Vim
Contenidos: |usr_toc.txt|

==============================================================================
*03.1* Movimiento en palabras

Para mover el cursor una palabra hacia delante, usa el comando "w". Del mismo modo que la mayoría de comandos Vim, puedes usar un prefijo numérico. Por ejemplo, "3w" se mueve tres palabras. Esta figura muestra cómo funciona:
This is a line with example text ~
  --->-->->----------------->
   w  w  w    3w

Hay que notar que "w" te mueve al comienzo de la siguiente palabra si es que el cursor se encuentra ya al comienzo de una palabra.

El comando "b" te mueve al comienzo de la palabra anterior:

This is a line with example text ~
<----<--<-<---------<---            b   b b    2b      b   

También existe el comando "e" que te desplaza hasta el final de la siguiente palabra y "ge" que te desplaza hasta el final de la palabra anterior:
This is a line with example text ~
   <-   <--- ----->   ---->
   ge    ge     e       e

Si te encuentras en la última palabra de una línea, el comando "w" te llevará hasta la primera palabra de la siguiente línea. Por consiguiente puedes usarlo para moverte por un párrafo, mucho más rápido que usando "l", "b" hace lo mismo en la dirección contraria.

Una palabra termina con un carácter de separación, como ".", "-" o ")". Para cambiar lo que Vim considera una palabra, establece la opción 'iskeyword'. También es posible desplazarse por palabras separadas por espacios en blanco. Esto no es una PALABRA en el sentido habitual, es por ello se usan las mayúsculas para designarla. Los comandos para desplazarse por PALABRAS suelen estar también en mayúsculas, como muestra la siguiente figura:
       ge      b   w    e
       <-     <-  --->          --->
This is-a line, with special/separated/words (and some more). ~
   <----- <-----  -------------------->        ----->
     gE      B    W    E

Con esta combinación de comandos en mayúsculas y minúsculas, puedes moverte rápidamente hacia atrás y hacia delante por un párrafo.

==============================================================================
*03.2* Moverse al principio o al final de la línea

El comando "$" mueve el cursor al final de la línea. Si tu teclado tiene la tecla conseguirás el mismo resultado presionandola.

El comando "^" te mueve hacia el primer carácter no vacío de la línea. El comando "0" (cero) te mueve al primer carácter de la línea. La tecla hace lo mismo.

   ^
     <------------  .....This is a line with example text ~  <-----------------   --------------->
 0     $

(los "....." indican espacios en blanco)


El comando "$" admite multiplicador, como la mayoría de comandos de evento. Pero moverte hacia el final de la línea varias veces no tiene sentido. Por lo tanto, lo que hace es moverte hacia el final de la siguiente línea. Por ejemplo, "1$" te mueve hacia el final de la primera línea (en la que estás), "2$" te mueve al final de la siguiente línea, y así. El comando "0" no admite ningún multiplicador, porque el "0" podría ser parte del número. El usar un multiplicador con "^" tampoco tiene ningún efecto.

==============================================================================
*03.3* Moverse a un carácter

Uno de los comandos de movimiento más útiles es el comando de búsqueda de un único carácter. El comando "fx" busca hacia delante en la línea el carácter x. Tip: "f" viene de "Find".

Por ejemplo, estás al principio de la línea siguiente. Supón que quieres ir a la "h" de "human". Ejecuta el comando "fh" y el cursor se posicionará sobre la h:

To err is human.  To really foul up you need a computer. ~
---------->--------------->
    fh   fy


Esto también muestra que el comando "fn" te mueve al comienzo de la palabra "really". Puedes especificar un multiplicador; por lo tanto, puedes ir a la "l" de "foul" con "3fl":

To err is human.  To really foul up you need a computer. ~
   --------------------->
     3fl

El comando "F" busca hacia la izquierda:
To err is human.  To really foul up you need a computer. ~
   <---------------------        Fh 


El comando "tx" funciona como el comando "fx", salvo que para un carácter antes del buscado. Tip: "t" viene de "To". La versión "regresate" de este comando es "Tx".

To err is human.  To really foul up you need a computer. ~
    <------------  ------------->
  Th  tn


Estos cuatro comandos pueden ser repetidos con ";". "," repite en la dirección contraria. El cursor nunca se mueve a otra línea. Ni siquiera cuando la frase continúa.

En ciertas ocasiones comenzarás la búsqueda y te darás cuenta de que has tecleado el comando erróneo. Presionas "f" para buscar hacia atrás, por ejemplo, y te das cuenta de que tenías que haber presionado "F". Para abortar la búsqueda, teclea . Por lo tanto, "f" es una búsqueda abortada. Nota: cancela la mayoría de las operaciones, no sólo búsquedas.

==============================================================================
*03.4* Emparejando un paréntesis

Al escribir código, a menudo usas construcciones anidados del tipo (). Para ello el comando "%" resulta muy útil: te desplaza hasta el paréntesis opuesto. Si el cursor está en un "(", te moverá hasta el ")". Si está en un ")" te moverá hasta el "(" correspondiente.

      %
   <----->
 if (a == (b * c) / d) ~
    <---------------->
      %


Esto también funciona para parejas de [] y {}. (Esto puede ser definido con la opción 'matchpairs'.)

Cuando el cursor no se encuentra en un carácter útil, "%" irá hacia delante para buscar uno. Si el cursor se encuentra al comienzo de la línea del ejemplo anterior, "%" buscará hacia delante hasta el primer "(".

 if (a == (b * c) / d) ~
 ---+---------------->
     %

==============================================================================
*03.5* Moverse a un línea específica


Si eres programador de C o C++, los mensajes de error de este tipo te resultan familiares:

prog.c:33: j undeclared (first use in this function) ~

Esto te indica que probablemente quieras arreglar algo en la línea 33. Entonces, ¿cómo encuentras la línea 33? Un modo es hacer "9999k" para ir a la parte superior del archivo y "32j" para ir hacia abajo 32 líneas. Esta no es la mejor forma, pero funciona. Una mucho mejor manera es usar el comando "G". Con un multiplicador, esto comando te posiciona en la línea indicada. Por ejemplo, "33G" coloca el cursor en la línea 33. (Hay un modo aún mejor de ir por la lista de errores del compilador, ve a |usr_30.txt| para información sobre ":make".) Sin argumentos, "G" te posiciona al final del archivo. Una forma rápida de ir al comienzo de la línea es usar "gg". "1G" hará lo mismo, pero es una pizca más lento de escribir.

    | first line of a file   ^
    | text text text text    |
    | text text text text    |  gg
7G  | text text text text    |
    | text text text text
    | text text text text
    V text text text text    |
 text text text text    |  G
 text text text text    |
 last line of a file    V


Otra manera de moverte a una línea es con el comando "%" y un multiplicador. Por ejemplo "50%" te mueve a la mitad del archivo. "90%" va casi al final.

Lo anterior asume que te quieres mover a una línea en un archivo, no importa si está visible o no. Pero ¿qué pasa si te quieres mover a una de las líneas que puedes ver? Esta figura te muestra los tres comandos que puedes emplear:

  +---------------------------+
 H --> | text sample text     |
  | sample text      |
  | text sample text     |
  | sample text      |
 M --> | text sample text     |
  | sample text      |
  | text sample text     |
  | sample text      |
 L --> | text sample text     |
  +---------------------------+

Tip: "H" viene de Home, "M" de Middle y "L" de Last.

==============================================================================
*03.6* Saber dónde estás

Para ver dónde estás en un archivo, hay tres maneras:


1. Usa el comando CTRL-G. Obtendrás un mensaje como este (asumiendo que la opción 'ruler' está apagada):

"usr_03.txt" line 233 of 650 --35%-- col 45-52 ~

Esto te muestra el nombre del archivo que estás editando, el número de línea en el que se encuentra el cursor, la posición relativa (en porcentaje) y la columna del cursor. A veces verás dos números separados por guión. Por ejemplo, "col 2-9". Esto indica que el cursor está posicionado en el segundo carácter, pero ya que el primer carácter es un tabulador, ocupará ocho espacios de columnas, y la columna en pantalla será 9.


2. Activa la variable 'number'. Esto te mostrará el número de línea al principio de cada línea: >

:set number
<>

:set nonumber
<>

:set ruler

Usar la opción 'ruler' tiene la ventaja de que no ocupa mucho espacio, por lo que no le quitará mucho espacio al texto.

==============================================================================
*03.7* Desplazar el texto

El comando CTRL-U desplaza el texto hacia abajo. Piensa como si vieras a través de una ventana hacia un texto y mueves esta ventana hacia arriba una distancia igual a la mitad de la ventana. Entonces la ventana se mueve hacia arriba sobre el texto, lo cuál es hacia arriba en el archivo. No te preocupes si no recuerdas qué es hacia arriba. A la mayoría de los usuarios les pasa. El comando CTRL-D mueve la ventana de visualización media pantalla hacia abajo, con lo que desplaza el texto hacia arriba media pantalla.

          +----------------+
          | some text |
          | some text |
          | some text |
+---------------+        | some text |
| some text |  CTRL-U  --> |  |
|  |        | 123456  |
| 123456 |        +----------------+
| 7890  |
|  |        +----------------+
| example |  CTRL-D -->  | 7890  |
+---------------+        |  |
          | example |
          | example |
          | example |
          | example |
          +----------------+


Para bajar una sola línea usa CTRL-E (avanzar) y CTRL-Y (retroceder). Piensa en CTRL-E como si te diera una línea Extra. (Si usas un mapeo de teclas compatible con MS-Windows CTRL-Y rehará un cambio en lugar de desplazar el texto.)

Para avanzar una pantalla completa (menos dos líneas) usa CTRL-F. La otra manera es retroceder, y se usa CTRL-B. Afortunadamente CTRL-F es Forward y CTRL-B es Backward, lo cuál lo hace fácil de recordar.

Una situacion habitual es que tras moverte hacia abajo muchas líneas con "j", tu cursor se encuentra en la parte inferior de la pantalla. Si te gustaría ver el contexto alrededor del cursor, presiona el comando "zz".

+---------------------+   +---------------------+
| un texto       |   | un texto        |
| un texto       |   | un texto        |
| un texto       |   | un texto        |
| un texto       |  zz -->  | línea con el cursor |
| un texto       |   | un texto        |
| un texto       |   | un texto        |
| línea con el cursor |   | un texto        |
+---------------------+   +---------------------+


El comando "zt" pone la línea del cursor arriba, "zb" la pone en la parte de abajo. Hay algunos comandos más de desplazamiento de texto, ver |Q_sc|. Para mantener siempre contexto alrededor del cursor, usa la opción 'scrolloff'.

==============================================================================
*03.8* Búsquedas simples

Para buscar una cadena, usa el comando "/cadena". Para encontrar la palabra include, por ejemplo, usa el comando: >

/include

Notarás que cuando presiona "/" el cursor salta a la última línea de la ventana Vim, como con el comando ":". Ahí es donde escribes la palabra. Puedes presionar la tecla de retroceso (flecha hacia atrás o ) para corregir. Usa las teclas de flecha cuando sea necesario. Presiona para ejecutar el comando.

Nota:

Los caracteres .*[]^%/\?~$ tienen significados especiales. Si quieres usarlos en una búsqueda tienes que poner \ delante de ellos.

Para encontrar la próxima cadena usa el comando "n". Usa esto para encontrar el primer #include después del cursor: >

/#include

Ahora presiona "n" varias veces. Te moverás a cada #include en el texto. Puedes también usar un multiplicador si sabes cuántas cadenas coincidentes quieres saltar. Por lo tanto "3n" va a la tercera. No se puede usar con "/".

El comando "?" funciona como "/" pero busca hacia atrás: >

?word

El comando "N" repite la última búsqueda en la dirección opuesta. Por lo tanto usar "N" después de un comando "/" busca hacia atrás, usar "N" tras "?" busca hacia delante.


IGNORAR MAYÚSCULAS/MINÚSCULAS

Normalmente tienes que teclear exactamente lo que quieres encontrar. Si no te importa si los caracteres están en mayúscula/minúscula, activa 'ignorecase': >

:set ignorecase

Si ahora buscas "palabra", también te identificará "Palabra" y "PALABRA". Para concordar con mayúsculas y minúsculas de nuevo: >

:set noignorecase


HISTORIAL

Suponte que haces tres búsquedas: >

/uno
/dos
/tres

Ahora comienza a buscar tecleando una simple "/" sin presionar . Si presionas (la tecla de flecha), Vim pone "tres" en la línea de comandos. Presionar en este punto busca "tres". Si no presionas y presionas , Vim cambia el texto a "/dos". Si presionas de nuevo te mostrará "/uno".

Puedes usar también la tecla de flecha para moverte por la historia de comandos de búsqueda en la otra dirección.

Si sabes cómo comienza una de tus búsquedas anteriores y la quieres usar de nuevo, introduce ese carácter antes de presionar . En el ejemplo anterior, teclea "/u" y Vim pondrá "/uno" en la línea de comandos.

Los comandos que comienzan con ":" también tienen historial. Esto ayuda a reutilizar comandos que has usado antes. Estos dos historiales son independientes.


BUSCAR UNA PALABRA EN EL TEXTO

Supón que ves la palabra "ElNombreLargoDeUnaFuncion" en el texto y quieres encontrar la siguiente ocurrencia. Puedes escribir "ElNombreLargoDeUnaFuncion", pero eso lleva mucho tiempo y no puedes equivocarte. Hay una forma mucho más sencilla: Pon el cursor en la palabra y usa el comando "*". Vim empleará la palabra bajo el cursor y la usará como cadena debúsqueda.

El comando "#" hace lo mismo en la otra dirección. Puedes añadirle un
multiplicador: "3*" busca la tercera ocurrencia de la palabra bajo el cursor.


BUSCAR PALABRAS COMPLETAS

Si tecleas "/el" también te identificará "ellos". Para buscar sólo palabras que terminen en con "el" usa: >

/el\>

El elemento "\>" es un marcador especial que sólo identifica el final de una palabra. De igual modo, "\<" identifica el comienzo de una palabra. Por lo tanto para buscar la palabra completa únicamente: >

/\

Esto no encontrará "ellos" o "mantel". Fíjate en que los comandos "*" y "#" usan estos marcadores de comienzo y final de palabra para encontrar únicamente palabras completas (puedes usar "g*" y "g#" para concordancias parciales).


DESTACAR COINCIDENCIAS

Editando un programa ves una variable llamada "nr". Quieres comprobar dónde se usa. Puedes mover el cursor a "nr" y usar el comando "*" y presionar "n" para ir de cadena en cadena.

Pero hay otro modo. Teclea el siguiente comando: >

:set hlsearch

Si ahora buscas "nr", Vim te destacará todas las concordancias. Este es un método muy bueno para ver dónde se emplea la variable, sin la necesidad de "n". Para apagarlo: >

:set nohlsearch

Necesitas activarlo de nuevo si quieres usarlo para el siguiente comando de búsqueda. Si sólo quieres que desaparezca, usa: >

:nohlsearch

Esto no modifica la opción. En su lugar, quita las marcas. Tan pronto como vuelvas a buscar algo, las marcas se volverán a emplear. También ocurrirá con los comandos "n" y "N".


OPCIONES DE BÚSQUEDAS

Hay algunas opciones que modifican el modo en el que la búsqueda se realiza. Éstas son las esenciales: >

:set incsearch

Esto hace que Vim muestre la concordancia de la cadena mientras aún la tecleas. Usa esto para ver si la cadena correcta será encontrada. Luego presiona para saltar a su localización. También puedes modificar la cadena.

>
:set nowrapscan

Esto detiene la búsqueda al final del archivo. O, cuando buscas hacia atrás, al
comienzo del archivo. La opción 'wrapscan' está activada por defecto, por lo
que buscará dando la vuelta al texto.


INTERMEZZO

Si te gusta alguna de las opciones mencionadas previamente, y la activas cada vez que usas Vim, puedes poner el comando en el archivo de arranque de Vim. Edita el archivo, como se describe en |not-compatible|. Puedes usar el siguiente comando para ver dónde se encuentra: >

:scriptnames

Edita el archivo, por ejemplo con: >

:edit ~/.vimrc

Ahora añade una línea con el comando para activar la opción, del mismo modo que lo introdujiste en Vim. Por ejemplo: >

Go:set hlsearch

"G" te mueve al final del archivo. "o" comienza una nueva línea donde tecleaste el comando ":set". Sal del modo insertar con . Guarda el archivo. >

ZZ

Si ahora reinicias Vim, la opción 'hlsearch' estará siempre activa.

==============================================================================
*03.9* Patrones sencillos de búsqueda

El editor Vim usa expresiones regulares para especificar búsquedas. Las expresiones regulares son un modo extremadamente potente y compacto de especificar un patrón de búsqueda. Por desgracia, esta potencia tiene un precio, porque las ER son un poco difíciles de escribir. En esta sección mencionaremos sólo algunas de las más esenciales. Más sobre patrones de búsqueda y comandos en el capítulo 27 |usr_27.txt|. Puedes encontrar una explicación completa en: |pattern|.


COMIENZO Y FINAL DE LÍNEA

El carácter ^ identifica el comienzo de línea. En un teclado Español-España lo encontrarás a la derecha de la "p". El patrón "include" concuerda la palabra "include" en cualquier parte de una línea. Pero el patrón "^include" concuerda la palabra include sólo si se encuentra al comienzo de la línea. El carácter $ coincide el final de línea. Por lo tanto, "era$" concuerda la palabra "era" sólo si esta se encuentra al final de una línea.

Vamos a marcar los lugares donde "que" se concuerda en esta línea con "x"s:

the solder holding one of the chips melted and the ~
xxx     xxx         xxx

Usando "/the$" se produce la siguiente concordancia:
the solder holding one of the chips melted and the ~
            xxx

Y con "/^the" encontramos el siguiente:
the solder holding one of the chips melted and the ~
xxx


Puedes intentar buscando con "/^que$", que sólo se identificará como una única línea consistente en "que". El espacio en blanco se considera, por lo que si contiene espacio tras la palabra, como "que ", el patrón no coincide.


CONCORDAR CUALQUIER CARÁCTER

El carácter . (punto) concuerda cualquier carácter existente. Por ejemplo, el patrón "c.m" se identifica con cadenas cuyo primer carácter es una "c", su segundo es cualquiera, y su tercero es el carácter "m":


We use a computer that became the cummin winter. ~
         xxx             xxx      xxx

CONCORDAR CARACTERES ESPECIALES


Si realmente quieres encontrar un punto, debes suprimir su significado especial poniendo antes una barra invertida. Si buscas "ter.", te dará las siguientes coincidencias:

We use a computer that became the cummin winter. ~
              xxxx                          xxxx


Buscar "ter\." te dará sólo el segundo.

==============================================================================
*03.10* Uso de marcadores o marcas


Cuando haces un salto a una posición con el comando "G", Vim recuerda la posición antes de el salto. Esta posición se llama marca o marcador. Para volver al punto anterior del que te encuentras, esa el siguiente comando: >

``

Este ` es una tilde invertida o carácter de abrir comillas simples. Si usas este mismo comando de nuevo, volverás atrás. Eso es porque el comando "`" es un salto en si mismo, y la posición anterior al salto también se registra.

Generalmente, cada vez que empleas un comando que puede mover el cursor más allá de la misma línea, esto se llama salto. Incluye la búsqueda con comandos "/" y "n" (no importa cuán lejos se encuentra la coincidencia), pero no las búsquedas de caracteres con "fx" y "tx" o los movimientos de palabra "w" y "e". Tampoco "j" ni "k" se consideran un salto. Incluso cuando usas un multiplicador para hacer que se mueva el cursor muy lejos.

El comando "``" salta hacia atrás y hacia delante, entre dos puntos. El comando CTRL-O salta a posiciones anteriores (Tip: O de older, "viejo"). CTRL-I salta de vuelta a posiciones más recientes (Tip: la I está justo al lado de la O en el teclado). Observa esta secuencia de comandos: >

33G
/^El
CTRL-O

Primero saltas a la línea 33, luego saltas a una línea que comienza con "El". Entonces con CTRL-O vuelves a la línea 33. Otro CTRL-O te devuelve a donde comenzaste. Si ahora usas CTRL-I vuelves a la línea 33 de nuevo. Con otro CTRL-I vuelves al "El" identificado.


     | texto de ejemplo      ^        |
33G  | texto de ejemplo      | CTRL-O | CTRL-I
     | texto de ejemplo      |        |
     V texto de la línea 33  ^        V
     | texto de ejemplo      |        |
/^The | texto de ejemplo      | CTRL-O | CTRL-I
     V Aquí estás            |        V
 texto de ejemplo

Note:
CTRL-I hace lo mismo que .


El comando ":jumps" te da una lista de posiciones a las que has saltado. La última entrada que has usado está marcada con un ">".


MARCADORES *bookmark*

Vim te permite colocar tus propias marcas en el texto. El comando "ma" marca el lugar sobre el que se encuentra el cursor como "a". Puedes poner hasta 26 marcas (a-z). No puedes verlas, son simplemente posiciones que Vim recuerda. Para ir a una marca, usa el comando `{marca}, donde {marca} es la letra del marcador. Para moverte a la marca "a":

>`a

El comando '{marca} (apóstrofe o signo de comillas simples) te desplaza al comienzo de la línea que contiene la marca. Esto difiere del comando `{marca}, que te desplaza a la columna donde se hizo la marca.

Los marcadores pueden ser muy útiles cuando se trabaja en dos partes del archivo relacionadas. Supón que tienes un texto cerca del comienzo del archivo que necesitas mirar mientras trabajas en otra parte. Muévete al texto del comienzo y pon un marcador "s" (start) allí: >

ms

Para moverte al texto sobre el que trabajas pon la marca "e" (end) allí: >

me

Ahora puedes moverte por el archivo, y cuando quieras mirar el comienzo del archivo usa esto para saltar allí: >

's

Luego puedes usar '' para saltar de vuelta donde estuviste, o 'e para saltar al texto donde estuviste trabajando.
No hay nada especial en usar s para el comienzo o e para el final, son simplemente fáciles de recordar.

Puedes usar este comando para obtener una lista de marcadores: >

:marks

Verás unos cuantos marcadores especiales. Entre ellos:

' La posición del cursor antes del último salto
" La posición del cursor antes de la última edición
[ Comienzo del último cambio
] Final del último cambio

==============================================================================

1 comentario:

Anónimo dijo...

Hola :) muy interesante y útil, pero no mencionaste como se borran los Marcadores :) Gracias!