Де я можу знайти список кодів терміналів для перенастроювання ярликів у bash?


42

Наприклад:

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

Я знаю лише шматочки та шматочки, як \eпідставки для втечі та C-для Ctrl, але які ці цифри ( 1) та літери ( Z)? Які ;, [і -знаки?

Чи є лише пробні та помилкові чи повний перелік баш-кодів та пояснення їх синтаксису?


2
Додатковим підказом для переліку фактичних прив'язків оболонки для читання є оболонка 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каже, bash, щоб зробити це назад один раз (я погуглив це і знайшов деякі речі про digit-arguments).
помилка

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib. Це
малий

1
@ user367890, це переходить до режиму клавіатури . Ви, ймовірно, виявите, що після цього tput smkxваш термінал надсилає \e[OD( kcub1) і після tput rmkx, \e[D() cub1той самий код, що і послідовність, яка переміщує курсор ліворуч, так що відлуння цих клавіш переміщуватиме курсор. Спробуйте, stty -echoctl; tput rmkx; sleep infі ви побачите клавіші зі стрілками переміщують курсор, якщо він не знаходиться в режимі клавіатури ).
Стефан Шазелас

1
@ user367890, з того, що каже Thomas (підтримувач ncurses та xterm) у відповіді, на яку ви посилаєтесь, так, це має працювати. режим клавіатури або режим додатків посилаються на одне і те ж, тому (знову ж таки, за словами Томаса) ключові специфікації в базі даних terminfo призначені, коли smkx увімкнено.
Стефан Шазелас

4

Він надається за допомогою бібліотеки читання gnu. Ви повинні заглянути у програму man 3 для перегляду її опису.

Схоже, вам також потрібна інформація про те, що означає "escspe" \[A. Ви можете знайти цю інформацію у статті wikipedia ANSI esacape code .


Це не пояснює мої приклади.
помилка

Схоже, це було мало зрозуміло. Перегляньте оновлення відповіді.
пік

Інформації про мої конкретні приклади в статті немає. Пошук на сторінці "[A" також нічого не повернув.
помилка

1
@bug уважно прочитайте статтю. \[Aзнаходиться в таблиці "Коди CSI" у рядку: "CSI n A"
пік

Завдяки поспішати, але де я можу знайти пояснення на [Z, [1;5Cабо -1?
помилка

3

Ці коди походять з одного джерела? Останній виглядає як прив'язка для читання GNU. Це те, що користувач надсилає на баш (див. Відповідь пік). Перші два, однак, більше схожі на термінальні керуючі послідовності (хоча перша з них буде неправильно сформованою). Ось що bash чи інша програма повертають назад до емулятора терміналу, щоб контролювати переміщення курсору, кольори тексту тощо.


Я виявив, що "\ e [1; 5C" використовується для руху слів ctrl-стрілка вперед, а "\ e [Z" і "\ e-1 \ Ci" для меню-завершення назад в інших навчальних посібниках. Всі вони використовувались у файлі .inputrc.
помилка

Гаразд, якщо вони інтерпретуються лінією читання, то повинен бути якийсь термінальний емулятор, де ці послідовності управління пов'язані з деякою комбінацією ctrl, alt та / або зсувом за допомогою функцій або клавіш зі стрілками. (Я не знаю, хто з них.)
Uwe

0

Найпростіший спосіб я перевірити, яка послідовність евакуації генерується клавішею або комбінацією клавіш - натиснути Ctrl+ vу терміналі, а потім натиснути клавішу / комбо, про яку ви хочете знати.

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

Він почався як 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`, і ці другі пара результатів повинні перераховувати типові посилання за замовчуванням.)

Для мнемоніки я раджу думати Ctrl+ vяк просити це v erbatim.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.