전기 쌍 모드에 대한 추가 모드 별 쌍을 정의하는 방법


13

electric-pair-modeA는 기본 모드로 자동으로 현재 주요 모드에 따른 분리 (괄호 대괄호 등) 정합 쌍을 삽입.

내가 추가 쌍 (될 것입니다 정의 할 수 있습니다 알고 글로벌 이 등) :

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

내 질문은 어떻게 정의 할 수 있습니다, 모드 별 쌍 (예 //, ==위해를 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.

조직을 시도해 봅시다 :

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

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에서도 사용 가능).

이 두 패키지를 사용하면에있을 때 org-mode: MY-EXPAND-REGION-BINDING *단어를 대담하게 만들 수 있습니다.


답변 주셔서 감사합니다. wrap-region패키지를 알고있었습니다 . 매우 유용합니다. 현재 내가 사용하는 타사 패키지 수를 줄이려고 노력 중이므로이 솔루션을 사용하지 않지만 여기에 언급 할 가치가 있습니다! :)
itsjeyd

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.