tmux: пытается связать ключ utf8
Я использую tmux 1.6 с konsole на Fedora 17 i686.
У меня есть клавиатура azerty (с акцентированными символами), и я хочу, чтобы ton bind нажимал клавишу "ù".
Я сделал следующее ~/.tmux.conf:
setw -g utf8 on
bind-key ù split-window -h
Но когда я запускаю tmux, у меня появляется следующая ошибка:
/home/glines/.tmux.conf: 2: unknown key: ù
Есть ли способ связать этот ключ?
За вашу помощь, спасибо заранее.
2 ответа
К сожалению, tmux поддерживает только одиночные 8-битные значения в привязках клавиш.
Если вы использовали 8-битное кодирование (фиксированной длины) (например, ISO 8859-1, ISO 8859-15 и т. Д.), То связывание должно работать. Однако если вы используете UTF-8, ваш ù (U+00F9) кодируется как два байта (C3 B9), и tmux отклоняет его как неизвестное имя ключа (если ключ длиннее одного байта (после удаления его) префиксы модификаторов), он обрабатывается как имя специального ключа, например F1
, PageUp
, KP0
, так далее.).
Хотя, если вы в отчаянии, есть грубый взлом, который вы можете попробовать:
tmux bind-key -r $(printf '\303') display 'c3 prefix binding hack' \; \
bind-key -r $(printf '\271') split-window -h
Это нарушает функциональность "повторного" связывания, используя его, чтобы оставаться в "режиме префикса", игнорируя при этом первый байт кодировки UTF-8 ù (шестнадцатеричный C3 B9, восьмеричный 303 271).
Первый байт ù (восьмеричный 303) связан с фиктивной командой, а второй байт (восьмеричный 271) связан с целевой командой. Для этого необходимо, чтобы вы не установили tmux repeat-time
параметр в ноль (чтобы отключить повторение), и имеет побочный эффект, оставляя tmux в режиме повтора для repeat-time
миллисекунды (по умолчанию 500 мс) после ввода префиксаPre (этот побочный эффект обычно будет заметен только в том случае, если вы сразу же набираете клавишу со стрелкой (с или без элемента управления или мета) после префиксаù- эти клавиши являются единственными привязками по умолчанию, которые являются " повторяемые").
В приведенном выше примере используется printf
Команда оболочки для генерации необходимых байтов, но это не будет работать в вашем .tmux.conf
, Если бы вы работали с tmux 1.7, вы могли бы написать это так (в вашем .tmux.conf
):
bind-key -r 0xC3 display 'c3 prefix binding hack'
bind-key -r 0xB9 split-window -h
Однако этот синтаксис шестнадцатеричного ключа не работает в tmux 1.6. Итак, вам нужно либо расположить необработанные байты непосредственно в файле (ваш текстовый редактор может с этим бороться, и легко ошибиться), либо использовать оболочку, чтобы помочь вам:
run-shell "tmux bind-key -r $(printf '\\303') display 'c3 prefix binding hack' \\; bind-key -r $(printf '\\271') split-window -h"
Замечания: run-shell
выполняет свою команду асинхронно, поэтому привязки могут быть недоступны сразу после запуска вашего первого сеанса.
Начиная с tmux 2.3 динамическое связывание, как объяснил Крис Джонсен, больше не является обязательным и даже не работает. Чтобы связать любой символ UTF-8, просто используйте его значение Unicode в 0x
нотации.
пример
Допустим, вы хотите привязать префиксě (маленький E с Caron) к окну 2.
Для начала нужно узнать значение Unicode ě
(обратите внимание, что это не зависит от кодовой последовательности UTF-8).
Вы можете использовать, например, python3
чтобы преобразовать символ UTF-8 в значение Юникода:
$ python3
>>> hex(ord('ě'))
'0x11b'
Теперь, когда вы знаете значение Unicode ě
является 0x011B
просто добавьте эту строку в ваш конфигурационный файл tmux:
bind-key 0x011B select-window -t 2