Thụt vào danh sách hằng


7

Việc thụt mã Emacs của mã lac Emacs thực sự tuyệt vời, ngoại trừ một điều:

(defconst one-to-ten '(one two three
                           four five six seven
                           eight nine ten))

Đây thực sự là cách ưa thích để thụt lề khối này? Như trái ngược với

(defconst one-to-ten '(one two three
                       four five six seven
                       eight nine ten))

Tôi thấy nó đặc biệt khó hiểu khi so sánh với mặc định cho alists:

(defconst one-to-ten '((one . 1) (two . 2) (three . 3)
                       (four . 4) (five . 5) (six . 6) (seven . 7)
                       (eight . 8) (nine . 9) (ten . 10)))

Có một lý do cho hành vi này? Tôi có thể có thể hiểu nó cho các danh sách được trích dẫn lại, vì nó sẽ mang lại sự thụt lề tốt hơn cho các macro, nhưng còn các danh sách thì sao?


Phần quy ước mã hóa của tài liệu hướng dẫn khá rõ ràng về điều này, btw:Indent the file using the default indentation parameters.
Clément

3
Các quy ước mã hóa có thể nói rằng theo quy ước, chúng tôi tôn trọng thụt lề mặc định, nhưng điều đó không cung cấp lý do tại sao thụt lề mặc định là như vậy. Không có gì trong các quy ước mã hóa nói rằng tại sao một danh sách không đổi được thụt vào như nó là. (Đây là giống như một phụ huynh mệt trả lời, để đáp ứng với 99 " "Tại sao?" Chỉ vì ".)
Drew

4
@EmacsUser: Tất nhiên rồi. Ý bạn là sao? Câu hỏi được đặt ra là " Có lý do cho hành vi này không? " Tại sao lại quy ước thụt lề này? Các quy ước không rơi khỏi bầu trời. Và đôi khi chúng được thay đổi. Nếu câu trả lời duy nhất được đưa ra cho Tại sao? là " Đó là quy ước ", đó không phải là câu trả lời nào cả.
vẽ

3
@EmacsUser: Không ai tranh cãi với "quan điểm" của bạn. Câu hỏi là một trong những tốt. Có thể có lý do tốt cho việc chọn mặc định này. Hay không. Có thể có lý do cho một vết lõm thay thế. Không có gì sai khi đặt câu hỏi.
vẽ

3
@ Clément: FWIW, cá nhân tôi nghĩ rằng đây là một lỗi và đã có những thay đổi xung quanh phần này của chế độ Elisp "gần đây", vì vậy bạn có thể muốn M-x report-emacs-bug.
Stefan

Câu trả lời:


2

Dưới đây là các cài đặt tôi đang sử dụng để sửa lỗi thụt lề:

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

Tôi đã cố gắng khắc phục vết lõm Elisp tại một thời điểm, nhưng nó quá phức tạp và tôi đã bỏ cuộc. Nhưng các thiết lập ở trên đã hoạt động tốt trong nhiều năm.


Bạn có thể vui lòng giải thích ngắn gọn những gì putgethình thức làm gì? Nó có thay thế các thể hiện cl-fletchức năng bằng fletvà các cl-labelsthể hiện labelschỉ trong common-lisp-indent-function? Nếu vậy, tại sao điều đó được thực hiện? Ngoài ra, thứ ba đặt làm gì? Tôi đọc puttài liệu nhưng vẫn không có ý nghĩa. Nó sẽ dịch thành "đặt giá trị common-lisp-indent-functiontài sản của ifbiểu tượng thành 2" nhưng điều đó không có ý nghĩa với tôi.
Kaushal Modi

Trong 3 trường hợp này, 'lisp-indent-function(tức là trường hợp mặc định) thực sự tốt hơn 'common-lisp-indent-function. Những cài đặt này làm cho vết lõm chuyển từ cái này sang cái khác.
abo-abo

1
Lưu ý: Đây chỉ là dòng đầu tiên trả lời câu hỏi này - tức là (setq lisp-indent-function 'common-lisp-indent-function). Phần còn lại không liên quan gì đến việc thụt lề để sử dụng cho một danh sách không đổi.
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.