2013-07-20 2 views
7

Текущий отступ для cl-flet кажется действительно уродливым для меня. См, например:Emacs собственно cl-flet отступы?

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

Я хотел бы установить его на что-то более разумным, как:

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

Как я могу это сделать?

+1

'cl-flet' имеет' (объявить (indent 1) ...) 'форму в нем. Это то, что решает, как макрос отступ. Я не думаю, что есть простой патч, но так, как вы знаете, вместо «1» вы можете использовать ссылку на функцию, и эта функция будет вызываться с формами, которые она должна отступать, но я не уверен в Точные вещи, которые он должен вернуть. –

+0

Почему бы просто не разбить все аргументы на функцию 'необычно-длинный-бар', а вместо того, чтобы обернуть некоторые и другие? Теперь похоже, что '(x)' значительно отличался от других аргументов. – Zelphir

ответ

6

должно работать:

(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

Это работает для 'cl-flet', но теперь мои операторы' if' ошибочны: обе статьи 'then' и' else' теперь находятся на одном уровне. –

+0

Это стандартный способ отступов 'if' в общем lisp. Если это вас беспокоит, добавьте '(put 'if' common-lisp-indent-function 2)' – sabof

+0

Спасибо, это работает. Но только когда я его оцениваю. Я попытался выразить это '~/.emacs', в' emacs-lisp-mode-hook', в 'eval-after-load' - не работает. –

3

путем добавления к ответу Sabof, вот отрывок, который копирует правила эксплуатации отступа от всех Common Lisp символов в их cl- префиксом эквиваленты 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

Не работает, к сожалению. –

+0

Я думаю, что единственное, что здесь отсутствует, это '(setq lisp-indent-function 'common-lisp-indent-function)'. –