Como aplico um conjunto de pressionamentos de tecla a cada ocorrência de uma palavra?

13

Se eu quiser excluir todas as palavras, isso é fácil, porque eu faria algo assim:

:s%/WORD//g

Mas e se eu quiser fazer xyza cada ocorrência de "WORD"? Por exemplo, digamos que eu queira excluir todas as linhas que contenham "WORD". Posso pensar em algumas maneiras de fazer isso, mas nenhuma delas parece ideal.

1)

/WORD

e pressione manualmente ddnddnddnddn...até que não haja mais ocorrências. Mas isso é demorado se houver muitas linhas para fazer isso.

2)

qd/WORD<enter>ddq

e então adivinhe quantas vezes o WORD ocorre e, por exemplo:

500@d 

Mas isso irá A) perder um monte de linhas ou B) excluir um monte de linhas extras.

Existe uma maneira melhor de fazer isso?

James
fonte
3
Só para você saber, 500@dcomo você descreve é ​​realmente seguro. A reprodução da macro será interrompida quando o termo de pesquisa não for encontrado. Então, você verá o erro "Padrão não encontrado: WORD" depois que todas as linhas que o contêm foram excluídas.
Wildcard
@ Wildcard Obrigado, isso é realmente bom saber!
James

Respostas:

17

Você pode usar os comandos :globale :normalpara isso. O :globalcomando tem a seguinte sintaxe:

:global/{pattern}/{command}

Isso executará "comando" em todas as ocorrências de "padrão". Você pode usar o :normalcomando para executar uma série de pressionamentos de tecla em cada ocorrência de uma palavra usando :global. Igual a:

:g/WORD/normal {keystrokes}

Se essas teclas envolverem teclas especiais como <Ctrl>, você pode combiná-lo com o :executecomando da seguinte maneira:

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

Observe que você deve colocar uma barra invertida antes de cada ocorrência de uma chave especial.

Para mais informações sobre esses comandos, consulte :help :normale :help :global.

EvergreenTree
fonte
Bata-me para isso; Acho que estava digitando muito devagar. :)
Curinga
3

Apenas para completar, você pode usar :substitute, se corresponder - no seu exemplo (exclua toda a linha que possui WORD) - toda a linha que contém WORD, por exemplo:

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

Isso tem uma implícita "substituir correspondência por nada", ou seja, é a forma mais curta de:

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

Combinado com o \zs, \ze, \(- \)(agrupamento), e \=(na peça de reposição) com submatch(), :substitutepode ser muito poderosa.

VanLaser
fonte
2

Parece que você está procurando :global.

:g/WORD/d_
Luc Hermitte
fonte
O que o sublinhado faz?
Wildcard
Isso funciona, mas nenhum dos comandos que conheço funciona. Eu continuo recebendo "não é um comando do editor".
James
1
@Wildcard: o sublinhado descarta o que está sendo cortado. O comando executado é realmente :deletee não a operação no modo normal d.
Luc Hermitte 14/10
@DJMcMayhem: para outras operações normais, você precisará :normal. E se você precisar de chaves especiais, poderá até precisar :exe-> `exe" normal aFooFar \ <esc> ""
Luc Hermitte