Команда, которая форматирует (преобразует) код Elisp

21

Допустим, у меня есть функция, которая выглядит следующим образом (как это часто бывает при печати вывода elisp).

(defun my-example-function () (let ((a (do-something)) (b (do-something))) (setq someone me) (with-current-buffer b (do-that (or this (and that those))) (format "%s" a))))

Я хотел бы команду, которая может превратить это в нечто, что написал бы человек, например, следующее.

(defun my-example-function ()
  (let ((a (do-something))
        (b (do-something)))
    (setq someone me)
    (with-current-buffer b
      (do-that (or this (and that those)))
      (format "%s" a))))

Я понимаю, что существует несколько способов форматирования фрагмента кода elisp , и разные люди делают это по-разному. Кроме того, я понимаю, что это несколько субъективно. Но должно быть довольно легко придумать набор правил, который приводит к коду, который по крайней мере приличный.

Я действительно пытался сделать это сам некоторое время назад, но решил, что лучше спросить, прежде чем изобретать велосипед.

Обратите внимание, я знаю о функции pp , но она не доходит до цели:

(defun my-example-function nil
  (let
      ((a
        (do-something))
       (b
        (do-something)))
    (setq someone me)
    (with-current-buffer b
      (do-that
       (or this
           (and that those)))
      (format "%s" a))))
Malabarba
источник
4
Это помогает? Elisp Formatting
Люк
Форматирование обязательно субъективно. Я не уверен, что вы могли бы сделать лучше, чем немного лучшую версию pp.
Шости
@ King Спасибо, это, безусловно, актуально.
Малабарба

Ответы:

10

Вот как lispy переформатировал его для меня (нажав Mна любом конце выражения):

(defun my-example-function ()
  (let ((a (do-something))
        (b (do-something)))
    (setq someone me)
    (with-current-buffer b (do-that (or this (and that those)))
                         (format "%s" a))))

Чтобы перейти к указанному форматированию, нажмите qk C-m [.

Або-або
источник
(local-set-key (kbd "s-8") #'lispy-multiline) (local-set-key (kbd "s-*") #'lispy-oneline)
Греттке
8

Как другие предлагали в комментариях, «форматирование» может означать разные вещи.

Для отступов, которые довольно обычны, попробуйте использовать C-M-q(команда indent-pp-sexpв режимах Lisp) с курсором где-нибудь внутри sexp верхнего уровня, который вы хотите повторно сделать отступом (например, defunsexp).

Нет, это не «автоматический» отступ, но может стать привычкой его использовать. ;-)

Для других вещей, кроме отступов, вам нужно будет либо сделать это вручную, либо выполнить свою собственную команду (команды) форматирования, либо найти некоторые существующие.

Смотрите также руководство по Emacs, узел Многострочный отступ и руководство по Elisp, узел Mode-Specific Indent.

Нарисовался
источник
3
Спасибо, я очень доволен отступом в elisp, я ищу что-то, что знает, когда ломать строки. :-) И да, я понимаю, что это субъективно. :-(
Малабарба
M-q( fill-paragraph) иногда может быть полезен для разрыва строки в режиме Emacs-Lisp, в зависимости от контекста. Но вы, вероятно, также ищете выравнивание ...
Дрю