電気ペアモードの追加のモード固有のペアを定義する方法


13

electric-pair-modeは、現在の主モードに基づいて、一致する区切り文字のペア(括弧、大括弧など)を自動的に挿入するための組み込みモードです。

次のように追加のペア(グローバルになる)を定義できることを知っています。

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

私の質問はモード固有のペアをどのように定義できるかです(たとえば//==for org-mode)?

回答:


7

これを行う簡単な方法はelectric-pair-pairselectric-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

Elispマニュアルの「バッファローカルバインディング作成と削除」セクションから:

大きい: setq-local variable value

このマクロは、の現在のバッファーにバッファーローカルバインディングを作成しVARIABLE、それにバッファーローカル値を与えますVALUE。これは、にmake-local-variable続けてを呼び出すのと同じsetqです。VARIABLE引用符で囲まれていないシンボルである必要があります。


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

構文テーブルの変更方法を示す回答を投稿していただきありがとうございます。あなたの答えの2つの提案のうち、これは私が好むアプローチです。フォールバック変数を使用して、私はあなたの答えよりも少し短い別の解決策を思いつきましたdefun
itsjeyd 2014年

2

この回答は、構成方法に関する質問には回答しませんelectric-pair-mode。しかし、それはあなたが望む結果に導くかもしれません。

wrap-regionMelpaで利用可能なパッケージは、あなたの問題への答えかもしれません。ここにそのgithubからの簡単な説明があります:

領域の折り返しは、句読点で領域を折り返す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でも入手可能)と非常にうまく機能することを付け加えたいと思います。

私は午前これらの2つのパッケージ、とorg-modeやって、:MY-EXPAND-REGION-BINDING *単語でそれを太字にします。


ご回答有難うございます。私はwrap-regionパッケージを知っていました。それは非常に便利です。現在、依存しているサードパーティパッケージの数を減らしようとしているので、このソリューションは使用しませんが、ここで言及する価値があります。:)
itsjeyd 2014年

2

itsjeydの答えに基づいて:

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