कुंजी बाइंडिंग टेबल?


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 "\e[A" history-beginning-search-backward

अब, मुझे पता है कि यह Up Arrowकुंजी है, लेकिन मुझे कैसे पता चलेगा कि मैं नहीं जानता था?

$ bindkey (at CLI)

... हमें एक ही कुंजी के लिए एक अलग भाषा देता है:

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

... लेकिन कम से कम अब मुझे पता है कि ^[[Aबिंडकी-ऑन-सीएलआई में वही बात होती है, जैसे \e[Aबिंडकी-इन-ज़िबिंडकी बोलने में होती है। यह आसान है। डॉस में पुराने दिनों में, Up Arrow था 0;72- आप हर कानूनी कीस्ट्रोके का स्कैन कोड पा सकते हैं और केवल एक ही भाषा थी।

वहां टेबल है? या कीस्ट्रोकेक लेने में सक्षम होने का कोई और तरीका पता है और इसे कैसे संदर्भित करना है terminfo[]... "बाइंडकी-इन-ज़िबिंडकी" में ... "बिंडकी-एट-सीएलआई" और / या अन्य भाषाओं में होना है?

फिर, डॉस में scancodeकार्यक्रम था - एक कीस्ट्रोके टाइप करें, और आपको स्कैनकोड मिला। यह पापपूर्ण आसान था।


फिर मैंने जो जवाब दिया उससे लगता है कि सभी संभव बिन्दुओं की तालिका को प्रिंट करने का कोई तरीका नहीं है? वैसे भी 'बिंडकी' लगभग वही करती है जो मैं चाहता हूं:

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उर्फ \033उर्फ 0x1b उर्फ ​​^ [] के साथ शुरुआत की जाती है । वही फ़ंक्शन कुंजी या संशोधक के साथ वर्ण कुंजी के संयोजन के लिए जाता है, हालांकि सभी टर्मिनल सभी अलग-अलग एम्पलीफायर संयोजनों के लिए अलग-अलग अनुक्रम नहीं भेजते हैं। कुछ कुंजियों को नियंत्रण वर्णों के रूप में एन्कोडेड भेजा जाता है (जैसे Tab→ Ctrl-I \t= \011)।

जैसा कि आप देख सकते हैं, नियंत्रण वर्णों का वर्णन करने के कई तरीके हैं। कुछ का नाम उनके पारंपरिक समारोह (जैसे टैब, लाइन फीड) के अनुरूप है; उन बैकस्लैश + पत्र संयोजन है कि आप अंदर उपयोग कर सकते हैं हो जाते हैं $'…'करने के लिए या किसी बहस के दौरान echoया print(और साथ ही sed नियमित अभिव्यक्ति में और awk, सी और अन्य भाषाओं (नोट में स्ट्रिंग शाब्दिक अलग अलग टूल्स एक अलग सेट हो सकता है बच के अनुक्रम))। आप \033इन संदर्भों में बैकस्लैश + ऑक्टल (जैसे ) का उपयोग कर सकते हैं ।

वहाँ कुछ भिन्नता है, जिसके लिए प्रत्येक कुंजी के लिए अनुक्रम अनुक्रम भेजने से बचते हैं। सौभाग्य से, लगभग कोई ओवरलैप नहीं है: बहुत कम वर्ण क्रम हैं जो अलग-अलग टर्मिनल पर अलग-अलग कुंजी हैं। मुख्य समस्या चरित्र 127 = \177= 0x7f है जो Backspaceआजकल सबसे अधिक है, लेकिन कभी-कभी Delete

^[OFऔर ^[[F(यानी \eOFऔर \e[F) दो आम भागने द्वारा भेजे गए दृश्यों हैं End^E(यानी \005) के लिए Emacs कुंजी बाइंडिंग ( Ctrl+ E) है end-of-line

यह देखने के लिए कि आपका टर्मिनल एमुलेटर किसी विशेष कुंजी या कुंजी संयोजन के लिए क्या भेजता है, प्रेस Ctrl+ Vऔर फिर प्रश्न में कुंजी। यह भागने के अनुक्रम के पहले चरित्र को शाब्दिक रूप से सम्मिलित करता है। एस्केप सीक्वेंस में आमतौर पर प्रिंट करने वाले पात्रों के बाद एक एस्केप कैरेक्टर होता है, इसलिए एस्केप सीक्वेंस के बाकी हिस्सों को भी शाब्दिक रूप से डाला जाता है।

Terminfo डेटाबेस में कुछ कुंजियों के लिए एस्केप सीक्वेंस होते हैं। आप अपने सिस्टम पर टर्मऑन (5) मैन पेज में टर्मिनफो क्षमताओं की सूची पाएंगे । Zsh में, आप डेटाबेस में terminfoसाहचर्य सरणी के माध्यम से मूल्यों को सूचीबद्ध कर सकते हैं । मानों को प्रिंट करते समय सावधान रहें कि उनमें एस्केप सीक्वेंस हैं, जिन्हें प्रदर्शित करते समय टर्मिनल द्वारा व्याख्या भी की जाती है, इसलिए उन्हें उद्धृत रूप में प्रिंट करें।

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

देखें कि कीबोर्ड इनपुट और टेक्स्ट आउटपुट कैसे काम करते हैं? जब आप किसी कुंजी को दबाते हैं तो अधिक पूर्ण अवलोकन के लिए क्या होता है। यह आवश्यक नहीं है कि zsh में प्रमुख बाइंडिंग को समझा जाए।


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

(टिप्पणियाँ, सुधार, कड़वी निंदा का स्वागत करते हैं: ईस्टलैंडलिंक डॉट सीए पर रायैंड्रूव्स)

डेबियन लिनक्स के तहत xfce4 के तहत एक पीसी (पीसी) से जुड़े '101' पीसी कीबोर्ड पर 'उपलब्ध' कुंजी संयोजन (मुझे नहीं पता कि कौन 'प्रभारी' है)। 'ग्रे' कुंजियों के भीतर डुप्लिकेट कोड बनाने वाले सभी संयोजनों को सरलतम अवतार के अलावा हटा दिया गया है जो दिखाया गया है। ध्यान दें, कुछ ग्रे कीज़ / कॉम्बिनेशन में '^' अक्षर डुप्लिकेट होते हैं, जैसे 'एंटर' == '^ M', इन्हें हटाया नहीं गया है। अन्य सक्रिय संयोजन सिस्टम द्वारा उपयोग किए जाने के बाद से 'उपलब्ध' नहीं थे, यहां तक ​​कि कंसोल से भी, जैसे। 'Alt + फ़ंक्शन' कुंजियाँ टर्मिनलों को स्विच करती हैं। शायद 'मेटा' कुंजी और अधिक करेगी, लेकिन यह 101 केबी के साथ है। दिलचस्प है कि DOS में अभी और भी संयोजन उपलब्ध हैं, जैसे कि Ctrl + फ़ंक्शन - DOS में सभी उपलब्ध, उनमें से कोई भी लिनक्स में उपलब्ध नहीं है, इसलिए ऐसा लगता है। ट्रिपल कुंजी संयोजनों में से कोई भी (जैसे। 'Ctrl + Alt + Up') ग्रे कुंजी के भीतर किसी भी अद्वितीय कोड का उत्पादन करता है, लेकिन वे सफेद कुंजी में कोड का उत्पादन करते हैं। दिलचस्प विसंगतियाँ: '^ [[22' '^ ^ [[27' '^ [[30' 'लापता' हैं, आपको आश्चर्य है कि उन नंबरों को क्यों छोड़ दिया गया। (जो यह कहना है कि आप 'F11' से '^ [[22' 'नहीं' ^ [[23]) होने की उम्मीद कर सकते हैं। '

दिखाए गए प्रमुख कोड इस प्रकार हैं कि वे 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 '

... 'मेरी-कमांड 1' के बाद 'शिफ्ट-एफ 1' को 'माय-कमांड 2' से बांधें और दोनों को निष्पादित करें।

सहयोग केवल ' कुंजी ' कुंजी का उपयोग कर रहे हैं :

कुंजी [ एफ 1 ] = '^ [[[ए' कुंजी [ एफ 2 ] = ^ ^ [[[बी ' कुंजी [ एफ 3 ] = ' ^ [[[सी ' कुंजी [ एफ 4 ] = ' ^ [[[डी ' कुंजी ] 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 ~' कुंजी [ पेजडाउन ] = '^ [[6 ~' कुंजी [ ऊपर ] = '^ [[ए' कुंजी [ नीचे ] = '^ [[बी' कुंजी [ अधिकार ] = '^[[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
19

यह उन उपकरणों में से एक है जिसका उपयोग मैंने अपनी तालिका बनाने के लिए किया था, लेकिन आपको एक ही बार में 'सब कुछ' करने के लिए कैसे प्राप्त होता है?
रे एंड्रयूज

दिलचस्प है - मुझे लगता है कि मैंने नहीं किया। मैंने वास्तव में इसे अब से पहले कभी नहीं चलाया है - केवल इसकी स्रोत फ़ाइल पढ़ें - और यह कुछ महीने पहले थी। मुझे लगता है कि यह अपनी बचत फ़ाइल बनाने के लिए इनपुट परीक्षणों की एक श्रृंखला करता है। लेकिन यह एक फ़ाइल के लिए सब कुछ बचाता है, है ना?
माइकर्स

6

यूनिक्स / लिनक्स में आपके निपटान में कई उपकरण हैं, इसलिए यह थोड़ा भ्रमित और भारी हो सकता है। शुरुआत के लिए मैं उपयोग करेगा 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 शीर्षक में अधिक जानकारी है: लिनक्स में मुख्य मैपिंग

संदर्भ


1
हालांकि यह सब सच है, यह एक टर्मिनल में प्रमुख बाइंडिंग को समझने के लिए अप्रासंगिक है।
गिल्स एसओ- बुराई को रोकें '

@ गिल्स - हाँ मुझे लगता है कि, मैं केवल लीड प्रदान करने का प्रयास कर रहा था, अब जब मैंने पढ़ा है कि आपके एआई ने समझा कि इंटरफ़ेस कैसे काम करता है, धन्यवाद!
स्लम

"शोकी-ए" हालांकि अप्रासंगिक नहीं है।
21 अगस्त को

2

यदि कुंजी ग्लिफ़ का 'नियमित' शब्दों में अनुवाद करने का कोई तरीका था:

bindkey "Home" beginning-of-line

... तो मुझे खुशी होगी।

नहीं है infocmpका वर्णन करने के लिए उपयोगिता terminfoप्रविष्टियों। यह -Lविकल्प उर्फ लंबे सी चर नामों के साथ विशेष रूप से उपयोगी है :

$ 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.