Regroupement des séquences de commandes pour répétition (.)

10

Considérer:

apple
pear

Placez votre curseur sur la première ligne et tapez Yp, produisant:

apple
apple
pear

Placez votre curseur sur la pearligne et tapez .pour répéter la dernière commande. Cela ne répète que le p(plutôt que la combinaison Yp), produisant:

apple
apple
pear
apple

Je voudrais un moyen de dire .de répéter les dernières commandes N. Quelque chose comme 2.répéter la combinaison Yppour produire:

apple
apple
pear
pear

Ofc cela ne fonctionnera pas - il répète les pdeux fois. Mais l'idée serait de "répéter la séquence des 2 dernières commandes".

Je sais que je peux q-enregistrer des séquences de commandes et les répéter avec @@, mais cette solution n'est pas idéale, car elle nécessite que vous ayez planifié à l'avance, alors qu'en pratique, vous ne réalisez souvent pas que vous devez répéter quelque chose avant vous l'avez fait.

Existe-t-il un moyen de réaliser ce que je veux?

Prix ​​de consolation: si ce qui précède n'est pas possible, existe-t-il un moyen de répéter la dernière lecture de macro? Par exemple, si j'ai tapé @@pour lire ma dernière macro, j'aimerais que la suivante .soit équivalente à taper à @@nouveau - ce qui n'est pas le cas (par exemple, si le résultat de @@dépend de la ligne sur laquelle vous êtes)

Jonas
la source
Je ne connais pas de solution pour la première partie de votre problème, mais pour la deuxième partie, vous pouvez essayer ce mappage: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>Mais pour que cela fonctionne, vous devez installer ce plugin: github.com/tpope/vim-repeat
user9433424

Réponses:

4

Vim stocke uniquement la dernière commande exécutée, et seule celle qui est répétée par .; à mon avis, toute autre chose serait difficile à gérer.

Si vous ressentez le besoin de répéter le Ypcombo comme une seule entité, vous devez en faire une seule commande. Le plugin repeat.vim de Tim Pope permet de le faire facilement pour les mappages personnalisés. Bien sûr, si vous choisissez une touche [séquence] courte pour le mappage, vous pouvez simplement retaper rapidement cela (au lieu de .), et même éviter l'intégration repeat.vim.

BTW, mon plugin LineJuggler fournit un ]dmappage pour dupliquer la ligne actuelle, et il prend en charge la répétition via repeat.vim.

Ingo Karkat
la source
2

Dans Yp, le seul "changement" à répéter est p. Le seul moyen que je connaisse pour modifier le comportement de .en mode normal est d'ajouter yà l' cpoptionsoption:

set cpoptions+=y

ce qui vous permet de répéter le dernier coup sec ainsi que le dernier changement.

Mais cela ne change rien à votre problème car il Ypy a toujours deux commandes: un coup sec suivi d'un changement.

Je ne pense pas que vous puissiez obtenir ce que vous voulez sans un script non trivial. Avez-vous jeté un œil à la section scripts de vim.org ?

romainl
la source
1

J'utilise fréquemment mappour obtenir cet effet. Par exemple:

map <F12> Yp

Ensuite, une pression F12répétée exécutera YpYpYpetc. Si vous souhaitez passer à la ligne suivante après chaque collage, mappez une clé à la Yp+place.

user112358
la source
1

L'engin remarquable qu'est le plugin RepeatLast (par notre propre @joeytwiddle ) fournit juste cette fonctionnalité, via la méthode impie d'enregistrer tout ce que vous faites en tant que macro.

Il fournit un certain nombre de nouvelles applications, mais, si je lis correctement la documentation, pour effectuer les modifications que vous décrivez , vous pouvez utiliser la séquence de commandes ( en supposant que vous utilisez la valeur par défaut <leader>de \):

  • YpTirez et mettez / collez la ligne apple,
  • jDescendre d'une ligne pour que le curseur soit maintenant sur la pearligne,
  • \Doubliez la jcommande,
  • 2\.Répétez les deux commandes Yetp
Riches
la source
Impie, en effet! Mais j'apprécie l'ambition.
Jonah