Sửa đổi thụt lề của một số hình thức Emacs Lisp


8

Tôi muốn một số hình thức Emps Lisp được thụt lề như Common Lisp. Chẳng hạn, trong Emacs Lisp, ifđược thụt lề như thế này:

(if COND
    THEN
  ELSE)

Trong khi tôi thích nó như thế này:

(if COND
    THEN
    ELSE)

Tôi có thể làm điều này:

(setq lisp-indent-function #'common-lisp-indent-function)

Nhưng điều này tác động đến tất cả các hình thức, do đó phá vỡ sự thụt dòng của macro Emacs Lisp, giống như cl-letfvà bất kỳ macro nào do người dùng xác định.

Câu trả lời:


17

Câu trả lời:

Các biểu tượng cho các hàm và macro có một thuộc lisp-indent-functiontính mà bạn có thể đặt declarehoặc trong trường hợp của bạn, vì ifđã được xác định, bạn chỉ có thể sử dụng put.

Bạn có thể đọc về các giá trị tài sản có thể ở đây:

M-: (info "(elisp) Indenting Macros") return

ifCài đặt mặc định là 2nghĩa là hình thức thứ hai được đối xử đặc biệt và được bù đắp.

Bạn có thể thay đổi giá trị tài sản thành 'defunvà tất cả các hình thức cơ thể sẽ xếp hàng.

(put 'if 'lisp-indent-function 'defun)

Thực hành tốt nhất:

Điều quan trọng cần lưu ý là có một lý do cho phong cách thụt đầu dòng. iftrong Elisp KHÔNG giống như iftrong Lisp thông thường.

Lưu ý các chữ ký khác nhau:

Lisp thường gặp: (if TEST THEN &OPTIONAL ELSE)

Emacs Lisp: (if COND THEN ELSE...)

Trong Emacs lisp, bạn có thể có bao nhiêu biểu mẫu sau điều kiện bạn muốn nhưng chỉ có hình thức đầu tiên là mệnh đề THEN, tất cả các hình thức khác là một phần của mệnh đề ELSE.

Đây là ifbiểu mẫu Elisp hợp lệ không hợp lệ trong CL:

(if something
    (message "THEN")
  (message "all")
  (message "these")
  (message "run")
  (message "on")
  (message "ELSE"))

Điều này cho thấy tại sao điều quan trọng là mệnh đề THEN được thụt lề nhiều hơn, đó là làm cho nó nổi bật so với tất cả các mẫu ELSE.

Ngoài việc thụt lề rất quan trọng đối với khả năng phân tích mã của người dùng, nó cũng sẽ đi ngược lại các kiểu dáng được chấp nhận của elisp. 99.99999% (được tính toán kỹ lưỡng) của mã elisp mà bạn gặp sẽ sử dụng chính xác lược đồ thụt lề mặc định. Thay đổi thụt lề ifcho việc sử dụng của riêng bạn sẽ khiến bạn khó có thể làm việc trên những người khác và làm cho người khác khó làm việc với bạn.


2

Tôi thực sự sử dụng thụt lề Lisp chung, với thụt lề Elisp cho if. Bạn có thể tùy chỉnh một số mã tương tự như của tôi:

(setq lisp-indent-function 'common-lisp-indent-function)
(eval-after-load 'cl-indent
  `(progn
     (put 'cl-flet 'common-lisp-indent-function
          (get 'flet 'common-lisp-indent-function))
     (put 'cl-labels 'common-lisp-indent-function
          (get 'labels 'common-lisp-indent-function))
     (put 'if 'common-lisp-indent-function 2)))

Cảm ơn, nhưng điều này cũng sẽ yêu cầu tôi sửa lỗi thụt lề của tất cả các macro do người dùng xác định. Tôi thà đi theo con đường ngược lại và sửa chữa vết lõm ifnhư được thực hiện bởi lisp-indent-function.
Elena

Tôi đã có cấu hình này trong nhiều năm. Không có macro nào khác mà tôi cần để "sửa". Chỉ cần nhớ đặt một declaretuyên bố trong mỗi macro mới, đó là điều tốt để làm trong mọi trường hợp.
abo-abo
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.