bảng ràng buộc chính?


18

Chúng ta có một bảng ràng buộc chính có thể dịch tất cả các cách khác nhau để đề cập đến một phím bấm không? Tôi đang sử dụng zsh, nhưng tôi cho rằng nếu có một bảng như vậy thì nó sẽ hoạt động với mọi vỏ.

Lý do tôi hỏi là tôi muốn chỉ định một số tổ hợp phím và tôi không có cách nào để biết cách giới thiệu chúng (trừ khi tôi sẽ ăn cắp một cái đã được xác định).

Ví dụ: trong 'zbindkey', chúng ta có loại điều này:

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

... Và tôi có thể đoán rằng "kend" có nghĩa là điều này đề cập đến Endkhóa.

Kiểm tra chéo với bindkeytôi thấy những dòng này:

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

... vì vậy tôi tin rằng một trong những dòng đó đề cập đến Endkhóa. Cái nào?

Chúng tôi cũng có cái này trong tập tin "bindkey":

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

Bây giờ, tôi tình cờ biết rằng đó là Up Arrowchìa khóa, nhưng làm thế nào tôi có thể tìm ra nếu tôi không biết?

$ bindkey (at CLI)

... Cung cấp cho chúng tôi một ngôn ngữ khác nhau cho cùng một khóa:

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

