Làm thế nào để thay thế dấu ngoặc đơn phù hợp?


10

Tôi viết (và viết lại) rất nhiều công thức toán học trong LaTeX với Emacs. Tôi thường xuyên gặp phải tình huống tôi muốn thay đổi một cặp dấu ngoặc phù hợp, để cải thiện khả năng đọc. Emacs của tôi đủ tử tế để chỉ cho tôi dấu phân cách phù hợp, nhưng làm cách nào để thay đổi nó theo chương trình?

Ví dụ: thay đổi các dấu phân cách bên ngoài trong một lần:

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

đến

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

2
Lưu ý nó cũng sẽ rất thú vị nếu mã như vậy có thể thay đổi ví dụ \bigl(...\bigr)để \Bigl(...\Bigr), vv
Andrew Swann

1
Ở đây tôi đã đưa ra một ví dụ về ngữ pháp LaTeX được đơn giản hóa bằng PEG: emacs.stackexchange.com/questions/36541/, đây sẽ là một cách để tiếp cận vấn đề này.
wvxvw

@wvxvw Tôi đã xem xét cách tiếp cận của bạn khi tôi viết câu hỏi này, và thực sự nó có vẻ thú vị! A cũng hy vọng có một cái gì đó, có lẽ đơn giản hơn, ngoài kia. Emacs đã biết về dấu phân cách phù hợp vì nó được tô sáng. Có lẽ điều này có thể được tận dụng?
Mankka


Emacs biết làm nổi bật dấu phân cách khớp bởi vì chế độ thực hiện forward-sexp-function(mà tôi đoán là chế độ TeX có) hoặc nó sẽ sử dụng scan-sexpsđể tìm kết quả khớp có thể. Trong trường hợp sau, trận đấu sẽ không luôn luôn chính xác. Vì vậy, nếu tất cả những gì bạn cần là khớp các dấu phân cách khớp, bạn có thể kiểm tra cú pháp của ký tự dưới điểm. Nếu đúng như vậy $, thì nó phải có một trận đấu và bạn có thể sử dụng forwad-sexpđể đến trận đấu đó.
wvxvw

Câu trả lời:


5

Tôi sử dụng mã dưới đây và liên kết yf/replace-or-delete-pairvới M-D.

Ví dụ sử dụng: với điểm trên (, tôi nhấn M-D [()cặp trở thành một []cặp. Nếu bạn nhấn M-D RETthay vào đó, cặp sẽ bị xóa.

Mã này sử dụng bảng cú pháp, có nghĩa là đối với một số cặp, bạn sẽ phải tự xác định paren đóng. ví dụ trong chế độ html, ()có thể được thay thế bằng <>cách nhấn M-D <. Tuy nhiên, trong nhiều chế độ <>không phải là một cặp được công nhận và M-D <sẽ nói "Không biết cách đóng <". Bạn có thể sau đó bạn chỉ cần gõ >.

(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

Đối với những người sử dụng cái ác, bạn có thể sử dụng evil-Surround cung cấp cho bạn c schuyển động (thay đổi, bao quanh).

Ví dụ của bạn chỉ cần làm c s ( [(chuyển động, từ loại paren, đến loại paren)


Đúng thứ tôi cần!!! Cảm ơn!
Hilman

2

ar-parentized2bracketed-atpt sẽ làm nhiệm vụ.

Nó đi kèm với ar-braced2parentized-atptvà về cơ bản tất cả các kết hợp tương ứng.

Lấy nó từ thingatpt-Transform-deliated.el của

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

Một lớp trừu tượng của các lệnh biến đổi tất cả các dạng được phân tách, ví dụ:

ar-delimited2bracketed-atpt

Các lệnh này được phân phối trong cùng một repo bởi

thingatpt-Transform-generic-deliated.el


0

Dấu ngoặc phù hợp được hiển thị với show-paren-mode. Cách tiếp cận logic là căn cứ chức năng để thay đổi parens thành cùng logic và chức năng cơ bản. Khi các dấu phù hợp được tô sáng, bạn có thể gọi hàm toggle-parensđược xác định bên dưới:

(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)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.