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

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 [.


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


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.