如何将php-mode的设置从.emacs移动到.dir-locals.el?

8

这是我的.emacs文件的内容。

(add-hook 'php-mode-hook
        (lambda ()
        (c-set-style "bsd")
        (setq indent-tabs-mode t)
        (setq c-basic-offset 4)
        (setq tab-width 4)
        (c-set-offset 'arglist-close 'c-lineup-arglist-operators)
        (c-set-offset 'arglist-intro '+)
        (c-set-offset 'arglist-cont-nonempty 'c-lineup-math)
        (c-set-offset 'case-label '+)       
        ))

我想将这些格式设置移动到项目特定目录。虽然我可以轻松地对setq语句进行操作(例如 setq (indent-tabs-mode t)),但是我无法对函数调用进行操作,例如:(c-set-offset 'arglist-intro '+)。
这是我放在我的.dir-locals.el中的内容:
;;; Directory Local Variables
;;; See Info node `(emacs) Directory Variables' for more information.

    ((php-mode
        (c-set-style "bsd")
        (indent-tabs-mode . t)
        (c-basic-offset . 4)
        (tab-width . 4)
        (c-set-offset 'arglist-close 'c-lineup-arglist-operators)
        (c-set-offset 'arglist-intro 'c-basic-offset)
        (c-set-offset 'arglist-cont-nonempty 'c-lineup-math)
        (c-set-offset 'case-label '+)       
      ))

这里出了什么问题?
1个回答

14

目录本地变量只是变量,而不是要评估的elisp表单。幸运的是,可以通过eval 伪变量来提供:

((php-mode
  (indent-tabs-mode . t)
  (c-basic-offset . 4)
  (tab-width . 4)
  (eval . (progn
            (c-set-style "bsd")
            (c-set-offset 'arglist-close 'c-lineup-arglist-operators)
            (c-set-offset 'arglist-intro 'c-basic-offset)
            (c-set-offset 'arglist-cont-nonempty 'c-lineup-math)
            (c-set-offset 'case-label '+)))))

当 Emacs 遇到这段代码时,它会要求您确认代码是否安全,并且如果您愿意,它会将其保存到您的初始化文件的 custom-set-variables 部分中的 safe-local-variable-values 列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接