Когда вы нажимаете клавишу или комбинацию клавиш в терминале, она передается приложению, работающему в терминале, как последовательность из одного или нескольких символов. Например, когда вы нажимаете a, приложение получает a
. При нажатии Enterприложение получает символ CR
(он же ^M
(произносится как «control-emm»), он же символ номер 13, он же \r
или \015
). Включающие комбинации клавиш Altобычно передаются в виде символа ESC
( ^[
aka \e
или aka \033
), за которым следует последовательность для клавиши или комбинации клавиш без Alt. Функциональные клавиши и другие комбинации клавиш передаются как escape-последовательности, начинающиеся с \e[
или \eO
.
Последовательности escape-полей не полностью стандартизированы, и терминалы обычно игнорируют определенные атрибуты для определенных ключей. Например, Ctrl+ Shift+ letterчасто передается в точности как Ctrl+ letterпо умолчанию.
Вы можете увидеть, что ваш терминал отправляет для комбинации клавиш, нажав Ctrl+, Vзатем эту комбинацию клавиш в приглашении оболочки или C-q
или C-h c
после комбинации клавиш в Emacs.
С некоторыми эмуляторами терминала вы можете настроить escape-последовательности для каждого ключа. На Xterm это делается через X ресурсы . Большинство настроек считывают ресурсы с ~/.Xresources
момента запуска X, и вы можете загрузить файл вручную с помощью 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~")
Общее соглашение использует escape-последовательности вида ESC [ number1 ; number2 ~
для функциональных клавиш с модификаторами. number1
указывает на функциональную клавишу ( 15
в 24
течение F5до F12- по историческим причинам, F1 через F4разные управляющие последовательности) и number2
указывает модификатор ( 2
для Shift, 5
для Ctrl, 3
для Meta, 8
для Ctrl+ Metaи добавить 1 для + Shift- нет, это не очень последовательно).
Emacs переводит escape-последовательности во внутреннее представление ключа через input-decode-map
илиlocal-function-key-map
(или function-key-map
до Emacs 23).
(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])
infocmp $TERM
?ESC
(если вы не хотите попробовать какой-либо символ ≥128, но это ограничит возможные входные кодировки), а второй символ должен быть чем-то, для чего вы не хотитеESC foo
привязывать.local-set-key
быть на самом делеdefine-key
? Первый дает ошибку (неверное количество аргументов), а второй работает, по крайней мере, для <kbd> C-Enter </ kbd>. Кажется, у konsole все еще есть проблемы с отправкой <kbd> CM -% </ kbd>.define-key
. Я не знаю, можно ли настроить управляющие клавиши Konsole, возможно, xterm более настраиваемый, чем любая другая альтернатива.XTerm*modifyOtherKeys: 2
ресурсом он будет генерировать уникальные последовательности даже дляC-M-
комбинаций, но с этим параметром вам нужно будет предоставить множество пользовательских отображений (XTerm*modifyOtherKeys: 1
менее функционально, но гораздо более функционально из коробки). Для примера (хотя тот, который не работал для меня) см.xterm-extras.el
Библиотеку и связанные с ней.Xresources
и.inputrc
файлы в загрузке easymacs .Для ограниченного, но значительного набора ключей, при условии, что KDE поддерживает KDE, можно выполнить следующие сложные рабочие сочетания клавиш в emacs -nw:
Я буду использовать мою реализацию получения
S-<RET>
работы в качестве примера:Return+Shift
и дайте ей полезную последовательность клавиш (я выбрал\E[27;3
ту, которая, я думаю, является последовательностью клавиш, отправленной X, когда я копался в xev, но это может быть неправильно - важно сделать уверен, что он имеет правильный выход и не конфликтует ни с чем другим).Запустите
emacs -nw
и в чистом буфере оцените:(read-key-sequence-vector "Type your new key:")
затем введите новую комбинацию клавиш.
Он должен выплевывать последовательность клавиш, которую вы можете связать.
(Он вернулся
[27 91 50 55 59 51]
ко мне в отличие от скучного старого,[13]
прежде чем я перепутал связывание ключей konsole.)Добавьте к вашей конфигурации emacs:
Я проверил это с
emacs -nw
помощью сеанса экрана, используя:источник
Короткий ответ - это фундаментальное ограничение всех терминалов.
Немного более длинный ответ таков: даже если кто-то создал терминал, который делает то, что вы хотите, сам Emacs потребует серьезных изменений для работы с этим гипотетическим терминалом.
источник
Прилагаются некоторые усилия по расширению протокола VT таким образом, чтобы обеспечить ввод с клавиатуры без потерь (среди других функций, таких как графика).
Одним из примеров является notty: https://github.com/withoutboats/notty
источник