2008-12-10 14 views
86

Soy consciente de que en Vim a menudo puedo repetir un comando simplemente agregando un número delante de él. Por ejemplo, se puede suprimir 5 líneas por:¿Cómo repito una edición en múltiples líneas en Vim?

5dd 

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

:10,20s:hello:goodbye:gc 

¿Cómo puedo realizar una 'edición verticales ¿? Me gustaría, por ejemplo, insertar un símbolo particular, digamos una coma, al principio (omitiendo el espacio en blanco, es decir, lo que obtendrías si escribes una coma después de Shift-I en el modo de comando) de cada línea en un dado distancia. ¿Cómo se puede lograr esto (sin recurrir a down-period-down-period-down-period)?

Respuesta

83

:10,20s/^/,/

O utilizar una macro, registro con:

q a i , ESC j h q

uso con:

@ a

Explicación: q a de iniciar la grabación de una macro para registrar a, q termina grabación. Hay registros a a z disponibles para esto.

+0

Gracias. ¿Qué pasaría si quisiera el equivalente de un turno? Es decir, omitiendo el espacio en blanco inicial? – saffsd

+1

: s/^ \ (\ s * \)/\ 1,/ – Svante

+1

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

10

Creo que lo más fácil es registrar una macro, y luego repetir la macro tantas veces como lo desee. Por ejemplo, para añadir una coma al comienzo de cada línea, se escribe:

q a I , ESC j q 

repetir que 5 veces, que entran

5 @ a 
1

Además de las macros, como ya contestadas, por lo específico caso de insertar una coma en una serie de líneas (digamos de la línea 10 a 20), es posible hacer algo como:

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

es decir, se puede crear un partido del grupo numerado con \ (y \), y use \ 1 en el reemplazo s tring para decir "reemplazar con el contenido del partido".

90

Ctrl - v ingresa al modo visual en bloque. A continuación, puede mover (hjkl -wise, como de costumbre), y si quieres insertar algo en varias líneas, utilice Shift - i.

lo tanto, para el texto:

abc123abc 
def456def 
ghi789ghi 

si se golpea Ctrl - v con el cursor sobre el 1, golpeó j dos veces para bajar dos columnas, a continuación, Shift - i,ESC, su texto se vería así:

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

(la inserción multilínea tiene un pequeño retraso, y no aparecerá hasta DESPUÉS de que llegue a ESC).

+3

Agradable. Ctrl-V significa mayúscula, por cierto, 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: help CTRL- {char}). – rampion

+2

después de buscar un poco de por qué este método no funcionaba es porque usa una I mayúscula (shift-i) en lugar de i (también, fue solo ctrl-v, ya que ctrl-shift-v me movió hasta el final) – Willyfrog

44

Eso es lo que la: norma de comandos (AL) es para:

 
:10,20 normal I, 
2

utilizo block visual mode. Esto le permite realizar inserciones/ediciones en múltiples líneas (también conocidas como "ediciones verticales").

+0

su enlace está roto –

17

Creo que la manera más sencilla de hacerlo es

1) grabar una macro para una línea, lo llaman 'a'; en este caso uno tipos

qa I, ESC JQ

2) seleccionar el bloque de líneas que desea aplicar la macro a

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

:'<,'>[email protected] 
36

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

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

muy genial ¡GRACIAS! – cmcginty

+1

Esto es útil pero también limitado ya que el '.' funciona 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

Cuestiones relacionadas