Lệnh định dạng (tô điểm) Mã Elisp


21

Giả sử tôi có một chức năng giống như sau (thường là khi in đầu ra 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))))

Tôi muốn một lệnh có thể biến nó thành thứ mà con người sẽ viết, chẳng hạn như sau.

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

Tôi hiểu rằng có nhiều hơn một cách để định dạng một đoạn mã elisp và những con người khác nhau làm điều đó khác nhau. Hơn nữa, tôi hiểu nó hơi chủ quan. Nhưng nó khá dễ dàng để đưa ra một bộ quy tắc dẫn đến mã ít nhất là tốt.

Tôi thực sự đã nghĩ đến việc này một mình trước đây, nhưng tôi nghĩ rằng tốt hơn là nên hỏi trước khi tôi phát minh lại bánh xe.

Lưu ý, tôi biết về chức năng pp , nhưng nó không hoàn toàn đạt được điều đó:

(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
Không giúp đỡ à? Định dạng Elisp
Luke

Định dạng nhất thiết phải chủ quan. Tôi không chắc bạn có thể làm tốt hơn phiên bản tốt hơn một chút pp.
shosti

@King Cảm ơn, nó chắc chắn có liên quan.
Malabarba

Câu trả lời:


10

Đây là cách lispy định dạng lại nó cho tôi (bằng cách nhấn Mvào một trong hai biểu thức):

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

Để chuyển từ định dạng này sang định dạng mà bạn đã chỉ định, nhấn qk C-m [.


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

8

Như những người khác đã đề xuất trong các bình luận, "định dạng" có thể có nghĩa là những thứ khác nhau.

Để thụt lề khá thông thường, hãy thử sử dụng C-M-q(lệnh indent-pp-sexptrong chế độ Lisp) với con trỏ ở đâu đó bên trong sexp cấp cao nhất mà bạn muốn thụt lại (ví dụ: defunsexp).

Không, đây không phải là thụt "tự động", nhưng nó có thể trở thành thói quen sử dụng nó. ;-)

Đối với những thứ khác ngoài thụt lề, bạn sẽ cần thực hiện thủ công hoặc cuộn (các) lệnh "định dạng" của riêng bạn hoặc tìm một số lệnh hiện có như vậy.

Xem thêm hướng dẫn sử dụng Emacs, nút thụt dòng đa nút và hướng dẫn Elisp, nút Mode-Specific Indent.


3
Cảm ơn, tôi khá hài lòng với thụt đầu dòng, tôi đang tìm kiếm thứ gì đó biết khi nào nên ngắt dòng. :-) Và vâng tôi hiểu nó chủ quan. :-(
Malabarba

M-q( fill-paragraph) đôi khi có thể hữu ích cho ngắt dòng trong chế độ Emacs-Lisp, tùy thuộc vào ngữ cảnh. Nhưng có lẽ bạn cũng đang tìm kiếm sự liên kết ...
vẽ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.