Cách xác định các cặp chế độ cụ thể bổ sung cho chế độ cặp điện


13

electric-pair-modelà một built-in chế độ để tự động chèn cặp kết hợp của delimiters (dấu ngoặc đơn, dấu ngoặc vuông, vv) dựa trên chế độ chính hiện tại.

Tôi biết rằng tôi có thể định nghĩa các cặp bổ sung (sẽ là toàn cầu ) như thế này:

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

Câu hỏi của tôi là , làm thế nào tôi có thể xác định chế độ đặc thù cặp (ví dụ //, ==cho org-mode)?

Câu trả lời:


7

Một cách dễ dàng để làm điều này là bằng cách tạo electric-pair-pairselectric-pair-text-pairsđệm cục bộ và tùy chỉnh chúng trong các móc cho các chế độ có liên quan.

Ví dụ làm việc cho 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)

Lưu ý rằng phương pháp này có thể khái quát hóa cho các tình huống khác mà bạn muốn sửa đổi giá trị của biến toàn cục cho các chế độ cụ thể.


Thông tin bổ sung: setq-local

Từ phần Tạo và xóa Bộ đệm - Ràng buộc cục bộ của sổ tay Elisp :

Macro: setq-local variable value

Macro này tạo ra một liên kết cục bộ đệm trong bộ đệm hiện tại VARIABLEvà cung cấp cho nó giá trị cục bộ đệm VALUE. Nó tương đương với việc gọi make-local-variabletheo sau setq. VARIABLEnên là một biểu tượng không được trích dẫn.


7

Cách chính xác: điền báo cáo lỗi thông qua kênh thích hợp của dự án của bạn, ví dụ org-submit-bug-reporthoặc report-emacs-bugvà tranh luận lý do tại sao lớp cú pháp của nhân vật yêu thích của bạn nên được thay đổi.

Ngoài ra, bạn có thể sửa đổi bảng cú pháp thích hợp (info "(elisp) Syntax Tables"), trong của bạn init.el.

Hãy thử 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))

Ngoài ra, bạn có thể sử dụng các biến dự phòng. Đây là một defun nên hoạt động, nhưng bạn có thể muốn làm cho đẹp hơn:

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

Cảm ơn bạn đã đăng câu trả lời cho thấy cách sửa đổi bảng cú pháp. Trong số hai gợi ý trong câu trả lời của bạn, đây là cách tiếp cận tôi muốn. Khi sử dụng các biến dự phòng, tôi đã đưa ra một giải pháp khác ngắn hơn một chút so với defuncâu trả lời của bạn.
itjeyd

2

Câu trả lời này không trả lời câu hỏi của bạn về cách cấu hình electric-pair-mode. Nhưng nó có thể dẫn bạn đến kết quả mà bạn muốn.

Các wrap-regiongói sẵn trên Melpa có thể là câu trả lời cho vấn đề của bạn. Dưới đây là mô tả ngắn gọn từ github của nó:

Wrap Region là một chế độ nhỏ cho Emacs bao bọc một vùng có dấu chấm câu. Đối với các chế độ đánh dấu "được gắn thẻ", chẳng hạn như HTML và XML, nó bao bọc bằng các thẻ.

Đây là cách tôi đã thiết lập nó hoạt động trong các chế độ đã chọn của mình. Đoạn trích cũng bao gồm các điểm bạn nêu ra trong câu hỏi của bạn; về org-modeđánh dấu thuộc tính phông chữ.

(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

Tôi muốn thêm rằng gói này hoạt động thực sự tốt với expand-regiongói (cũng có sẵn trên Melpa).

Với 2 gói này, khi tôi tham gia org-mode, thực hiện: MY-EXPAND-REGION-BINDING *trên một từ sẽ làm cho nó đậm.


Cảm ơn câu trả lời của bạn. Tôi đã nhận thức được các wrap-regiongói; nó khá hữu ích Tôi hiện đang cố gắng giảm số lượng gói của bên thứ ba mà tôi phụ thuộc, vì vậy tôi sẽ không sử dụng giải pháp này, nhưng nó chắc chắn xứng đáng được đề cập ở đây! :)
itjeyd

2

Dựa trên câu trả lời của itjeyd:

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

Tôi đã phải thoát khỏi các nhân vật để làm cho nó hoạt động(?\= . ?\=)
phoxd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.