reproduzir uma macro vim até o final do buffer


85

Quero executar uma macro que acabei de gravar no registro "x " em cada linha de um buffer aberto, do meu cursor até o final do buffer, no vim. Como faço isso?

Eu sei que posso repetir a macro n vezes:

15@x

... ou apenas segure @ até chegar à última linha, mas quero apenas pressionar algumas teclas e pronto.

Desde já, obrigado.


15 @ x não funciona no Windows gVIM
Mingjiang Shi

Respostas:


102

Pessoalmente eu faria

VG:normal @x

Editar: registro alterado para o que você especificou.


Agradável. Gosto que esta solução funcione apenas na área selecionada.
Kevin

Mapeei isso para nnoremap <C - @> VG: norm @ q <CR>
PAS

Tentei fazer isso com a macro "1z =] s", mas ela só corrige a grafia da primeira palavra de cada linha, pulando o resto.
elegível em

@elig você provavelmente deseja fazer uma macro recursiva que encontrará palavras que faltam em todas as linhas.
raman

67

Você pode fazer (no modo de comando)

:%normal @x

Eu gosto dessa solução, mas vou executar a macro em todas as linhas do buffer, OP pergunta apenas do cursor até o final.
Porunga de

24

fazer macro recursiva:

qa@aq

ex:

qa0gUwj@aq

Irá UPCASE pela primeira palavra da linha atual até o final do arquivo com um único @a. Mas certifique-se de que "um registro está vazio:

let @a=""

3
Excelente. Esta abordagem é mais útil do que a %:normalabordagem, pois respeita quaisquer movimentos de linha dentro da macro, portanto, é útil quando as linhas não são idênticas na forma. Acho mais fácil criar uma macro 'a' para definir a ação e, em seguida, fazer com que a macro 'b' faça o bit recursivo, ou seja, qb @ a @ bq.
Paul Ruane

3
Evite isso se sua macro envolver uma pesquisa, pois ela continuará do início. ctrl-cpara parar se isso acontecer!
Iain Ballard de

3
@IainBallard, :set nowrapscanfaz com que ele falhe e pare ao chegar ao final do arquivo.
Ericbn

1
para limpar registrar um, basta fazer qaqantes da macro: qaqqa0gUwj@aq. Além disso, se você esquecer de colocar o @qno final, pode sempre fazer qApara começar a anexar um registro e depois fazer @q. Eu geralmente gravo no reg q por algum motivo porque é fácil (esp para macros recursivas) e geralmente acabo fazendo em qqqqqgUiwj@qqvez de duas macros. Os três primeiros qs apagam o reg q, os dois qsegundos começam a gravar. Consulte vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

Acho que para limpar o aregistro, pode-se digitar simplesqaq
Peter Perháč

12

999999@x, a menos que você tenha um buffer muito grande ...


6
porque não apenas %:normal @xou 1,$:normal @x?
Nathan Fellman

3
esta é definitivamente a solução mais elegante - acho que 99999@xé a coisa natural que você pensa quando está com pressa :)
Peter

2
O 9999999 @ x não o executará muitas vezes na última linha, a menos que você tenha exatamente 999999 linhas?
David Oneill

2
Apenas tentei. Suspende a sessão. Provavelmente continua a executá-lo um milhão de vezes sem parar no final da linha.
CDR

1
Pelo menos em alguns casos, isso não se comportará como esperado. Considere ter uma macro com find next / find prev . Portanto, quando a repetição da macro chegar ao final do arquivo, ela continuará desde o início. vim doc sobre o assunto . Para evitar o encapsulamento da pesquisa, pode-se usar : set nowrapscan . Este é um exemplo que eu poderia dar, mas isso não significa que não haja mais. :% normal @x é uma maneira de seguir como @ryan_s sugeriu em sua resposta acima.
Sergey Markelov,

-1

Do vim wiki, versão abreviada: qqqqq para gravar a macro @qq para finalizar a gravação @q para executá-la (e será executado até o final do arquivo)


1
Por favor, você pode adicionar uma referência à documentação?
aturégano de

2
@aturegano Acho que o autor pretendia usar uma macro recursiva. Veja The Vim Wiki: Grave uma macro recursiva para mais informações.
dylnmc
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.