2013-07-20 48 views
7

Thụt lề hiện tại cho cl-flet có vẻ thực sự xấu với tôi. Xem ví dụ:Emacs thụt đầu dòng thích hợp?

(defun foo (lst) 
    (cl-flet ((unusually-long-bar (x) 
           (1+ x) 
           (1+ x) 
           (1+ x))) 
    (mapcar #'unusually-long-bar lst))) 

tôi muốn đặt nó vào một cái gì đó hợp lý hơn, như:

(defun foo (lst) 
    (cl-flet ((unusually-long-bar (x) 
       (1+ x) 
       (1+ x) 
       (1+ x))) 
    (mapcar #'unusually-long-bar lst))) 

Làm thế nào tôi có thể làm điều này?

+1

'cl-flet' có biểu mẫu' (khai báo (thụt lề 1) ...) 'trong đó. Đây là những gì quyết định cách macro được thụt vào. Tôi không nghĩ rằng có một bản vá dễ dàng, nhưng bạn biết đấy, bạn có thể sử dụng tham chiếu hàm thay cho '1', và hàm đó sẽ được gọi với các biểu mẫu mà nó phải thụt lề, nhưng tôi không chắc về những điều chính xác nó sẽ trở lại. –

+0

Tại sao không chỉ đơn giản là phá vỡ tất cả các đối số cho chức năng 'bất thường-dài-bar', thay vào đó nếu gói một số và những người khác không? Bây giờ có vẻ như '(x)' khác biệt đáng kể so với các đối số khác. – Zelphir

Trả lời

6

Sau đây nên làm việc:

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

    )) 
+0

Điều này làm việc cho 'cl-flet', nhưng bây giờ các câu lệnh' if' của tôi là sai: cả hai mệnh đề 'sau đó' và' else' bây giờ ở cùng mức. –

+0

Đây là cách tiêu chuẩn để thụt lề 'if' trong lisp thông thường. Nếu nó làm phiền bạn, hãy thêm '(put 'if' common-lisp-indent-function 2)' – sabof

+0

Cảm ơn, nó hoạt động. Nhưng chỉ khi tôi đánh giá nó. Tôi đã cố gắng đặt nó là '~/.emacs', trong' emacs-lisp-mode-hook', trong 'eval-after-load' - không hoạt động. –

3

Bằng cách thêm vào câu trả lời Sabof của, đây là một đoạn mà các bản sao quy tắc thụt vào từ tất cả những biểu tượng Common Lisp để cl- tiền tố tương đương Emacs của họ, khi sau này tồn tại:

(load-library "cl-indent") ; defines the common-lisp-indent-function properties 
(cl-loop for symbol being the symbols 
     for cl-indent-rule = (get symbol 'common-lisp-indent-function) 
     for elisp-equivalent = (intern-soft (concat "cl-" (symbol-name symbol))) 
     when (and cl-indent-rule elisp-equivalent (fboundp elisp-equivalent)) 
     do (put elisp-equivalent 'common-lisp-indent-function cl-indent-rule)) 
+0

Không hoạt động, thật không may. –

+0

Tôi nghĩ rằng điều duy nhất còn thiếu ở đây là '(setq lisp-indent-function 'phổ biến-lisp-indent-function)'. –