Come posso applicare una serie di sequenze di tasti a ogni ricorrenza di una parola?


13

Se voglio cancellare ogni parola, è facile, perché farei qualcosa del genere:

:s%/WORD//g

E se volessi fare xyzogni ricorrenza di "WORD"? Ad esempio, supponiamo di voler eliminare ogni riga che contiene "WORD". Posso pensare a un paio di modi per farlo, ma nessuno di loro sembra ideale.

1)

/WORD

e quindi premere manualmente ddnddnddnddn...fino a quando non ci sono più occorrenze. Ma questo richiede molto tempo se ci sono molte linee per farlo.

2)

qd/WORD<enter>ddq

e poi indovina quante volte si verifica WORD e quindi, ad esempio:

500@d 

Ma questo A o mancherà un mucchio di righe o B) cancellerà un mucchio di righe extra.

C'è un modo migliore per farlo?


3
Solo così sai, 500@dcome descrivi è in realtà sicuro. La riproduzione macro si interromperà quando non viene trovato il termine di ricerca. Quindi vedrai solo un errore "Pattern non trovato: WORD" dopo che tutte le righe che lo contengono sono state eliminate.
Wildcard

@Wildcard Grazie, è davvero bello saperlo!
James,

Risposte:


17

È possibile utilizzare i comandi :globale :normalper questo. Il :globalcomando ha la sintassi seguente:

:global/{pattern}/{command}

Questo eseguirà "comando" su ogni occorrenza di "modello". È quindi possibile utilizzare il :normalcomando per eseguire una serie di sequenze di tasti su ogni occorrenza di una parola usando :global. Così:

:g/WORD/normal {keystrokes}

Se questi tasti coinvolgono tasti speciali come <Ctrl>, puoi combinarli con il :executecomando in questo modo:

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

Si noti che è necessario inserire una barra rovesciata prima di ogni occorrenza di una chiave speciale.

Per ulteriori informazioni su questi comandi, vedere :help :normale :help :global.


Batti a me; Immagino stia scrivendo troppo lentamente. :)
Wildcard

3

Solo per completezza, puoi usare :substitute, se corrispondi - nel tuo esempio (elimina l'intera riga che ha WORD) - l'intera riga contenente WORD, ad esempio:

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

Questo ha un implicito "sostituire la partita con niente", ovvero è la forma più breve di:

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

In combinazione con \zs, \ze, \(- \)(raggruppamento), e \=(nella parte di ricambio) con submatch(), :substitutepuò essere molto potente.


2

Sembra che tu stia cercando :global.

:g/WORD/d_

Cosa fa il carattere di sottolineatura?
Wildcard

Funziona, ma nessuno dei comandi che conosco funziona. Continuo a ricevere "non un comando editor".
James,

1
@Wildcard: il carattere di sottolineatura scarta ciò che viene tagliato. Il comando eseguito è effettivamente :deletee non il normale funzionamento in modalità d.
Luc Hermitte,

@DJMcMayhem: per altre normali operazioni, avrai bisogno :normal. E se hai bisogno di chiavi speciali, potresti anche aver bisogno :exe-> `exe" normal aFooFar \ <esc> "
Luc Hermitte,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.