ключові прив’язки таблиці?


19

Чи є у нас таблиця прив'язки ключів, яка перекладає всі різні способи посилання на клавішу? Я використовую zsh, але я припускаю, що якби була така таблиця, вона працювала б для будь-якої оболонки.

Причина, яку я прошу, полягає в тому, що я хотів би призначити деякі в'язки клавіш, і я не можу знати, як посилатися на них (якщо тільки я не буду красти ту, яка вже визначена).

Наприклад, у "zbindkey" у нас є така річ:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

... і я можу здогадатися, що "Кенд" означає, що це стосується End ключа.

Перехресна перевірка, bindkeyя бачу ці рядки:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... тому я вірю, що один із цих рядків відноситься до End ключ. Який?

У нас це також є у файлі "bindkey":

bindkey "\e[A" history-beginning-search-backward

Тепер я, мабуть, знаю, що це Up Arrowключ, але як я міг дізнатися, якби не знав?

$ bindkey (at CLI)

... дає нам іншу мову для того ж ключа:

"^[[A" history-beginning-search-backward

... але принаймні зараз я знаю, що ^[[Aв bindkey-at-CLI розмова - це те саме, що і \e[Aв bindkey-in-zbindkey. Це легко. За старих часів у DOS, Up Arrow був0;72 : ви могли знайти код сканування кожного юридичного натискання клавіш, і там була лише одна мова.

Є стіл? Або якийсь інший спосіб мати можливість натиснути клавішу і знати, як посилатися на неї у terminfo[]... у "bindkey-in-zbindkey" ... у "bindkey-at-CLI" та / або будь-якими іншими мовами трапляється бути?

Знову ж таки, в DOS з'явилася scancodeпрограма - наберіть клавішу, і ви отримали код сканування. Це було гріховно легко.


З відповідей я гадаю, що тоді немає можливості роздрукувати таблицю всіх можливих прив’язок? У будь-якому випадку "bindkey" робить майже те, що я хочу:

pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...

принаймні я бачу всі існуючі прив'язки, навіть якщо не всі можливі прив'язки. Тепер, якщо був лише якийсь спосіб перекладу ключових гліфів у "звичайні" терміни:

bindkey "Home" beginning-of-line

... тоді я був би щасливий.


3
Натисніть Ctrl + V (або все, що там stty -aсказано lnext), а потім клавішу.
Мікель

Відповіді:


16

Інтерфейс між термінальною програмою та емулятором терміналу (або апаратним терміналом) передає байти, а не ключі. Функціональні клавіші, такі як клавіші переміщення курсору, переводяться в послідовності втечі (починаючи з символу втечі ESC \eака \033aka 0x1b aka ^ [). Те саме стосується комбінацій функціональної клавіші або символьної клавіші з модифікаторами, хоча не всі термінали надсилають різні послідовності для всіх різних комбінацій модифікаторів. Кілька клавіш надсилаються в кодованому вигляді керуючих символів (наприклад, Tab→ Ctrl-I = \t= \011).

Як бачите, існує багато способів описати контрольні символи. Деякі мають назву, що відповідає їх традиційній функції (наприклад, вкладка, канал рядків); ті , як правило, мають поєднання зворотний слеш + лист , яке можна використовувати всередині $'…'або в якості аргументу echoабо print(а також в SED регулярних виразів і строкових літералів в AWK, C та іншими мовами (зазначити , що різні інструменти можуть мати дещо інший набір послідовностей втечі)). Ви також можете використовувати зворотний кут нахилу + восьмери (наприклад \033) у цих контекстах.

Існує певна різниця щодо того, які термінали вхідної послідовності надсилаються для кожного ключа. На щастя, перекриття майже немає: дуже мало послідовностей символів, які означають різні клавіші на різних терміналах. Основна проблема - характер 127 = \177= 0x7f, що найчастіше в Backspaceнаш час, але іноді Delete.

^[OFі ^[[F(тобто \eOFі \e[F) є двома загальними послідовностями втечі, що надсилаються End. ^E(тобто \005) - прив'язка клавіш Emacs ( Ctrl+ E) для end-of-line.

Щоб побачити, що надсилає ваш емулятор терміналу для певної клавіші або комбінації клавіш, натисніть Ctrl+, Vа потім відповідну клавішу. Це вводить перший символ послідовності втечі буквально. Послідовності втечі зазвичай складаються з символу втечі, за яким слід друкувати символи, тому решта послідовності втечі також вставляється буквально.

База даних Terminfo містить послідовності евакуації для деяких клавіш. Список можливостей Terminfo ви знайдете на сторінці чоловіка terminfo (5) у вашій системі. У zsh ви можете перелічити значення в базі даних через terminfoасоціативний масив. Будьте обережні, друкуючи значення, що вони містять евакуаційні послідовності, які також інтерпретуються терміналом при відображенні, тому друкуйте їх у процитованій формі.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

Див. Як працюють введення з клавіатури та вихід тексту? для більш повного огляду того, що відбувається при натисканні клавіші. Не потрібно розуміти ключові прив’язки в zsh.


11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(коментарі, покращення, гіркі доноси: вітаємо: rayandrews в Eastlink do ca)

"Доступні" комбінації клавіш на клавіатурі ПК "101", прикріпленій до ПК, що працює під управлінням "zsh" під xfce4 під Debian Linux (я не знаю, хто "відповідає"). Усі комбінації, які створюють повторювані коди в межах "сірих" клавіш, були видалені, за винятком найпростішого аватара, який відображається. Зауважте, деякі сірі клавіші / комбінації мають дублікати "^ літер", як-от "Enter" == '^ M', їх не було видалено. Інші активні комбінації не були "доступними", оскільки використовуються системою, навіть з консолі, наприклад. Клавіші Alt + Function перемикають клеми. Можливо, клавіша "Meta" зробить більше, але це з 101 КБ. Цікаво, що в DOS є набагато більше комбінацій, таких як Ctrl + Function - всі доступні в DOS, жодна з них не доступна в Linux, так здається. Жодна комбінація потрійних клавіш (наприклад, "Ctrl + Alt + Up") не створювала жодних унікальних кодів у сірих клавішах, але вони створюють коди у білих клавішах. Цікаві аномалії: '^ [[22' '^ [[27' '^ [[30' відсутні ", ви хочете задуматися, чому ці цифри були пропущені. (Що означає, що ви можете очікувати, що "F11" буде "^ [[22" не '^ [[23'.)

Показані ключові коди є такими, якими вони будуть виведені 'showkeys -a' або 'bindkey' в CLI. Однак, якщо ви використовуєте 'bindkey' у сценарії (як у '.zshrc'), '^ [' необхідно замінити на '\ e', таким чином у CLI:

bindkey -s '^ [[[A' 'my-command \ Cm'

... прив'яжіть 'F1' до 'my-command' та виконайте його ('\ Cm' імітує клавішу 'Enter').

у ".zshrc":

bindkey -s '\ e [25' 'my-command1; моя команда2 \ См '

... прив’яжіть 'Shift-F1' до 'my-command1', а потім 'my-command2' та виконайте їх обоє.

КОМБІНАЦІЇ використовуючи тільки "Грея КЛЮЧІ :

ключ [ F1 ] = '^ [[[A' клавіша [ F2 ] = '^ [[[B' клавіша [ F3 ] = '^ [[[C' клавіша [ F4 ] = '^ [[[D' клавіша [ F5 ] = '^ [[[E' клавіша [ F6 ] = '^ [[17 ~' клавіша [ F7 ] = '^ [[18 ~' клавіша [ F8 ] = '^ [[19 ~' клавіша [ F9 ] = '^ [[20 ~' ключ [ F10 ] = '^ [[21 ~' клавіша [ F11 ] = '^ [[23 ~' клавіша [ F12 ] = '^ [[24 ~'

клавіша [ Shift - F1 ] = '^ [[25 ~' клавіша [ Shift - F2 ] = '^ [[26 ~' клавіша [ Shift - F3 ] = '^ [[28 ~' клавіша [ Shift - F4 ] = ' Клавіша ^ [[29 ~ ' [ Shift - F5 ] = ' ^ [[31 ~ ' клавіша [ Shift - F6 ] = ' ^ [[32 ~ ' клавіша [ Shift - F7 ] = '^ [[33 ~' клавіша [ Shift - F8 ] = '^ [[34 ~'

ключ [ Вставити ] = '^ [[2 ~' клавіша [ Видалити ] = '^ [[3 ~' клавіша [ Головна ] = '^ [[1 ~' клавіша [ Кінець ] = '^ [[4 ~' клавіша [ PageUp ] = '^ [[5 ~' клавіша [ PageDown ] = '^ [[6 ~' клавіша [ Вгору ] = '^ [[A' клавіша [ Вниз ] = '^ [[B' клавіша [ Право ] = '^[[C' key[Left] = '^[[D'

key[Bksp] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

key[Tab] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies: 'Ctrl+`' == 'Ctrl+2', and 'Ctrl+1' == '1' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' (duhhh) A-Shift = 'A' (who would have guessed?) A-Alt = '^[a'
A-Ctrl = '^A' A-Alt-Ctrl = '^[^A' A-Alt-Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

Як / де визначено " Alt - Ctrl - Delete "?

enter code here

Я майже хочу надіслати електронний лист ...
mikeserv

У будь-який спосіб робіть Майк: rayandrews@eastlink.ca
Рей Ендрюс

це був лише жарт, промінь - ти просто не часто бачиш суки, лещата, скарги? надішліть мені електронну пошту ... по рядку тут. Я оцінив це, все. у будь-якому випадку, як убік, на zshтему клавіш, ви можете спробувати zkbdфункцію, яка має отримати ціле відображення клавіш, збережене у файлі. Я вважаю, що це autoloadвміє, але, якщо ні, шукайте це /usr/share/zsh/functions/Misc. Там є, до речі, теж якісь дивні речі tetris.
mikeserv

Це один із інструментів, який я використовував для виготовлення свого столу, але як змусити його одразу збити все?
Рей Ендрюс

цікаво - я думаю, я цього не зробив. Я ніколи насправді не запускав його раніше - читав лише його вихідний файл - і це було пару місяців тому. Я думаю, він робить серію вхідних тестів для створення файлу збереження. але це зберігає все у файл, правда?
mikeserv

6

У Unix / Linux у вашому розпорядженні багато інструментів, тому це може бути трохи заплутано та непомітно. Для початку я б використав showkey:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

З чоловічої сторінки стосовно -a:

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

Ви можете використовувати xmodmapдля отримання деяких відображень:

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

Вищенаведене - не всі фрагменти головоломки, але є додатковою інформацією, яка може бути корисною для пошуку остаточної карти між клавіатурними вкладками та скан-кодами. Більше інформації в цьому питаннях U&L Q&A під назвою: Основні відображення в Linux .

Список літератури


1
Хоча це все правда, розуміння ключових прив'язок у терміналі не має значення.
Жил "ТАК - перестань бути злим"

@Gilles - так, я якось зрозумів, що я лише намагався навести лідери, тепер, коли я прочитав ваш AI, розумію, як працює цей інтерфейс, дякую!
slm

"showkey -a", однак, не має значення.
skagedal

2

якщо існує лише якийсь спосіб перекладу ключових гліфів у "регулярні" терміни:

bindkey "Home" beginning-of-line

... тоді я був би щасливий.

Існує infocmpутиліта для опису terminfoзаписів. Це особливо корисно для -Lопцій ака- довгих змінних C :

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

Порівнюючи це з bindkeyвиходом

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

видно, що вони використовують різні позначення для втечі , але в основному досить просто написати сценарій, який з'єднує другий стовпчик infocmpз першим зbindkey .

Якщо є сумніви у тому, що означає конкретний рядок (як надруковано у infocmpвихідному документі), ви завжди зможете заглянути в terminfoкерівництво, де подано повний опис, наприклад

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key

0

Я використовую емулятор терміналу URxvt. Там корисний ключ прив'язки для показу таких кодів: Ctrl+V. Після натискання клавіші введіть потрібну послідовність клавіш, і вона надрукує код. Наприклад, у мого Ctrl+ є код ^[Oa.

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