2013-07-20 20 views
7

Obecne wcięcie na cl-flet wydaje mi się bardzo brzydkie. Patrz na przykład:Emacs właściwe wcięcie kl-flet?

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

chciałbym ustawić go na coś bardziej sensownego, jak:

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

Jak mogę to zrobić?

+1

'cl-flet' ma w sobie formę' (deklaruj (wcięcie 1) ...) '. To właśnie decyduje o wcięciu makra. Nie sądzę, że jest łatwa łatka, ale żebyś wiedział, że możesz użyć odwołania do funkcji w miejsce "1", i ta funkcja zostanie wywołana z formularzami, które ma wcięcia, ale nie jestem pewien Dokładne rzeczy, które powinien powrócić. –

+0

Dlaczego nie po prostu rozbić wszystkie argumenty funkcji "niezwykle długi pasek", czy zamiast tego zawijać niektóre, a inne nie? Teraz wygląda na to, że '(x)' znacznie różniło się od innych argumentów. – Zelphir

Odpowiedz

6

Poniższa powinno działać:

(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

To działa dla 'cl-flet', ale teraz moje instrukcje' if' są źle przypisane: zarówno klauzule 'then' i' else' są teraz na tym samym poziomie. –

+0

Jest to standardowy sposób na wcięcie 'if' w typowym seplenie. Jeśli ci to przeszkadza, dodaj '(put 'jeśli' common-lisp-function-function 2)' – sabof

+0

Dzięki, działa. Ale tylko wtedy, gdy je oceniam. Próbowałem umieścić to '~/.emacs',' 'emacs-lisp-mode-hook', w' eval-after-load' - nie działa. –

3

drodze oprócz odpowiedzi Sabof, oto jest fragment, który, gdy ten ostatni istnieje kopie dotyczące użytkowania wcięcia ze wszystkich wspólnych symboli Lisp do ich cl- prefiksem ekwiwalentów Emacs:

(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

Nie działa niestety. –

+0

Myślę, że jedyną rzeczą, której tu brakuje, jest '(setq lisp-indent-function 'common-lisp-indent-function)'. –