在 .dir-locals.el 中定义新变量
Define new variable in .dir-locals.el
我是 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))))
这个有效
((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")))))
根据How do I set buffer local variable from Eval: in .dir-local.el?的例子,我尝试了其他方法但失败了。
((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"))))))
和
((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))))
虽然setq
是在elisp代码中设置变量的正确命令,.dir-locals.el
是一个特殊的文件,需要以某种格式定义变量。
要在您的设置中使用变量,请参阅 this answer 相关问题。
.dir-locals.el
文件应该包含一个特殊构造的列表,它将主要模式名称(符号)映射到列表(请参阅 Emacs Lisp 参考手册中的 Association Lists)。当启用指定的主要模式时,每个列表条目都包含一个变量名和分配给该变量的目录本地值。您可以指定 nil
而不是模式名称,这意味着列表适用于任何模式;或者您可以指定子目录名称(字符串),在这种情况下,列表适用于该子目录中的所有文件。
这是一个 .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
和填充列,并为任何 C 源文件设置缩进样式。特殊的 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
.
您可以使用特殊关键字 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))))
因为在 setq
形式中设置 clang-args
成功时,下面的两个变量定义将 符号 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")))))
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))))))
我认为第一个更具可读性,而第二个可能更易于维护,因为只需在一个位置更改值。
附录: 请注意下面 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))))))
我是 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))))
这个有效
((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")))))
根据How do I set buffer local variable from Eval: in .dir-local.el?的例子,我尝试了其他方法但失败了。
((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"))))))
和
((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))))
虽然setq
是在elisp代码中设置变量的正确命令,.dir-locals.el
是一个特殊的文件,需要以某种格式定义变量。
要在您的设置中使用变量,请参阅 this answer 相关问题。
.dir-locals.el
文件应该包含一个特殊构造的列表,它将主要模式名称(符号)映射到列表(请参阅 Emacs Lisp 参考手册中的 Association Lists)。当启用指定的主要模式时,每个列表条目都包含一个变量名和分配给该变量的目录本地值。您可以指定 nil
而不是模式名称,这意味着列表适用于任何模式;或者您可以指定子目录名称(字符串),在这种情况下,列表适用于该子目录中的所有文件。
这是一个 .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
和填充列,并为任何 C 源文件设置缩进样式。特殊的 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
.
您可以使用特殊关键字 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))))
因为在 setq
形式中设置 clang-args
成功时,下面的两个变量定义将 符号 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")))))
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))))))
我认为第一个更具可读性,而第二个可能更易于维护,因为只需在一个位置更改值。
附录: 请注意下面 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))))))