असली के लिए C- [को कैसे बांधें?


10

C-[अमेरिकी अंग्रेजी कीबोर्ड पर भागने की कुंजी के बराबर है, इस प्रकार, इसे बांधने के किसी भी प्रयास से M-व्यवहार गड़बड़ हो जाएगा ।

लगता है Emacs को कोई परेशानी नहीं है <escape>और C-[इसके अलावा GUI फ्रेम में। निम्नलिखित काम ठीक है और बाइंडिंग के साथ M-काम करना शुरू कर रहे हैं:

(global-set-key (kbd "<escape>") (lambda () (interactive) (message "<escape>")))

हालांकि, अगर मैं बांधता हूं

(global-set-key (kbd "C-[") (lambda () (interactive) (message "C-[")))

अचानक एमैक पागल हो जाता है और M-xब्रेक की तरह बाध्यकारी हो जाता है । इसके अलावा, दबाने C-[से बंधे हुए लंबो को ट्रिगर करने से मना किया जाता है। दिलचस्प रूप से पर्याप्त है, C-x @ c [(ब्रैकेट खोलने के लिए संशोधक नियंत्रण लागू करें) अभी भी कहते हैं C-[ is undefined

क्या C-[बिना ईमेक को तोड़े किसी चीज को बांधने का कोई तरीका है ?

जवाबों:


7

आप वास्तव 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["
    

1
धन्यवाद, यह बहुत अच्छा जवाब है। लेकिन निश्चित रूप से इस तरह के एक महान जवाब भी निश्चित रूप से फ्रंट पेज के शीर्ष पर 34 बार टकराए जाने की आवश्यकता नहीं है। प्रत्येक बम्पर की एक छोटी सी लागत होती है जिसे समुदाय द्वारा साझा किया जाता है: स्पैम की जाँच करना, यह देखना कि क्या कोई नई दिलचस्प सामग्री है, आदि। या जो तुम्हारे पास है उसी से चिपके रहो। अनुभव से बोलते हुए, एकदम सही पोस्ट जैसी कोई बात नहीं है, कुछ बिंदु पर आपको बस आगे बढ़ना होगा।
गिल्स एसओ- बुराई को रोकना '

@ गिल्स मिल गया, और इसके लिए खेद है। मुझे नहीं पता था कि काश में इसे समायोजित करने वाला कोई मुद्दा होता।
चंपिग्नैक

0

निम्नलिखित समाधान थोड़ा कठिन है, लेकिन काम करने के लिए लगता है:

चलो ~/.xbindkeysrcनिम्नलिखित होते हैं:

"xvkbd -xsendevent -text '\[Control_L]\[F13]'"
  m:0x14 + c:34

"xvkbd -xsendevent -text '\[Control_L]\[F14]'"
  m:0x14 + c:35

अब xbindkeysअनुवाद कर देगा C-[करने के लिए C-<f13>और C-]करने के लिए C-<f14>, ताकि वे स्वतंत्र रूप Emacs में बाध्य किया जा सकता है। आप संभवत: उदाहरण के लिए, abort-recursive-editकिसी अन्य चीज़ से बंधना चाहेंगे ।C-]C-S-g

नकारात्मक पक्ष यह है कि अब C-[Emacs को छोड़कर प्रत्येक एप्लिकेशन में टूट गया है, जिसे परीक्षण के लिए कुछ तर्क जोड़कर तय किया जा सकता है कि क्या महत्वपूर्ण संयोजन emacs को भेजा जा रहा है ...


FWIW, मुझे नहीं लगता कि इसके बारे में कुछ खास है C-]
मालाबार

हाँ, मुझे और न ही, लेकिन कुछ अजीब कारणों से मेरे C-]बंधन को बंद करने के बाद मैंने काम करना शुरू कर दिया क्योंकि मैंने एक्सबिंडकीज़ को निकाल दिया, इसलिए मैं उस एक को भी पलट देता हूं।
क्रिस्टोफ़ मार्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.