¿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)?

saffsd
fuente

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.

Svante
fuente
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).

rampion
fuente
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
59

Para eso está el comando: norm (al):

: 10,20 normal I,
Cyber ​​Oliveira
fuente
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>
realzar
fuente
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
Albert
fuente
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
wimh
fuente
2

Yo uso el modo visual de bloque . Esto le permite realizar inserciones / ediciones en varias líneas (también conocido como 'ediciones verticales').

ONODEVO
fuente
1
su enlace está roto
Christopher Hunter
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 .
Noé
fuente
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".

Paolo Tedesco
fuente