在.dir-locals.el中定义新变量

时间:2015-10-11 08:30:05

标签: emacs elisp

我是emacs的新手。如何在.dir-locals.el中定义和使用新变量?

这是我的.dir-locals.el,它没有用。

((c-mode . ((company-clang-arguments . ("-isystem/usr/include/glib-2.0"
                                        "-isystem/usr/lib/glib-2.0/include"))
            (flycheck-clang-args . ("-isystem/usr/include/glib-2.0"
                                    "-isystem/usr/lib/glib-2.0/include")))))

这有效

((c-mode . ((eval . (setq company-clang-arguments ("-isystem/usr/include/glib-2.0"
                                                   "-isystem/usr/lib/glib-2.0/include"))
            (eval . (setq flycheck-clang-args ("-isystem/usr/include/glib-2.0"
                                               "-isystem/usr/lib/glib-2.0/include"))))))

根据How do I set buffer local variable from Eval: in .dir-local.el?的例子,我尝试了其他方法,但失败了。

((c-mode . ((eval . (setq clang_args ("-isystem/usr/include/glib-2.0"
                                      "-isystem/usr/lib/glib-2.0/include"))
            (company-clang-arguments . clang_args)
            (flycheck-clang-args . clang_args))))

cookie

2 个答案:

答案 0 :(得分:4)

您可以使用特殊关键字eval来执行任意lisp代码,例如,定义临时变量。但是,您不能在后续的alist样式变量声明中使用该变量。也就是说,以下内容不起作用:

((c-mode . ((eval . (setq clang-args ("-isystem/usr/include/glib-2.0"
                                      "-isystem/usr/lib/glib-2.0/include"))
            (company-clang-arguments . clang-args)
            (flycheck-clang-args . clang-args))))

因为在clang-args表单中设置setq成功时,下面的两个变量定义会将符号 clang-args分配给company-clang-arguments和{{ 1}}分别不是之前定义的变量 flycheck-clang-args的值。 但是,有两个选项可行:

1)使用相同的字符串文字两次:

clang-args

2)在((c-mode . ((company-clang-arguments . ("-isystem/usr/include/glib-2.0" "-isystem/usr/lib/glib-2.0/include")) (flycheck-clang-args . ("-isystem/usr/include/glib-2.0" "-isystem/usr/lib/glib-2.0/include"))))) 形式内进行实际的变量赋值:

eval

第一个在我看来更具可读性,而第二个可能更易于维护,因为只需要在一个位置进行值的更改。

附录((c-mode . ((eval . (let ((clang-args '("-isystem/usr/include/glib-2.0" "-isystem/usr/lib/glib-2.0/include"))) (setq company-clang-arguments clang-args flycheck-clang-args clang-args)))))) 注意下面的评论:他的建议是在第二个选项中将phils替换为set。这将导致以下结果:

setq-local

答案 1 :(得分:3)

虽然setq是在elisp代码中设置变量的正确命令,但.dir-locals.el是一个需要特定格式的变量定义的特殊文件。

要在您的设置中使用变量,请参阅this answer相关问题。

来自GNU Emacs Manual

.dir-locals.el文件应该包含一个特殊构造的列表,它将主要模式名称(符号)映射到alists(参见The Emacs Lisp Reference Manual中的Association Lists)。当启用指定的主模式时,每个alist条目都包含一个变量名和要分配给该变量的目录本地值。您可以指定nil,而不是模式名称,这意味着alist适用于任何模式;或者您可以指定子目录名称(字符串),在这种情况下,alist适用于该子目录中的所有文件。

以下是.dir-locals.el文件的示例:

((nil . ((indent-tabs-mode . t)
         (fill-column . 80)))
 (c-mode . ((c-file-style . "BSD")
            (subdirs . nil)))
 ("src/imported"
  . ((nil . ((change-log-default-name
              . "ChangeLog.local"))))))

这为目录树中的任何文件设置indent-tabs-mode和fill-column,以及任何C源文件的缩进样式。 special subdirs元素不是变量,而是一个特殊关键字,表示C模式设置仅应用于当前目录,而不应用于任何子目录。最后,它为src / imported子目录中的任何文件指定了不同的ChangeLog文件名。

您可以使用命令 M-x add-dir-local-variable ,而不是手动编辑.dir-locals.el文件。这会提示输入模式或子目录名称,以及变量和值,并添加定义目录本地变量的条目。 M-x delete-dir-local-variable 删除条目。 M-x copy-file-locals-to-dir-locals 将当前文件中的文件局部变量复制到.dir-locals.el

相关问题