इलेक्ट्रिक-जोड़ी-मोड के लिए अतिरिक्त मोड-विशिष्ट जोड़े को कैसे परिभाषित करें


13

electric-pair-modeवर्तमान प्रमुख मोड के आधार पर सीमांकित (कोष्ठक, वर्ग कोष्ठक, आदि) के जोड़े को स्वचालित रूप से सम्मिलित करने के लिए एक अंतर्निहित मोड है।

मुझे पता है कि मैं इस तरह अतिरिक्त जोड़े (जो वैश्विक होगा ) को परिभाषित कर सकता हूं :

(push '(?\' . ?\') electric-pair-pairs)      ; Automatically pair single-quotes
(push '(?\' . ?\') electric-pair-text-pairs) ; ... in comments

मेरा सवाल है , मैं मोड-विशिष्ट जोड़े (जैसे, //के ==लिए org-mode) को कैसे परिभाषित कर सकता हूं ?

जवाबों:


7

ऐसा करने का एक आसान तरीका प्रासंगिक मोड के लिए हुक electric-pair-pairsऔर electric-pair-text-pairsबफर-लोकल बनाना और उन्हें कस्टमाइज़ करना है।

उदाहरण के कार्य के लिए org-mode:

(defvar org-electric-pairs '((?/ . ?/) (?= . ?=)) "Electric pairs for org-mode.")

(defun org-add-electric-pairs ()
  (setq-local electric-pair-pairs (append electric-pair-pairs org-electric-pairs))
  (setq-local electric-pair-text-pairs electric-pair-pairs))

(add-hook 'org-mode-hook 'org-add-electric-pairs)

ध्यान दें कि यह दृष्टिकोण अन्य स्थितियों के लिए सामान्य है, जिसमें आप विशिष्ट मोड के लिए एक वैश्विक चर के मूल्य को संशोधित करना चाहते हैं।


अतिरिक्त जानकारी: setq-local

एलीफ़ मैनुअल के बफरिंग -लोकल बाइंडिंग सेक्शन को बनाना और हटाना :

मैक्रो: setq-local variable value

यह मैक्रो वर्तमान बफर के लिए बफर-लोकल बाइंडिंग बनाता है VARIABLE, और इसे बफर-लोकल वैल्यू देता है VALUE। इसके make-local-variableबाद कॉल करने के बराबर है setqVARIABLEएक निर्विवाद प्रतीक होना चाहिए।


7

सही तरीका: अपने प्रोजेक्ट के उचित चैनल के माध्यम से एक बग रिपोर्ट भरें, उदाहरण के लिए org-submit-bug-reportया report-emacs-bugतर्क दें कि आपके पसंदीदा चरित्र के वाक्यविन्यास वर्ग को क्यों बदलना चाहिए।

वैकल्पिक रूप से, आप उचित सिंटैक्स-तालिका (info "(elisp) Syntax Tables")को अपने में संशोधित कर सकते हैं init.el

चलो ऑर्ग की कोशिश करें:

(with-eval-after-load 'org
  (modify-syntax-entry ?/ "(/" org-mode-syntax-table)
  (modify-syntax-entry ?= "(=" org-mode-syntax-table)
  (add-hook 'org-mode-hook 'electric-pair-mode))

वैकल्पिक रूप से, आप फ़ॉलबैक चर का उपयोग कर सकते हैं। यहाँ एक मानहानि है जिसे काम करना चाहिए, लेकिन आप पहले से बता सकते हैं:

(defun rasmus/electric-pairs-with-local-pairs (pairs)
  "Start electric pair with buffer-local PAIRS.

  PAIRS is a list of strings and/or cons of strings."
  (require 'elec-pair)
  (let ((ec-lists '(electric-pair-pairs electric-pair-text-pairs)))
    (mapc 'make-local-variable ec-lists)        
    (mapc (lambda (L)
            (mapc (lambda (elm) (add-to-list L elm))
                  (mapcar (lambda (x)
                            (if (consp x)
                                (cons (string-to-char (car x))
                                      (string-to-char (cdr x)))
                              (cons (string-to-char x)
                                    (string-to-char x))))
                          pairs)))
          ec-lists))
  (electric-pair-mode t))

(with-eval-after-load 'org
  (add-hook 'org-mode-hook
            (lambda ()
              (rasmus/electric-pairs-with-local-pairs
               '("/" "=" ("`" . "'"))))))

एक उत्तर पोस्ट करने के लिए धन्यवाद जो दिखाता है कि वाक्यविन्यास तालिका को कैसे संशोधित किया जाए। आपके उत्तर में दो सुझावों में से, यह वह दृष्टिकोण है जिसे मैं पसंद करूंगा। फॉलबैक चर का उपयोग करके डब्ल्यू / आर / टी, मैं एक और समाधान के साथ आया हूं defunजो आपके उत्तर की तुलना में थोड़ा छोटा है ।
इसका अजायबघर

2

यह उत्तर कॉन्फ़िगर करने के तरीके के बारे में आपके प्रश्न का उत्तर नहीं देता है electric-pair-mode। लेकिन यह आपको मनचाहे परिणामों तक ले जा सकता है।

wrap-regionपैकेज Melpa पर उपलब्ध अपनी समस्या का जवाब हो सकता है। इसका गीथब से इसका संक्षिप्त विवरण इस प्रकार है:

रैप क्षेत्र Emacs के लिए एक छोटी सी विधा है जो विराम चिह्न वाले क्षेत्र को लपेटता है। एचटीएमएल और एक्सएमएल जैसे "टैग किए गए" मार्कअप मोड के लिए, यह टैग के साथ लपेटता है।

यहां बताया गया है कि मैंने इसे अपने चयनित मोड में काम करने के लिए कैसे सेट किया है। स्निपेट आपके प्रश्न में आपके द्वारा उठाए गए बिंदुओं को भी कवर करता है; org-modeफ़ॉन्ट प्रॉपर्टी मार्कर के बारे में ।

(require 'wrap-region)

;; Enable wrap-region in the following major modes
(dolist (hook '(emacs-lisp-mode-hook
                org-mode-hook))
  (add-hook hook 'wrap-region-mode))

(wrap-region-add-wrapper "`" "'") ; select region, hit ` then region -> `region'

(wrap-region-add-wrapper "=" "=" nil 'org-mode) ; select region, hit = then region -> =region= in org-mode
(wrap-region-add-wrapper "*" "*" nil 'org-mode) ; select region, hit * then region -> *region* in org-mode
(wrap-region-add-wrapper "/" "/" nil 'org-mode) ; select region, hit / then region -> /region/ in org-mode
(wrap-region-add-wrapper "_" "_" nil 'org-mode) ; select region, hit _ then region -> _region_ in org-mode
(wrap-region-add-wrapper "+" "+" nil 'org-mode))) ; select region, hit + then region -> +region+ in org-mode

मैं जोड़ना चाहूंगा कि यह पैकेज पैकेज के साथ वास्तव में अच्छी तरह से काम करता है expand-region(मेलपा पर भी उपलब्ध है)।

इन 2 पैकेजों के साथ, जब मैं अंदर होता हूँ org-mode, कर रहा हूँ : MY-EXPAND-REGION-BINDING *एक शब्द पर यह बोल्ड कर देगा।


आपके उत्तर के लिए धन्यवाद। मुझे wrap-regionपैकेज के बारे में पता था ; यह काफी उपयोगी है। मैं वर्तमान में उन तृतीय-पक्ष पैकेजों की संख्या को कम करने की कोशिश कर रहा हूं जिन पर मैं निर्भर हूं, इसलिए मैं इस समाधान का उपयोग नहीं करूंगा, लेकिन यह निश्चित रूप से यहां एक उल्लेख के योग्य है! :)
इसका अजायबघर

2

इसके अजायबघर के उत्तर पर निर्माण:

(defmacro spw/add-mode-pairs (hook pairs)
  `(add-hook ,hook
             (lambda ()
               (setq-local electric-pair-pairs (append electric-pair-pairs ,pairs))
               (setq-local electric-pair-text-pairs electric-pair-pairs))))

(spw/add-mode-pairs 'emacs-lisp-mode-hook '((?` . ?')))

मुझे इसे काम करने के लिए पात्रों से बचना पड़ा(?\= . ?\=)
फोक्सड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.