ตารางผูกที่สำคัญ?


18

เรามีตารางการเชื่อมโยงคีย์ที่แปลวิธีต่าง ๆ ทั้งหมดของการอ้างอิงถึงการกดปุ่มหรือไม่? ฉันใช้zshแต่ฉันคิดว่าถ้ามีโต๊ะแบบนี้มันจะใช้ได้กับเปลือกหอยใด ๆ

เหตุผลที่ฉันถามคือฉันต้องการมอบหมาย keybindings บางอย่างและฉันไม่มีทางรู้วิธีอ้างอิงถึงพวกเขา (ยกเว้นว่าฉันจะขโมยสิ่งที่กำหนดไว้แล้ว)

ตัวอย่างเช่นใน 'zbindkey' เรามีสิ่งนี้:

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

... และฉันเดาได้ว่า "kend" หมายความว่านี่หมายถึง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โปรแกรม - พิมพ์การกดแป้นและคุณได้ 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(รวมถึงในนิพจน์ปกติและในสตริงตัวอักษรใน awk, C และภาษาอื่น ๆ (โปรดทราบว่าเครื่องมือต่าง ๆ อาจมีชุดที่แตกต่างกันเล็กน้อย) ของลำดับหนี)) คุณสามารถใช้ backslash + octal (เช่น\033) ในบริบทเหล่านี้ได้เช่นกัน

มีรูปแบบบางอย่างที่เทอร์มินัลลำดับ escape ส่งสำหรับแต่ละคีย์ โชคดีที่แทบจะไม่ทับซ้อนกัน: มีลำดับอักขระน้อยมากที่หมายถึงคีย์ที่แตกต่างกันในเทอร์มินัลที่แตกต่างกัน ปัญหาหลักที่เป็นตัวละคร 127 = \177= 0x7F ซึ่งเป็นส่วนใหญ่มักจะBackspaceในปัจจุบัน Deleteแต่บางครั้ง

