Как мне связать префикс tmux с Super?

20

Я нахожу даже Ctrl+bочень emacsпохожим, но я понимаю суть. Мне интересно, могу ли я связать это с одним нажатием клавиши, которую я не использую другим способом? а именно Super_L(также известный как левая клавиша Windows. Почему я говорю, что Super_L запускается xevв терминале и нажимает эту клавишу)

xenoterracide
источник

Ответы:

15

Super_Lявляется ключом X Tmux работает в терминале. Это ваш эмулятор терминала, чтобы преобразовать KeySym в последовательность символов. Таким образом, вам придется настроить как эмулятор терминала, так и tmux.

В документации по tmux префиксом может быть только известное имя ключа с необязательным модификатором. Таким образом, вы можете установить префикс tmux на комбинацию клавиш, например, которую вы не используете M-F12, и заставить свой терминал отправлять последовательность символов, M-F12когда вы нажимаете Super_L. Приложив немного больше работы, вы можете использовать клавишу, которой, вероятно, нет на клавиатуре (tmux принимает F13в F20качестве имен клавиш, но они должны быть объявлены в terminfo).

На стороне эмулятора терминала вам нужно будет Super_Lсгенерировать последовательность клавиш \e\e[24~(для M-F12) или \e[34~(для F20) (где \eнаходится escape-символ). Как это сделать, зависит от эмулятора терминала (а некоторые недостаточно настраиваются для этого). С помощью xterm это делается через ресурсы X:

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

Вы можете попасть в зацепку, которая Super_Lобычно является модификатором, и клавиши-модификаторы не всегда работают, когда не требуется модификатор. Если вы не хотите Super_Lбыть модификатором, вы можете убрать его модификатор или (менее запутанно) использовать другой ключ для симуляции физического ключа. Это можно сделать с помощью xmodmap (старомодный и простой для понимания), xkb (современный, плохо документированный, мощный и сложный способ) или, возможно, с помощью инструмента конфигурации графического интерфейса вашей рабочей среды.

Жиль "ТАК - перестань быть злым"
источник
будет ли это работать только в X тогда? например, если я залез в мою систему удаленно без переадресации X, это не сработает.
ксенотеррацид
2
@xenoterracide: либо я не понимаю ваш вопрос, либо вы не понимаете мой ответ. Super_LЭто X KeySym, так что вы, вероятно, где-то X-сервер (если вы входили из Windows, я думаю, вы бы назвали ключ левой клавишей Windows). Tmux работает в терминале и считывает свои входные данные в байтах, функциональные клавиши переводятся в escape-последовательности. Удаленный вход в систему прозрачен, ssh просто передает байты, которые составляют escape-последовательность.
Жиль "ТАК - перестань быть злым"
1
Просто попробовал это на Mac, и я мог бы сэкономить время другим. Похоже, iTerm2 не поддерживает отправку F13-F20. См. Code.google.com/p/iterm2/issues/detail?id=1630
Balu
3

Ты не можешь Привязка ключа будет вызывать cmd_bind_key_parseфункцию из cmd-bind-key.cкоторых в свою очередь , будет ( в конце концов) вызов key_string_get_modifiersиз 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     } 

tmux.cСодержит ключевой Модификатор #defineзаявления и из этого файла мы имеем:

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

На первый взгляд, это не так уж сложно изменить; возможно выходные (известные последние слова;)) проект?

gvkv
источник
3
здесь вы пропускаете шаг: tmux - это программа в текстовом режиме, она читает последовательности клавиш, а не X клавиш. Так что на самом деле это возможно, правильно настроив эмулятор терминала и tmux.
Жиль "ТАК - перестань быть злым"
2

Мне не удалось установить префикс для пользовательской клавиши-модификатора, но мне удалось определить привязки tmux в сочетании с настраиваемой клавишей-модификатором в Gnome в сочетании с Metacity. Например, чтобы отобразить Mod4+ kи Mod4+, jчтобы перейти к текущей панели вверх и вниз соответственно:

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"

Это учитывает привязки tmux в сочетании, например, с ключом Windows. Нечто подобное работает для любого оконного менеджера, который позволяет определять глобальные сочетания клавиш (Compiz, KWin и т. Д.).

Тон ван ден Хеувел
источник