Comando que formatea (prettifica) el código Elisp


21

Supongamos que tengo una función similar a la siguiente (como suele ser el caso al imprimir resultados de 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))))

Me gustaría un comando que pueda convertir eso en algo que un humano escribiría, como el siguiente.

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

Entiendo que hay más de una forma de formatear un código de Elisp , y que diferentes seres humanos lo hacen de manera diferente. Además, entiendo que es algo subjetivo. Pero debería ser bastante fácil crear un conjunto de reglas que dé como resultado un código que sea al menos decente.

De hecho, pensé en hacer esto hace un tiempo, pero pensé que era mejor preguntar antes de reinventar la rueda.

Tenga en cuenta que conozco la función pp , pero no llega allí:

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

44
¿Esto ayuda? Formateo de Elisp
Lucas

El formateo es necesariamente subjetivo. No estoy seguro de que puedas hacerlo mejor que una versión ligeramente mejor de pp.
shosti

@ King Gracias, ciertamente es relevante.
Malabarba

Respuestas:


10

Así es como lispy lo volvió a formatear (presionando Men cualquier extremo de la expresión):

(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 pasar de esto al formato que especificó, presione qk C-m [.


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

8

Como otros han sugerido en los comentarios, "formatear" puede significar cosas diferentes.

Para la sangría que es bastante convencional, intente usar C-M-q(comando indent-pp-sexpen modos Lisp) con el cursor en algún lugar dentro del sexp de nivel superior que desea volver a sangrar (por ejemplo, el defunsexp).

No, esto no es una sangría "automática", pero puede convertirse en un hábito usarla. ;-)

Para otras cosas que no sean sangría, deberá hacerlo manualmente o rodar sus propios comandos de "formateo" o buscar algunos de ellos.

Consulte también el manual de Emacs, nodo Sangría multilínea y el manual de Elisp, nodo Mode-Specific Indent.


3
Gracias, estoy bastante contento con la sangría de Elisp, estoy buscando algo que sepa cuándo romper las líneas. :-) Y sí, entiendo que es subjetivo. :-(
Malabarba

M-q( fill-paragraph) a veces puede ser útil para el salto de línea en el modo Emacs-Lisp, según el contexto. Pero probablemente también estés buscando la alineación ...
Drew
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.