Utiliser Super dans emacs -nw sous linux

15

J'ai eu du mal à trouver une question simple et directe à la réponse et j'ai donc décidé de poser ici.

Q: Existe - t-il un moyen d'utiliser Super dans Emacs lancé dans un terminal sous Linux?

PS : J'ai lu beaucoup d'informations xmodmapmais je pense que la clé est que l'émulateur de terminal ne peut pas représenter la touche Super. Cependant, (kbd "s-SPC")renvoie quelque chose et je pensais utiliser la fonction de traduction de .Xdefaults/X. Suis-je sur la bonne voie? Compte tenu du résultat de kbd, que dois-je mettre en tant que traductions XTerm.VT100.?

Andrea Richiardi
la source

Réponses:

21

Vous serez plus à l'aise dans un X11 Emacs, qui peut recevoir une entrée au clavier et afficher du texte sans passer par l' encodage et le décodage du terminal . La principale raison d'utiliser un éditeur de mode texte est de l'exécuter à l'intérieur de l'écran ou de tmux sur une machine distante, mais grâce à Tramp, il est généralement plus facile de modifier le fichier distant dans votre Emacs local. Cela étant dit, vous pouvez faire ce que vous voulez tant que votre émulateur de terminal coopère, ce qui est le cas avec Xterm.

Lorsque vous appuyez sur une touche ou une combinaison de touches dans un terminal, elle est transmise à l'application exécutée dans le terminal sous la forme d'une séquence d'un ou plusieurs caractères. Par exemple, lorsque vous appuyez sur a, l'application reçoit a. Lorsque vous appuyez sur Enter, l'application reçoit le caractère CR(aka ^M(prononcé "control-emm"), aka caractère numéro 13, aka \rou \015). Les combinaisons de touches impliquant Altsont généralement transmises sous la forme du caractère ESC( ^[alias aka \eou \033) suivi de la séquence de la touche ou de la combinaison de touches sans Alt. Les touches de fonction et autres combinaisons de touches sont transmises sous forme de séquences d'échappement commençant par \e[ou \eO.

Les séquences d'échappement ne sont pas entièrement standardisées et les terminaux ignorent généralement certains attributs pour certaines clés. Par exemple, les hyper et super modificateurs sont généralement ignorés. Vous pouvez voir ce que votre terminal envoie pour une combinaison de touches en appuyant sur Ctrl+ Vsuivi de cette combinaison de touches dans une invite du shell, ou C-qou C-h csuivi de la combinaison de touches dans Emacs.

Xterm vous permet de configurer les séquences d'échappement pour chaque clé par les ressources X . La plupart des configurations lisent les ressources à partir du ~/.Xresourcesdémarrage de X, et vous pouvez charger le fichier manuellement avec xrdb -merge ~/.Xresources.

XTerm.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <Key> Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <Key> percent: string("\033[37;6~")

Une convention courante utilise des séquences d'échappement du formulaire ESC [ number1 ; number2 ~pour les touches de fonction avec des modificateurs. number1indique la touche de fonction ( 15à 24pour F5à F12- pour des raisons historiques, F1 à F4ont des séquences d'échappement différentes) et number2indique le modificateur ( 2pour Shift, 5pour Ctrl, 3pour Meta, 8pour Ctrl+ Metaet ajoutez 1 pour + Shift- non, ce n'est pas très cohérent).

Vous devrez spécifier les modificateurs Hyper et Super à travers leur nombre, comme à Mod1travers Mod5. Exécutez xmodmap -pmpour voir le mappage des clés-clés aux modificateurs. Par exemple, si Super_Lest lié à Mod5, la ligne suivante (utilisez ce cas exact) définit une liaison pour Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacs traduit les séquences d'échappement en sa représentation de clé interne via input-decode-mapoulocal-function-key-map (ou function-key-mapavant Emacs 23).

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

Ce poste est composé à 80% de matériaux recyclés. Existe-t-il des terminaux Linux qui peuvent gérer toutes les combinaisons de touches?

Gilles 'SO- arrête d'être méchant'
la source
C'est une excellente réponse, englobant toutes les connaissances que j'ai trouvées un peu dispersées. Juste une question: où avez-vous trouvé / comment avez-vous choisi 32; 16 ~ et pourquoi ne correspond-il pas avec la liaison emacs ci-dessous? Je compris l'origine des chiffres , mais je voudrais vous demander si vous pouvez créer un lien vers un endroit de table de correspondance pour nombre1 et nombre2 .
Andrea Richiardi
@AndreaRichiardi J'ai choisi 32 car c'est la valeur ASCII / Unicode pour le caractère espace et 16 parce que les liaisons standard utilisent des valeurs jusqu'à 8 pour Ctrl, Meta et Shift. Le 33 ci-dessous était une faute de frappe. Vous pouvez choisir n'importe quoi tant qu'il n'entre pas en conflit avec d'autres clés.
Gilles 'SO- arrête d'être méchant'
J'ai dû lier la séquence à une fonction, donc je me suis résolu momentanément (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Mais pour être complet, j'ai essayé votre define-keyci-dessus, mais je n'ai pas pu ensuite déclencher (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). C'était juste en train d'imprimer, 16 ~ dans le tampon. Il aurait été bien de lier cette séquence à (kbd "s-SPC") pour que la séquence de touches soit liée et que je puisse la réaffecter à d'autres commandes.
Andrea Richiardi
C-h lretourne ce qui suit en appuyant sur s-SPC maintenant: ESC [ 3 2 ; 1 6 ~mais emacs se plaint toujours queM-[ 32 is undefined
Andrea Richiardi
@AndreaRichiardi Après avoir corrigé plus de fautes de frappe dans la partie xterm (que vous semblez avoir corrigé puisque Emacs reçoit la séquence de caractères voulue), cela fonctionne pour moi. Cela fonctionne-t-il si vous utilisez function-key-mapau lieu de local-function-key-map? Cela peut être une question de moment où vous définissez local-function-key-map, car cela dépend du terminal.
Gilles 'SO- arrête d'être méchant'
0

Si vous êtes prêt à installer un package Emacs et à configurer votre terminal, j'ai écrit un package Emacs qui peut enseigner à Emacs et aux terminaux comment reconnaître correctement toutes les touches du clavier du PC et les combinaisons de touches de modification:

https://github.com/CyberShadow/term-keys

L'encodage du modificateur Super n'est pas activé par défaut, mais le package est personnalisable et permet de configurer les combinaisons de touches de modification qui sont encodées. Pour activer les combinaisons de touches d'encodage qui incluent le modificateur Super, définissez term-keys/want-key-p-funcune fonction qui renvoie tquand (elt mods 3)est non nul (voir l'implémentation par défaut pour une explication).

Vladimir Panteleev
la source
0

J'ai les éléments suivants dans mes fichiers init:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

Cela me permet d'envoyer des touches super et hyper en utilisant les touches de fonction.

Realraptor
la source
-1

Réponse courte: utiliser Konsole.

Explication:

  • Emacs local-function-key-mapa un mappage d'entrée C-x @ svers event-apply-super-modifier.
  • Konsolemappe Super(la clé du logo Windows) à la séquence d'échappement ^X@s(qui ne semble documentée nulle part, je l'ai découverte par hasard). Vous pouvez essayer ceci en ouvrant Konsoleet en appuyant par exemple Ctrl-v Win-o.
Ubolonton
la source
Merci pour la réponse mais changer le terme n'est pas la solution que je recherche.
Andrea Richiardi