Comment arrêter l'enregistrement en ligne de commande?

19

Lorsque j'enregistre une macro avec qet que j'ai terminé, je peux taper:

  • q pour arrêter l'enregistrement si je suis en mode normal ou visuel.
  • <c-o>q pour arrêter l'enregistrement si je suis en mode insertion.
  • ..

    Comment arrêter l'enregistrement si ma macro se termine en mode commande?

iago-lito
la source
Quel est votre cas d'utilisation pour cela? Je suis vraiment curieux :)
PhilippFrank
2
@PhilippFrank Je vais souvent chercher et remplacer le même motif par des motifs différents dans différents blocs de texte. Avec une telle macro, il est possible de sélectionner automatiquement le bloc, d'écrire le motif de recherche réel et de placer le curseur sur la bonne position pour taper la chaîne de remplacement. Lorsque je le joue, il sélectionne le bloc, passe en mode commande, tape :'<,'>s/toBeReplaced//gpuis place le curseur entre les deux //pour que tout ce que j'ai à faire soit de taper newString<cr>et j'ai terminé. :)
iago-lito
C'est donc comme une macro avec un paramètre. Très belle idée, merci!
PhilippFrank
@PhilippFrank en quelque sorte, oui. Je suis content que vous l'aimez. :)
iago-lito

Réponses:

12

Une autre solution consiste en mode ligne de commande, utilisez Ctrl-fet appuyez sur qpour arrêter l'enregistrement.

Ctrl-fvous permet d'ouvrir la fenêtre de ligne de commande, dans laquelle vous pouvez modifier la commande en mode normal. Pour valider la commande, utilisez simplement enter.


Par conséquent, après avoir ajouté quelque chose comme:

cnoremap <c-q> <c-f>i<c-o>q

dans votre .vimrc, vous pouvez utiliser <c-q>pour arrêter l'enregistrement d'une macro en mode commande.


Florent

fflorent
la source
Vous devez toujours supprimer le caractère <Cf> ( ^F) à la fin de la macro, non? C'est du moins ce que je vois.
VanLaser
Presque là! Vraiment utile (je ne connaissais pas la fenêtre de ligne de commande mais c'est génial), mais .. aargh! Il semble que l'accès à cette fenêtre à partir du mode d'insertion perd la zone sélectionnée. Existe-t-il un moyen de faire fonctionner la commande que vous lancez à partir de la fenêtre de ligne de commande sur une zone sélectionnée?
iago-lito
@VanLaser Non, car vous pouvez continuer à taper votre commande dans la fenêtre de ligne de commande. Votre macro ressemblera qqSTARTMACRO:STARTCOMMANDLINEPART<c-f>i<c-o>qet donc l'enregistrement s'est réellement arrêté pendant que vous tapiez la partie commande. Pour utiliser la macro: @qFINISHYOURCOMMAND<cr>et vous avez terminé: pas besoin de la modifier. Malheureusement, cela ne semble pas fonctionner en mode visuel (ou cela perd la sélection) .. ou ai-je oublié quelque chose?
iago-lito
Ah, à droite :) BTW, je pouvais sélectionner une plage visuelle, puis le faire @qet la plage a été ajoutée au démarrage de la commande '<,'>- tant que la macro a commencé avec :....
VanLaser
@ lago-lito En fait, il semble que même si vous ne voyez pas votre sélection, la plage spécifiée (c'est-à-dire '<,'>) correspond toujours à la sélection lors de la validation de la commande.
fflorent
17

Une façon de le faire:

  • démarrez votre macro comme d'habitude (par exemple qq... d'autres caractères)
  • lorsque vous atteignez le mode cmdline, écrivez tous les caractères que vous voulez
  • vous voulez terminer la macro ici. Appuyez ESCsur pour sortir du mode cmdline, qpour terminer votre macro.
  • supprimez le ESCde votre qregistre (*): vous pouvez le coller dans un tampon, supprimer le ^[caractère, sélectionner à nouveau tout le contenu (par caractère) et le reculer pour vous enregistrer q.
  • c'est il: exécuter votre macro: @q.

En gros, vous "post-traitez" un peu votre macro, car elle est stockée dans un registre :)

