Відповіді:
Залежно від того, як налаштований термінал, введення тексту Alt+Keyсхоже на введення послідовних клавіш Escі Key, тому він надсилає символ ESC (ака \e
або ^[
або \033
), а потім символ або послідовність символів, що надсилаються після натискання на це Key.
Після натискання Upбільшість термінальних емуляторів надсилають або три символи, \033[A
або \033OA
залежно від того, перебувають вони в режимі клавіатури програми чи ні.
Перший відповідає послідовності евакуації, яка при виході в термінал переміщує курсор вгору. Якщо ти зробиш:
printf '\nfoo\033[Abar\n\n'
Ви побачите bar
написане після foo
одного ряду вгору. Якщо ти зробиш:
stty -echoctl; tput rmkx; read foo
Ви побачите, що клавіші зі стрілками переміщують курсор навколо.
Коли програма любить zsh
або vi
читає цю послідовність символів з терміналу, вона інтерпретує її як дію "Вгору", оскільки з бази даних терміно ( kcuu1
здатності) вона знає, що це послідовність виходу, що надсилається при натисканні Up.
Тепер, для Alt-Up, деякі термінали , як rxvt
і її похідні , такі як eterm
посил , \033
за яким слід послідовність для Up(тобто \033\033[A
або \033\033OA
), в той час як деякі інші , подібні xterm
або gnome-terminal
мають окремі послідовностей для цих типів ключів при використанні комбінованих ключів , таких як Alt, Shift, Ctrl.
Ті, як правило , відправити \033[1;3A
на Alt-Up.
Після надсилання в термінал ця послідовність також перемістить курсор вгору (другий параметр (3) ігнорується). Немає відповідної клавішної клавіатури , тому це та сама послідовність, яку надсилається Alt-Upв режимі клавіатури програми чи поза ним .
Тепер, чи це, \033\033[A
чи \033[1;3A
багато додатків не знають, для чого ці послідовності. База даних terminfo їм не допоможе, оскільки немає такої можливості, яка б визначала, які символи надсилають ці комбінації клавіш.
Вони постараються інтерпретувати цю послідовність. bash
наприклад, інтерпретуватиме \033[1;3
як послідовність втечі, нічого про це не знає, тому нічого не робить A
. zsh
, перестане читати, як тільки дізнається, що немає відомої послідовності відповідних символів. Немає послідовності евакуації, яку вона знає, що починається з, \033[1
тому вона пропустить це і прочитає решту: ;3A
і вставимо її в редактор рядків.
Багато додатків , такі як vi
, zsh
або на readline
основі з них , як gdb
і bash
(хоча остерігайтеся bash
використовує модифіковану версію readline
) дозволяють додавати прив'язки для будь-якій послідовності символів.
Наприклад, у zsh
, можливо, ви захочете зв’язати Alt-Up, Alt-Downяк-от:
bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward
Вони призначені для пошуку історії назад та вперед для командних рядків, які починаються подібно до поточного до поточного положення курсору, що досить зручно для згадування попередніх команд.
Ви можете використовувати Crtl+ vдля повернення вхідних кодів вашої клавіатури. Якщо ви зробите це для клавіш зі стрілками, ви отримаєте [[D^
, [[C^
, [[A^
і [[B
значення. Не існує жодних прив'язок за замовчуванням для Altклавіш зі стрілками, тому, схоже, що виконувана дія - це друк лише буквеного коду. Hovewer, якщо ви створюєте локальну версію файлу конфігурації бібліотеки читання:
$ cp /etc/inputrc ~/.inputrc
І додайте рядок:
"\e[1;3C": "sometexthere"
Де [1;3C
вводиться код Alt+ →(ви можете отримати його так само, як раніше, ніж використовувати Crtl+ vярлик) і перезапустіть свій термінал, тоді Crtl+ →ярлик поверне вам текст "деякийтекст", а інші Alt+ ярлики стрілок перестануть повертати символи.
Замість тексту ви можете передати bindable команду з http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands, як
"\e[1;3C": unix-line-discard
мати такий же ефект, як Crtl+ u(видалити рядок).
Більше інформації тут: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html
AltКлюч часто використовується в якості мета - модифікатора. Курсорні та функціональні клавіші називаються спеціальними клавішами, оскільки вони можуть надсилати кілька символів - і надіслані символи можуть бути змінені.
Деякі користувачі, наприклад, bash
очікують, що натискання Altнадішле клавішу з префіксом символу втечі. Документована "мета" функція (див. terminfo(5)
) Стосується восьмого біта:
Якщо в терміналі є "мета-клавіша", яка виконує функцію клавіші зсуву, встановлюючи 8-й біт будь-якого переданого символу, цей факт можна вказати за допомогою
km
. В іншому випадку програмне забезпечення передбачає, що 8-й біт є паритетом, і він зазвичай буде очищений. Якщо рядки існують, щоб увімкнути та вимкнути цей "мета режим" , їх можна надати якsmm
іrmm
.
bash
про це теж знає (див. Ncurses FAQ ), але мало хто з його користувачів цікавиться функцією. Тим не менш, вони звикли називати Alt"мета", навіть якщо мета-режим вимкнено. І rxvt, і xterm мали цю особливість з (принаймні) початку 1990-х.
Інші користувачі (з моменту xterm
введення функції у патчі № 94, 1999 ) можуть очікувати, що інформація модифікатора буде закодована як параметр у послідовності символів, яку надсилатиме спеціальний ключ. Документація XTerm називає ці модифіковані клавіші функціональними клавішами "стиль ПК", щоб відрізнити їх від "VT220-стилю" (у яких не було модифікаторів). Немодифікований ключ курсору може надіслати ESC[A, але також законним є параметр , наприклад ESC[5A, який програма повинна розуміти як повторення цього п'яти разів. Перша версія xterm
«S PC-стиль ключів використовується , що" 5 "для позначенняcontrol, а пізніша версія змінила його, щоб уникнути плутанини з повторним підрахунком. Так...
ESC[5A
пропонує програмі перемістити курсор вгору на 5 рядків, поки
ESC[1;5A
пропонує перейти вгору на один рядок, повідомляючи програмі, що controlнатиснута клавіша.
Корисні комбінації містяться в базі даних ncurses terminfo з 2004 року :
# 2004-07-17
# * add xterm-pc-fkeys -TD
База даних terminfo показує поточну версію xterm + pcfkeys з коментарем, що показує, як модифікуються модифікатори:
# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
# Code Modifiers
# ---------------------------------
# 2 Shift
# 3 Alt
# 4 Shift + Alt
# 5 Control
# 6 Shift + Control
# 7 Alt + Control
# 8 Shift + Alt + Control
# ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.
(Alt і meta не обов'язково є одним і тим же ключем). Це будівельний блок (у свою чергу складається з інших будівельних блоків), з якого складається xterm
термінальний опис. Він використовує розширення, яке надається в ncurses з 1999 року, що дозволяє визначати користувачі імена. Оскільки termcap підтримує лише 2-символьні імена та 1023-байтні описи, не було підстав робити ці розширені імена доступними через інтерфейс termcap . Вони легко доступні програмам, що використовують інтерфейс terminfo .
Тепер виникає складність: є кілька способів програми визначити, що таке ключова послідовність:
Мало хто з програм зробив би першу; деякі текстові редактори будуть робити другий ( на самом деле, я зробив це для ded
в кінці 1980 - х років ). Розробники таких додатків, як bash
обрали третій маршрут, припускаючи, що більшість інформації знаходиться у терміні cap . Крім того, вони могли вирішити скласти таблицю з інформацією termcap / terminfo та використовувати інтерфейс, який дає найкращу інформацію. xterm
робить це для функції tcap-запиту , надаючи vim
фактичні призначення функціональної клавіші.
Оскільки жодна з рядків, яка bash
порівнюється з відповідними рядкам, які вона отримує, вона може заплутатися, влаштувавшись на часткові збіги (наприклад, сам символ втечі).
Подальше читання: