我是emacs的新手。如何在.dir-locals.el中定义和使用新变量?
这是我的.dir-locals.el,它没有用。
(setq clang_args '("-isystem/usr/include/glib-2.0"
"-isystem/usr/lib/glib-2.0/include"))
((c-mode . ((company-clang-arguments . clang_args)
(flycheck-clang-args . clang_args))))
Run Code Online (Sandbox Code Playgroud)
这有效
((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")))))
Run Code Online (Sandbox Code Playgroud)
根据“ 如何在.dir-local.el中从Eval:设置缓冲区局部变量”中的示例?,我尝试了其他方法,但失败了。
((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"))))))
Run Code Online (Sandbox Code Playgroud)
和
((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))))
Run Code Online (Sandbox Code Playgroud)
虽然setq是在 elisp 代码中设置变量的正确命令,但它.dir-locals.el是一个特殊文件,需要以某种格式定义变量。
要在您的设置中使用变量,请参阅相关问题的答案。
来自GNU Emacs 手册:
该.dir-locals.el文件应该包含一个特殊构造的列表,它将主要模式名称(符号)映射到列表(请参阅Emacs Lisp 参考手册中的关联列表)。当启用指定的主要模式时,每个 alist 条目都包含一个变量名称和要分配给该变量的目录本地值。您可以指定nil,而不是模式名称,这意味着 alist 适用于任何模式;或者您可以指定子目录名称(字符串),在这种情况下,allist 适用于该子目录中的所有文件。
下面是一个.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"))))))
Run Code Online (Sandbox Code Playgroud)
这indent-tabs-mode为目录树中的任何文件设置和填充列,以及任何 C 源文件的缩进样式。特殊的 subdirs 元素不是一个变量,而是一个特殊的关键字,它表示 C 模式设置仅应用于当前目录,而不应用于任何子目录。最后,它为 src/imported 子目录中的任何文件指定不同的 ChangeLog 文件名。
.dir-locals.el您可以使用命令,而不是手动编辑文件M-x add-dir-local-variable。这会提示输入模式或子目录名称以及变量和值,并添加定义目录局部变量的条目。M-x delete-dir-local-variable删除一个条目。M-x copy-file-locals-to-dir-locals将当前文件中的文件局部变量复制到.dir-locals.el.
您可以使用special关键字eval执行任意Lisp代码,例如定义临时变量。但是,随后您将无法在后续的列表样式变量声明中使用该变量。也就是说,以下操作无效:
((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))))
Run Code Online (Sandbox Code Playgroud)
因为当设置clang-args成功时setq,下面的两个变量定义将符号 分别分配clang-args给company-clang-arguments和flycheck-clang-args,而不是先前定义的变量 的值clang-args。但是,有两个选项可以起作用:
1)两次使用相同的字符串文字:
((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")))))
Run Code Online (Sandbox Code Playgroud)
2)在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))))))
Run Code Online (Sandbox Code Playgroud)
在我看来,第一个更具可读性,而第二个则可能更具维护性,因为只需要在一个位置进行值的更改即可。
附录:在下面的注释中注明phils:他的建议是在第二个选项中替换set为setq-local。这将导致以下结果:
((c-mode . ((eval . (let ((clang-args '("-isystem/usr/include/glib-2.0"
"-isystem/usr/lib/glib-2.0/include")))
(setq-local company-clang-arguments clang-args
flycheck-clang-args clang-args))))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2395 次 |
| 最近记录: |