Comment supprimer les liaisons à la clé de préfixe ESC

9

Je voudrais utiliser la ESCclé au lieu de C-gpour keyboard-quit. Mon approche naïve pour faire

(define-key global-map (kbd "ESC") 'keyboard-quit)

ne marche pas. ESCest toujours une touche de préfixe et le presser n'appelle pas keyboard-quit.

Geier
la source
1
Vous pouvez être intéressé par ce fil connexe - J'ai utilisé cette solution pendant environ un an jusqu'à ce que je m'habitue à Cg et ESC-ESC-ESC: Comment utiliser <escape> (conditionnellement) comme clé de modification stackoverflow.com/a/20036348/ 2112489 La réponse de Stefan dans ce fil connexe est le même concept que celui utilisé par le universal-argumentavec le universal-argument-map.
lawlist

Réponses:

8

Tu peux le faire (define-key key-translation-map (kbd "ESC") (kbd "C-g")). J'ai fait la même chose il y a longtemps et je n'ai eu aucun problème.

Modifiez pour améliorer la réponse en fonction des commentaires:

Si vous souhaitez conserver la ESCfonctionnalité clé, vous pouvez le faire

(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))

Une chose à noter est que si Emacs se bloque, vous devez toujours utiliser la C-gclé pour une raison quelconque, mais cela se produit rarement.

clemera
la source
1
@EmacsUser Même si je n'ai jamais touché ESC en utilisant emacs?
Geier
1
@EmacsUser: Alors? Pour l'instant, je n'appuie sur ESC une seule fois, encore moins deux ou trois fois. Je ne vais pas le manquer.
Geier
2
@EmacsUser Je ne dis pas que c'est la bonne réponse et que je veux l'utiliser, je veux juste comprendre ce qui ne va pas. L'ensemble "à l'avenir, vous ne pourrez pas appuyer deux fois sur ESC" ne m'affecte pas du tout. Si vous me dites dans quelles conditions je pourrais entrer dans une boucle infinie avec cela et pourquoi, ce serait vraiment perspicace.
Geier
1
@Geier J'ai utilisé ce remappage depuis longtemps et je n'ai jamais rencontré de problème avec. La seule chose est que si emacs se bloque, vous devez appuyer sur C-gpour le détacher, le ESCremappage ne fonctionne pas dans ce cas.
clemera
1
@EmacsUser Je n'ai jamais eu de cas d'utilisation, ESCdonc cela ne m'a pas dérangé. Mais si vous en avez besoin, vous pouvez faire une autre traduction, par exemple(define-key key-translation-map (kbd "C-<escape>") (kbd "ESC"))
clemera
8

Mon conseil serait de partir ESCseul, car c'est une clé spéciale.

Par défaut, Emacs utilise ESC(ASCII 27) comme meta-prefix-key. Dans le manuel Elisp:

'esc-map' est le clavier global pour la clé de préfixe. Ainsi, les définitions globales de tous les méta-caractères se trouvent réellement ici. Cette carte est également la définition de fonction du «préfixe ESC».

et

Au lieu de cela, les méta-caractères sont considérés aux fins de la recherche de clés comme des séquences de deux caractères, dont le premier est ESC (ou quelle que soit actuellement la valeur de «meta-prefix-char»). Ainsi, la clé «M-a» est représentée en interne comme «ESC a», et sa liaison globale se trouve à l'emplacement pour «a» dans «esc-map».

Donc, pour utiliser ESC pour autre chose, vous devez définir meta-pefix-keyquelque chose d'autre et également lier une autre clé ESC-prefix. D'autres changements peuvent également être nécessaires - je n'ai jamais essayé cela.

Pour plus d'informations meta-prefix-char, voir Fonctions de recherche de touches dans le manuel Elisp.

