आप वास्तव C-[में उपयोगकर्ता-स्तरीय मानचित्रों में बाइंडिंग नहीं बदल सकते , जैसा कि आप के साथ करते हैं global-set-key
। हालाँकि, आप इसे कीबोर्ड की घटना के रूप में बदल सकते हैं इससे पहले कि यह उन कीमैप तक पहुँच जाए। आप उदाहरण के लिए कह सकते हैं:
(define-key input-decode-map
(kbd "C-[")
[control-bracketleft])
और फिर [control-bracketleft]
अपने कीमैप में उपयोग करें। बहुत आसान है ना?
निर्देशक की कटौती
दुर्भाग्य से, यह इतना आसान नहीं है, और इस समाधान के लिए कुछ समायोजन की आवश्यकता होती है, जो बहुत दर्दनाक प्रतीत होगा। आपको चेतावनी दी गई थी। लेकिन पहले देखते हैं कि उपयोगकर्ता-स्तर के नक्शे सवाल का जवाब क्यों नहीं दे सकते हैं। निम्नलिखित में, मैं एमएसीएस 26.1 के लिए एमएसीएस लिस्प मैनुअल का उल्लेख करता हूं जब मैं कहता हूं कि अधिक सटीक बिना "कुछ देखें"।
C-[ASCII नियंत्रण चरित्र ESC
(21.7.1 - कीबोर्ड इवेंट देखें ) के रूप में एक बहुत ही प्रारंभिक चरण में व्याख्या की गई है । यह कोड अन्य सभी स्थानों पर लंबे दृश्यों के लिए उपसर्ग के रूप में फैला हुआ है। इसके लिए एक कारण है: ESC
वास्तव में मेटा प्रीफिक्स (देखें meta-prefix-char
) है, और M-कुछ पढ़ने वाले सभी बाइंडिंग
एक अनुक्रम में अनुवाद करेंगे जो इसके साथ शुरू होता है ESC
। इस प्रकार, वैश्विक मानचित्र को बदलना पर्याप्त नहीं होगा: आपको पहले बदलने की आवश्यकता है meta-prefix-char
, फिर ESC
अपने meta-prefix-char
प्रत्येक नक्शे में अपने नए को रीमैप करने के लिए जो M-आप सुरक्षित रूप से मैप करने से पहले उपयोग कर सकते हैं C-[।
ठीक है, निश्चित रूप से: चलो उपयोग करते हैं input-decode-map
। कुछ ऐसे ही नक्शे हैं जिन्हें हम इस्तेमाल करने के लिए लुभा सकते हैं (देखें खंड 21.8.3 और 22.14), लेकिन आइए इस पर टिके रहें। और अच्छी तरह से ... यह काम करता है! आप कर रहे हैं, तुम नहीं हो?
दरअसल, नहीं, कहानी यहीं खत्म नहीं होती। यह काम करता है ... जब तक आप एक विंडो सिस्टम का उपयोग कर रहे हैं। यदि दुर्भाग्य के कारण आपको आपातकालीन स्थिति में लिनक्स कंसोल में जेल हो जाती है, तो आपको एहसास होता है कि स्थिति कितनी नाटकीय हो गई है: तीर कुंजी Home, और निश्चित रूप से M-बाइंडिंग, सभी कचरा हैं। क्यों? क्योंकि जब टर्मिनल कहता है ESC
(जो आप टाइप करते हैं C-[), तो इसका वास्तव में मतलब हैESC
, और उसी तरह का एक क्रम शुरू करता है जो गैर-एएससीआईआई पात्रों को प्रसारित करने के लिए उपयोग करता है।
आपदा को देखते हुए, आप उपरोक्त input-decode-map
संशोधन को इस तरह से संरक्षित करना बुद्धिमानी समझ सकते हैं कि यह केवल उस स्थिति में सक्रिय होता है जब कोई विंडो सिस्टम कीबोर्ड को नियंत्रित कर रहा हो:
(let ((frame (framep (selected-frame))))
(or (eq t frame)
(eq 'pc frame)
(define-key input-decode-map
(kbd "C-[")
[control-bracketleft])
)))
टर्मिनल तब काम करते हैं जब वे करते थे।
अब, क्या हम C-[टर्मिनलों पर काम कर सकते हैं ? असल में, हाँ हम कर सकते हैं, लिनक्स कंसोल पर और साथ ही अन्य टर्मिनल एमुलेटर पर, जिनके साथ मैं खेल सकता हूं। लेकिन इससे कहानी काफी लंबी हो जाती है, क्योंकि नए पात्र दृश्य में प्रवेश करते हैं। इसके लिए कोई और अधिक अकेला नहीं है: टर्मिनल की अब केंद्रीय भूमिका है।
चलो एक कान उधार देते हैं जो लिनक्स कंसोल को कहना है। C-vइसे सुनने के लिए कुछ कुंजी से पहले टाइप करें । C-[है ESC
; ऐसा है Esc। ऊपर तीर लगता है ESC [ A
, जबकि M-aहै
ESC A
। हम्म ... इस मेटा की तरह लग रहा है emacs में प्रमुख circumvolutions यह नहीं है? वैसे भी।
जब तक हम समय चरित्र घटनाओं (जो वैसे भेद नही कर सकेगी के बीच गुजरे के आधार पर कुछ चाल खेलने के लिए तैयार
Escसे C-[), ऐसा लगता है हम कोई विकल्प नहीं मिल गया है लेकिन सांत्वना बताने के लिए हम वास्तव में मतलब यह नहीं है क्या ESC
जब हम टाइप करते हैं C-[। इसके अलावा, यह बहुत जल्द ही प्रकट होता है जो C-[स्टॉक टर्मिनल कोड के साथ एकमात्र समस्या नहीं है: संशोधक अधिकांश समय प्रेषित जानकारी को मिटा देते हैं। हमें टर्मिनल को उसी कारण से अनुकूलित करने की आवश्यकता है, जब हम ईमेक को अनुकूलित करते हैं: यदि हम करते हैं तो यह बहुत अधिक व्यावहारिक होगा।
इस बिंदु पर, आप अपने टर्मिनल की डॉक्यूमेंटेशन आँखों में एक गहरी नज़र डालने की हिम्मत करेंगे: loadkeys(1)
लाइन कस्टम कंसोल के लिए मैन पेज , xterm(1)
सेक्शन कस्टम की बिंदिंग्स में xterm
और अन्य टर्मिनलों के लिए जो भी मैं-न-पता है । में KDE konsole
, आप सेटिंग / संपादित करें वर्तमान प्रोफ़ाइल ...
तब कीबोर्ड में कस्टम अनुवाद को परिभाषित कर सकते हैं । यहाँ ~/.local/share/konsole/Test.keytab
इस बाद के संवाद के साथ खेलने के बाद एक अंश है :
key [+Ctrl+AnyModifier : "\EO*["
एक बार जब आप टर्मिनल भेजने ESC O 5 [
के लिए
C-[(ऊपर विन्यास में), तो आप Emacs वापस जा सकते हैं। बेशक, आप अभी तक नहीं कर रहे हैं।
Emacs को निर्देश देने के लिए कि किसी दिए गए टर्मिनल का उपयोग किस बोली में होता है, आप समायोजित कर सकते हैं input-decode-map
। हां, यह सौभाग्य से वही है जिसे हमने इस कहानी की शुरुआत में संशोधित किया है, और term/xterm.el
जब xterm शामिल होता है तो यह बहुत ही
छूता है। समायोजन के लिए एक अच्छी जगह है tty-setup-hook
(अनुभाग 40.1.3 देखें):
(add-hook 'tty-setup-hook
(lambda ()
(let ((term (getenv "TERM")))
(cond
(;; xterm-function-map not in doc, but in term/xterm.el
(boundp 'xterm-function-map)
(map-my-term-codes xterm-function-map))
((equal term "linux")
(map-my-term-codes input-decode-map))
)
)))
ध्यान रखें कि यह हुक केवल तभी चलता है जब आप टर्मिनल में हों। इस प्रकार, आप यहाँ विंडो सिस्टम इनिशियलाइज़ेशन के लिए कोड नहीं डाल सकते हैं। यहाँ अनुवाद कार्य अपने आप होता है:
(defun map-my-term-codes (map)
(define-key map (kbd "M-O 5 [")
[control-bracketleft])
)
और फिर आप कुछ आराम कर सकते हैं: यह यात्रा का अंत है। बेशक, यदि आप टर्मिनलों की परवाह नहीं करते हैं, तो यह जल्दी है क्योंकि आप सभी दर्दनाक हिस्से को छोड़ देंगे। लेकिन आप मानते हैं कि यह भी अधूरा है।
दो अंतिम नोट:
मैं ESC O 5 [
कोड चुनता हूं C-[। यह सिर्फ एक उदाहरण है: मैं यह एक अच्छा विकल्प नहीं दिखाएगा । केवल 5
भाग, जिसका अर्थ है C-, किसी प्रकार के स्थापित सम्मेलन का पालन करना प्रतीत होता है
लिनक्स कंसोल को कॉन्फ़िगर करना एक खराब स्वाद छोड़ देता है: यह एक मध्यवर्ती मौजूदा प्रतीक का उपयोग किए बिना बाध्यकारी करना संभव नहीं लगता है , और जिन्हें मुझे ज़रूरत
नहीं है, उनका अस्तित्व नहीं है । मैं ज्यादातर इंटरनेट उदाहरणों में जैसे F21- प्रतीकों का उपयोग करता हूं F246, लेकिन यह बहुत संतोषजनक नहीं है। यह कुछ असंबंधित बाइंडिंग के लिए ठीक है, लेकिन यह एक व्यवस्थित स्कीमा की सेवा नहीं देगा।
संपादित करें
- मैंने इसे इस Escमामले के साथ पूरा किया है - जिसका अपना व्यक्तित्व है - एक अन्य पोस्ट में: ईएससी उपसर्ग कुंजी के लिए बाइंडिंग कैसे निकालें
यहाँ के loadkeys
साथ खिलाने के लिए एक विन्यास का एक टुकड़ा है । मैं इसे /root/custom.kmap में डालता हूं, और जब मुझे आवश्यकता होती है (जो दुर्लभ है) इसे लोड करता हूं। मेरा वास्तविक कॉन्फ़िगर तीर और मॉडिफ़ायर के विभिन्न संयोजनों को भी मैप करता है, लेकिन यह लंबे समय तक है, प्रतीकों और अनुक्रमों का चुनाव संदिग्ध है, और मुझे यकीन नहीं है कि मेरे कीबोर्ड के लिए कीकोड आपके मेल खाएंगे। तो आइए इसे उसके नियत स्तर पर रखें: यह एक दृष्टांत के अलावा और कुछ नहीं है।
keymaps 0-127
# http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html
# web+man:keymaps
# web+man:loadkeys
# escape
keycode 1 = F100
alt keycode 1 = Escape # keep the Escape behavior somewhere
# keycode 26 = bracketleft
control keycode 26 = F115 # Control_bracketleft does not exist
string F100 = "\033OO" # map this to [escape] in map-my-term-codes
string F115 = "\033O5["