relire une macro vim jusqu'à la fin du tampon

85

Je veux exécuter une macro que je viens d'enregistrer dans le registre " x" sur chaque ligne d'un tampon ouvert, de mon curseur à la fin du tampon, dans vim. Comment je fais ça?

Je sais que je peux rejouer la macro n fois:

15@x

... ou maintenez-la enfoncée @jusqu'à ce que j'atteigne la dernière ligne, mais je veux juste appuyer sur quelques touches et en finir.

Merci d'avance.

Kevin
la source
15 @ x ne fonctionne pas sous Windows gVIM
Mingjiang Shi

Réponses:

101

Personnellement je ferais

VG:normal @x

Modifier: a changé le registre pour celui que vous avez spécifié.

Randy Morris
la source
Joli. J'aime que cette solution ne fonctionne que sur la zone sélectionnée.
Kevin
J'ai mappé ceci à nnoremap <C - @> VG: norm @ q <CR>
PAS
J'ai essayé cela avec la macro "1z =] s" mais cela ne corrige que l'orthographe du premier mot de chaque ligne, en sautant le reste.
elig
@elig vous souhaitez probablement créer une macro récursive qui trouvera les mots manquants sur toutes les lignes.
raman le
67

Vous pouvez faire (en mode commande)

:%normal @x
ryan_s
la source
J'aime cette solution, mais il exécutera la macro sur chaque ligne du tampon, OP ne demanda que de son curseur à la fin.
Porunga
24

faire une macro récursive:

qa@aq

ex:

qa0gUwj@aq

Il va UPCASE premier mot de la ligne actuelle à la fin du fichier avec un seul @a. Mais assurez-vous qu '"un registre est vide:

let @a=""
Maxim Kim
la source
3
Excellent. Cette approche est plus utile que l' %:normalapproche car elle honore tous les mouvements de ligne dans la macro, elle est donc utile lorsque les lignes ne sont pas de forme identique. Je trouve qu'il est plus facile de créer une macro «a» pour définir l'action, puis de demander à la macro «b» de faire le bit récursif, c'est-à-dire qb @ a @ bq.
Paul Ruane
3
Évitez cela si votre macro implique une recherche, car elle continuera à partir du haut. ctrl-cd'arrêter si cela arrive!
Iain Ballard
3
@IainBallard, le :set nowrapscanfait échouer et s'arrête lorsqu'il atteint la fin du fichier.
ericbn
1
pour effacer enregistrer un, il suffit de faire qaqavant la macro: qaqqa0gUwj@aq. De plus, si vous oubliez de mettre le @qà la fin, vous pouvez toujours qAcommencer à ajouter un registre, puis le faire @q. J'enregistre généralement sur reg q pour une raison quelconque car c'est facile (en particulier pour les macros récursives) et finit généralement par faire qqqqqgUiwj@qqau lieu de deux macros. Les trois premiers qs clear reg q, les deux seconds qdémarrent l'enregistrement. Voir vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc
Je pense que pour effacer le aregistre, on pourrait taper simplementqaq
Peter Perháč
11

999999@x, sauf si vous avez un très gros buffer ...

Peter
la source
6
pourquoi pas juste %:normal @xou 1,$:normal @x?
Nathan Fellman
3
c'est certainement la solution la plus élégante - je suppose que 99999@xc'est juste la chose naturelle que vous proposez lorsque vous êtes pressé :)
Peter
2
9999999 @ x ne l'exécutera-t-il pas plusieurs fois sur la dernière ligne à moins que vous n'ayez exactement 999999 lignes?
David Oneill
2
Juste essayé. Suspend la session. Continue probablement à l'exécuter un million de fois sans s'arrêter en fin de ligne.
CDR du
1
Au moins dans certains cas, cela ne se comportera pas comme prévu. Pensez à avoir une macro avec find next / find prev . Ainsi, une fois que la répétition de la macro atteint la fin du fichier, elle continuera depuis le début. vim doc sur le sujet . Pour éviter le wrapping de la recherche, vous pouvez utiliser : set nowrapscan . C'est un exemple que je pourrais trouver, mais cela ne veut pas dire qu'il n'y en a plus. :% normal @x est une façon de procéder comme @ryan_s l'a suggéré dans sa réponse ci-dessus.
Sergey Markelov
-1

De vim wiki, version abrégée: qqqqq pour enregistrer la macro @qq pour terminer l'enregistrement @q pour l'exécuter (et fonctionnera jusqu'à la fin du fichier)

user3499436
la source
1
S'il vous plaît, pouvez-vous ajouter une référence à la documentation?
aturegano
2
@aturegano Je pense que l'auteur voulait utiliser une macro récursive. Voir The Vim Wiki: Enregistrer une macro récursive pour plus d'informations.
dylnmc du