Bagaimana cara mengganti tanda kurung yang cocok?

10

Saya menulis (dan menulis ulang) banyak rumus matematika di LaTeX dengan Emacs. Saya sering mengalami situasi di mana saya ingin mengubah sepasang tanda kurung yang cocok, untuk meningkatkan keterbacaan. Emacs saya cukup baik untuk menunjukkan kepada saya pembatas yang cocok, tetapi bagaimana cara mengubahnya secara terprogram?

Misalnya, ubah pembatas luar dalam sekali jalan:

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

untuk

[ (\sqrt{a} + b)^{-1} + c^{-1} ]
Mankka
sumber
2
Perhatikan juga akan menarik jika kode seperti itu bisa berubah misalnya \bigl(...\bigr)menjadi \Bigl(...\Bigr)dll.
Andrew Swann
1
Di sini saya memberikan contoh tata bahasa LaTeX yang disederhanakan menggunakan PEG: emacs.stackexchange.com/questions/36541/... ini akan menjadi salah satu cara untuk mendekati masalah ini.
wvxvw
@ wvxvw Saya melihat pendekatan Anda ketika saya menulis pertanyaan ini, dan memang itu terlihat menarik! Sebuah harapan juga ada sesuatu, mungkin lebih sederhana, di luar sana. Emacs sudah mengetahui pembatas yang cocok karena disorot. Mungkin ini bisa dimanfaatkan?
Mankka
Emacs tahu untuk menyorot pembatas yang cocok karena salah satu mode mengimplementasikan forward-sexp-function(yang saya duga mode TeX), atau akan digunakan scan-sexpsuntuk menemukan kemungkinan kecocokan. Dalam kasus selanjutnya, pertandingan tidak akan selalu benar. Jadi, jika semua yang Anda butuhkan adalah untuk mencocokkan pembatas yang cocok, Anda dapat memeriksa sintaks karakter di bawah titik. Jika ya $, maka harus ada kecocokan, dan Anda bisa menggunakan forwad-sexpuntuk mendapatkan kecocokannya.
wvxvw

Jawaban:

5

Saya menggunakan kode di bawah ini dan ikat yf/replace-or-delete-pairke M-D.

Contoh penggunaan: dengan titik aktif (, saya menekan M-D [dan ()pasangan menjadi []pasangan. Jika Anda menekan M-D RETsebagai gantinya, pasangan akan dihapus.

Kode ini menggunakan tabel sintaks, yang berarti bahwa untuk beberapa pasangan Anda harus menentukan sendiri paren penutup. misal dalam mode-html, ()bisa diganti <>dengan memukul M-D <. Namun, dalam banyak mode <>bukan pasangan yang dikenali, dan M-D <akan mengatakan "Tidak tahu bagaimana menutup <". Anda kemudian bisa mengetik >.

(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))
YoungFrog
sumber
7

Bagi mereka yang menggunakan kejahatan Anda dapat menggunakan kejahatan-surround yang memberi Anda c sgerakan (perubahan, surround).

Sebagai contoh Anda kemudian lakukan saja c s ( [(gerakan, dari jenis paren, ke jenis paren)

Anntoin Wilkinson
sumber
Apa yang saya butuhkan !!! Terima kasih!
Hilman
2

ar-parentized2bracketed-atpt akan melakukan tugas itu.

Muncul bersama ar-braced2parentized-atptdan pada dasarnya semua kombinasi masing-masing.

Dapatkan dari thingatpt-transform-delimited.el of

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

Kelas perintah yang abstrak mengubah semua formulir yang dibatasi, misalnya:

ar-delimited2bracketed-atpt

Perintah-perintah ini dikirimkan dalam repo yang sama oleh

thingatpt-transform-generic-delimited.el

Andreas Röhler
sumber
0

Tanda kurung yang cocok divisualisasikan dengan show-paren-mode. Pendekatan logis adalah mendasarkan fungsi untuk mengubah parens ke logika dan fungsi dasar yang sama. Saat mencocokkan parens disorot, Anda dapat memanggil fungsi yang toggle-parensditentukan di bawah ini:

(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)))
Heikki
sumber