Comando che formatta (pre-imposta) il codice Elisp


21

Diciamo che ho una funzione simile alla seguente (come spesso accade quando si stampa un output 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))))

Vorrei un comando che potesse trasformarlo in qualcosa che un essere umano avrebbe scritto, come il seguente.

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

Capisco che esiste più di un modo per formattare un pezzo di codice elisp e diversi esseri umani lo fanno in modo diverso. Inoltre, capisco che è in qualche modo soggettivo. Ma dovrebbe essere abbastanza facile elaborare un insieme di regole che si traducano in un codice almeno decente.

In realtà ho pensato di farlo da solo qualche tempo fa, ma ho pensato che sarebbe meglio chiedere prima di reinventare la ruota.

Nota, sono a conoscenza della funzione pp , ma non ci arriva proprio:

(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
questo aiuta? Formattazione Elisp
Luca,

La formattazione è necessariamente soggettiva. Non sono sicuro che potresti fare di meglio di una versione leggermente migliore di pp.
shosti,

@King Grazie, è sicuramente rilevante.
Malabarba,

Risposte:


10

Ecco come lispy lo ha riformattato per me (premendo Malle estremità dell'espressione):

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

Per passare da questo alla formattazione specificata, premere qk C-m [.


(local-set-key (kbd "s-8") #'lispy-multiline) (local-set-key (kbd "s-*") #'lispy-oneline)
Grettke,

8

Come altri hanno suggerito nei commenti, "formattazione" può significare cose diverse.

Per un rientro piuttosto convenzionale, prova a usare C-M-q(comando indent-pp-sexpin modalità Lisp) con il cursore da qualche parte all'interno del sexp di livello superiore che desideri rientrare nel rientro (ad esempio defunsexp).

No, questo non è un rientro "automatico", ma può diventare un'abitudine usarlo. ;-)

Per cose diverse dal rientro dovrai farlo manualmente o ruotare i tuoi comandi di "formattazione" o trovarne alcuni esistenti.

Vedi anche il manuale Emacs, nodo Rientro multilinea e il manuale Elisp, nodo Mode-Specific Indent.


3
Grazie, sono abbastanza contento del rientro elisp, sto cercando qualcosa che sappia quando spezzare le righe. :-) E sì, capisco che è soggettivo. :-(
Malabarba,

M-q( fill-paragraph) a volte può essere utile per interrompere la linea in modalità Emacs-Lisp, a seconda del contesto. Ma probabilmente stai cercando anche un allineamento ...
Disegnato il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.