2009-07-23 19 views
87

Supongamos que tengo diez líneas y quiero anteponer el texto a algunas palabras que aparecen en esas líneas. No tiene que ser al principio de la línea.¿Cómo puedo preceder el texto en el medio de la línea a varias líneas en Vim?

Desde:

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 rodean foo con bar(foo)?

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

Uso Vim/GVim 7.2.

+1

C son comentarios de estilo/* */ BCPL son // –

+0

relacionado: [¿Cómo crear un comentario en un conjunto de líneas que se seleccionan en el modo visual? ] (http://vi.stackexchange.com/q/130/467) en Vim SE – kenorb

Respuesta

163

Ir a la primera foo, pulse Ctrl - v para entrar en modo de bloque visual y presione hacia abajo hasta que todas las líneas con foo están marcados. Luego presione Shift - i para 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, pulse de nuevo Ctrl - v, se mueven hacia arriba/abajo para marcar todas las líneas afectadas y pulse Fin o $ para extender la selección hasta el final de las líneas. Ahora puede pulsar Shift - un para anexar al final de todas las líneas, al igual que antes con Shift - i.

La selección visual también se puede realizar con los comandos de movimiento normales.Así que para comentar una manzana entera en C que podría pasar a la llave de apertura y escriba Ctrl - v%Shift - i//Esc.

+5

Simplemente una adición: si Ctrl-V no inicia el modo de bloque visual en Vim en Windows, uno debería usar Ctrl-Q en su lugar. – Paul

+3

Una variación de entonces responder es marcar el bloque visual con shift + V thenalter el bloque en modo ex: : '<,'> s/^/prexix_text/ :' <,'> s/$/suffix_text/ Nota que "' <,'>" es impreso 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

44

para responder a su primera pregunta, el siguiente

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

buscará foo, y rodean el patrón coincide con bar(). El /g lo hará varias veces en una línea.

Dado que solo está haciendo coincidir foo, puede hacer un simple :s/foo/bar(foo)/g. Lo anterior funcionará, sin embargo, si decide hacer coincidir una expresión regular en lugar de una palabra simple (por ejemplo, f[a-z][a-z]). El '&' de arriba representa lo que ha coincidido.

+0

Tuve una gran respuesta larga con macros. Esto es mucho más fácil :-) –

+0

¿funciona esto en múltiples líneas? – maxwellb

+0

¿Cómo lo haces para líneas múltiples? Un caso práctico es cuando tienes un bloque de código compuesto por líneas similares que requieren esta sustitución. –

0

Para los comentarios al estilo C, use la respuesta de expresiones regulares de Brian y haga coincidir el final de línea $, e inserte lejos.

16

para prefijar un conjunto de líneas que utilizo uno de dos enfoques diferentes:

Un enfoque es el bloque de selección (mencionado por sth). En general, puede seleccionar una región rectangular con ctrl-V seguido de movimiento del cursor. Una vez que haya resaltado un rectángulo, al presionar shift-I se insertarán caracteres en el lado izquierdo del rectángulo, o shift-A se agregarán 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, marque 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 pasar a la última/primera línea. Luego escriba:

:s/^/YOUR PREFIX/ 

El^es un regex (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 diagonales, puede escapárselas con barra diagonal inversa, o puede usar un carácter de puntuación diferente como separador en el comando. Por ejemplo, para agregar C++ comentarios de línea, por lo general escribo:

:s:^:// : 

para añadir un sufijo del enfoque de sustitución es generalmente más fácil a menos que todas sus líneas son exactamente la misma longitud. Simplemente use $ para el patrón en lugar de^y su cadena se anexará en lugar de estar pre-agregada.

Si desea agregar un prefijo y un sufijo al mismo tiempo, se puede hacer algo como esto:

:s/.*/PREFIX & SUFFIX/ 

El * coincide con toda la línea.. El & en el reemplazo pone el texto coincidente (toda la línea) de nuevo, pero ahora tendrá su prefijo y sufijo agregado.

BTW: al comentar el código, es probable que desee 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 el las barras oblicuas como este:

:s:// :: 
2

sin embargo, otra posibilidad (probablemente no muy útil en el caso de test, pero muy útil en otras situaciones) es para acordonar el área que desea cambiar con las marcas.

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

Normalmente me gusta el modo de bloque visual si todo está visible en t La pantalla, y generalmente prefiero las marcas si el inicio y la parada están separados por muchas pantallas.

+0

Debería ser 'm' en lugar de' '' para 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

6

: normal al rescate!

:%norm Wibar(

:%norm WEa)

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

W - va a la siguiente palabra

i - inicia el modo de inserción

bar (- tipos de la 'barra (' secuencia

O en una sola línea:

:%norm Wibar(ctrlvESCEa)

Si' vuelva a ejecutar Windows y luego escriba ct rlq en lugar de ctrlv.

1

Otra expresión regular simple es: comentarios de estilo

%s/^/<text you want to prepend>/ 
Cuestiones relacionadas