Existe-t-il un moyen de détecter si j'enregistre en Vimscript?

11

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.

James
la source
3
À mon humble avis, ce serait une mauvaise idée - "enregistrer", dans ce cas, deviendrait un faux nom :) Je ne sais pas ce que vous essayez de faire, mais peut-être que poser cette question pourrait fournir différentes façons de le résoudre.
VanLaser
@VanLaser Qu'entendez-vous par faux nom?
James
1
Si une action Vim est différente lorsque vous l'enregistrez, cela signifie que le processus d'enregistrement lui-même affecte l'action, alors qu'il ne doit la "stocker" que pour une répétition ultérieure. À quoi vous attendez-vous lorsque vous exécutez la macro?
VanLaser

Réponses:

4

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:

let g:isRecording = 0
nnoremap Q :call ToggleRecording()<CR>q

function! ToggleRecording()
    let g:isRecording = !g:isRecording
    echo "is recording " . g:isRecording
endfunction

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:isRecordingqui sera basculée à chaque démarrage ou arrêt d'un enregistrement. De cette façon, lorsque vous démarrez l'enregistrement g:isRecordingsera réglé sur 1et sur 0lorsque 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.

statox
la source
2

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 dansusr_10

Vous commencez par passer au premier caractère de la première ligne. Ensuite, vous exécutez les commandes suivantes:

qa Commencez à enregistrer une macro dans le registre a .

^ Passez au début de la ligne.

i # inclure "Insérer la chaîne #include" au début de la ligne.

$ Aller à la fin de la ligne.

a "Ajoutez le guillemet double (") à la fin de la ligne.

j Passez à la ligne suivante.

q Arrêtez l'enregistrement de la macro.

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 :regliste. Il s'avère que cela fonctionne comme un charme!

Exemple:

En mode normal: qaisomething<Esc>

et à l'intérieur de :regnous voyons l'entrée!

"a   isomething^[

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 qpour 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 registerssur les registres disponibles

Il existe dix types de registres: registres E354

  1. Le registre sans nom ""

  2. 10 registres numérotés "0 à" 9

  3. Le petit registre d'effacement "-

  4. 26 registres nommés "a à" z ou "A à" Z

  5. trois registres en lecture seule ":,"., "%

  6. registre tampon alternatif "#

  7. le registre d'expression "=

  8. Les registres de sélection et de dépôt "*," + et "~

  9. Le registre du trou noir "_

  10. Dernier registre de modèle de recherche "/

En 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-eventpour CursorHold; 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)

CursorHold

Lorsque l'utilisateur n'appuie pas sur une touche pendant la durée spécifiée avec «updatetime». Non relancé tant que l'utilisateur n'a pas appuyé sur une touche (c'est-à-dire qu'il ne déclenche pas tous les ms de «mise à jour» si vous quittez Vim pour faire du café. :) Voir | CursorHold-example | pour prévisualiser les balises. Cet événement n'est déclenché qu'en mode Normal. Il n'est pas déclenché lors de l'attente de la saisie d'un argument de commande ou d'un mouvement après un opérateur. Pendant l'enregistrement, l'événement CursorHold n'est pas déclenché. | q |

Dan Bradbury
la source
Je ne vois pas vraiment comment cela résout le problème: lorsque vous avez terminé d'enregistrer votre macro, une chaîne est enregistrée dans le registre, mais comment différencier lorsque le registre contient une macro ou lorsqu'il contient quelque chose provenant d'une commande yank par exemple. De plus, le registre est sauvegardé en une seule fois lorsque vous avez terminé l'enregistrement, donc quand vous voyez que le contenu du registre a changé, vous n'êtes plus en mode d'enregistrement.
statox
J'espérais que vous seriez en mesure d'utiliser quelque chose comme le registre blackhole (un registre qui ne va jamais être arraché). Si vous avez ce registre verrouillé, vous pouvez vérifier CursorHold qui a un comportement spécial en mode enregistrement (mettra à jour ma réponse avec plus d'informations pour voir si cela vous aide)
Dan Bradbury
ajouté quelques informations sur les autres registres (moyen d'éviter les conflits avec yank) et un indice sur la façon dont nous pourrions être en mesure de capturer "l'enregistrement" avec CursorHold non actif pendant l'enregistrement de macro. Si vous vous battez toujours après ces notes, faites le moi savoir et je peux essayer de le mettre en œuvre une fois le travail terminé. Comme note, le blackhole registern'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 ..
Dan Bradbury
J'ai passé un peu de temps sur cette dernière nuit (écraser le clavier de la bière) et j'ai trouvé qu'il était incroyablement difficile de savoir exactement quand l'enregistrement se produit et se termine. Mon intuition CursorHoldsemble être un rêve impossible en raison du décalage de la CursorHold 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 ..
Dan Bradbury
À mon avis, vous n'avez pas mille options différentes: vous devez remplacer le comportement de qet 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 :-)
statox