... nhưng ít nhất bây giờ tôi biết rằng ^[[Atrong bindkey-at-CLI speak cũng giống như \e[Atrong bindkey-in-zbindkey. Điều đó thật dễ dàng. Ngày xưa trong DOS, Up Arrow0;72- bạn có thể tìm thấy mã quét của mọi tổ hợp phím hợp pháp và chỉ có một ngôn ngữ.

Có cái bàn không? Hoặc một số cách khác để có thể chọn tổ hợp phím và biết cách tham chiếu nó trong terminfo[]... trong "bindkey-in-zbindkey" ... trong "bindkey-at-CLI" và / hoặc bằng bất kỳ ngôn ngữ nào khác có thể xảy ra?

Một lần nữa, trong DOS có scancodechương trình - gõ một tổ hợp phím và bạn đã có scancode. Thật là dễ dàng tội lỗi.


Từ câu trả lời tôi đoán sau đó không có cách nào để in ra một bảng của tất cả các ràng buộc có thể? Dù sao, 'bindkey' thực hiện gần như những gì tôi muốn:

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
...

ít nhất tôi có thể thấy tất cả các ràng buộc hiện có, ngay cả khi không phải tất cả các ràng buộc có thể . Bây giờ, nếu chỉ có một số cách dịch các glyph chính thành các thuật ngữ 'thông thường':

bindkey "Home" beginning-of-line

... Sau đó tôi sẽ hạnh phúc.


3
Nhấn Ctrl + V (hoặc bất cứ điều gì stty -anói lnextlà) sau đó nhấn phím.
Mikel

Câu trả lời:


15

Giao diện giữa ứng dụng đầu cuối và trình giả lập thiết bị đầu cuối (hoặc thiết bị đầu cuối phần cứng) truyền các byte, không phải các khóa. Các phím chức năng như phím di chuyển con trỏ được dịch thành các chuỗi thoát (bắt đầu bằng ký tự thoát ESC aka \eaka \033aka 0x1b aka ^ [). Điều tương tự cũng xảy ra đối với sự kết hợp của một phím chức năng hoặc một phím ký tự với các bộ sửa đổi, mặc dù không phải tất cả các thiết bị đầu cuối đều gửi các chuỗi khác nhau cho tất cả các kết hợp sửa đổi khác nhau. Một vài khóa được gửi được mã hóa dưới dạng các ký tự điều khiển (ví dụ Tab→ Ctrl-I = \t= \011).

Như bạn có thể thấy, có nhiều cách để mô tả các ký tự điều khiển. Một số có tên, tương ứng với chức năng truyền thống của chúng (ví dụ: Tab, Line feed); những người có xu hướng kết hợp dấu gạch chéo ngược + chữ cái mà bạn có thể sử dụng bên trong $'…'hoặc trong một đối số với echohoặc print(cũng như trong biểu thức chính quy sed và trong chuỗi ký tự trong awk, C và các ngôn ngữ khác (lưu ý rằng các công cụ khác nhau có thể có một bộ hơi khác của các chuỗi thoát)). Bạn cũng có thể sử dụng dấu gạch chéo ngược + bát phân (ví dụ \033) trong các bối cảnh này.

Có một số biến thể mà các thiết bị đầu cuối chuỗi thoát gửi cho mỗi khóa. May mắn thay, hầu như không có sự trùng lặp: có rất ít chuỗi ký tự có nghĩa là các khóa khác nhau trên các thiết bị đầu cuối khác nhau. Vấn đề chính là ký tự 127 = \177= 0x7f thường xảy ra nhất Backspacehiện nay nhưng đôi khi Delete.

^[OF^[[F(tức là \eOF\e[F) là hai chuỗi thoát phổ biến được gửi bởi End. ^E(tức là \005) là ràng buộc khóa Emacs ( Ctrl+ E) cho end-of-line.

Để xem những gì trình giả lập thiết bị đầu cuối của bạn gửi cho một khóa hoặc tổ hợp phím cụ thể, nhấn Ctrl+ Vvà sau đó là phím được đề cập. Điều này chèn ký tự đầu tiên của chuỗi thoát theo nghĩa đen. Các chuỗi thoát thường bao gồm một ký tự thoát theo sau là các ký tự có thể in được, do đó phần còn lại của chuỗi thoát cũng được chèn theo nghĩa đen.

Cơ sở dữ liệu Terminfo chứa các chuỗi thoát cho một số khóa. Bạn sẽ tìm thấy danh sách các khả năng Terminfo trong trang man terminfo (5) trên hệ thống của bạn. Trong zsh, bạn có thể liệt kê các giá trị trong cơ sở dữ liệu thông qua terminfomảng kết hợp. Cẩn thận khi in ra các giá trị mà chúng chứa các chuỗi thoát cũng được thiết bị đầu cuối giải thích khi hiển thị, vì vậy hãy in chúng ở dạng trích dẫn.

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

Xem Làm thế nào để nhập liệu bàn phím và đầu ra văn bản hoạt động? để có cái nhìn tổng quan đầy đủ hơn về những gì xảy ra khi bạn nhấn phím. Không cần thiết phải hiểu các ràng buộc chính trong zsh.


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

(bình luận, cải tiến, tố cáo cay đắng chào mừng: rayandrews tại Eastlink dot ca)

Các tổ hợp phím 'Sẵn có' trên bàn phím PC '101' được gắn vào PC chạy 'zsh' trong xfce4 trong Debian Linux (Tôi không biết ai là người 'phụ trách'). Tất cả các kết hợp tạo mã trùng lặp trong các phím 'xám' đã bị xóa ngoại trừ hình đại diện đơn giản nhất được hiển thị. Lưu ý, một số phím / kết hợp màu xám có trùng lặp '^ letter', như 'Enter' == '^ M', những khóa này chưa bị xóa. Các kết hợp hoạt động khác không 'có sẵn' do hệ thống sử dụng, ngay cả từ bảng điều khiển, vd. Phím 'Alt + Function' chuyển đổi thiết bị đầu cuối. Có lẽ khóa 'Meta' sẽ làm được nhiều hơn, nhưng đây là với 101 KB. Điều thú vị là có nhiều kết hợp hơn có sẵn trong DOS, chẳng hạn như Ctrl + Function - tất cả đều có sẵn trong DOS, không có kết hợp nào trong Linux, vì vậy có vẻ như vậy. Không có tổ hợp phím ba lần nào (ví dụ: 'Ctrl + Alt + Up') tạo ra bất kỳ mã duy nhất nào trong các phím màu xám, nhưng chúng tạo ra mã trong các phím trắng. Sự bất thường thú vị: '^ [[22' '^ [[27' '^ [[30' là 'mất tích', bạn hafta tự hỏi tại sao những con số đó bị bỏ qua. (Điều này có nghĩa là bạn có thể mong đợi 'F11' là '^ [[22' chứ không phải '^ [[23'.)

Các mã khóa được hiển thị là chúng sẽ được xuất ra bởi 'showkeys -a' hoặc 'bindkey' tại CLI. Tuy nhiên, vì một số lý do nếu bạn sử dụng 'bindkey' trong tập lệnh (như trong '.zshrc') '^ [' phải được thay thế bằng '\ e', do đó tại CLI:

bindkey -s '^ [[[A' 'lệnh của tôi \ Cm'

... liên kết 'F1' với 'lệnh của tôi' và thực thi nó ('\ Cm' mô phỏng phím 'Enter').

trong '.zshrc':

bindkey -s '\ e [25' 'my-lệnh1; lệnh của tôi2 \ Cm '

... liên kết 'Shift-F1' với 'my-command1' theo sau là 'my-command2' và thực thi cả hai.

Kết hợp chỉ sử dụng 'GRAY' KEYS :

khóa [ F1 ] = '^ [[[A' key [ F2 ] = '^ [[[B' key [ F3 ] = '^ [[[C' key [ F4 ] = '^ [[[D' key [ F5 ] = '^ [[[E' key [ F6 ] = '^ [[17 ~' key [ F7 ] = '^ [[18 ~' key [ F8 ] = '^ [[19 ~' key [ F9 ] = '^ [[20 ~' khóa [ F10 ] = '^ [[21 ~' khóa [ F11 ] = '^ [[23 ~' khóa [ F12 ] = '^ [[24 ~'

phím [ Shift - F1 ] = '^ [[25 ~' phím [ Shift - F2 ] = '^ [[26 ~' phím [ Shift - F3 ] = '^ [[28 ~' phím [ Shift - F4 ] = ' ^ [[29 ~ ' phím [ Shift - F5 ] = ' ^ [[31 ~ ' phím [ Shift - F6 ] = ' ^ [[32 ~ ' phím [ Shift - F7 ] = '^ [[33 ~' phím [ Shift - F8 ] = '^ [[34 ~'

key [ Chèn ] = '^ [[2 ~' key [ Xóa ] = '^ [[3 ~' key [ Home ] = '^ [[1 ~' key [ End ] = '^ [[4 ~' key [ PageUp ] = '^ [[5 ~' key [ PageDown ] = '^ [[6 ~' key [ Up ] = '^ [[A' key [ Down ] = '^ [[B' key [ Right ] = '^[[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?

Làm thế nào / ở đâu ' Alt - Ctrl - Xóa ' được xác định?

enter code here

tôi gần như muốn gửi email ...
mikeerv

Bằng mọi cách hãy thực hiện mike: rayandrews@eastlink.ca
Ray Andrews

đó chỉ là một trò đùa, tia - bạn thường không thấy một con chó cái, nắm chặt, phàn nàn? gửi email cho tôi ... theo dòng ở đây. Tôi đánh giá cao nó, là tất cả. dù sao đi nữa, về zshchủ đề khóa, bạn có thể muốn thử zkbdchức năng giúp bạn có toàn bộ ánh xạ khóa được lưu trong một tệp. Tôi tin rằng nó autoloadcó thể, nhưng, nếu không, hãy tìm nó trong /usr/share/zsh/functions/Misc. Nhân tiện, có một số thứ kỳ lạ khác ở đó, như thế tetris.
mikeerv

Đó là một trong những công cụ tôi đã sử dụng để tạo bảng của mình, nhưng làm thế nào để bạn có được nó để dọn dẹp 'mọi thứ' cùng một lúc?
Ray Andrew

thú vị - tôi đoán là tôi đã không làm thế Tôi chưa bao giờ thực sự chạy nó trước đây - chỉ đọc tệp nguồn của nó - và đó là một vài tháng trước. Tôi đoán nó thực hiện một loạt các thử nghiệm đầu vào để tạo tệp lưu của nó. Nhưng nó lưu tất cả mọi thứ vào một tập tin, phải không?
mikeerv

6

Có nhiều công cụ theo ý của bạn trong Unix / Linux vì vậy nó có thể hơi khó hiểu và áp đảo. Để bắt đầu, tôi sẽ sử dụng 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

Từ trang người đàn ông liên quan đến -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.

Bạn có thể sử dụng xmodmapđể có được một số ánh xạ:

$ 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)

Trên đây không phải là tất cả các mảnh ghép cho câu đố nhưng là một số thông tin bổ sung có thể hữu ích cho bạn trong việc tìm kiếm bản đồ cuối cùng giữa các phím bấm và các đoạn mã. Có nhiều thông tin hơn trong Hỏi & Đáp về U & L này có tiêu đề: Ánh xạ chính trong Linux .

Người giới thiệu


1
Mặc dù điều này hoàn toàn đúng, nhưng việc hiểu các ràng buộc chính trong một thiết bị đầu cuối là không liên quan.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - vâng Tôi hình dung rằng, tôi chỉ cố gắng cung cấp khách hàng tiềm năng, bây giờ tôi đã đọc AI của bạn hiểu cách giao diện đó hoạt động, cảm ơn!
slm

"Showkey -a" không phải là không liên quan, mặc dù.
skagedal 28/03/2015

2

nếu chỉ có một số cách dịch các glyph chính thành các thuật ngữ 'thông thường':

bindkey "Home" beginning-of-line

... Sau đó tôi sẽ hạnh phúc.

infocmptiện ích để mô tả terminfocác mục. Điều này đặc biệt hữu ích với -Ltùy chọn aka tên biến C dài :

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

So sánh điều này với bindkeyđầu ra

"^[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

người ta có thể thấy rằng họ sử dụng các ký hiệu khác nhau để thoát , nhưng về cơ bản, việc viết một tập lệnh kết nối cột thứ hai infocmpvới đầu tiên là tương đối dễ dàng bindkey.

Trong trường hợp có bất kỳ nghi ngờ gì về chuỗi cụ thể có nghĩa là gì (như được in ở infocmpđầu ra), người ta luôn có thể xem xét terminfothủ công trong đó mô tả đầy đủ được đưa ra, ví dụ

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.