¿Cómo puedo insertar texto en el medio de la línea en varias líneas en Vim?

91

Digamos que tengo diez líneas y quiero anteponer texto a alguna palabra que aparezca en esas líneas. No tiene que estar al principio de la línea.

De:

sdfsd   foo sdfsd
sfsd    foo fsdf
sdfsdf  foo  sdfsdf

a:

sdfsd   bar(foo sdfsd
sfsd    bar(foo fsdf
sdfsdf  bar(foo  sdfsdf

¿Es también posible no sólo precedidos por bar(, pero en realidad envolvente foocon bar(foo)?

También me gustaría una forma rápida de agregar //comentarios a varias líneas (comentarios de estilo C).

Yo uso Vim / GVim 7.2.

Allen
fuente
1
Los comentarios de estilo C son / * * / Los comentarios de estilo BCPL son //
William Pursell

Respuestas:

169

Vaya al primero foo, presione Ctrl- vpara ingresar al modo de bloqueo visual y presione hacia abajo hasta que todas las líneas con fooestén marcadas. Luego presione Shift- ipara insertar al principio (del bloque). Cuando haya terminado y presione Esc, los caracteres insertados se agregarán a cada línea a la izquierda del bloque marcado.

Para insertar al final, presione nuevamente Ctrl- v, muévase hacia arriba / abajo para marcar todas las líneas afectadas y luego presione Endo $para extender la selección hasta el final de las líneas. Ahora puede presionar Shift- apara agregar al final de todas las líneas, como antes con Shift- i.

La selección visual también se puede realizar con comandos de movimiento normales. Entonces, para comentar un bloque completo en C, podría moverse a la llave de apertura y escribir Ctrl- v % Shift- i // Esc.

algo
fuente
5
Solo una adición: si Ctrl-V no inicia el modo de bloque visual en Vim en Windows, se debe usar Ctrl-Q en su lugar.
Paul
3
Una variación de la respuesta es marcar el bloque visual con shift + V y luego modificar el bloque en modo ex:: '<,'> s / ^ / prexix_text /: '<,'> s / $ / suffix_text / Note que "'< , '> "se imprime automáticamente por vim cuando presiona": ".
dimba
1
Para descomentar use bloque visual (marque con Ctrl + V). Una de las columnas con el signo de comentario "//" está marcada, presione "d" para eliminar los comentarios. no te olvides de los comentarios de C ++ (/ ** /) también :)
dimba
9
Vale la pena señalar que en Linux tuve que salir del modo Insertar antes de que el prefijo se aplicara a todas las líneas, y es una mayúscula que necesitaba para pasar al modo Insertar desde el modo Visual, es decir, Shift + I, escriba prefijo, Escape, Escape.
Joshua Enfield
6
Esto no funciona con masilla. Cuando presiono ino pasa nada. Cuando presiono, shift+ila selección desaparece pero puedo insertar texto (en el lugar actual donde está solo el cursor).
Jürgen Paul
44

Para responder a su primera pregunta, la siguiente

:%s/foo/bar(&)/g

buscará fooy rodeará el patrón coincidente con bar(). El /gva a hacer esto varias veces en una sola línea.

Ya que solo está haciendo coincidir foo, podría hacer un simple :s/foo/bar(foo)/g. Sin embargo, lo anterior funcionará si decide hacer coincidir una expresión regular en lugar de una simple palabra (p f[a-z][a-z]. Ej .). El '&' de arriba representa lo que ha hecho coincidir.

Brian Agnew
fuente
Tuve una gran respuesta larga con macros. Esto es mucho más fácil :-)
Brian Ramsay
¿Cómo lo haces para varias líneas? Un caso práctico es cuando tiene un bloque de código que consta de líneas similares que requieren esta sustitución.
Seguro que parece que funciona en todas las líneas ... tenga en cuenta:% sy / g.
ojrac
lo interesante es que:% s / foo / bar (&) / gc no confirma - 'c' no tiene efecto .. Ugh
1
El texto entre :y sdetermina en qué líneas opera. Nada significa solo la línea actual. 1,30significa líneas 1 a 30 (inclusive). '<,'>significa las líneas en la selección visual actual.
rampion
17

Para prefijar un conjunto de líneas, utilizo uno de dos enfoques diferentes:

Un enfoque es la selección de bloque (mencionado por sth). En general, puede seleccionar una región rectangular ctrl-Vseguida del movimiento del cursor. Una vez que haya resaltado un rectángulo, al presionar shift-Ise insertarán caracteres en el lado izquierdo del rectángulo, o los shift-Aagregará en el lado derecho del rectángulo. Entonces, puede usar esta técnica para hacer un rectángulo que incluya la columna más a la izquierda de las líneas que desea prefijar, presione shift-I, escriba el prefijo y luego presione escape.

El otro enfoque es utilizar una sustitución (como lo menciona Brian Agnew). La sustitución de Brian afectará a todo el archivo (el% en el comando significa "todas las líneas"). Para afectar solo unas pocas líneas, el enfoque más fácil es presionar shift-V(que habilita el modo de línea visual) mientras está en la primera / última línea, y luego moverse a la última / primera línea. Luego escriba:

:s/^/YOUR PREFIX/

El ^ es una expresión regular (en este caso, el comienzo de la línea). Al escribir esto en el modo de línea visual, verá '<,'> insertado antes de la s automáticamente. Esto significa que el rango de la sustitución será la selección visual.

Consejo adicional: si su prefijo contiene barras, puede escapar de ellas con barra invertida o puede usar un carácter de puntuación diferente como separador en el comando. Por ejemplo, para agregar comentarios de línea de C ++, generalmente escribo:

:s:^:// :

Para agregar un sufijo, el método de sustitución es generalmente más fácil a menos que todas las líneas tengan exactamente la misma longitud. Simplemente use $ para el patrón en lugar de ^ y su cadena se agregará en lugar de agregarla.

Si desea agregar un prefijo y un sufijo simultáneamente, puede hacer algo como esto:

:s/.*/PREFIX & SUFFIX/

El. * Coincide con toda la línea. El & en el reemplazo devuelve el texto coincidente (la línea completa), pero ahora tendrá su prefijo y sufijo agregados.

Por cierto: al comentar el código, probablemente querrá descomentarlo más tarde. Puede usar visual-block ( ctrl-V) para seleccionar las barras y luego presionar d para eliminarlas, o puede usar una sustitución (probablemente con una selección de línea visual, hecha con shift-V) para eliminar las barras principales como esta:

:s:// ::
Laurence Gonsalves
fuente
6

: normal al rescate!

:%norm Wibar(

:%norm WEa)

: norm (al) reproduce los comandos como si los hubiera escrito:

W - pasa a la siguiente palabra

i - inicia el modo de inserción

bar (- escribe la secuencia 'bar ('

O en una línea:

:%norm Wibar(ctrlvESCEa)

Si está ejecutando Windows, escriba en ctrlqlugar de ctrlv.

Cyber ​​Oliveira
fuente
3

Otra posibilidad (probablemente no tan útil en su caso de prueba, pero útil en otras situaciones) es acordonar el área que desea cambiar con marcas.

  • Coloque el cursor en cualquier lugar de la línea superior y presione 'a
  • Coloque el cursor en cualquier lugar de la última línea y presione 'b
  • Emita el comando :'a,'b s/foo/bar(&)/

Por lo general, me gusta el modo de bloqueo visual si todo está visible en la pantalla, y generalmente prefiero las marcas si el inicio y el final están separados por muchas pantallas.

Godfrey Parke
fuente
Debería ser en mlugar de 'establecer un nuevo marcador. 'es para saltar a la línea de un marcador existente. `salta a la línea y columna de ese marcador.
tiktak
1

Otra expresión regular simple es:

%s/^/<text you want to prepend>/
Artorias2718
fuente
0

Para los comentarios de estilo C, use la respuesta de expresión regular de Brian, haga coincidir el final de la línea $e insértela.

maxwellb
fuente