Polecenie formatujące (upiększające) kod Elisp

21

Powiedzmy, że mam funkcję, która wygląda następująco (jak to często bywa przy drukowaniu wyników w 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))))

Chciałbym polecenia, które może zmienić to w coś, co napisałby człowiek, na przykład następujące.

(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))))

Rozumiem, że istnieje więcej niż jeden sposób sformatowania fragmentu kodu elisp , a różni ludzie robią to inaczej. Ponadto rozumiem, że jest to nieco subiektywne. Ale powinno być dość łatwo wymyślić zestaw reguł, które powodują, że kod jest co najmniej przyzwoity.

Właściwie to kiedyś próbowałem to zrobić, ale pomyślałem, że lepiej zapytać, zanim ponownie wymyślę koło.

Uwaga, znam funkcję pp , ale nie do końca się tam dostanie:

(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
źródło
4
czy to pomaga? Formatowanie Elisp
Łukasz
Formatowanie jest z konieczności subiektywne. Nie jestem pewien, czy mógłbyś zrobić coś lepszego niż nieco lepsza wersja pp.
shosti
@ King Dzięki, to z pewnością ma znaczenie.
Malabarba

Odpowiedzi:

10

Oto jak Lispy ponownie sformatował go dla mnie (naciskając Mpo obu stronach wyrażenia):

(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))))

Aby przejść od tego do określonego formatowania, naciśnij qk C-m [.

abo-abo
źródło
(local-set-key (kbd "s-8") #'lispy-multiline) (local-set-key (kbd "s-*") #'lispy-oneline)
grettke
8

Jak sugerują inni w komentarzach, „formatowanie” może oznaczać różne rzeczy.

Jeśli wcięcie jest dość konwencjonalne, spróbuj użyć C-M-q(polecenie indent-pp-sexpw trybach Lisp) z kursorem gdzieś wewnątrz seksu najwyższego poziomu, który chcesz ponownie wciąć (np. defunSexp).

Nie, nie jest to „automatyczne” wcięcie, ale korzystanie z niego może stać się nawykiem. ;-)

W przypadku rzeczy innych niż wcięcie musisz albo zrobić to ręcznie, albo wykonać własne polecenie (polecenia) formatowania lub znaleźć jakieś takie.

Zobacz także podręcznik Emacsa, węzeł Wielowierszowe wcięcie i podręcznik Elisp, węzeł Mode-Specific Indent.

Drew
źródło
3
Dzięki, jestem całkiem zadowolony z elips wcięcia, szukam czegoś, co wie, kiedy przekroczyć granice. :-) I tak, rozumiem, że to subiektywne. :-(
Malabarba
M-q( fill-paragraph) może czasem być użyteczne do łamania linii w trybie Emacs-Lisp, w zależności od kontekstu. Ale zapewne też szukasz wyrównania ...
Drew,