Commande qui formate (améliore) le code Elisp

21

Disons que j'ai une fonction qui ressemble à ce qui suit (comme c'est souvent le cas lors de l'impression d'une sortie 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))))

Je voudrais une commande qui puisse transformer cela en quelque chose qu'un humain écrirait, comme ce qui suit.

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

Je comprends qu'il existe plus d'une façon de formater un morceau de code elisp , et différents êtres humains le font différemment. De plus, je comprends que c'est quelque peu subjectif. Mais il devrait être assez facile de trouver un ensemble de règles qui aboutisse à un code au moins décent.

J'ai pensé à le faire moi-même il y a quelque temps, mais j'ai pensé qu'il valait mieux demander avant de réinventer la roue.

Remarque, je connais la fonction pp , mais elle n'y arrive pas vraiment:

(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
la source
4
est-ce que cela aide? Elisp Formatting
Luke
Le formatage est nécessairement subjectif. Je ne suis pas sûr que vous puissiez faire mieux qu'une version légèrement meilleure de pp.
shosti
@King Merci, c'est certainement pertinent.
Malabarba du

Réponses:

10

Voici comment lispy l'a reformaté pour moi (en appuyant Msur l'une des extrémités de l'expression):

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

Pour passer de cela au formatage que vous avez spécifié, appuyez sur qk C-m [.

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

Comme d'autres l'ont suggéré dans les commentaires, le «formatage» peut signifier différentes choses.

Pour une indentation assez conventionnelle, essayez d'utiliser C-M-q(commande indent-pp-sexpen modes Lisp) avec le curseur quelque part à l'intérieur du sexp de niveau supérieur que vous souhaitez defunréindenter (par exemple, le sexp).

Non, ce n'est pas une indentation "automatique", mais cela peut devenir une habitude de l'utiliser. ;-)

Pour les choses autres que l'indentation, vous devrez soit le faire manuellement, soit lancer vos propres commandes de «formatage», soit en trouver de telles.

Voir également le manuel Emacs, nœud Retrait multiligne et le manuel Elisp, nœud Mode-Specific Indent.

A dessiné
la source
3
Merci, je suis assez content de l'indentation elisp, je cherche quelque chose qui sait quand casser les lignes. :-) Et oui je comprends que c'est subjectif. :-(
Malabarba
M-q( fill-paragraph) peut parfois être utile pour les sauts de ligne en mode Emacs-Lisp, selon le contexte. Mais vous cherchez probablement aussi l'alignement ...
Drew