Comando que formata (pré-classifica) o código Elisp

21

Digamos que eu tenha uma função que se parece com a seguinte (como geralmente ocorre ao imprimir a saída 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))))

Eu gostaria de um comando que possa transformar isso em algo que um humano escreveria, como o seguinte.

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

Entendo que há mais de uma maneira de formatar um pedaço de código elisp , e diferentes seres humanos o fazem de maneira diferente. Além disso, eu entendo que é um pouco subjetivo. Mas deve ser bastante fácil criar um conjunto de regras que resultem em código que seja pelo menos decente.

Na verdade, eu pensei em fazer isso sozinho há um tempo, mas achei melhor perguntar antes de reinventar a roda.

Observe que estou ciente da função pp , mas ela não chega lá:

(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
fonte
4
Isso ajuda? Elisp Formatting
Luke
A formatação é necessariamente subjetiva. Não sei se você poderia fazer melhor do que uma versão um pouco melhor pp.
Shosti
@ King Obrigado, é certamente relevante.
Malabarba 25/09

Respostas:

10

Veja como o lispy o formatou para mim (pressionando Mem cada extremidade da expressão):

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

Para passar disso para a formatação especificada, pressione qk C-m [.

abo-abo
fonte
(local-set-key (kbd "s-8") #'lispy-multiline) (local-set-key (kbd "s-*") #'lispy-oneline)
grettke
8

Como outros sugeriram nos comentários, "formatação" pode significar coisas diferentes.

Para um recuo bastante convencional, tente usar C-M-q(comando indent-pp-sexpnos modos Lisp) com o cursor em algum lugar dentro do sexp de nível superior que você deseja recuar (por exemplo, defunsexp).

Não, isso não é um recuo "automático", mas pode se tornar um hábito usá-lo. ;-)

Para outras coisas além do recuo, você precisará fazer isso manualmente ou rolar seus próprios comandos de "formatação" ou encontrar alguns existentes.

Veja também o manual do Emacs, nó Multi-line Indent e o manual Elisp, nó Mode-Specific Indent.

Desenhou
fonte
3
Obrigado, estou muito feliz com o recuo do elisp, estou procurando por algo que saiba quando quebrar linhas. :-) E sim, eu entendo que é subjetivo. :-(
Malabarba
M-q( fill-paragraph) às vezes pode ser útil para quebra de linha no modo Emacs-Lisp, dependendo do contexto. Mas provavelmente você está à procura de alinhamento, bem ...
de Drew