10
votes

Emacs Key Reliding Balling

J'ai un mode mineur. Si ce mode est actif et que l'utilisateur frappe del, je Voulez-vous faire une action, mais seulement si une condition est tirée. Si la Conditions conteste et l'action est exécutée, je veux ne rien faire de plus après ça. Mais si la condition échoue, je ne veux rien faire et laissez l'action par défaut del action exécuter.

Vous ne savez pas comment je pourrais résoudre ce problème. Mais je suppose que je pourrais le faire de deux manières: p>

1) strong> Je pourrais reculer la touche Del à une fonction en mode mineur, puis Vérifiez si les conditions contiennent OT non. Mais alors comment puis-je savoir ce que le commande par défaut à del est? p>

2) strong> Je pourrais ajouter un crochet de pré-commandement comme celui-ci. Exécuter la commande puis briser la chaîne. Mais comment briser la chaîne? P>

(add-hook 'pre-command-hook
          (lambda()
            (when (equal last-input-event 'backspace)
              ;; Do something and then stop (do not execute the
              ;; command that backspace is bound to)
              )))


1 commentaires

Est-ce que Del et Backspace sont les mêmes?


3 Réponses :


-3
votes

Il ne semble pas y avoir un moyen de faire ce que vous voulez de manière fiable. Si votre nouvelle commande est liée à Del, alors tout ce qui était liée à Del avant dans le Keymap actuel n'est plus là. L'autre approche que vous avez proposée ne fonctionnera pas car les crochets de pré-commandement n'empêchent pas l'action suivante d'avoir lieu. Vous pouvez également penser à interrompre une nouvelle exécution avec ^ g (clavier-cessé), mais c'est une interruption incontrôlée qui pourrait empêcher plus de choses que vous ne le souhaitez.

Même si vous faites le processus de configuration de la nouvelle liaison un peu plus sophistiquée que de retirez simplement et rappelez-vous ce qui était lié auparavant, vous pouvez donc l'appeler ensuite, vous n'avez pas vraiment ce que vous recherchez. . Si quelqu'un veut reculer l'action "Par défaut", ils doivent le faire en modifiant à votre fonction plutôt que de remplacer la liaison de clé.

Ce que vous voulez faire ne contient pas le modèle d'EMACS de la manière dont les travaux de liaison de clés.


0 commentaires

13
votes

La manière de le faire est de désactiver temporairement votre mode mineur, puis recherchez la liaison de la clé.

prétendre que vous avez lié 'do-baisse à del . Ensuite, cela ferait l'astuce (en supposant que la condition que vous souhaitez déclencher est (égale à l'éventualité de l'événement d'entrée) : xxx note : Ce problème suppose que vous avez configuré votre Liaisons clés the de manière standard Un mode mineur serait . Spécifiquement, vous devez ajouter votre KEYMAP à la variable Mode-Map-alist en ajoutant un élément < Code> (My-MODE-MODE. MY-MODE-MODE-KEYMAP) . C'est la manière dont le document indique fonctionne, il lève la liaison souhaitée avec votre mode temporairement désactivé.

si vous utilisez MODE DEFINER-MORT-MODE pour définir votre mineur Mode, le Keymap est configuré automatiquement de la "voie de droite".


1 commentaires

Qu'en est-il d'une relevette arbitraire, où vous ne savez pas à l'avance quelle est la clé dont vous souhaitez revenir? Comment pouvez-vous rechercher programmable la liaison à utiliser pour la valeur de l'original-Func? (NEUVEDMIND: On dirait que l'on utilise cette touche-commandes-vector).



2
votes

C'est ce que j'utilise pour mon package intelligent-onglet code> qui fait exactement cela.

(if (smart-tab-must-expand prefix)
    ;; use smart tab
  (smart-tab-default))


0 commentaires