Закриття всіх круглих дужок


14

Коли я пишу коди lisp, я іноді заглиблююся вкладеним виразом, і все, що я хочу, - це вставити всі відсутні дужки, що закриваються. Зараз я просто вставляю їх, поки не отримаю невідповідних батьків, але це не дуже ефективно.
Чи є якась команда вставити всі відсутні дужки?

FYI, я використовую smartparens для автоматичного вставлення відповідних паронів. Все-таки іноді мені просто потрібно це зробити.


2
FWIW, Франц Лісп (до CL) мав особливість, коли він ]діяв як супер правильний батько, закриваючи всі відкриті паролі, як ви вимагаєте.
Дрю

2
Я раніше використовував ту саму методологію. З тих пір я почав використовувати паритет , який зупиняє проблему до її запуску. Єдине застереження полягає в тому, що вставлення в код не отримує однакового балансування.
Еларсон

Відповіді:


6

Ось функція, яка закриває всі незакриті дужки та інші відповідні пари. Він покладається на сексепсичний розбір Emacs. Він підтримує лише пари, що відповідають одній символі, тому щось подібне {-буде закрито }, а не -}. Для Лісп це не має значення.

(defun close-all-parentheses ()
  (interactive "*")
  (let ((closing nil))
    (save-excursion
      (while (condition-case nil
         (progn
           (backward-up-list)
           (let ((syntax (syntax-after (point))))
             (case (car syntax)
               ((4) (setq closing (cons (cdr syntax) closing)))
               ((7 8) (setq closing (cons (char-after (point)) closing)))))
           t)
           ((scan-error) nil))))
    (apply #'insert (nreverse closing))))

IIUC. Це вимагає, щоб ця точка не знаходилася в жодному наборі відповідних дужок. У мене було враження, що ОК потребує роботи з деякими внутрішніми виразами lisp, де зроблені дужки будуть невідповідні, але інші не будуть.
Малабарба

@Malabarba Це закриває всі раніше відкриті дужки, незалежно від того, чи вони вже мали відповідні дужки після точки чи ні. Ось як я розумію питання, але це, мабуть, не зрозуміло з цього приводу. Де б ви вставили обмежувачі, що закриваються? Наприклад ([-!-foo], ви вставляєте ])в точці чи )після foo]?
Жил "ТАК - перестань бути злим"

з мого розуміння, якщо у вас є ([-!-foo], я би вставив )після foo]. Але я можу помилитися, звичайно. Можливо, @rlazo може розробитись.
Малабарба

для мого випадку використання, @Gilles має рацію, мені байдуже, якщо роздільники закриті після точки, я хочу закрити все перед точкою.
rlazo

3

Я з'ясував, що якщо у вас встановлений шлам, є команда для цього, що називається slime-close-all-parens-in-sexp


Хм ... так що, здається, це закривається на поточному рядку. Це може бути приємно, якби був підхід, який закрив "поточний блок". Цього можна досягти, перейшовши до кінця файлу, а потім перемістивши назад sexp, поки щось не закрилося.
Att Righ

1

Дуже примітивний (і майже напевно неправильний) спосіб це зробити

(defun buffer-needs-parens-fixing ()
  (save-excursion
    (condition-case nil
        (check-parens)
      (error (point)))))

(defun buffer-fix-parens ()
  (interactive)
  (while (buffer-needs-parens-fixing)
    (insert ")")))

Серед інших обмежень передбачається, що всі дужки, які потребують вставки, є:

  • закриваючі
  • потрібна в поточному місці

Я думаю, це може бути достатньо, щоб бути корисним для вашого конкретного випадку використання


Це застряє в нескінченному циклі, якщо у вас занадто багато дужок, що закриваються.
Еміль Вікстрьом

@ EmilVikström так, це дійсно не сумісне з моїм першим заявленим обмеженням :)
Sigma
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.