Y a-t-il quelque chose comme
eval("is_recording()")
que je peux appeler dans mon vimscript pour savoir si j'enregistre actuellement une macro? J'aurais pensé que cela fonctionne:
eval("mode(1)")
mais cela revient juste "n"
.
Je ne sais pas si c'est important, mais j'utilise neovim, donc si c'est exclusif à neovim, ça va.
Réponses:
Tout d'abord, je pense que votre problème est principalement un problème XY . Vous devriez nous donner plus d'informations sur ce que vous essayez de faire à la fin et je pense que nous pourrions trouver une autre solution.
Maintenant, voici une solution de contournement, ce n'est probablement pas idéal et certainement pas très robuste, mais vous pouvez ajouter ces lignes à votre
.vimrc
:L'idée est que le "mode d'enregistrement" est basculé exclusivement lorsque vous appuyez sur qen mode normal.
Sur cette base, vous créez une variable
g:isRecording
qui sera basculée à chaque démarrage ou arrêt d'un enregistrement. De cette façon, lorsque vous démarrez l'enregistrementg:isRecording
sera réglé sur1
et sur0
lorsque vous arrêterez l'enregistrement. Vous pouvez alors accéder à l'état d'enregistrement via la valeur de la variable.L'inconvénient est que pour éviter le mappage récursif, vous devrez utiliser Shit-q pour démarrer et arrêter l'enregistrement au lieu de q. (Notez que ce n'est pas un gros problème: j'utilise le shift-qmode d'enregistrement depuis un certain temps car je n'aime pas le shift-qcomportement d' origine )
Le principal problème de cette solution est que si vous l'avez oublié et que vous utilisez qla variable, elle ne sera pas basculée mais vous ne pourrez pas la désactiver q(par exemple avec
nnoremap q <nop>
) car si vous le faites, shift-qcela ne fonctionnera plus.la source
C'est une demande assez curieuse car il n'y a pas de "mode" pour enregistrer une macro. Après avoir fouillé dans certains documents, j'ai trouvé ce qui suit dans
usr_10
La chose la plus remarquable pour moi était la ligne sur "Commencer à enregistrer une macro dans un registre"
Étant donné que chaque macro va être enregistrée dans un registre par défaut, j'espérais que nous pourrions la voir dans la
:reg
liste. Il s'avère que cela fonctionne comme un charme!Exemple:
En mode normal:
qaisomething<Esc>
et à l'intérieur de
:reg
nous voyons l'entrée!Avec cette connaissance, vous devriez pouvoir "espionner" les registres pour confirmer qu'une macro est en cours d'enregistrement (utilisez un registre nommé sur chaque enregistrement [carte
q
pour toujours utiliser le même registre (ou quelque chose comme ça)])Si vous rencontrez des problèmes, faites le moi savoir et je vais essayer de vous aider (car cette fonctionnalité est nouvelle pour moi aussi: D)
modifier Pour résoudre le problème d'un registre utilisé pendant le coup sec, je recommanderais de rechercher un type spécial de registre que vous pouvez utiliser uniquement pour l'
vimL
écriture (aucun coup sec ne serait jamais engagé sur le registre ("ay
))Voici quelques informations
:help registers
sur les registres disponiblesEn supposant que vous disposez d'un registre que vous allez utiliser maintenant, le problème devient "comment savoir quand l'enregistrement est arrêté?". Pour prendre soin de ce que je prendrais un coup d' oeil à la
autocmd-event
pourCursorHold
; la note dans les documents d'aide semble assez prometteuse (j'essaierais de comprendre comment je pourrais différencier le curseur normal par rapport à l'événement inactif / inexistant qui se produit lorsque votre registre est écrit dans le but de la macro)la source
blackhole register
n'a été mentionné que comme un indice et une information intéressante sur vim qui pourrait conduire à quelque chose (il ne serait pas utile d'utiliser lors de l'enregistrement de macros; car @_ n'est pas utilisable.) En fait, vous ne pouvez même pas essayer d'enregistrer la macro à elle ..CursorHold
semble être un rêve impossible en raison du décalage de laCursorHold
réalité (fait un simple incrément global à chaque fois pour regarder cela). Toujours incroyablement intéressé à trouver un moyen de le faire et continuera de me fracasser le visage contre les touches jusqu'à ce que nous ayons une solution ..q
et faire basculer une variable et démarrer / arrêter l'enregistrement. Une autocomande ne peut pas être fiable ici car aucun autocmd ne se déclenche sur une pression de touche, et il n'est pas possible de faire une fonction d'interrogation en raison de la nature monothread de Vim. Bonne chance pour vos futures expérimentations :-)