2013-07-20 10 views
7

L'indentazione attuale per cl-flet mi sembra davvero brutta. Si veda ad esempio:Rientri indentazione di cl-flet di Emacs?

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

mi piacerebbe impostare a qualcosa di più sensato, come:

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

Come posso fare questo?

+1

'cl-flet' ha un' '(dichiara (indent 1) ...)' in esso. Questo è ciò che decide come la macro è rientrata. Non penso che ci sia una patch facile, ma solo per quello che sai, puoi usare un riferimento di funzione al posto di '1', e quella funzione verrà chiamata con le forme che deve indentare, ma non sono sicuro riguardo le cose esatte che dovrebbe restituire. –

+0

Perché non semplicemente rompere tutti gli argomenti alla funzione 'insolitamente-long-bar', invece se ne avvolgono alcuni e altri no? Ora sembra che '(x)' fosse significativamente diverso dagli altri argomenti. – Zelphir

risposta

6

Il seguente dovrebbe funzionare:

(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

Questo funziona per 'cl-flet', ma ora le mie istruzioni' if' sono fuorvianti: entrambe le clausole 'then' e' else' ora sono allo stesso livello. –

+0

Questo è il modo standard per indentare 'if' in common lisp. Se ti dà fastidio, aggiungi '(metti 'se' common-lisp-indent-function 2)' – sabof

+0

Grazie, funziona. Ma solo quando lo valuto. Ho provato a metterlo '~/.emacs', in' emacs-lisp-mode-hook', in 'eval-after-load' - non funziona. –

3

A titolo di aggiunta alla risposta di Sabof, ecco un frammento di che, se questi ultimi esistono copie regole di rientro da tutti i simboli Common Lisp ai loro cl- equivalenti Emacs prefissati,:

(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

Purtroppo non funziona. –

+0

Penso che l'unica cosa che manca qui sia '(setq lisp-indent-function 'common-lisp-indent-function)'. –

Problemi correlati