一致する括弧を置き換える方法は?


10

私はEmacsを使ってLaTeXで多くの数式を書いています(そして書き直しています)。読みやすさを向上させるために、一致する括弧のペアを変更したい状況に頻繁に出くわします。私のEmacsは、対応する区切り文字を表示するのに十分親切ですが、プログラムで変更するにはどうすればよいですか?

たとえば、外側の区切り文字を一度に変更します。

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

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

2
このようなコードは、例えば変えることができれば、それはまた興味深いものになるだろうに注意してください\bigl(...\bigr)\Bigl(...\Bigr)など
アンドリュー・スワン

1
ここでは、PEGを使用して簡素化されたLaTeX文法の例を挙げました:emacs.stackexchange.com/questions/36541/…これは、この問題に取り組む1つの方法です。
wvxvw 2017

@wvxvw私がこの質問を書いたときに私はあなたのアプローチを見ました、そして確かにそれは面白いようです!また、おそらくもっと簡単なものがそこにあることを願っています。Emacsは強調表示されているので、対応する区切り文字をすでに認識しています。たぶんこれは活用できますか?
Mankka


Emacsは、モードが実装されているforward-sexp-function(TeXモードがそうだと思います)かscan-sexps、可能な一致を見つけるために使用するため、一致する区切り文字を強調表示することを知っています。後者の場合、一致は常に正しいとは限りません。したがって、一致する区切り文字を一致させることだけが必要な場合は、ポイントアンダー文字の構文を確認できます。の場合$、一致する必要があり、一致forwad-sexpに到達するために使用できます。
wvxvw 2017

回答:


5

以下のコードを使用してにバインドyf/replace-or-delete-pairM-Dます。

使用例:ポイントオンで(、ヒット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))

7

evilを使用している場合は、モーション(変更、サラウンド)を提供するevil-surroundを使用できますc s

あなたの例では、次に行いますc s ( [(括弧のタイプから括弧のタイプへの動き)


ちょうど私が必要としたもの!!! ありがとう!
Hilman

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ます。論理的なアプローチは、括弧を同じ基礎となるロジックと関数に変更する関数をベースにすることです。一致する括弧が強調表示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.