¿Cómo repito una edición en varias líneas en Vim?


122

Soy consciente de que en Vim a menudo puedo repetir un comando simplemente agregando un número delante de él. Por ejemplo, uno puede eliminar 5 líneas de la siguiente manera:

5dd

A menudo también es posible especificar un rango de líneas para aplicar un comando, por ejemplo

:10,20s:hello:goodbye:gc

¿Cómo puedo realizar una 'edición vertical'? Me gustaría, por ejemplo, insertar un símbolo en particular, digamos una coma, al comienzo (omitiendo espacios en blanco, es decir, lo que obtendría si escribe una coma después de Shift-I en modo comando) de cada línea en un determinado rango. ¿Cómo se puede lograr esto (sin recurrir al período inferior-período-inferior-período-inferior)?

Respuestas:


107

:10,20s/^/,/

O use una macro, grabe con:

q a i , ESC j h q

usar con:

@ a

Explicación: q acomienza a grabar una macro para registrar a, qtermina la grabación. Existen registros aa zdisposición para ello.


Gracias. ¿Y si quisiera el equivalente de un shift-i? Es decir, ¿saltar sobre el espacio en blanco inicial?
saffsd

2
Explicación: ^\(\s*\)captura el espacio en blanco inicial y lo guarda en un registro, que luego puede leer \1.
Svante

136

Ctrl- vingresa al modo visual en bloque. A continuación, puede moverse (a lo hjkllargo, como de costumbre) y, si desea insertar algo en varias líneas, use Shift- i.

Entonces para el texto:

abc123abc
def456def
ghi789ghi

si presiona Ctrl- vcon el cursor sobre el 1, presione jdos veces para bajar dos columnas, entonces Shift- i,ESC, su texto se vería así:

abc,123abc
def,456def
ghi,789ghi

(la inserción de varias líneas tiene un pequeño retraso, y no se procesará hasta DESPUÉS de presionar ESC).


3
Agradable. Ctrl-V significa mayúscula, por cierto, se podría decir Ctrl-Shift-v
Svante

8
en realidad, es CTRL-v o CTRL-V. Vim no distingue entre mayúsculas y minúsculas para los códigos CTRL (consulte: ayuda CTRL- {char}).
rampion

2
después de buscar un poco de por qué este método no estaba funcionando es porque utiliza una I mayúscula (shift-i) en lugar de i (también, fue sólo Ctrl-V, como Ctrl-Shift-v me movió hasta el final)
Willyfrog

44
Soy curioso. ¿Por qué no se usan isin la tecla shift?
off99555

1
i sin desplazamiento es insertar en la posición actual. shift + i se inserta al comienzo de la línea
Kevin P


44

Si ya está usando el '.' para repetir tu último comando mucho, entonces encontré que esta es la solución más conveniente hasta ahora. Le permite repetir su último comando en cada línea de un bloque visual utilizando

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Esto es útil pero también limitado, ya que .opera en línea en modo visual. Creo que el modo visual en este caso a veces puede ser conveniente para seleccionar un rango de línea. Pero los comandos y las macros son más flexibles y potentes en este caso.
Bohr

23

Creo que la forma más fácil de hacer esto es

1) grabar una macro para una línea, llámela 'a'; en este caso uno teclea

qa I, ESC jq

2) seleccione el bloque de líneas al que desea aplicar la macro

3) use la función 'norma' para ejecutar la macro 'a' sobre este bloque de líneas, es decir,

:'<,'>norm@a

17

Creo que lo más fácil es grabar una macro y luego repetirla tantas veces como quieras. Por ejemplo, para agregar una coma al comienzo de cada línea, escriba:

q a I , ESC j q

para repetir eso 5 veces, ingresas

5 @ a


2

Con su edición ya guardada en el .operador, haga lo siguiente:

  1. Seleccione el texto al que desea aplicar el operador usando el modo visual
  2. Luego ejecuta el comando :norm .

1

Además de las macros, como ya se respondió, para el caso específico de insertar una coma en un rango de líneas (digamos de la línea 10 a la 20), puede hacer algo como:

:10,20s/\(.*\)/,\1

Es decir, puede crear una coincidencia de grupo numerada con \ (y \) y usar \ 1 en la cadena de reemplazo para decir "reemplazar con el contenido de la coincidencia".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.