Perintah yang memformat (cantik) kode Elisp

21

Katakanlah saya memiliki fungsi yang terlihat seperti berikut (seperti yang sering terjadi saat mencetak keluaran 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))))

Saya ingin perintah yang dapat mengubah itu menjadi sesuatu yang manusia akan tulis, seperti berikut ini.

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

Saya mengerti bahwa ada lebih dari satu cara untuk memformat sepotong kode elisp , dan manusia yang berbeda melakukannya secara berbeda. Selanjutnya, saya mengerti itu agak subjektif. Tetapi harus cukup mudah untuk membuat seperangkat aturan yang menghasilkan kode yang setidaknya layak.

Saya sebenarnya sulit melakukan ini sendiri beberapa waktu lalu, tetapi saya pikir lebih baik untuk bertanya sebelum saya menemukan kembali kemudi.

Catatan, saya mengetahui fungsi pp , tetapi tidak cukup sampai di sana:

(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
sumber
4
Apakah ini membantu? Pemformatan Elisp
Lukas
Pemformatan harus subjektif. Saya tidak yakin Anda bisa melakukan lebih baik daripada versi yang sedikit lebih baik pp.
shosti
@ Raja Terima kasih, ini pasti relevan.
Malabarba

Jawaban:

10

Inilah cara lispy memformat ulang untuk saya (dengan menekan Mdi kedua ujung ekspresi):

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

Untuk beralih dari ini ke format yang Anda tentukan, tekan qk C-m [.

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

Seperti yang disarankan orang lain dalam komentar, "memformat" dapat berarti hal yang berbeda.

Untuk indentasi yang cukup konvensional, coba gunakan C-M-q(perintah indent-pp-sexpdalam mode Lisp) dengan kursor di suatu tempat di dalam sexp tingkat atas yang ingin Anda indentasi ulang (misalnya defunsexp).

Tidak, ini bukan lekukan "otomatis", tetapi ini bisa menjadi kebiasaan untuk menggunakannya. ;-)

Untuk hal-hal selain lekukan, Anda harus melakukannya secara manual atau menggulung perintah "pemformatan" Anda sendiri atau menemukan beberapa yang sudah ada.

Lihat juga manual Emacs, simpul Indentasi Multi-line dan manual Elisp, simpul Mode-Specific Indent.

Drew
sumber
3
Terima kasih, saya cukup senang dengan indentasi elisp, saya mencari sesuatu yang tahu kapan harus memutuskan garis. :-) Dan ya saya mengerti itu subjektif. :-(
Malabarba
M-q( fill-paragraph) terkadang dapat berguna untuk pemecahan garis dalam mode Emacs-Lisp, tergantung pada konteksnya. Tetapi Anda mungkin juga mencari keberpihakan ...
Drew