टर्मिनल का उपयोग करते समय कीबाइंडिंग के साथ समस्या


30

मेरे पास निम्नलिखित पंक्ति है init.el:

(global-set-key [(control \;)] 'comment-region)

यह GUI विंडो में बहुत अच्छी तरह से काम करता है, लेकिन अगर विकल्प के emacsसाथ इनवॉइस किया गया -nwहै, तो C-;यह क्षेत्र नहीं बताता है, केवल ;वर्ण सम्मिलित करता है। M-x comment-region RETहालांकि ठीक काम करता है।

मैंने इसी तरह की समस्या पर इस उत्तर का पालन करने की कोशिश की , लेकिन C-q C-;सिर्फ रिटर्न देता है ;और मैं स्पष्ट रूप से नंगे को बांधना नहीं चाहता ;

वांछित प्रभाव कैसे प्राप्त करें?


4
यह संभव है कि आपका टर्मिनल (आप किस तरह से उपयोग कर रहे हैं?) उस कमांड अनुक्रम को नहीं पहचानता है। C-;कॉम्बो का उपयोग करने का प्रयास करें और फिर M-x view-lossageयह देखने के लिए उपयोग करें कि क्या यह Emacs के लिए भी हो रहा है।
दान

मैं उपयोग कर रहा हूं gnome-terminal, और M-x view-lossageरिटर्न:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
WeSenseASoulInSearchOfAnswers 13

3
एक टर्मिनल मुद्दे की तरह दिखता है: यदि वह महत्वपूर्ण संयोजन Emacs तक पहुंचने के लिए था, तो यह इसके C-;बजाय c ;(या, कम से कम, मुझे मिलता है C-;) जैसा लगेगा ।
दान

@ दान: आप एक जवाब के रूप में डाल सकता है? यह प्रश्न के उत्तर के रूप में चिह्नित करेगा और समाधान को देखना आसान बना देगा, जो अन्य लोगों के लिए समान समस्या है। धन्यवाद!
तिखन जेल्विस

अधिक पढ़ने के लिए अतिरिक्त लिंक के साथ संक्षेप और पोस्ट किया गया। साथ ही इसे थोड़ा और सामान्य बनाने के लिए प्रश्न शीर्षक को संपादित करना।
दान

जवाबों:


17

सबसे पहले, अधिक सामान्य मुद्दा: टर्मिनल एमुलेटर अक्सर नियंत्रण और भागने के अनुक्रम में सीमित होते हैं जो वे भेज सकते हैं। इसलिए: यह ऐसा मामला हो सकता है कि Emacs तक पहुँचने से पहले टर्मिनल आपके विशेष पात्रों को निगल ले। एक सामान्य डायग्नोस्टिक के रूप में, आप देख सकते हैं C-h l(या M-x view-lossage) यह देखने के लिए कि क्या आपके प्रमुख संयोजन इसे Emacs में बनाते हैं।

इस मुद्दे की अधिक चर्चा के लिए, इस स्टैक ओवरफ्लो थ्रेड और उसके लिंक पर एक नज़र डालें ।

टिप्पणियों में आगे-पीछे संक्षेप में प्रस्तुत करने के लिए, आपकी विशिष्ट समस्या यह बताती है कि यह Emacs के बजाय टर्मिनल है जो समस्या है। जब आपने कोशिश की C-;और फिर M-x view-lossage, आप मिल गए blah blah blah c ; ESC v i e w - l o s s a g e RET। यह एक टर्मिनल मुद्दे की तरह दिखता है: यदि कुंजी संयोजन Emacs तक पहुंच रहा था, तो c ;भाग जैसा दिखेगा C-;


33

में Shift + ऊपर एक टर्मिनल में Emacs द्वारा मान्यता प्राप्त नहीं है मैं, यह बताएं कि टर्मिनलों भागने दृश्यों में सबसे फ़ंक्शन कुंजियों का अनुवाद क्योंकि अनुप्रयोगों और टर्मिनलों संचारित वर्ण (या बल्कि बाइट्स), नहीं चाबियाँ के बीच इंटरफेस। केवल कुछ संशोधक + वर्ण संयोजनों का अपना चरित्र होता है:

  • Ctrlप्लस एक पत्र या @[\]^_बाइट्स 031 (ASCII नियंत्रण वर्ण ) में बदल जाता है ।
  • अक्सर Ctrl+ ?बाइट 127 में बदल जाता है और Ctrl+ + (बाइट 0) के Spaceबराबर होता है ।Ctrl@
  • कुछ फ़ंक्शन कुंजियाँ नियंत्रण वर्णों के बराबर होती हैं: Tab= Ctrl+ I, Return= Ctrl+ M, Esc= Ctrl+ [
  • और Backspace= Ctrl+ Hया Ctrl+ ?विन्यास पर निर्भर करता है। Emacs के लिए Ctrl+ ?अधिक सुविधाजनक है, क्योंकि Ctrl+ Hसहायता है।
  • Meta+ चरित्र के अनुसार characterभेजा जाता है ।Esc

तो इस तरह के रूप अन्य संयोजन के बारे में क्या Ctrl+ ;या Ctrl+ Shift+ letter? चूँकि कोई समान वर्ण नहीं है, इसलिए टर्मिनल को किसी वर्ण का पुन: उपयोग करना पड़ता है या भागने का क्रम भेजना पड़ता है। कई टर्मिनल ऐसे मॉडिफायर्स को नजरअंदाज करते हैं, जब कोई अनुरूप चरित्र नहीं होता है, तो आप अंत में Ctrl+ ;भेजने ;, Ctrl+ Shift+ के letterबराबर Ctrl+ letterआदि के साथ समाप्त होते हैं ।

टर्मिनल विक्रेता लंबे समय तक साधारण काम करते रहे। एस्केप सीक्वेंस के लिए कोई मानक नहीं था, जो स्वयं-स्थायी था - टर्मिनल विक्रेताओं ने इसे लागू नहीं किया, अनुप्रयोग इसका समर्थन नहीं करते हैं, उपयोगकर्ताओं को यह उम्मीद है। कुछ टर्मिनल एमुलेटर को मनमाने ढंग से भागने के अनुक्रम भेजने के लिए कॉन्फ़िगर किया जा सकता है, इसलिए यदि आपका हो सकता है, तो आप इसे कॉन्फ़िगर कर सकते हैं और भागने के अनुक्रम को एमएसीएस (इस पर बाद में) घोषित कर सकते हैं।

हाल ही में, स्थिति बदल रही है, क्योंकि भागने के दृश्यों पर मानकीकरण के लिए दो प्रस्ताव आए हैं। एक सिंटैक्स के साथ लियोनेर्ड का लिबटरमेक है । एक और वाक्यविन्यास के साथ थॉमस डिकी का एक्सटर्म है । संसाधन सेट करके xterm (16216) के वर्तमान संस्करणों को सिंटैक्स के लिए कॉन्फ़िगर किया जा सकता है ; गैर-मूल्य पर सेट करके सुविधा को सक्रिय किया जाना चाहिए ।ESC [ codepoint ; modifier uESC [ 2 7 ; modifier ; codepoint ~formatOtherKeysmodifyOtherKeys

यदि आपका टर्मिनल एमुलेटर इन सिंटैक्स का समर्थन नहीं करता है, लेकिन कॉन्फ़िगर किया जा सकता है, तो या तो चुनें।

24.4 Emacs के बाद से, Emacs स्वचालित रूप से उस modifyOtherKeysसुविधा को चालू करता है जब यह पता लगाता है कि टर्मिनल xterm संस्करण .4216 है। चर के माध्यम से कुंजी को एनकोड करने के लिए एस्केप सीक्वेंस का एमएसीएस का पता लगाना local-function-key-map। 24.4 Emacs के रूप में, सभी एस्केप सीक्वेंस समर्थित नहीं हैं। आप कार्य को पूरा करने के लिए अपनी इनिट फ़ाइल में निम्न कोड का उपयोग कर सकते हैं।

;; xterm with the resource ?.VT100.modifyOtherKeys: 1
;; GNU Emacs >=24.4 sets xterm in this mode and define
;; some of the escape sequences but not all of them.
(defun character-apply-modifiers (c &rest modifiers)
  "Apply modifiers to the character C.
MODIFIERS must be a list of symbols amongst (meta control shift).
Return an event vector."
  (if (memq 'control modifiers) (setq c (if (or (and (<= ?@ c) (<= c ?_))
                                                (and (<= ?a c) (<= c ?z)))
                                            (logand c ?\x1f)
                                          (logior (lsh 1 26) c))))
  (if (memq 'meta modifiers) (setq c (logior (lsh 1 27) c)))
  (if (memq 'shift modifiers) (setq c (logior (lsh 1 25) c)))
  (vector c))
(defun my-eval-after-load-xterm ()
  (when (and (boundp 'xterm-extra-capabilities) (boundp 'xterm-function-map))
    (let ((c 32))
      (while (<= c 126)
        (mapc (lambda (x)
                (define-key xterm-function-map (format (car x) c)
                  (apply 'character-apply-modifiers c (cdr x))))
              '(;; with ?.VT100.formatOtherKeys: 0
                ("\e\[27;3;%d~" meta)
                ("\e\[27;5;%d~" control)
                ("\e\[27;6;%d~" control shift)
                ("\e\[27;7;%d~" control meta)
                ("\e\[27;8;%d~" control meta shift)
                ;; with ?.VT100.formatOtherKeys: 1
                ("\e\[%d;3u" meta)
                ("\e\[%d;5u" control)
                ("\e\[%d;6u" control shift)
                ("\e\[%d;7u" control meta)
                ("\e\[%d;8u" control meta shift)))
        (setq c (1+ c))))))
(eval-after-load "xterm" '(my-eval-after-load-xterm))

यदि TERMपर्यावरण चर xtermया वैरिएंट जैसे सेट नहीं है xterm-256color, तो Emacs उन अनुक्रमों को सक्रिय नहीं करेगा। यदि Emacs के पास पहले से ही आपके मूल्य के लिए समर्थन है TERM, तो आप Lisp फ़ाइलTERM को लोड करने के बाद क्रियान्वित किया जा सकता है, जिसका नाम Lisp फ़ाइल लोड करने के बाद है । Emacs ऐसी कोई समर्थन हासिल है, तो आप इसे उप-निर्देशिका कहा जाता है बनाने के द्वारा जोड़ सकते हैं termअपने में कहीं load-path, और कहा जाता है एक लिस्प फ़ाइल बनाने term/$TERM.elजहां $TERMका मूल्य है TERM, एक समारोह में कहा जाता को परिभाषित terminal-init-$TERM

जैसा कि मैं लिखता हूं, ऐसा लगता है कि xterm के अलावा कुछ टर्मिनल एमुलेटर ने इन एस्केप सीक्वेंस को अपनाया है। OSX पर, आप प्रत्येक कुंजी संयोजन के लिए एक, एक-एक करके भागने के क्रम का चयन करके iTerm2 को कॉन्फ़िगर कर सकते हैं ।


2
इस विषय पर आपके उत्तर हमेशा शानदार हैं, गिलेज़। बहुत सराहना की।
फिल्स

महान!। हालांकि मेरे पास काफी कठिन समय है कि हम उन दृश्यों को भेजने वाले urxvt कैसे बनायें। क्या आप मुझे एक हाथ दे सकते हैं :)
अमोस

@Amos मैं rxvt का उपयोग नहीं करता। आपको यूनिक्स और लिनक्स पर पूछना चाहिए कि कैसे urxvt को एक ही एस्केप अनुक्रम भेज सकते हैं।
गिल्स एसओ- बुराई को रोकना '

macOS xterm-256color पर काम नहीं करता है। M-C-%पहचाना जा सकता हैESC 5
लोरेंसकैन

@ लॉरेंसचैन यह अपेक्षित व्यवहार है यदि modifyOtherKeysसुविधा सक्रिय नहीं है। ध्यान दें कि यह केवल xterm के हाल के पर्याप्त संस्करणों में समर्थित है, और यह केवल Emacs 24.4 के बाद से स्वचालित रूप से सक्रिय है। मुझे नहीं पता कि OSX हाल के संस्करणों के साथ जहाज करता है या नहीं। यदि यह नहीं है, और यह आपके लिए काम नहीं कर रहा है, तो मेरा सुझाव है कि आप एक नया प्रश्न पूछें। उन संस्करणों का उल्लेख करें जिनका आप उपयोग कर रहे हैं।
गिल्स एसओ- बुराई को रोकना '

2

गिल्स के उत्तर में कहा गया है: On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one. मुझे वहां पहुंचने में थोड़ी परेशानी हुई, इसलिए यहां एक विस्तृत विवरण, जो आप मेरे जैसे हैं, भ्रमित हैं।

यदि, जब टर्मिनल में Emacs चल रहा हो (जैसे, Mac का डिफ़ॉल्ट Terminal.app), C-x C-;नहीं चलता है comment-line, और आप उस कार्यक्षमता को पसंद करेंगे, तो आपको iTerm2 पर स्विच करना होगा (Terminal.app में क्षमता नहीं है) और एक कुंजी मानचित्रण बनाएं अंडर प्रोफाइल ... कुंजी इस प्रकार है:

^;     ^[[59;5u

यह +बटन पर क्लिक करके पूरा किया जाता है , जो "कीबोर्ड शॉर्टकट" नामक एक छोटी सी खिड़की लाता है; इस विंडो में शुरू में दो क्षेत्र हैं; शीर्ष का मान "क्लिक टू सेट" है और नीचे का मान "अनदेखा करें" है। शीर्ष बटन पर क्लिक करें और टाइप करें C-;। यह कुंजी संयोजन सेट करता है जो कार्रवाई और कोड चलाएगा। नीचे के क्षेत्र, "एक्शन" पर क्लिक करें और खोजें और "सेंड एस्केप सीक्वेंस" पर क्लिक करें, जो आधे से थोड़ा अधिक नीचे है। आपके द्वारा क्लिक करने के बाद, एक तीसरा फ़ील्ड दिखाई देगा, जिसे "Esc +" कहा जाएगा। इस फ़ील्ड के अंदर, टाइप करें:

[59;5u

59अल्पविराम के दशमलव ASCII कोड है, और 5के लिए कोड है Ctrl। फिर समाप्त करने के लिए "ओके" दबाएं। कुंजी क्रम के लिए सही कुंजी कॉम्बो अब iTerm2 की प्राथमिकताओं में शामिल किया जाएगा। जब आप iTerm में Emacs शुरू करते हैं, तो अब आपके पास C-x C-;कार्यक्षमता तक पहुंच होगी ।

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