Когда вы нажимаете клавишу или комбинацию клавиш в терминале, она передается приложению, работающему в терминале, как последовательность из одного или нескольких символов. Например, когда вы нажимаете 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?