Quelle est la meilleure façon de détecter les frappes (par exemple via un crochet) qui ne modifient pas le tampon? Je veux dire des choses comme les touches fléchées pour le mouvement de point, les appels à beginning-of-buffer
, etc.
La raison en est que je travaille sur certaines ycmd
liaisons pour emacs, et j'aimerais pouvoir détecter (au moins heuristiquement) lorsque l'utilisateur a arrêté de modifier et se déplace dans le tampon. C'est le bon moment pour expédier le contenu du tampon pour l'analyse. Le client vim fait cela lorsque l'utilisateur quitte le mode d'insertion, et j'essaie d'émuler ce comportement.
key-bindings
abingham
la source
la source
self-insert-command
d'annuler et de replanifier un temporisateur au lieu d'utiliser un temporisateur inactif. De cette façon, même si l'utilisateur fait quelque chose, le minuteur n'est pas réinitialisé sauf si le "quelque chose" est une insertion de texte.after-change-functions
est un mécanisme général pour réagir aux changements de texte.post-command-hook
. Cela se déclenchera sur tout, vous devrez donc peut-être filtrer ce qui l'a déclenché avant de prendre l'action que vous souhaitez.buffer-chars-modified-tick
fonction peut être utile.Réponses:
Ajoutez les crochets suivants:
pre-command-hook
, définissez une variable sentinelle surt
- cela indique que la commande ne change pas.after-change-functions
, définissez cette valeur sentinelle surnil
. (C'est un crochet, il ne ressemble tout simplement pas à un; merci à @phils de l'avoir signalé.)post-command-hook
, vérifiez cette valeur sentinelle et exécutez votre fonction.Cela peut ou peut ne pas fonctionner selon l'ordre d'exécution. Si ce n'est pas le cas, faites-le moi savoir dans les commentaires ci-dessous.
Lorsque je quitterai le travail, je publierai un exemple.
la source
post-self-insert-hook
(ce morceau de la réponse semble confondre ce crochet avec le conseilself-insert-command
). Dans tous les cas, je pense que vous préféreriez généralementafter-change-functions
car il fait ce que vous voulez (car l'auto-insertion n'est pas le seul type de coup de clé qui modifie le tampon).Juste une pensée -
Cela ne devrait pas vraiment concerner les "frappes", mais les commandes - peu importe comment elles sont exécutées, non ? Si je comprends bien, vous cherchez vraiment un moyen de savoir si une commande donnée qui est invoquée modifie le tampon.
Si oui, alors peut-être faire quelque chose comme ceci:
Mettez une fonction sur
pre-command-hook
(1) enregistre la valeur actuelle de(buffer-modified-p)
puis (2) utiliseset-modified-p
pour rendre le tampon non modifié.Mettez une fonction sur
post-command-hook
cela (1) vérifie si la commande a modifié le tampon (en comparant la valeur enregistrée avec la nouvelle valeur actuelle de(buffer-modified-p)
), puis agit en conséquence, et (2) si la nouvelle valeur estnil
ensuite réinitialisée à la valeur de pré-changement en utilisantset-modified-p
.Un peu lourd (il vérifie chaque commande invoquée), mais cela pourrait valoir la peine d'être essayé.
Si la partie " agit en conséquence " est juste un no-op pour toutes les commandes de modification du tampon, et si c'est aussi un no-op pour de nombreuses commandes non-modificatrices (par exemple parce que vous venez de le faire sur une précédente commande non-modificatrice), alors au moins vous ne ferez pas cette action " agit en conséquence " plus que nécessaire. Mais la vérification seule peut être chère / exagérée (ralentir trop les choses) - essayez-la pour voir.
la source