วิธีการกำหนดคู่โหมดเฉพาะเพิ่มเติมสำหรับโหมดคู่ไฟฟ้า


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บัฟเฟอร์ในระบบและปรับแต่งใน hooks สำหรับโหมดที่เกี่ยวข้อง

ตัวอย่างการทำงานสำหรับ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

จากส่วนการสร้างและการลบการเชื่อมโยงบัฟเฟอร์ในพื้นที่ของคู่มือ Elisp :

มาโคร setq-local variable value

แมโครนี้จะสร้างบัฟเฟอร์ท้องถิ่นที่มีผลผูกพันในบัฟเฟอร์ปัจจุบันและให้มันคุ้มค่าบัฟเฟอร์ท้องถิ่นVARIABLE VALUEมันเป็นเทียบเท่ากับการเรียกตามmake-local-variable ควรเป็นสัญลักษณ์ที่ไม่มีเครื่องหมายsetqVARIABLE


7

วิธีที่ถูกต้อง: กรอกรายงานข้อผิดพลาดผ่านช่องทางที่เหมาะสมของโครงการของคุณเช่นorg-submit-bug-reportหรือreport-emacs-bugโต้แย้งเหตุผลว่าทำไมคลาสไวยากรณ์ของตัวละครที่คุณชื่นชอบควรเปลี่ยนไป

หรือคุณสามารถปรับเปลี่ยนรูปแบบตารางที่เหมาะสมในของคุณ (info "(elisp) Syntax Tables")init.el

ลอง Org:

(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 ที่ควรใช้งานได้ แต่คุณอาจต้องการที่จะสวยกว่า:

(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
               '("/" "=" ("`" . "'"))))))

ขอบคุณที่โพสต์คำตอบที่แสดงวิธีแก้ไขตารางไวยากรณ์ จากคำแนะนำสองข้อในคำตอบของคุณนี่เป็นวิธีที่ฉันต้องการ W / r / t โดยใช้ตัวแปรทางเลือกฉันหาวิธีแก้ปัญหาที่สั้นกว่าdefunคำตอบของคุณเล็กน้อย
itsjeyd

2

electric-pair-modeคำตอบนี้ไม่ตอบคำถามของคุณเกี่ยวกับวิธีการกำหนดค่า แต่อาจนำคุณไปสู่ผลลัพธ์ที่คุณต้องการ

wrap-regionแพคเกจที่มีอยู่บน Melpa อาจจะตอบปัญหาของคุณ นี่คือคำอธิบายสั้น ๆ จาก GitHub:

Wrap Region เป็นโหมดย่อยสำหรับ Emacs ที่ล้อมรอบด้วยเครื่องหมายวรรคตอน สำหรับโหมดมาร์กอัป "แท็ก" เช่น HTML และ XML จะล้อมรอบด้วยแท็ก

นี่คือวิธีที่ฉันตั้งให้ทำงานในโหมดที่ฉันเลือก ตัวอย่างยังครอบคลุมจุดที่คุณถาม เกี่ยวกับ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แพ็คเกจ (มีให้ใน Melpa)

เมื่อฉันอยู่ในแพคเกจทั้งสองนี้เมื่อฉันorg-modeทำ: MY-EXPAND-REGION-BINDING *คำจะทำให้เป็นตัวหนา


ขอบคุณสำหรับคำตอบ. ฉันรับรู้ถึงwrap-regionแพ็คเกจ มันค่อนข้างมีประโยชน์ ขณะนี้ฉันกำลังพยายามลดจำนวนแพ็คเกจของบุคคลที่สามที่ฉันพึ่งพาดังนั้นฉันจะไม่ใช้โซลูชันนี้ แต่ควรได้รับการกล่าวถึงที่นี่อย่างแน่นอน! :)
itsjeyd

2

สร้างคำตอบของ itsjey:

(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 '((?` . ?')))

ฉันต้องหลบหนีตัวละครเพื่อที่จะทำงานได้(?\= . ?\=)
phoxd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.