Comment lier le préfixe tmux à un Super?

20

Je trouve même Ctrl+btrès emacssemblable mais je comprends le point. Je me demande si je pourrais le lier à une seule touche d'une touche que je n'utilise pas autrement? à savoir Super_L(également connu sous le nom de la touche gauche de la fenêtre. pourquoi je dis Super_L démarrer xevdans un terminal et appuyer sur cette touche)

xénoterracide
la source

Réponses:

15

Super_Lest un X keysym. Tmux s'exécute dans un terminal. C'est à votre émulateur de terminal de transformer une clé de clavier en une séquence de caractères. Vous devrez donc configurer à la fois votre émulateur de terminal et tmux.

En regardant la documentation tmux, le préfixe ne peut être qu'un nom de clé connu avec un modificateur facultatif. Ainsi, vous pouvez définir le préfixe tmux sur une combinaison de touches que vous n'utilisez pas, par exemple M-F12, et demander à votre terminal d'envoyer la séquence de caractères M-F12lorsque vous appuyez sur Super_L. Avec un peu plus de travail, vous pourriez utiliser une clé que votre clavier ne possède probablement pas (tmux accepte F13via F20comme noms de clés, mais ils doivent être déclarés dans terminfo).

Du côté de l'émulateur de terminal, vous devez organiser la Super_Lgénération de la séquence de touches \e\e[24~(pour M-F12) ou \e[34~(pour F20) (où \eest le caractère d'échappement). La procédure à suivre dépend de l'émulateur de terminal (et certains ne sont pas suffisamment configurables pour le faire). Avec xterm, cela se fait via les ressources X:

! Make Super_L act as Meta+F12
XTerm.VT100.translations:       #override \
    <Key>Super_L:  string("\033\033[24~")

Vous pouvez frapper un accroc qui Super_Lest normalement un modificateur, et les touches de modification ne fonctionnent pas toujours lorsqu'un non-modificateur est requis. Si vous ne voulez Super_Lpas être un modificateur, vous pouvez retirer son modificateur ou (moins confus) utiliser une clé différente pour la clé physique. Cela peut être fait via xmodmap (à l'ancienne et simple à comprendre), via xkb (la manière moderne, peu documentée, puissante et complexe), ou peut-être via l'outil de configuration GUI de votre environnement de bureau.

Gilles 'SO- arrête d'être méchant'
la source
cela ne fonctionnerait-il que dans X alors? Par exemple, si je bombardais mon système à distance sans transfert X, cela ne fonctionnerait pas.
xenoterracide du
2
@xenoterracide: soit je ne comprends pas votre question, soit vous ne comprenez pas ma réponse. Super_Lest un symbole de clé X, donc vous avez probablement un serveur X quelque part (si vous vous connectiez depuis Windows, je suppose que vous appelleriez la clé la touche Windows gauche). Tmux s'exécute dans un terminal et lit son entrée sous forme d'octets, avec des touches de fonction traduites en séquences d'échappement. Une connexion à distance est transparente, ssh transmet simplement les octets qui composent la séquence d'échappement.
Gilles 'SO- arrête d'être méchant'
1
Je viens de l'essayer sur un Mac et je gagnerais peut-être du temps aux autres. Il semble que iTerm2 ne prend pas en charge l'envoi de F13-F20. Voir code.google.com/p/iterm2/issues/detail?id=1630
balu
3

Tu ne peux pas. La liaison d'une touche appellera la cmd_bind_key_parsefonction à partir de cmd-bind-key.claquelle, à son tour, appellera key_string_get_modifiersde key-string.c:

/* Find modifiers. */
105     int
106     key_string_get_modifiers(const char **string)
107     {
108         int modifiers;
109         
110         modifiers = 0;
111         while (((*string)[0] != '\0') && (*string)[1] == '-') {
112             switch ((*string)[0]) {
113                 case 'C':
114                 case 'c':
115                 modifiers |= KEYC_CTRL;
116                 break;
117                 case 'M':
118                 case 'm':
119                 modifiers |= KEYC_ESCAPE;
120                 break;
121                 case 'S':
122                 case 's':
123                 modifiers |= KEYC_SHIFT;
124                 break;
125             }
126             *string += 2;
127         }
128         return (modifiers);
129     } 

Le tmux.ccontient les #definedéclarations des touches de modification et à partir de ce fichier, nous avons:

106     /* Key modifier bits. */
107     #define KEYC_ESCAPE 0x2000
108     #define KEYC_CTRL 0x4000
109     #define KEYC_SHIFT 0x8000
110     #define KEYC_PREFIX 0x10000 

En surface, il ne semble pas trop difficile à modifier; peut-être un week-end (fameux derniers mots;)) projet?

gvkv
la source
3
il vous manque une étape ici: tmux est un programme en mode texte, il lit les séquences de touches, pas les X keysymes. Il est donc possible, en configurant correctement l'émulateur de terminal et tmux.
Gilles 'SO- arrête d'être méchant'
2

Je n'ai pas pu définir de préfixe sur une touche de modification personnalisée, mais j'ai réussi à définir des liaisons tmux en combinaison avec une touche de modification personnalisée sous Gnome en combinaison avec Metacity. Par exemple, pour mapper Mod4+k et Mod4+ jpour passer respectivement au panneau actuel de haut en bas:

gconftool-2 --set /apps/metacity/keybinding_commands/command_1 --type string "tmux select-pane -D"
gconftool-2 --set /apps/metacity/keybinding_commands/command_2 --type string "tmux select-pane -U"
gconftool-2 --set /apps/metacity/global_keybindings/run_command_1 --type string "<Mod4>j"
gconftool-2 --set /apps/metacity/global_keybindings/run_command_2 --type string "<Mod4>k"

Cela permet des liaisons tmux en combinaison avec par exemple la touche Windows. Quelque chose dans ce sens fonctionne pour tout gestionnaire de fenêtres qui permet de définir des raccourcis clavier globaux (Compiz, KWin, etc.).

Ton van den Heuvel
la source