2016-08-03 3 views
1

J'ai mis les raccourcis clavier suivants dans mon fichier .emacs:emacs raccourci clavier ne fonctionne pas dans le terminal

(global-set-key (kbd "C-S-M-w") 'windmove-up) 
(global-set-key (kbd "C-S-M-s") 'windmove-down) 
(global-set-key (kbd "C-S-M-d") 'windmove-right) 
(global-set-key (kbd "C-S-M-a") 'windmove-left) 

(global-set-key (kbd "C-S-a") 'shrink-window-horizontally) 
(global-set-key (kbd "C-S-d") 'enlarge-window-horizontally) 
(global-set-key (kbd "C-S-s") 'shrink-window) 
(global-set-key (kbd "C-S-w") 'enlarge-window) 

Ils fonctionnent très bien quand ils sont dans leur propre fenêtre. Cependant, si je le lance dans le terminal (emacs -nw) les raccourcis clavier ne sont pas chargés. Même après avoir chargé le fichier .emacs, je n'ai toujours pas les raccourcis clavier. C'est la même histoire quand j'utilise un démon emacs et que je l'ouvre dans le terminal client vs terminal. Je suis sur une machine Linux si ça compte.

Répondre

3

Le problème n'est pas avec emacs, le problème est que les combinaisons de touches de modification (Control, Shift et Alt) se comportent très mal dans la plupart des programmes terminaux. Des questions similaires continuent de surgir ici et dans de nombreux autres endroits, y compris le super-utilisateur, par exemple: emacs - [control shift up] doesn't work, et https://superuser.com/q/230852. Vous devez le tester dans votre terminal spécifique - mais le contrôle terminal de Gnome par exemple montre que C-S- ne se distingue d'un peu C-, donc la plupart de vos fixations même pas faites à emacs correctement

Si vous avez besoin de vous convaincre utiliser C-h k puis les combinaisons qui vous manquent. Vous verrez que lorsque vous exécutez un terminal, ces combinaisons sont dépouillées de certains modificateurs.

J'ai vécu une expérience similaire et suis arrivé à la conclusion que la lutte contre les terminaux ne vaut pas la peine. Je vous suggère de remapper les combinaisons de touches qui nécessitent plus d'un modificateur à quelque chose d'autre, lorsque vous êtes dans un terminal. (J'ai fini par remapper les commandes windmove aux touches F, par exemple.) Sinon, je peux recommander soit en utilisant evil leader clé (si vous utilisez mal), ou God mode sinon. Cela réduit considérablement le besoin de plusieurs modificateurs.

0

La première étape consiste à faire en sorte que votre terminal envoie des codes d'échappement auxquels vous pouvez attribuer ultérieurement une signification dans emacs. Modifiez votre fichier .Xdefaults pour en ajouter autant que vous le souhaitez. Voici un exemple en utilisant xterm (fautes de frappe possible, comme je ne peux pas couper-coller de mon PC de travail):

*VT100*translations: #override \n\ 
    ~Ctrl ~Shift <KeyPress> BackSpace: string(0x7F)\n\ 
    Ctrl ~Shift <KeyPress> BackSpace: string("\033[27;5;8~")\n\ 
    Ctrl Shift <KeyPress> BackSpace: string("\033[27;6;8~")\n 

    Ctrl Shift ~Meta <KeyPress> A: string("\033[27;6;65~")\n\ 
    ... 
    Ctrl Shift ~Meta <KeyPress> Z: string("\033[27;6;90~")\n\ 

    Ctrl Shift Meta <KeyPress> A: string("\033[27;8;65~")\n\ 
    ... 
    Ctrl Shift Meta <KeyPress> Z: string("\033[27;8;90~")\n\ 

XTerm*vt100.modifyOtherKeys: 1 
XTerm*vt100.formatOtherKeys: 0 

Les séquences de touches peuvent être quelque chose (et je l'ai vu beaucoup de séquences clés en situation irrégulière), mais la chose la plus proche d'un "standard" peut être trouvée ici: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html.

La deuxième étape est d'obtenir emacs pour attribuer ces nouvelles séquences d'échappement à des séquences clés qu'il comprend:

; xterm-specific options 
(unless window-system 
    (define-key key-translation-map "\C-[[27;6;65~" (kbd "C-S-a")) 
    ... 
    (define-key key-translation-map "\C-[[27;6;90~" (kbd "C-S-z")) 

    (define-key key-translation-map "\C-[[27;8;65~" (kbd "C-M-S-a")) 
    ... 
    (define-key key-translation-map "\C-[[27;8;90~" (kbd "C-M-S-z")) 

    ; other xterm-specific options here 
) 

Dans le ..., incrémenter le dernier numéro avant la ~ par un, donc A = 65, B = 66, ..., Z = 90.

+0

Quelque chose comme ça. Mais cela ne fonctionne que pour xterm, et OP pense probablement que "terminal" est un programme différent. –

+0

@ThomasDickey Comme vous l'avez mentionné dans votre réponse, de nombreux émulateurs de terminal copient le comportement de xterm, dans une certaine mesure, bien qu'ils capturent souvent des combinaisons de touches à leurs propres fins. Il est probable que le PO ne réalise pas les limites du terminal et pourrait vouloir essayer d'autres terminaux (comme xterm) pour voir s'ils sont mieux adaptés. – Teajay

+0

C'est pourquoi j'ai répondu (mieux que de faire des commentaires). –

1

xterm peut être fait pour ce faire; d'autres terminaux ne peuvent pas.

Si vous changez l'objectif d'utiliser touches de fonction, vous pouvez aller plus loin, parce que sans modifier la configuration, xterm envoie des séquences d'échappement distinctes pour les différentes combinaisons des modificateurs changement, contrôle, alt et meta lorsqu'il est appliqué aux touches de fonction et de curseur.

Le suspect probable pour "Terminal" serait l'un des émulateurs de terminal VTE tels que terminal gnome.Cela copie un morceau de taille juste de cette partie du comportement de xterm, donc vous pouvez expérimenter avec votre configuration pour touches de fonction, décider ce qui a du sens et utiliser ces paramètres.

Le comportement de VTE est non documenté. Mais vous pouvez lire l'original dans XTerm Control Sequences.