Eşleşen parantez nasıl değiştirilir?


10

Emacs ile LaTeX'te birçok matematiksel formül yazıyorum (ve yeniden yazıyorum). Okunabilirliği artırmak için sık sık eşleşen bir parantez değiştirmek istediğim durumlarla karşılaşıyorum. Emacs'ım bana eşleşen sınırlayıcıyı gösterecek kadar nazik, ama programlı olarak nasıl değiştirebilirim?

Örneğin, dış sınırlayıcıları tek seferde değiştirin:

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

için

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

2
Böyle kod örn değişebilir Eğer o da ilginç olurdu Not \bigl(...\bigr)için \Bigl(...\Bigr)vs.
Andrew Swann

1
Burada PEG kullanarak basitleştirilmiş bir LaTeX dilbilgisi örneği verdim: emacs.stackexchange.com/questions/36541/… bu soruna yaklaşmanın bir yolu olurdu.
wvxvw

@wvxvw Bu soruyu yazdığımda yaklaşımınıza baktım ve gerçekten ilginç görünüyor! Ayrıca orada daha basit bir şey olduğunu umuyorum. Emacs, vurgulandığı için eşleşen sınırlayıcının zaten farkındadır. Belki bu kaldıraç kullanılabilir mi?
Mankka


Emacs, modun forward-sexp-function(TeX modunu tahmin ediyorum) uyguladığı ya da scan-sexpsolası eşleşmeyi bulmak için kullanacağı için eşleşen sınırlayıcıyı vurgulamayı bilir . Sonraki durumda, maç her zaman doğru olmayacaktır. Yani, ihtiyacınız olan tek şey eşleşen sınırlayıcılarla eşleşmekse, noktanın altındaki karakterin sözdizimini kontrol edebilirsiniz. Eğer öyleyse $, bir maç olması gerekir ve maçına forwad-sexpulaşmak için kullanabilirsiniz .
wvxvw

Yanıtlar:


2

smartparensPaketi kullanın . sp-rewrap-sexpTam olarak ihtiyacınız olan şey olarak adlandırılan bir işlev içerir . Proje ana sayfasında ( https://github.com/Fuco1/smartparens ) işlevselliği açıkça gösteren bazı gifler bulunmaktadır.


7

Kötülüğü kullananlar için size hareket (değişim, surround) sağlayan kötü-çevreyi kullanabilirsiniz c s.

Örneğiniz için sadece yapın c s ( [(paren türünden paren türüne hareket)


Sadece ne gerek !!! Teşekkürler!
Hilman

6

Ben aşağıdaki kodu ve bağlayıcılığı kullanmak yf/replace-or-delete-pairiçin M-D.

Örnek kullanım: nokta açıkken (vururum M-D [ve ()çift ​​bir []çift olur . M-D RETBunun yerine vurursanız , çift kaldırılır.

Bu kod sözdizimi tablosunu kullanır, yani bazı çiftler için kapanış parenini kendiniz belirtmeniz gerekir. örneğin html modunda, vurularak ()değiştirilebilir . Ancak, birçok modda tanınan bir çift yoktur ve "Nasıl kapatılacağını bilmiyorum <" der. Sonra sadece yazabilirsiniz .<>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 görevi yapar.

ar-braced2parentized-atptTemel olarak tüm ilgili kombinasyonlarla birlikte gelir .

Thingatpt-transform-delimited.el sitesinden alın

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

Soyutlanmış bir komut sınıfı, sınırlandırılmış tüm formları dönüştürür, örneğin:

ar-delimited2bracketed-atpt

Bu komutlar aynı repo ile

thingatpt-transform-jenerik-delimited.el


0

Eşleşen parantezler ile görselleştirilir show-paren-mode. Mantıksal yaklaşım, parenleri aynı temel mantık ve işleve değiştirmek için işlevi temel almaktır. Eşleşen parenler vurgulandığında, toggle-parensaşağıda tanımlanan işlevi çağırabilirsiniz :

(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)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.