Где я могу найти список кодов ключей терминала для переназначения ярлыков в bash?

42

Например:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Я знаю только биты и кусочки, например , обозначения \eescape и C-for Ctrl, но что это за цифры ( 1) и буквы ( Z)? Каковы ;, [и -знаки для?

Есть только метод проб и ошибок, или есть полный список кодов ключей bash и объяснение их синтаксиса?

ошибка
источник
2
Дополнительный совет для перечисления фактических привязок readline к оболочке bind -p.
1
Большинство таких кодов интерпретируются вашим терминалом; Прочитайте о кодах выхода ANSI в Википедии для большого списка.
Чепнер
stty -a отображает настройки линии терминала
ошибка

Ответы:

52

Это последовательности символов, отправленные вашим терминалом при нажатии данной клавиши. Ничего общего с bash или readline как таковым, но вы захотите узнать, какую последовательность символов посылает данная клавиша или комбинация клавиш, если вы хотите сконфигурировать readlineчто-то сделать при нажатии данной клавиши.

Когда вы нажимаете Aклавишу, обычно терминалы отправляют aсимвол (0x61). Если вы нажмете <Ctrl-I>или <Tab>, то обычно отправляете ^Iсимвол, также известный как TABили \t(0x9). Большинство функциональных и навигационных клавиш обычно посылают последовательность символов, которая начинается с ^[(control- [), также известного как ESCили \e(0x1b, 033 восьмеричное), но точная последовательность изменяется от терминала к терминалу.

Лучший способ узнать, что посылает клавиша или комбинация клавиш для вашего терминала, - запустить sed -n lи набрать его, а затем Enterна клавиатуре. Тогда вы увидите что-то вроде:

$ sed -n l
^[[1;5A
\033[1;5A$

Первая строка вызвана локальным терминалом, echoвыполняемым терминальным устройством (это может быть ненадежно, поскольку настройки терминального устройства могут повлиять на это).

Вторая строка выводится sed. $Не должны быть включены, это только , чтобы показать вам , где конец линии.

Выше это означает , что Ctrl-Up(который я нажал) отправить 6 символов ESC, [, 1, ;, 5и A(0x1b 0x5b 0x31 0x3B 0x35 0x41)

База terminfoданных записывает количество последовательностей для ряда общих ключей для ряда терминалов (на основе $TERMзначения).

Например:

TERM=rxvt tput kdch1 | sed -n l

Скажет вам, какая последовательность перехода отправляется rxvtпосле нажатия Deleteклавиши.

Вы можете посмотреть, какой ключ соответствует данной последовательности с вашим текущим терминалом infocmp(здесь предполагается, что ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Комбинации клавиш, например Ctrl-Up, не имеют соответствующих записей в terminfoбазе данных, поэтому, чтобы узнать, что они отправляют, либо прочитайте исходный код или документацию для соответствующего терминала, либо попробуйте это с помощью sed -n lметода, описанного выше.

Стефан Шазелас
источник
Это отличное объяснение, спасибо! Теперь все встало на свои места, \e-1\C-iзакладка в обратном направлении, так controlи iвставляет вкладку и escapeзатем -1говорит Баш , чтобы сделать это в обратном направлении один раз (я вытаращил это и нашел некоторые вещи о digit-arguments).
ошибка
$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx
3
@vib. Это строчная буква L, а не цифра 1
Стефан Шазелас
1
@ user367890, это до режима клавиатуры . Вы, вероятно, обнаружите, что после того tput smkx, как ваш терминал отправляет \e[OD( kcub1) и после tput rmkx, \e[D( cub1тот же код, что и последовательность, которая перемещает курсор влево, так что эхо этих клавиш действительно перемещает курсор. Попробуйте, stty -echoctl; tput rmkx; sleep infи вы увидите, клавиши со стрелками перемещают курсор, когда не в режиме клавиатуры ).
Стефан Шазелас
1
@ user367890, из того, что Томас (сопровождающий ncurses и xterm) говорит в ответе, на который вы ссылаетесь, да, это должно сработать. Режим клавиатуры или режим приложения относятся к одной и той же вещи, поэтому (опять-таки, по словам Томаса) спецификации клавиш в базе данных terminfo предназначены для случаев, когда включен smkx.
Стефан Шазелас
4

Он предоставляется через библиотеку gnu readline. Вы должны заглянуть в man 3 readline, чтобы узнать его описание.

Похоже, вам также нужна информация о том, что означает код escspe liks \[A. Вы можете найти эту информацию в википедии ANSI esacape code article.

порыв
источник
Это не объясняет мои примеры.
ошибка
Похоже, это было немного неправильно понято. Пожалуйста, посмотрите ответ обновления.
Раш
В статье нет информации о моих конкретных примерах. Поиск по странице "[A" также ничего не дал.
ошибка
1
@ Клоп, пожалуйста, внимательно прочитайте статью. \[Aнаходится в таблице «CSI коды» в строке: «CSI n A»
пик
Благодаря спешить, но где я могу найти объяснения на [Z, [1;5Cили -1?
ошибка
3

Эти коды поступают из одного источника? Последний выглядит как привязка readline GNU. Это то, что пользователь отправляет на bash (см. Ответ Rush). Первые два, однако, больше похожи на последовательности управления терминалами (хотя первая будет неправильной). Это то, что bash или другая программа отправляет обратно в эмулятор терминала, чтобы контролировать перемещения курсора, цвета текста и тому подобное.

Uwe
источник
Я обнаружил, что "\ e [1; 5C" будет использоваться для перемещения слова вперед по стрелке ctrl, а "\ e [Z" и "\ e-1 \ Ci" для полного меню назад в других руководствах. Все они были использованы внутри файла .inputrc.
ошибка
Хорошо, если они интерпретируются readline, тогда должен быть некоторый эмулятор терминала, где эти последовательности управления связаны с некоторой комбинацией ctrl, alt и / или shift с помощью функциональных клавиш или клавиш со стрелками. (Я не знаю, какой из них.)
Уве
0

Я нашел самый простой способ проверить, какая управляющая последовательность генерируется клавишей или комбинацией клавиш, - нажать Ctrl+ vв терминале, а затем нажать клавишу / комбинацию, о которой вы хотите знать.

Вы получите подобную последовательность, ^[Oaи вам придется переводить ^[в \eили \033или \x1bили любое другое представление, которое ваша система привязки клавиш ожидает для escape-символа.

Он начинался как именованная функция Emacs quoted-insertи, поскольку привязки клавиш по умолчанию для Bash и Zsh имитируют Emacs, они также копировали его.

Bash получает его через библиотеку ввода GNU Readline, которую import rlcompleterтакже используют другие вещи, такие как улучшения Python .

Вот описание из руководства Readline :

quoted-insert( C-qили C-v)

Добавьте следующий символ, введенный в строку, дословно. Это как вставить последовательности клавиш C-q, например.

Это должно работать во всем, основанном на GNU Readline.

Что касается Zsh, который использует свою собственную альтернативу с именем ZLE, то C-q, как ни странно, он учитывает исходную привязку Emacs только в режиме Vi, но C-vвсе еще работает в режиме ввода по умолчанию, подобном Emacs. (Искать quoted-insertв zshzleили zshall` страниц Справочника и thesecond пары результатов следует перечислить keybinds по умолчанию.)

Для мнемоники я советую думать о Ctrl+ vкак об этом.

ssokolow
источник