2013-07-20 19 views
7

cl-flet için geçerli girinti bana çok çirkin görünüyor. örneğin bakınız:Emacs uygun cl-flet girinti?

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

ben gibi, daha mantıklı bir şeye ayarlamak istiyorum:

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

Bunu nasıl yapabilirim?

+1

'cl-flet' içinde bir' (declare (indent 1) ...) formu vardır. Makronun nasıl girileceğine karar verir. Kolay bir yama olduğunu sanmıyorum, ama bildiğiniz gibi, '1' yerine bir işlev referansı kullanabilirsiniz ve bu işlev girintilemek zorunda olduğu formlarla çağrılacaktır, ancak emin değilim tam olarak geri dönmesi gereken şeyler. –

+0

Niçin bazılarını ve başkalarını değil, tüm argümanları 'alışılmadık-uzun-bar 'işlevine neden ayırmıyoruz? Şimdi (x) 'in diğer argümanlardan önemli ölçüde farklı olduğu anlaşılıyor. – Zelphir

cevap

6

şu çalışmalıdır:

Sabof cevabı eklenmesi arada
(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

Bu "cl-flet" için çalışır, ancak şimdi "if" ifadeleri yanlış yönlendirildi: hem "sonra" hem de "else" cümleleri aynı düzeyde. –

+0

Bu, ortak lisp'de "if" ifadesini girmenin standart yoludur. Eğer sizi rahatsız ederse, '(' ortak 'lisp-indent-function 2' yazın) ' – sabof

+0

'u ekleyin, teşekkürler. Ama sadece bunu değerlendirdiğimde. Bunu, “post-after-load” yazısında emacs-lisp-mode-hook'da '~/.emacs' denemeye çalıştım - işe yaramıyor. –

3

, burada kendi cl- öneki Emacs eşdeğeri, tüm Common Lisp semboller kopyalayan girinti kurallarını ikincisi var snippet'idir:

+0

Maalesef işe yaramıyor. –

+0

Bence burada eksik olan tek şey '(setq lisp-indent-function 'ortak-lisp-indent-function)' dır. –