2011-06-03 15 views
23

A menudo tengo el texto en columnas y la necesidad de reemplazar algunas cosas sin clobbering cosas similares en la misma línea ... un ejemplo sencillo sigue:búsqueda vim y reemplazar limitada a lo más destacado en el modo de bloque visual

vim visual block-mode screenshot

Supongamos que he resaltado el texto en gris con el modo de bloque visual vim, y deseo reemplazar 80 con 81; sin embargo, solo quiero reemplazos dentro del bloque visual resaltado.

que ya han intentado Cntlv: s/80/81/g; sin embargo, eso reemplaza el texto dentro y fuera del el bloque visual. (basado en los comentarios de Randy, es porque : s es un comando en línea).

sé que podía utilizar un bloque visual de línea sabio sustituir en este caso particular (Shiftv: s/80\.1/81.1/g); sin embargo, estoy tratando de encontrar una solución general para el problema de no tener medios fáciles de reemplazar dentro de un bloque visual no lineal (¿no es este el problema amable que se supone que el modo de bloque visual ayuda a resolver?). Las respuestas que requieren confirmación como : s/80/81/gc, no son lo que estoy buscando.

Voy a volver a formular la pregunta para mayor claridad: ¿Cómo puedo reemplazar 80 con 81 mediante el uso del modo visual block block de vim?

+0

FYI ... para aquellos que usan 'gvim' en MS Windows, el modo de bloque visual es' ', porque' 'pega el buffer de copia –

Respuesta

25

Es necesario añadir \%V a su patrón. De :help \%V:

Match inside the Visual area. When Visual mode has already been 
stopped match in the area that gv would reselect. 
This is a /zero-width match. To make sure the whole pattern is 
inside the Visual area put it at the start and end of the pattern. 

OP EDITAR: la solución explícita es utilizar : s/\%V8\%V0/81/g

+0

Exactamente lo que estaba buscando; es interesante que no necesito '\% V' en el modo de bloque en línea. –

+2

Porque ': s' es una operación en línea. La ventaja de agregar esto es que incluso si saliste del modo visual, aún puedes operar en la última selección visual con '\% V' en tu patrón. –

+0

Para que yo entienda esto, trato '\%' como un carácter de escape de expresiones regulares, '\' y 'V' como' b' en '\ b' para un límite de palabras donde' \% V' es el límite de la selección . –

5

El bloque de selección visual should sea identificable con% V

:'<,'>s/\%V80/81/g 
6

La solución es, obviamente, el átomo \% V expresiones regulares, pero tenga en cuenta, que este es todavía un poco poco buggy.

Actualización: No es ningún error. Este thread explica el comportamiento.

+1

Gracias por su respuesta. ¿Qué tipo de comportamiento con errores has visto con '\% V'? –

+0

@ChristianBrabandt Sería más útil si a) dijera que coincide con '\% V' dentro de la expresión regular (consulte mi comentario sobre la respuesta aceptada) y b) borre o no el comentario anterior que dice que' \% V' es no de ancho cero. // Creo que es tu edición lo que hizo que esta pregunta aparezca en el RSS. – ZyX

+0

@Zyx: hecho eso –

Cuestiones relacionadas