Elektrik çifti modu için ek moda özgü çiftler nasıl tanımlanır


13

electric-pair-modegeçerli ana moda göre eşleşen çift ayırıcı çiftlerini (parantez, köşeli parantez vb.) otomatik olarak eklemek için yerleşik bir moddur.

Bu gibi ek çift (ki küresel olacak ) tanımlayabilirsiniz biliyorum :

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

Sorum şu , moda özgü çiftleri nasıl tanımlayabilirim (ör. //, ==İçin org-mode)?

Yanıtlar:


7

Bunu yapmanın kolay bir yolu, yerel yapmak electric-pair-pairsve electric-pair-text-pairsarabelleğe almak ve bunları ilgili modlar için kancalarda özelleştirmektir.

Çalışma örneği için 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)

Bu yaklaşımın, belirli modlar için genel değişkenin değerini değiştirmek istediğiniz diğer durumlar için genelleştirilebilir olduğunu unutmayın.


İlave bilgi: setq-local

Gönderen Oluşturma ve Silme Tampon-Yerel Bağlar bölümünde elisp manuel :

Makro: setq-local variable value

Bu makro, geçerli arabellekte bir arabellek-yerel bağlaması oluşturur VARIABLEve bu arabellek-yerel değerini verir VALUE. Çağırmaya ve make-local-variableardından gelenlere eşdeğerdir setq. VARIABLEalıntılanmamış bir sembol olmalıdır.


7

Doğru yol: bir hata raporunu projenizin uygun kanalı aracılığıyla doldurun, örneğin org-submit-bug-reportveya report-emacs-bugen sevdiğiniz karakterin sözdizimi sınıfının neden değiştirilmesi gerektiğini tartışın.

Alternatif olarak, uygun sözdizimi-tablo değiştirebilir (info "(elisp) Syntax Tables")Gözlerinde farklı, init.el.

Org'u deneyelim:

(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))

Alternatif olarak, yedek değişkenleri kullanabilirsiniz. İşte işe yarayacak bir kusur, ama daha güzel yapmak isteyebilirsiniz:

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

Sözdizimi tablosunun nasıl değiştirileceğini gösteren bir yanıt gönderdiğiniz için teşekkür ederiz. Cevabınızdaki iki öneri arasından tercih ettiğim yaklaşım budur. W / r / t geri dönüş değişkenlerini kullanarak, cevabınızdakinden biraz daha kısa başka bir çözüm buldum defun.
itsjeyd

2

Bu yanıt, nasıl yapılandırılacağı ile ilgili sorunuza cevap vermiyor electric-pair-mode. Ancak sizi istediğiniz sonuçlara götürebilir.

wrap-regionMelpa'da bulunan paket, sorunun cevabı olabilir. İşte onun github kısa açıklaması:

Sargı Bölgesi, bir bölgeyi noktalama işaretleriyle saran Emacs için küçük bir moddur. HTML ve XML gibi "etiketli" işaretleme modları için etiketlerle sarılır.

Seçtiğim modlarda çalışacak şekilde ayarladım. Snippet ayrıca sorunuzda ortaya koyduğunuz noktaları da kapsar; yaklaşık org-modetipi özellik belirteçleri.

(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

Bu paketin paketle gerçekten iyi çalıştığını eklemek istiyorum expand-region(Melpa'da da mevcuttur).

Bu 2 paketle, org-modeiçerideyken: MY-EXPAND-REGION-BINDING *bir kelime üzerinde kalın yapacaktır.


Cevabınız için teşekkürler. wrap-regionPaketin farkındaydım ; oldukça faydalı. Şu anda bağımlı olduğum üçüncü taraf paketlerinin sayısını azaltmaya çalışıyorum, bu yüzden bu çözümü kullanmayacağım, ama kesinlikle burada bir sözü hak ediyor! :)
itsjeyd

2

Jeyd'in cevabı üzerine inşa etmek:

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

Çalışması için karakterlerden kaçmak zorunda kaldım(?\= . ?\=)
phoxd
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.