¿Cómo aplico un conjunto de teclas a cada aparición de una palabra?


13

Si quiero eliminar cada palabra, eso es fácil, porque haría algo como esto:

:s%/WORD//g

Pero, ¿qué pasa si quiero hacer xyzcada aparición de "PALABRA"? Por ejemplo, supongamos que quiero eliminar cada línea que contiene "PALABRA". Puedo pensar en un par de formas de hacer esto, pero ninguna de ellas parece ideal.

1)

/WORD

y luego presione manualmente ddnddnddnddn...hasta que no haya más ocurrencias. Pero esto lleva mucho tiempo si hay muchas líneas para hacerlo.

2)

qd/WORD<enter>ddq

y luego adivina cuántas veces aparece WORD, y luego, por ejemplo:

500@d 

Pero esto A) perderá un montón de líneas o B) eliminará un montón de líneas adicionales.

¿Hay una mejor manera de hacer esto?


3
Para que lo sepas, 500@dcomo lo describe es realmente seguro. La reproducción de la macro se detendrá una vez que no se encuentre el término de búsqueda. Entonces verá un error "Patrón no encontrado: PALABRA" después de que se hayan eliminado todas las líneas que lo contienen.
Comodín el

@Wildcard Gracias, eso es realmente bueno saberlo!
James

Respuestas:


17

Puede usar los comandos :globaly :normalpara esto. El :globalcomando tiene la siguiente sintaxis:

:global/{pattern}/{command}

Esto ejecutará "comando" en cada aparición de "patrón". Luego puede usar el :normalcomando para ejecutar una serie de pulsaciones de teclas en cada aparición de una palabra usando :global. Al igual que:

:g/WORD/normal {keystrokes}

Si esas pulsaciones de teclas involucran teclas especiales como <Ctrl>, puede combinarlo con el :executecomando de la siguiente manera:

:g/WORD/exe "normal {keystrokes}"

Tenga en cuenta que debe colocar una barra diagonal inversa antes de cada aparición de una tecla especial.

Para más información sobre estos comandos, vea :help :normaly :help :global.


Gáname a eso; Supongo que estaba escribiendo demasiado lento. :)
Comodín el

3

Solo para completar, puede usar :substitute, si coincide, en su ejemplo (eliminar toda la línea que tiene WORD), la línea completa que contiene WORD, por ejemplo:

:%s/^.*\<WORD\>.*\n

Esto tiene un implícito "reemplazar coincidencia con nada", es decir, es la forma más corta de:

:%s/^.*\<WORD\>.*\n//

En combinación con \zs, \ze, \(- \)(agrupación), y \=(en la pieza de repuesto) con submatch(), :substitutepuede ser muy poderoso.


2

Parece que lo estás buscando :global.

:g/WORD/d_

¿Qué hace el guión bajo?
Comodín el

Esto funciona, pero ninguno de los comandos que conozco funciona. Sigo recibiendo "no un comando de editor".
James

1
@Wildcard: el guión bajo descarta lo que se está cortando. El comando ejecutado es en realidad :deletey no la operación en modo normal d.
Luc Hermitte

@DJMcMayhem: para otras operaciones normales, necesitará :normal. Y si necesita teclas especiales, puede que incluso necesite :exe-> `exe" normal aFooFar \ <esc> "
Luc Hermitte
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.