(*) Un moyen rapide de supprimer le dernier caractère d'une macro stockée dans le registre qserait:

:let @q = @q[:-2]
VanLaser
la source
Haha! Jusqu'à présent, cela a été mon hack = D. N'y a-t-il pas une manière "canonique" de le faire? (aussi plus rapide )
iago-lito
Je n'en connais pas, mais je n'utilise pas trop de macros (je préfère écrire de petites fonctions à la place). Les macros me paraissent cryptiques, quand je les regarde ensuite.
VanLaser
@VanLaser: pourriez-vous donner un peu plus de détails sur la ligne :let @q = @q[:-2]s'il vous plaît? Surtout comment ça [:-2]marche? :-)
statox
Il "tranche" et fonctionne sur les listes et les chaînes (c'est ainsi que j'accède / définit @qci-dessus). Quelques exemples ici
VanLaser
@VanLaser, ils ont vraiment l'air énigmatique. Il existe cependant des choses répétitives et sophistiquées que vous devez faire dans des cas très spécifiques. Vous connaissez ce genre de problèmes qui n'apparaissent qu'une seule fois et ne durent que quelques minutes. Être en mesure de les gérer en créant des macros à la volée et sans avoir à écrire et déboguer une fonction dédiée est tout simplement génial! ^ ^
iago-lito
3

Après avoir lu votre commentaire sur le cas d'utilisation, il semble que vous pourriez utiliser un mappage de clé au lieu d'une macro.

J'ai cette ligne dans mon .vimrc (je ne me souviens pas où je l'ai trouvée):

nnoremap <Leader>s :%s/\<<C-r><C-w>\>//g<Left><Left>

Il a un effet similaire au cas d'utilisation que vous avez décrit, vous mettant sur la ligne de commande de sorte que la seule chose que vous ayez à faire est de taper le remplacement et d'appuyer sur Entrée, mais dans ce cas, en remplaçant toutes les occurrences du mot qui était sous votre curseur .

Pour simplement remplacer le bloc actuel, je pense que quelque chose comme ce qui suit devrait fonctionner:

nnoremap <Leader>s m'va{<ESC>``:'<,'>s/\<<C-r><C-w>\>//g<Left><Left>

Bien sûr, vous pouvez le mapper à la clé de votre choix.

Ce que cela fait: marquer la position actuelle à l'aide du marqueur sans nom, sélectionner visuellement le bloc actuel, quitter le mode visuel et ramener le curseur à la position enregistrée (les marqueurs de sélection visuels sont toujours définis), entrer en mode commande et taper la commande de remplacement , en insérant le mot qui se trouvait sous le curseur avec <C-r><C-w>et en positionnant votre curseur pour taper le remplacement.

dhakimian
la source
Oui, je l'ai aussi. Dans mon cas d'utilisation spécifique, cependant, le toBeReplacedmodèle n'est pas aussi simple que "le mot sous le curseur", c'est pourquoi j'ai besoin d'une petite macro spécifique que je pourrais créer en déplacement. Et puis encore: trop spécifique pour une carte: \ Merci quand même :)
iago-lito
2
Peut-être, mettez le motif dans un registre, puis adaptez le mappage ci-dessus pour obtenir automatiquement le contenu du registre en tant que toBeReplacedpartie (au lieu du mot actuel sous le curseur, ce qui est plus limitant).
VanLaser
1
@VanLaser À droite, cela permettrait un mappage général et le rendrait également beaucoup plus simple: va{:s/<C-r>0//g<Left><Left>avec cela, vous pouvez tirer à l'avance le motif dont vous avez besoin, puis appuyez simplement sur la touche mappée pour remplacer ce motif par quelque chose dans le courant bloquer.
dhakimian