glucas
la source
1
+1. Ne retirez pas la reliure de ESC. Liez une autre clé à keyboard-quit, si vous le souhaitez. Et sachez que cela ESC ESC ESCvous donne déjà le comportement d'échappement que vous souhaitez - voir le manuel Emacs, noeud Quitting .
Drew
2
Réglage de la meta-prefix-charà nilOSX sera pas le désactiver d'être une clé de préfixe - ce qu'il ne séparera de la clé de méta. Sur OSX avec une version graphique d'Emacs, j'aime que la touche d'échappement soit séparée de la méta-clé - je l'ai définie (setq meta-prefix-char nil)au début de mon initialisation pour que toutes les bibliothèques chargées par la suite comprennent ce que je veux. Cela me donne la possibilité d'utiliser la méta-clé comme clé de préfixe et la touche d'échappement comme clé de préfixe. Le esc-mapest défini au niveau du code source C dans keymap.c. Il est destiné à être utilisé comme clé de préfixe.
lawlist
@lawlist Intéressant - alors mappez-vous ensuite la méta comme esc-mappréfixe pour conserver les liaisons M par défaut?
glucas
Je pense que c'est le paramètre pertinent sur OSX:, (setq ns-alternate-modifier 'meta)ce qui fait de la méta la touche alt gauche du clavier Apple. J'aime utiliser la touche alt droite pour créer des caractères unicode en utilisant les paramètres par défaut OSX: (setq ns-right-alternate-modifier 'none)- pour insérer des caractères espagnols, des symboles de paragraphe, etc. Lors de la construction --with-ns, les touches alt gauche et droite sont définies sur meta. Le paramètre par défaut lie la touche d'échappement à la méta-clé sur OSX à l'aide de la meta-prefix-char, 27comme vous l'avez indiqué.
lawlist
5
Utilisez emacs, disent-ils. C'est extensible, disent-ils. Vous n'avez pas à vous y adapter, cela s'adapte à vous, disent-ils. Autrement dit, il ne s'adapte à vous que si vous souhaitez échapper à une situation en appuyant trois fois sur ESC. Parce que quelqu'un dans le passé pensait que l'ESC était une touche inouïe (ce n'est que dans le coin supérieur gauche de chaque clavier) qu'il ferait mieux de l'attacher avec la touche Meta :-(.
Geier
1

Belle réponse ici: https://superuser.com/a/945245/624661

Citant:

Vous pouvez l'utiliser dans votre fichier init Emacs:

;;; esc always quits
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)
(global-set-key [escape] 'keyboard-quit)
Ole
la source
0

Vous voulez lier [escape], pas (kbd "ESC"), comme le montrent les liaisons référencées par Ole . En stock, cela ne fonctionnera que si des cadres emacs dans un système de fenêtre. Je pense que cela mérite un peu d'explication.

(kdb "ESC")signifie en fait le caractère de contrôle ASCII ESC, et comme les glucas l'ont mentionné, vous ne voulez certainement pas remapper celui-ci. Mais ce Escn'est pas ASCII ESC: c'est un symbole escape, du moins dans un environnement graphique. Comment se fait-il que la liaison (kbd "ESC")affecte Escalors? Cela se produit car emacs se traduit escapepar ESC s'il n'y a pas de liaison disponible pourescape . Une sorte de solution de rechange si vous le souhaitez (qui est implémentée par le biais de local-function-key-mapsi vous êtes intéressé par de telles choses).

Ainsi, lorsque vous vous attachez [escape], vous êtes en sécurité et n'avez pas à vous soucier ESC; en dehors de vos propres liaisons, il vous suffit d'augmenter les keymaps qui disent ESCquand ils signifient [escape].

Hmm ... enfin presque. Pourquoi ces cartes ne sont-elles pas utilisées [escape]pour la première fois? Parce que cela ne fonctionnera pas dans un terminal. Si vous souhaitez Esctravailler sur un tel appareil, vous devrez au moins personnaliser votre terminal avant.

L'histoire du terminal est rapportée dans un autre article: Comment lier C- [pour de vrai? . Ce que vous devez faire est de dire au terminal d'envoyer une séquence personnalisée lorsque vous Escappuyez sur, puis de mapper cette séquence [escape]à un stade d'entrée précoce dans emacs (le input-decode-map).

J'espère que cela t'aides.

Champignac
la source