Existe-t-il des terminaux Linux qui peuvent gérer toutes les combinaisons de touches?


11

J'aime utiliser emacs en mode terminal ( -nw), mais il semble que la plupart (tous?) Les terminaux ne peuvent pas gérer certaines combinaisons de touches - par exemple, C-<RET>ou C-M-%. Je sais que c'est parce que la plupart des terminaux émulent un VT-100, qui n'avait pas ces combinaisons. Existe-t-il des terminaux Linux (de préférence KDE) qui peuvent gérer ces combinaisons de touches, ou s'agit-il d'une limitation fondamentale de tous les terminaux?

Réponses:


15

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, Ctrl+ Shift+ letterest souvent transmis exactement comme Ctrl+ letterpar défaut.

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.

Avec certains émulateurs de terminal, vous pouvez configurer les séquences d'échappement pour chaque clé. Sur xterm, cela se fait par le biais des 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.

Term.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 ( 15pour 24pour F5à F12- pour des raisons historiques, F1 à F4ont des séquences d'échappement différentes) et number2indique le modificateur ( 2pour Shift, 3pour Meta, 5pour Ctrl, 7pour Ctrl+ Metaet ajoutez 1 pour Shiftavec au moins un Ctrlou Meta).

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[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

Donc, si je comprends bien, je dois d'abord définir une séquence d'échappement dans mon terminal qui correspond à une combinaison de touches. Ensuite, dans emacs, j'ai besoin de mapper la séquence d'échappement vers la combinaison de touches. La séquence d'échappement peut-elle être arbitraire, tant qu'elle n'entre pas en conflit avec celles définies dans infocmp $TERM?
Yossarian

2
@Yossarian Oui. En plus de ne pas entrer en conflit, les séquences d'échappement doivent être sans ambiguïté, c'est-à-dire qu'aucune séquence d'échappement ne doit être le préfixe d'une autre. Cela signifie en pratique que le premier caractère doit être ESC(sauf si vous voulez essayer un caractère ≥128, mais cela restreindra les encodages d'entrée possibles) et le deuxième caractère doit être quelque chose pour lequel vous ne voulez aucune ESC fooliaison.
Gilles 'SO- arrête d'être méchant'

Je viens d'essayer ce que vous avez suggéré. Devrait l' local-set-keyêtre define-key? Le premier donne une erreur (nombre d'arguments incorrect), tandis que le second fonctionne, au moins pour <kbd> C-Enter </kbd>. Il semble que konsole ait encore du mal à envoyer <kbd> CM-% </kbd>.
Yossarian

@Yossarian En effet, ça devrait l'être define-key. Je ne sais pas si les touches d'échappement de Konsole peuvent être configurées, xterm est probablement plus personnalisable que n'importe quelle alternative.
Gilles 'SO- arrête d'être méchant'

1
Notez que le xterm de Thomas Dickey est en développement actif. Avec la XTerm*modifyOtherKeys: 2ressource, il générera des séquences uniques, même pour les C-M-combinaisons, mais avec ce paramètre, vous devrez fournir beaucoup de mappages personnalisés ( XTerm*modifyOtherKeys: 1est moins capable mais beaucoup plus fonctionnel hors de la boîte). Pour un exemple (bien que celui qui ne fonctionnait pas pour moi) voir la xterm-extras.elbibliothèque et les fichiers associés .Xresourceset .inputrcdans le téléchargement easymacs .
phils

1

Pour un ensemble de clés limité mais significatif, en supposant la konsole de KDE, on peut faire ce qui suit pour avoir des raccourcis clavier fonctionnels et complexes dans emacs -nw:

Je vais utiliser mon implémentation de se rendre S-<RET>au travail comme exemple:

  1. Ouvrez une nouvelle console, accédez aux paramètres -> profil actuel -> clavier -> modifier
  2. Appuyez sur Ajouter et créez une nouvelle entrée pour Return+Shiftlui donner une séquence de touches utile (j'ai choisi \E[27;3la séquence de touches que je pense être envoyée par X lorsque je fouillais avec xev, mais cela peut être faux - la chose importante à faire est de faire assurez-vous qu'il a une fuite appropriée et n'entre en conflit avec rien d'autre).
  3. Jouez avec dans la petite zone de test en bas pour vous assurer qu'il fonctionne.
  4. Redémarrez konsole.
  5. Démarrez emacs -nwet évaluez dans le tampon de travail:

    (read-key-sequence-vector "Type your new key:")

    puis saisissez votre nouvelle combinaison de touches.

    • Si vous n'êtes pas familier avec cela, écrivez la ligne, laissez le curseur à la fin de la ligne et appuyez sur Cx Ce pour que emacs exécute cette ligne, il devrait vous dire tout ce que vous avez mis entre guillemets et attendre que vous tapez quelque chose.
  6. Il doit cracher une séquence de touches que vous pouvez lier.
    (Il [27 91 50 55 59 51]m'est revenu par opposition à l'ancien ennuyeux [13]avant que je ne joue avec le raccourci clavier Konsole.)

  7. Ajoutez à votre configuration emacs:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Je l'ai testé emacs -nwdans une session d'écran en utilisant:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    

0

La réponse courte est qu'il s'agit d'une limitation fondamentale de tous les terminaux.

La réponse un peu plus longue est que même si quelqu'un a créé un terminal qui fait ce que vous voulez, Emacs lui-même nécessiterait des changements majeurs pour fonctionner avec ce terminal hypothétique.


C'est un bon point sur emacs, qui ne m'est même pas venu à l'esprit. Je suppose que je vais commencer à utiliser l'interface graphique à la place.
Yossarian

C'est ce que je fais.
hruvulum

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.