मुझे बैश में शॉर्टकट निकालने के लिए टर्मिनल कुंजी कोड की एक सूची कहां मिल सकती है?


42

उदाहरण के लिए:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

मैं केवल बिट्स और टुकड़ों को जानता हूं, जैसे \eभागने के लिए और के C-लिए खड़ा है Ctrl, लेकिन ये नंबर ( 1) और अक्षर ( Z) क्या हैं? क्या हैं ;, [और -के लिए संकेत?

क्या केवल परीक्षण और त्रुटि है या बैश कुंजी कोड की पूरी सूची और उनके सिंटैक्स की व्याख्या है?


2
शेल की वास्तविक रीडलाइन बाइंडिंग को सूचीबद्ध करने के लिए एक अतिरिक्त टिप है bind -p

1
इस तरह के अधिकांश कोड आपके टर्मिनल द्वारा व्याख्या किए जाते हैं; एक बड़ी सूची के लिए विकिपीडिया पर ANSI एस्केप कोड के बारे में पढ़ें ।
चेपनर

stty -a टर्मिनल की लाइन सेटिंग्स को प्रदर्शित करता है
बग

जवाबों:


52

जब आप किसी दिए गए कुंजी को दबाते हैं तो आपके टर्मिनल द्वारा भेजे गए वर्णों के अनुक्रम होते हैं। सेश के साथ कुछ भी करने या पढ़ने के लिए कुछ भी नहीं है, लेकिन आप जानना चाहेंगे कि किसी दिए गए कुंजी या कुंजी संयोजन के वर्णों का क्रम क्या है यदि आप readlineकिसी दिए गए कुंजी प्रेस पर कुछ करने के लिए कॉन्फ़िगर करना चाहते हैं ।

जब आप Aकुंजी दबाते हैं, तो आम तौर पर टर्मिनल a(0x61) वर्ण भेजते हैं । यदि आप दबाते हैं <Ctrl-I>या <Tab>, तो आम तौर पर या (0x9) के ^Iरूप में भी जाना जाने वाला चरित्र भेजें । समारोह और नेविगेशन कुंजी के अधिकांश आम तौर पर उस के साथ शुरू होता वर्णों के अनुक्रम भेज (नियंत्रण [), भी रूप में जाना जाता है या (0x1b, 033 अष्टाधारी), लेकिन सही अनुक्रम टर्मिनल के लिए टर्मिनल से भिन्न होता है।TAB\t^[ESC\e

यह जानने का सबसे अच्छा तरीका है कि आपके टर्मिनल के लिए कुंजी या कुंजी संयोजन क्या भेजता है, इसे चलाया जाता है sed -n lऔर Enterकीबोर्ड पर इसके बाद टाइप किया जाता है । फिर आपको कुछ इस तरह दिखाई देगा:

$ sed -n l
^[[1;5A
\033[1;5A$

पहली लाइन echoटर्मिनल डिवाइस द्वारा किए गए स्थानीय टर्मिनल के कारण होती है (यह विश्वसनीय नहीं हो सकता है क्योंकि टर्मिनल डिवाइस सेटिंग्स इसे प्रभावित करेगी)।

दूसरी लाइन आउटपुट है sed। इसमें $शामिल नहीं होना है, यह केवल आपको यह दिखाने के लिए है कि लाइन का अंत कहां है।

ऊपर है कि इसका मतलब है कि Ctrl-Up(जो मैं दबाया है) 6 अक्षर भेजने ESC, [, 1, ;, 5और A(0x1b 0x5b 0x31 0x3b 0x35 0x41)

terminfoडेटाबेस टर्मिनलों के एक नंबर (आधार पर के लिए आम चाबियों का एक नंबर के लिए दृश्यों की एक संख्या रिकॉर्ड $TERMमूल्य)।

उदाहरण के लिए:

TERM=rxvt tput kdch1 | sed -n l

आपको बताएगा rxvtकि Deleteकुंजी दबाने पर कौन सा एस्केप अनुक्रम भेजा जाता है ।

आप यह देख सकते हैं कि आपके वर्तमान टर्मिनल के साथ दिए गए अनुक्रम के साथ कौन सी कुंजी मेल खाती है infocmp(यहाँ ncursesइन्फोकम्प मानकर)

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

कुंजी संयोजन की तरह डेटाबेस Ctrl-Upमें संबंधित प्रविष्टियां नहीं होती हैं terminfo, इसलिए यह पता लगाने के लिए कि वे क्या भेजते हैं, या तो संबंधित टर्मिनल के लिए स्रोत या प्रलेखन पढ़ें या इसे sed -n lऊपर वर्णित विधि के साथ आज़माएं ।


यह एक महान व्याख्या है, धन्यवाद! अब यह सब जगह में पड़ता है, \e-1\C-iएक बैकवर्ड टैब है, क्योंकि एक टैब controlऔर iसम्मिलित करता है और escapeउसके बाद -1कहता है कि इसे एक बार बैकवर्ड करने के लिए बैश करें (मैंने इस पर ध्यान दिया और कुछ सामान पाया digit-arguments)।
बग

$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx

3
@vib। यह लोअरकेस L नहीं अंक 1 है
स्टीफन चेज़लस

1
@ user367890, यह कीपैड मोड के नीचे है । आपको शायद पता चलेगा कि tput smkxआपके टर्मिनल के बाद \e[OD( kcub1) और बाद tput rmkxमें \e[D( cub1, उसी कोड को अनुक्रम के रूप में भेजा जाता है जो कर्सर को बाईं ओर ले जाता है, ताकि उन कुंजियों की गूंज कर्सर को स्थानांतरित कर दे। कोशिश करें stty -echoctl; tput rmkx; sleep infऔर आप देखेंगे। तीर कुंजियाँ कीपैड मोड में नहीं होने पर कर्सर ले जाती हैं )।
स्टीफन चेजलस

1
@ user367890, थॉमस (ncurses और xterm अनुचर) से क्या जवाब में आप लिंक से कहते हैं, हां, यह काम करना चाहिए। कीपैड मोड या एप्लिकेशन मोड एक ही चीज़ को संदर्भित करता है, इसलिए (थॉमस के अनुसार), टर्मो डेटाबेस में मुख्य विनिर्देश smkx सक्षम होने पर हैं।
स्टीफन चेजलस

4

यह ग्नू रीडलाइन लाइब्रेरी के माध्यम से प्रदान किया जाता है। आपको इसके विवरण का पता लगाने के लिए आदमी 3 रीडलाइन पर गौर करना चाहिए ।

लगता है कि आपको इस बारे में भी जानकारी चाहिए कि escspe कोड क्या पसंद करते हैं \[A। आप इस जानकारी को विकिपीडिया ANSI esacape कोड लेख में पा सकते हैं ।


यह मेरे उदाहरणों की व्याख्या नहीं करता है।
बग

लगता है, यह छोटी सी गलतफहमी थी। कृपया उत्तर अपडेट देखें।
भीड़

लेख में मेरे विशिष्ट उदाहरणों के बारे में कोई जानकारी नहीं है। "[ए" के लिए एक पृष्ठ-खोज ने कुछ भी नहीं लौटाया।
बग

1
@bug कृपया लेख को ध्यान से पढ़ें। \[Aपंक्ति के भीतर "CSI कोड" तालिका में है: "CSI n A"
जल्दी करें

धन्यवाद भीड़ है, लेकिन मैं कहाँ पर स्पष्टीकरण मिल रहा है [Z, [1;5Cया -1?
बग

3

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


मैंने "\ e [1; 5C" को अन्य ट्यूटोरियल्स में मेनू-पूर्ण-बैकवर्ड के लिए ctrl-arrow फॉरवर्ड वर्ड मूवमेंट, और "\ e [Z" और "\ e-1 \ Ci" के लिए इस्तेमाल किया। वे सभी .inputrc फ़ाइल के अंदर उपयोग किए गए हैं।
बग

ठीक है, अगर उन्हें रीडलाइन द्वारा व्याख्या किया जाता है, तो कुछ टर्मिनल एमुलेटर होना चाहिए जहां ये नियंत्रण अनुक्रम ctrl, alt, और / या फ़ंक्शन या तीर कुंजियों के साथ बदलाव के कुछ संयोजन के लिए बाध्य हैं। (मुझे नहीं पता कि कौन सा है।)
यूवे

0

सबसे आसान तरीका है कि मैंने जांच किया है कि एक कुंजी या कुंजी कॉम्बो द्वारा भागने का क्रम क्या उत्पन्न होता है Ctrl+ vएक टर्मिनल में + दबाने के लिए और फिर उस कुंजी / कॉम्बो को दबाएं जिसके बारे में आप जानना चाहते हैं।

आप की तरह एक दृश्य मिल जाएगा ^[Oaऔर आप अनुवाद करना होगा ^[में \eया \033या \x1bभागने चरित्र के लिए अपनी कोई कीबाइंडिंग प्रणाली की उम्मीद है या कोई अन्य प्रतिनिधित्व।

इसका नाम Emacs फंक्शन के रूप में शुरू हुआ quoted-insertऔर, बश और Zsh मिमिक Emacs के लिए डिफ़ॉल्ट कीबाइंड के बाद से, उन्होंने इसे भी कॉपी किया।

बैश इसे GNU रीडलाइन इनपुट लाइब्रेरी के माध्यम से प्राप्त होता है जो कि पायथन की import rlcompleterवृद्धि जैसी अन्य चीजों का भी उपयोग करता है।

यहां पढ़ें विवरण पुस्तिका से विवरण :

quoted-insert( C-qया C-v)

पंक्ति में लिखे अगले वर्ण को शब्दशः जोड़ें। C-qउदाहरण के लिए, इस तरह से कुंजी क्रम सम्मिलित करना है ।

यह GNU Readline पर आधारित कुछ भी काम करना चाहिए ।

Zsh के लिए, जो ZLE नाम के अपने स्वयं के विकल्प का उपयोग करता है, यह केवल मूल Emacs C-qबाइंडिंग का सम्मान करता है जब Vi मोड में, विडंबना पर्याप्त है, लेकिन फिर C-vभी डिफ़ॉल्ट Emacs जैसे इनपुट मोड में काम करता है। (के लिए खोज quoted-insertमें zshzleया zshall` manpages और परिणाम डिफ़ॉल्ट keybinds में सूचीबद्ध करना चाहिए की thesecond जोड़ी।)

एक mnemonic के लिए, मैं इसे v erbatim के रूप में Ctrl+ के बारे में सोचने की सलाह देता हूं।v

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.