Enregistrer la dernière action (.) Dans une macro

9

Cas d'utilisation

Je suis en mode normal. Je n'ai pas explicitement pensé à enregistrer une macro, mais j'effectue une seule modification de commande. Je peux maintenant répéter cette action en utilisant le point.

Je me rends compte maintenant que c'est une action utile pour enregistrer dans une macro à utiliser plus tard plutôt que de taper la commande entière à chaque fois. Je peux soit assister à toutes les modifications nécessitant cette commande en ce moment en utilisant le point, soit continuer avec l'édition et utiliser cette commande plus tard en l'enregistrant dans une macro.

C'est ce que je veux faire, mais la façon la plus simple d'y penser n'est pas facile - annuler ma modification, commencer à enregistrer une macro et retaper la commande pour effectuer la modification requise et arrêter l'enregistrement de la macro.

Ce que j'ai essayé jusqu'à présent:

L'enregistrement d'un point dans une macro ne fonctionne pas car il enregistre le point et non le changement effectué par le point. (Par exemple, supposons que la commande stockée dans le point était d5wSi vous commencez à enregistrer une macro et effectuez l'action via. En attendant qu'elle supprime 5 mots à chaque fois que vous exécutez la macro, cela ne se produira pas. La prochaine fois que vous exécuterez la macro fera des points et non la commande d5w. Cela signifie que si vous avez fait un autre changement après avoir enregistré la macro - dites supprimer 3 mots en utilisant d3wet c'était la dernière modification que vous avez effectuée, puis quand vous exécutez la macro elle supprimera 3 mots et non 5, parce que ça ne fait que courir .)

Peeyush Kushwaha
la source
J'ai du mal à comprendre à la fois ce que vous voulez faire et pourquoi vous ne faites pas quoi que ce soit avec une macro.
1
@DrEval L'OP se rend compte après avoir exécuté une commande en mode normal qu'ils auraient dû l'enregistrer dans une macro et ne veut pas avoir à le taper à nouveau lors de l'enregistrement de la macro.
Rich

Réponses:

2

Vim ne conserve pas d'historique de vos commandes en mode normal. Si vous souhaitez conserver un historique de votre historique de mode normal, vous pouvez utiliser ce qui suit pour l'enregistrer dans un fichier: https://vi.stackexchange.com/a/587/13848

Les commandes en mode normal sont généralement courtes, donc les gens le tapent simplement en mode normal et n'essaient pas de créer des macros. Cependant, si vous souhaitez créer des macros à partir de commandes en mode normal, vous pouvez les convertir en Excommande de mode, puis l'enregistrer dans une macro comme l'a souligné @wmmso. Vous pouvez le faire en utilisant la normcommande. Donc, si vous souhaitez supprimer 2 mots à partir de la position actuelle du curseur et utiliser une commande de mode normal en Exmode utilisation :norm d2w. (Réf: http://vimdoc.sourceforge.net/htmldoc/various.html#:norm , exécute une commande normale sur la plage )

Il vaut mieux utiliser une Excommande de mode si c'est une commande compliquée, car elle vous permet de taper la commande complète dans un tampon, assurez-vous qu'elle est réellement correcte et l'enregistre également dans l'historique de la ligne de commande.

Maintenant que vous avez votre commande en mode normal en mode ex, vous pouvez également parcourir votre commande comme l'historique à l'aide q:, puis la copier dans un registre à l'aide "ay$, tandis que sur la ligne contenant la ligne de commande que vous souhaitez enregistrer dans une macro. Ensuite, lorsque vous souhaitez exécuter la macro, vous pouvez l'exécuter à l'aide@a

alpha_989
la source
Comment écririez-vous une commande en mode normal sur la ligne de commande? par exemple d2w?
Peeyush Kushwaha
Ajout de quelques clarifications dans la réponse. Est-ce que cela aide?
alpha_989
0

copier le contenu du registre ":" (ce que vous venez de faire) dans un autre registre, par exemple, enregistrer un:

:let @a = @:

vous pouvez l'exécuter à nouveau en utilisant

@a
wmmso
la source
Cela ne fonctionne pas pour moi dans vim 7.4. Semble que le registre :contient la dernière commande exécutée via :command-name-goes-hereau lieu d'une commande en mode normal telle qued2w
Peeyush Kushwaha
2
Cette solution ne fonctionne que pour les commandes ex et non pour les commandes en mode normal. Je ne connais pas de registre contenant la dernière commande en mode normal. Serait utile
Steve