Як замінити відповідні дужки?


10

Я пишу (і переписую) багато математичних формул в LaTeX з Emacs. Я часто стикаюся з ситуаціями, коли хочу змінити пару дужок, щоб збільшити читання. Мій Emacs досить люб'язний, щоб показати мені відповідний роздільник, але як це змінити програмно?

Наприклад, змініть зовнішні роздільники за один раз:

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

до

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

2
Зауважте, було б також цікаво, якби такий код міг змінитися, наприклад, \bigl(...\bigr)на \Bigl(...\Bigr)etc.
Andrew Swann

1
Тут я наводив приклад спрощеної граматики LaTeX за допомогою PEG: emacs.stackexchange.com/questions/36541/… це був би один із способів підійти до цієї проблеми.
wvxvw

@wvxvw Я дивився на ваш підхід, коли я писав це питання, і справді це виглядає цікаво! Також сподіваюся, що там щось, можливо, простіше. Emacs вже знає відповідний роздільник, оскільки він виділений. Може, це можна було б використати?
Манька


Emacs знає виділити відповідний роздільник, тому що або реалізується режим forward-sexp-function(який, напевно, працює в режимі TeX), або він буде використовувати scan-sexpsдля пошуку можливої ​​відповідності. У подальшому випадку відповідність не завжди буде правильною. Отже, якщо все, що вам потрібно, це відповідати відповідним роздільникам, ви можете перевірити синтаксис символу під пунктом. Якщо це так $, то він повинен мати відповідність, і ви можете використовувати його, forwad-sexpщоб дістатися до його матчу.
wvxvw

Відповіді:


2

Використовуйте smartparensпакет. Вона включає в себе функцію sp-rewrap-sexp, яка називається , саме те, що вам потрібно. На домашній сторінці проекту ( https://github.com/Fuco1/smartparens ) є кілька gif-файлів, які чітко показують функціональність.


7

Для тих, хто використовує зло, ви можете скористатися злом-оточенням, яке дає вам c sрух (змінити, оточити).

Для вашого прикладу тоді просто робіть c s ( [(рух, від типу батьків, до типу батьків)


Просто те, що мені потрібно було !!! Дякую!
Гільман

6

Я використовую наведений нижче код і прив'язуюсь yf/replace-or-delete-pairдо нього M-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))

2

ar-parentized2bracketed-atpt зробив би завдання.

Він постачається разом із ar-braced2parentized-atptусіма відповідними комбінаціями.

Отримайте його з thingatpt-transform-delimited.el of

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)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.