일치하는 괄호를 바꾸는 방법?


10

LaTeX에서 Emacs로 많은 수학 공식을 작성하고 다시 작성합니다. 가독성을 높이기 위해 일치하는 괄호 쌍을 변경하려는 상황이 자주 발생합니다. 내 Emacs는 일치하는 구분 기호를 보여줄만큼 친절하지만 프로그래밍 방식으로 어떻게 변경합니까?

예를 들어 외부 구분 기호를 한 번에 변경하십시오.

( (\sqrt{a} + b)^{-1} + c^{-1} )

[ (\sqrt{a} + b)^{-1} + c^{-1} ]

2
그러한 코드가 예 \bigl(...\bigr)를 들어 다음과 같이 변경 될 수 있다면 흥미로울 것입니다 \Bigl(...\Bigr).
Andrew Swann

1
여기에 PEG를 사용하여 단순화 된 LaTeX 문법의 예를 들었습니다 : emacs.stackexchange.com/questions/36541/… 이 문제에 접근하는 한 가지 방법입니다.
wvxvw

@ wvxvw 나는이 질문을 쓸 때 당신의 접근 방식을 살펴 보았으며 실제로 흥미로워 보입니다! 또한 아마도 더 간단한 무언가가 있기를 바랍니다. Emacs는 강조 표시된 일치하는 분리 문자를 이미 알고 있습니다. 아마도 이것이 활용 될 수 있습니까?
Mankka


Emacs는 일치하는 구분 기호를 강조 표시하는 것을 알고 있습니다. forward-sexp-functionTeX 모드가 구현하는 모드를 구현 하거나 scan-sexps가능한 일치 하는 것을 찾는 데 사용 하기 때문입니다 . 후자의 경우 일치가 항상 올바른 것은 아닙니다. 따라서 필요한 구분 기호를 일치시키는 것만으로도 포인트 아래의 문자 구문을 확인할 수 있습니다. 인 경우 $일치해야하며 일치하는 forwad-sexp데 사용할 수 있습니다 .
wvxvw

답변:


2

smartparens패키지를 사용하십시오 . 여기에는 sp-rewrap-sexp정확히 필요한 기능인이라는 함수가 포함되어 있습니다. 프로젝트 홈페이지 ( https://github.com/Fuco1/smartparens )에는 기능을 명확하게 보여주는 GIF가 있습니다.


7

악을 사용하는 사람들에게는 악의적 인 서라운드 를 사용하여 c s모션 (변화, 서라운드)을 줄 수 있습니다.

귀하의 예를 들어 다음과 같이하십시오 c s ( [(모자 유형에서 파렌 유형으로의 움직임)


내가 필요한 것 !!! 감사!
Hilman

6

아래 코드를 사용하여에 바인딩 yf/replace-or-delete-pair합니다 M-D.

사용법 : point on을 사용 하면 (히트 M-D [하고 ()쌍이 쌍이됩니다 []. M-D RET대신 맞으면 쌍이 제거됩니다.

이 코드는 구문 테이블을 사용합니다. 즉, 일부 쌍의 경우 닫기 구문 분석기를 직접 지정해야합니다. HTML 모드에서 예를 들면, ()로 대체 될 수있다 <>쳐서 M-D <. 그러나 많은 모드 <>에서 인식되는 쌍이 M-D <아니며 "<를 닫는 방법을 모르겠습니다"라고 표시됩니다. 그런 다음을 입력하면됩니다 >.

(defun yf/replace-or-delete-pair (open)
  "Replace pair at point by OPEN and its corresponding closing character.
The closing character is lookup in the syntax table or asked to
the user if not found."
  (interactive
   (list
    (read-char
     (format "Replacing pair %c%c by (or hit RET to delete pair):"
             (char-after)
             (save-excursion
               (forward-sexp 1)
               (char-before))))))
  (if (memq open '(?\n ?\r))
      (delete-pair)
    (let ((close (cdr (aref (syntax-table) open))))
      (when (not close)
        (setq close
              (read-char
               (format "Don't know how to close character %s (#%d) ; please provide a closing character: "
                       (single-key-description open 'no-angles)
                       open))))
      (yf/replace-pair open close))))

(defun yf/replace-pair (open close)
  "Replace pair at point by respective chars OPEN and CLOSE.
If CLOSE is nil, lookup the syntax table. If that fails, signal
an error."
  (let ((close (or close
                   (cdr-safe (aref (syntax-table) open))
                   (error "No matching closing char for character %s (#%d)"
                          (single-key-description open t)
                          open)))
        (parens-require-spaces))
    (insert-pair 1 open close))
  (delete-pair)
  (backward-char 1))

2

ar-parentized2bracketed-atpt 작업을 수행합니다.

ar-braced2parentized-atpt기본적으로 모든 조합 과 함께 제공됩니다 .

thingatpt-transform-delimited.el에서 가져옵니다.

URL : https://github.com/andreas-roehler/thing-at-point-utils

추상화 된 명령 클래스는 다음과 같이 구분 된 모든 형식을 변환합니다.

ar-delimited2bracketed-atpt

이 명령들은

thingatpt-transform-generic-delimited.el


0

일치하는 괄호는로 표시됩니다 show-paren-mode. 논리적 접근 방식은 함수를 기반으로하여 동일한 기본 논리 및 기능으로 패런을 변경하는 것입니다. 일치하는 Parens가 강조 표시되면 toggle-parens아래 정의 된 함수를 호출 할 수 있습니다.

(defun toggle-parens ()
  "Toggle parens () <> [] at cursor.

Turn on `show-paren-mode' to see matching pairs of parentheses
and other characters in buffers. This function then uses the same
function `show-paren-data-function' to find and replace them with
the other pair of brackets.

This function can be easily modified and expanded to replace
other brackets. Currently, mismatch information is ignored and
mismatched parens are changed based on the left one."
  (interactive)
  (let* ((parens (funcall show-paren-data-function))
         (start (if (< (nth 0 parens) (nth 2 parens))
                    (nth 0 parens) (nth 2 parens)))
         (end (if (< (nth 0 parens) (nth 2 parens))
                  (nth 2 parens) (nth 0 parens)))
         (startchar (buffer-substring-no-properties start (1+ start)))
         (mismatch (nth 4 parens)))
    (when parens
      (pcase startchar
        ("(" (toggle-parens--replace "[]" start end))
        ("[" (toggle-parens--replace "()" start end))))))

(defun toggle-parens--replace (pair start end)
  "Replace parens with a new PAIR at START and END in current buffer.

A helper function for `toggle-parens'."
  (goto-char start)
  (delete-char 1)
  (insert (substring pair 0 1))
  (goto-char end)
  (delete-char 1)
  (insert (substring pair 1 2)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.