Команда, яка форматує (вдосконалює) код 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))))

Я розумію, що існує декілька способів відформатувати фрагмент коду еліпса , і різні люди роблять це по-різному. Крім того, я розумію, що це дещо суб'єктивно. Але слід досить легко придумати набір правил, які приводять до коду, принаймні пристойного.

Я фактично мав намір зробити це сам деякий час тому, але я подумав, що краще запитати, перш ніж винаходити колесо.

Зауважте, я знаю про функцію 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))))

4
Чи допомагає це? Форматування Elisp
Лука

Форматування обов'язково суб'єктивне. Я не впевнений, що ви могли б зробити краще, ніж трохи кращу версію pp.
shosti

@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)
grettke

8

Як підказали інші в коментарях, "форматування" може означати різні речі.

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

Ні, це не "автоматичне" відступ, але це може стати звичкою використовувати його. ;-)

Для речей, окрім відступів, вам потрібно буде зробити це вручну або прокатати власні команди (формати), або знайти якісь такі.

Дивіться також посібник Emacs, вузол багаторядкового відступу та посібник Elisp, вузол Mode-Specific Indent.


3
Дякую, я цілком задоволений відступом еліпса, шукаю щось, що знає, коли потрібно перервати лінії. :-) І так, я розумію, що це суб'єктивно. :-(
Малабарба,

M-q( fill-paragraph) іноді може бути корисним для розриву рядків у режимі Emacs-Lisp, залежно від контексту. Але ви, напевно, також шукаєте вирівнювання ...
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.