^[OFและ^[[F(เช่น\eOFและ\e[F) Endเป็นลำดับสองหลบหนีร่วมกันส่งโดย ^E(คือ\005) เป็นกุญแจสำคัญที่มีผลผูกพัน Emacs ( Ctrl+ E) end-of-lineสำหรับ

ในการดูว่าเทอร์มินัลอีมูเลเตอร์ของคุณส่งสำหรับคีย์หรือคีย์ผสมใดให้กดCtrl+ Vจากนั้นคีย์ที่เป็นปัญหา สิ่งนี้จะแทรกอักขระตัวแรกของลำดับหลบหนีอย่างแท้จริง โดยปกติแล้ว Escape sequences จะประกอบด้วยอักขระ escape ตามด้วยอักขระที่พิมพ์ได้ดังนั้นส่วนที่เหลือของลำดับ escape จะถูกแทรกด้วยเช่นกัน

ฐานข้อมูล Terminfo มีลำดับ escape สำหรับบางคีย์ คุณจะพบรายการความสามารถของ Terminfo ในหน้า man terminfo (5)ในระบบของคุณ ใน zsh คุณสามารถแสดงรายการค่าในฐานข้อมูลผ่านterminfoอาร์เรย์ที่เชื่อมโยงได้ ระวังเมื่อพิมพ์ค่าที่มีลำดับการหลีกเลี่ยงซึ่งจะถูกตีความโดยเทอร์มินัลเมื่อแสดงดังนั้นให้พิมพ์ในรูปแบบที่ยกมา

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

ดูที่คีย์บอร์ดและเอาต์พุตข้อความทำงานอย่างไร สำหรับภาพรวมที่สมบูรณ์ยิ่งขึ้นของสิ่งที่เกิดขึ้นเมื่อคุณกดปุ่ม ไม่จำเป็นต้องเข้าใจการเชื่อมโยงที่สำคัญใน zsh


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

(ความเห็นการปรับปรุงการต้อนรับ denunciations ขม: rayandrews ที่ eastlink dot ca)

คีย์ผสม 'พร้อมใช้งาน' บนแป้นพิมพ์ PC '101' ที่ต่อกับพีซีที่ใช้ 'zsh' ภายใต้ xfce4 ภายใต้ Debian Linux (ฉันไม่ทราบว่ามีใคร 'รับผิดชอบ') ชุดค่าผสมทั้งหมดที่สร้างรหัสซ้ำภายในคีย์ 'สีเทา' ถูกลบออกยกเว้นอวาตาร์ที่ง่ายที่สุดที่แสดง หมายเหตุคีย์ / ชุดสีเทาบางชุดมีการซ้ำซ้อนของ '^ ตัวอักษร' เช่น 'Enter' == '^ M' ซึ่งยังไม่ถูกลบออก ชุดค่าผสมที่ใช้งานอื่น ๆ ไม่ได้ 'พร้อมใช้งาน' ตั้งแต่ใช้โดยระบบแม้จากคอนโซลเช่น ปุ่ม 'Alt + Function' จะสลับขั้ว บางทีกุญแจ 'Meta' จะทำอะไรได้มากกว่านี้ แต่มีขนาด 101 KB น่าสนใจว่ามีชุดค่าผสมให้เลือกมากมายใน DOS เช่นฟังก์ชั่น Ctrl + ทั้งหมดมีอยู่ใน DOS ไม่มีชุดค่าผสมเหล่านี้ใน Linux จึงดูเหมือนว่า ไม่มีการผสมคีย์ tripple (เช่น '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 \ Cm '

... ผูก 'Shift-F1' เป็น 'my-command1' ตามด้วย 'my-command2' และดำเนินการทั้งสองอย่าง

การรวมโดยใช้เพียงปุ่ม'สีเทา' :

key [ F1 ] = '^ [[[A' key [ F2 ] = '^ [[B' key [ F3 ] = '^ [[C [ คีย์] [ F4 ] = ' ^ [[D D key] [ F5 ] = '^ [[[E' คีย์[ F6 ] = '^ [[17 ~' ปุ่ม[ F7 ] = '^ [[18 ~ สำคัญ[ F8 ] = ' ^ [[19 ~ ' สำคัญ[ F9 ] = '^ [[20 ~' key [ F10 ] = '^ [[21 ~' key [ F11 ] = '^ [[23 ~' สำคัญ[ F12 ] = '^ [[24 ~'

แป้น[ Shift - F1 ] = '^ [[25 ~' ปุ่ม[ Shift - F2 ] = '^ [ คีย์26] [ Shift - F3 ] = ' ^ [[28 ~ สำคัญ[ Shift - F4 ] = ' ^ [[29 ~' ที่สำคัญ[ กะ- F5 ] = '^ ['[31 ~ สำคัญ[ กะ- F6 ] = '^ [[32 ~' ที่สำคัญ[ กะ- F7 ] = '^ [[33 ~' ปุ่ม[ Shift - F8 ] = '^ [[34 ~'

key [ Insert ] = '^ [[2 ~' key [ Delete ] = '^ [[3 ~' key [ Home ] = '^ [[1 ~' key [ End ] = '^ [[4 ~' key [ PageUp ] = '^ [[5 ~' key [ PageDown ] = '^ [[6 ~' key [ Up ] = '^ [[A' key [ ลง] = '^ [[B' key [ ขวา] = '^[[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:

ความผิดปกติ: 'Ctrl + `' == 'Ctrl + 2' , และ'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' ( ใครจะเดาได้?) 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
Ray Andrews

มันเป็นแค่เรื่องตลกเรย์ - คุณมักจะไม่เห็นผู้หญิงคนหนึ่งกริฟท์ร้องเรียนหรือไม่? ส่งอีเมลฉัน ...โดยรอบที่นี่ ฉันชื่นชมมันคือทั้งหมด อย่างไรก็ตามในส่วนของzshคีย์คุณอาจต้องการลองใช้zkbdฟังก์ชั่นที่จะช่วยให้คุณบันทึกการแม็พคีย์ทั้งหมดในไฟล์ ผมเชื่อว่ามันautoloadสามารถ /usr/share/zsh/functions/Miscแต่ถ้าไม่มองมันใน มีบางสิ่งแปลก ๆ อยู่ในนั้นด้วยเหมือนtetrisกัน
mikeserv

นั่นเป็นหนึ่งในเครื่องมือที่ฉันใช้ทำตารางของฉัน แต่คุณจะทำให้ 'ทุกสิ่ง' พร้อมกันได้อย่างไร
Ray Andrews

ที่น่าสนใจ - ฉันคิดว่าฉันไม่ได้ ฉันไม่เคยเรียกใช้มันมาก่อนเลย - แค่อ่านไฟล์ต้นฉบับของมัน - และนั่นก็เป็นสองสามเดือนที่ผ่านมา ฉันเดาว่ามันใช้ชุดของการทดสอบอินพุตเพื่อสร้างไฟล์บันทึก แต่มันจะบันทึกทุกอย่างลงในไฟล์ใช่ไหม
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)

ด้านบนไม่ได้เป็นส่วนหนึ่งของปริศนา แต่เป็นข้อมูลเพิ่มเติมบางอย่างที่อาจเป็นประโยชน์ต่อคุณในการค้นหาแผนที่ที่ดีที่สุดระหว่างการโยงคีย์และ scancodes มีข้อมูลเพิ่มเติมในเรื่องนี้ U & L Q & A บรรดาศักดิ์เป็นแมปที่สำคัญในลินุกซ์

อ้างอิง


1
ในขณะนี้เป็นจริงทั้งหมดมันไม่เกี่ยวข้องกับการทำความเข้าใจการเชื่อมโยงคีย์ในเทอร์มินัล
Gilles 'SO- หยุดความชั่วร้าย'

@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

จะเห็นว่าพวกเขาใช้สัญกรณ์ที่แตกต่างกันสำหรับ การหลบหนีแต่พื้นมันค่อนข้างง่ายที่จะเขียนสคริปต์ซึ่งเชื่อมต่อกับคอลัมน์ที่สองของกับครั้งแรกของการinfocmpbindkey

ในกรณีที่มีข้อสงสัยใด ๆ ความหมายของสตริงเฉพาะ (ดังที่พิมพ์ในinfocmpเอาต์พุต) สามารถดูterminfoด้วยตนเองได้เสมอเมื่อมีการให้คำอธิบายแบบเต็มตัวอย่างเช่น

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

0

ฉันใช้โปรแกรมจำลองเทอร์มินัล URxvt Ctrl+Vมีความสำคัญที่มีประโยชน์ที่มีผลผูกพันในการแสดงรหัสดังกล่าว: หลังจากกดมันป้อนลำดับคีย์ที่คุณต้องการและมันจะพิมพ์รหัส ตัวอย่างเช่นฉันCtrl+ มีรหัส^[Oa

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.