2010-10-21 27 views
8

Cuando realizo una búsqueda interactiva de algún patrón, cada vez que toco n, obtengo el siguiente resultado. ¿Cómo borro/cambio cada resultado al que llego?Eliminación/cambio de texto buscado en Vim

Idealmente, lo que estoy buscando funcionaría así: Me golpeó n para obtener el resultado de la búsqueda, y luego magic command destacar que resultan en modo visual, y luego puede hacer d o c borrar o cambiar el texto resaltado.

Ejemplo:

I entran en el comando

/hello . 

y que coincide con hello, un espacio, y cualquier carácter después de ella.

Digamos que la primera coincidencia que alcanza es "hello w".

Ahora, quiero borrar todos hello w, buscar el próximo partido (dicen que es hello a), cambiar el próximo partido a hello there, y seguir haciendo cosas diferentes para cada partido.

no estoy buscando sólo la búsqueda y reemplazo, porque quiero ser capaz de realizar cualquier acción en cada resultado de forma interactiva, tales como eliminar el primer resultado, vuelva a colocar el segundo resultado con bye, y reemplazar el tercer resultado con later.

+0

:% s/hello/hello w/g – shoebox639

+0

@ shoebox639: Eso reemplazaría todos los 'hello' con' hello w', que no es lo que estaba buscando:/ – Chetan

Respuesta

12

Para seleccionar la coincidencia completa de la coincidencia actual (si se encuentra al comienzo del partido) puede escriba

v//e 

para eliminar hasta el final del partido

d//e 

Para cambiar el partido

c//e 

Lo único negativo es que no se puede utilizar n (ya que eso rehacer //e) y en lugar de tener que utilizar //

flujo de trabajo tan típico sería el siguiente

/hello ./ : Jump to the start of the next "hello ." 
d//e   : Delete the item 
//   : repeat the search to get to the begining of the next "hello ." 
c//e   : change it 
//   : next one. 
etc. 
+0

¡Ah, esto es exactamente lo que estaba buscando! ¡Increíble! Solo para aclarar, ¿qué exactamente busca '// e'? El final del partido? ¿Como funciona? – Chetan

+0

Una pregunta más general, en realidad, es, ¿qué busca '//'? – Chetan

+0

En realidad, he hecho la pregunta por separado, por favor respóndala aquí: http://stackoverflow.com/questions/3984622/how-does-the-command-work-in-vim – Chetan

1

Cambiar el primero, usando cwfooesc o lo que sea, a continuación, utilizar el comando . repetir que editar para cada ocurrencia, además, que desea cambiar.

+0

Eso cambia la * palabra * , OP quiere eliminar/reemplazar * texto *. – codaddict

+0

De acuerdo, use el comando de edición * text * que necesite para cambiar lo que necesita cambiar. Es imposible recomendar algo específico sin un ejemplo específico. –

+0

He agregado un ejemplo. – Chetan

0

Presione la tecla x.

o usuario de búsqueda y reemplazo: [esc] :%s/[search-regex]/[replace-regex]/g

Si replace-regex está en blanco se eliminarán de lo que acaba de buscar.

+0

Y si quiere reemplazar el texto, simplemente haga [r] y escriba, luego [esc] [n] [r] y luego escriba algo más. Pero una búsqueda y reemplazo es probablemente lo mejor para usted. – shoebox639

+0

¿'' x' no elimina solo un carácter? Y 'r' reemplazar solo un personaje? Estoy buscando eliminar o reemplazar todo el texto coincidente. – Chetan

+0

Mierda tu derecha. Bueno, ¿has probado la búsqueda y el reemplazo? – shoebox639

2

Haría lo que sugería un cartel anterior: Construya un solo comando de eliminación con d objetivo y pulse. después de usar n para encontrar cada ocurrencia. En este caso, 7x eliminaría cualquier elemento que coincida con hello . que es un formulario de acceso directo de d7l o d7[space] ya que d toma cualquier comando de movimiento.

Sin embargo, si desea una solución verdaderamente general para buscar y eliminar una expresión regular, puede ejecutar un único comando de sustitución (incluso si falla) y luego ejecutar su búsqueda y utilizar & para volver a aplicar la última sustitución al línea actual:

:s/hello .// 
/hello . 
& 
n 
& 

La primera línea (la sustitución) puede fallar. Todavía puede aplicarlo de nuevo con & más tarde. Estoy sorprendido de que el primer comando de sustitución no establezca el patrón predeterminado, pero tal vez lo haga en vi que no sea vim.

+0

¡Gracias por su respuesta! ¿Hay alguna forma en que pueda hacer que Vim resalte cada coincidencia cuando llegue a ella en modo visual, de modo que pueda operar en el texto seleccionado visualmente? Esa sería la solución óptima. – Chetan

+0

Puede hilitear el patrón de búsqueda actual en cualquier momento activando hlsearch (': set hlsearch') –

+0

Me refiero a resaltarlo en modo visual, para que pueda realizar una acción en él. – Chetan

1

que busca "confirmar"

:%s/hello .//gc 

: para entrar en modo ex,% se aplique a toda la memoria intermedia, es sustituir,/hola ./ para buscar esa expresión regular, a // sustitúyalo por nada, g para buscar todas las coincidencias en una línea, y c para confirmar si eliminar o no antes de cada partido.

Eso es asumiendo que usted está buscando confirmar. Si sólo quiere hacerlo todo a la vez, se ha mencionado ya un montón de veces

:%s/hello .//g 

: para entrar en modo ex,% se aplique a toda la memoria intermedia, es sustituir,/hola ./ para buscar esa expresión regular, // para reemplazarla por nada, y g para buscar todas las coincidencias en una línea

+0

Sé acerca de confirmar, pero estaba buscando algo un poco diferente. Por favor revisa el nuevo texto en negrita en la pregunta para aclaración. – Chetan

+0

lo que está describiendo es confirmar. Escribe el comando superior, lo lleva al primer resultado y le pregunta si desea reemplazarlo. dices "y" o "n", que lo hace o no, y pasa a la siguiente instancia, haciendo la misma pregunta –

0

¿Qué tal hacer esto con las grabaciones.

qa/TEXTSEARCH HIT ENTER v9lvq

9 es la (longitud de TEXTSEARCH - 1) es decir, 10 - 1 = 9

Ahora, una vez que haya preparado la grabación en el registro 'a', hacer @agv (@ un: ejecuta la grabación llamado 'a' y selecciona gv su texto de búsqueda.)

Ahora usted puede hacer lo que con su texto seleccionado, una vez que haya terminado se puede ir a la siguiente uno con @@

espero th at helps ..

3

Creo que quieres gn: (Ir al próximo partido y) seleccionarlo en modo visual. Puede prefijar esto con un comando, p. cgn cambia la coincidencia, dgn elimina etc. Encontré que si ya estaba en una coincidencia, se usa esta coincidencia, por lo que debería hacerlo.

+0

Esta debería ser la respuesta, es ¡mucho más práctico! –

+0

Esto se ve increíble. ¿Qué versión de vim soporta esto? No puedo encontrarlo en la ayuda de mi versión, y el comando no funciona para mí (estoy en 7.2). –

+0

En otra máquina, he verificado que funciona en vim 8.0, por lo que los vims más nuevos parecen estar bien. –

Cuestiones relacionadas