Emacs 错误的类型参数:listp,在.dir-locals.el中加载后求值

Emacs 错误的类型参数:listp,在.dir-locals.el中加载后求值,emacs,eval-after-load,Emacs,Eval After Load,我正在写我的第一个.dir locals.el,我在*消息*中得到一个错误 代码: 跟踪: .dir-locals error: Wrong type argument: listp, eval-after-load 我做错了什么?对于.dir locals.el文件,有一种特定的格式。您需要将特定模式与特定变量相关联。如果要为所有模式应用变量,请使用nil。以下工作: ((nil (eval-after-load "grep" '(add-to-list 'grep-find-ignor

我正在写我的第一个
.dir locals.el
,我在
*消息*
中得到一个错误

代码:

跟踪:

.dir-locals error: Wrong type argument: listp, eval-after-load

我做错了什么?

对于
.dir locals.el
文件,有一种特定的格式。您需要将特定模式与特定变量相关联。如果要为所有模式应用变量,请使用
nil
。以下工作:

((nil
  (eval-after-load "grep" '(add-to-list 'grep-find-ignored-directories "blur"))))

然而,这可能不是(可能不是)你想要的。如果在编辑此目录中的任何文件之前加载
grep
,则不会产生任何效果。

此处介绍了
.dir locals.el
的常规格式:

  • C-hig
    (emacs)目录变量
要计算代码,必须使用特殊的伪变量名
eval
,如所述:

  • C-hig
    (emacs)指定文件变量
e、 g:

但是,
grep find ignored directories
不是一个自动缓冲区局部变量,我们在这里没有明确地将其设置为目录局部变量(这里讨论的“局部变量”是
eval
),因此当
grep find ignored directories
以这种方式设置时,它是全局设置的,这肯定不是你想要的

您可以尝试以下方法:

((nil . ((eval . (eval-after-load "grep"
                   '(add-to-list 
                     (make-local-variable 'grep-find-ignored-directories) 
                     "blur"))))))
但事实上,这仍然是错误的,因为一旦您访问了此目录下的文件,加载后的
eval
(这是一个全局设置)将在加载
grep
后立即触发,无论您当时在哪个缓冲区,因此您可以轻松添加“模糊”在调用grep的某个不需要的缓冲区中本地添加该值,同时也无法将其添加到您想要添加该值的任何先前访问的缓冲区中

最简单的解决方案可能是在设置变量之前强制要求grep:

((nil . ((eval . (progn
                   (require 'grep)
                   (add-to-list 
                    (make-local-variable 'grep-find-ignored-directories)
                    "blur"))))))
这确保目录下的所有文件都将获得本地值(而其他地方的文件则不会)

现在,这是解决一般问题的一种方法,但看看这个具体案例,C-hv
grep find ignored directories
,这个变量提供了一些功能,可以使解决方案更简单,并且不需要不必要地加载grep

.dir-locals.el文件可以设置局部变量,因此:

((nil . ((my-ignore-blur-p . t))))
在.emacs中,您可以执行以下操作:

(取消my-ignore-blur-p(dir)
“设置'my-ignore-blur-p'局部变量时,返回非nil。”
(局部变量-if-set-p'my-ignore-blur-p))
(加载后评估“grep”
“(添加到列表”grep find ignored directories
(犯人的my-ignore-blur-p“blur”))
然后,当您从设置了此局部变量的任何缓冲区执行
rgrep
时,我们在全局
grep find ignored directories
变量中指定的自定义函数将返回一个非
nil
值,这将导致“blur”包含在忽略目录列表中

(注意,我对函数和变量使用了相同的名称,因为我可以--elisp对变量和函数有单独的名称空间--但这不是必需的。为清楚起见,我指的是加载后的
eval
代码中的函数,以及函数代码和.dir-locals.el文件中的变量)

或者,您可以将
my-ignore-blur-p
函数的行为建立在
dir
参数(正在搜索的目录)的基础上,并完全忽略局部变量。这将使从列表中包含或省略“blur”的决定完全独立于启动rgrep命令的缓冲区,这可能更理想



1如果您希望在
grep find ignored directories
中全局添加“blur”,那么根本不要使用
.dir locals.el
——只需在加载后将
eval调用添加到.emacs文件中即可。

恐怕这完全是错误的。首先,使用符号
eval after load
设置一个局部变量。第二,如果它确实按照您的想法执行,则绝对会对加载grep后访问的文件进行评估,因为如果加载了库,则会立即对
eval after load
主体进行评估。(你说得对,这不是你想做的,记住;只是没有正确的理由。)很有道理。解释了为什么我得到的唯一自动完成是eval,而不是加载后eval。谢谢你的更正。
((nil . ((eval . (progn
                   (require 'grep)
                   (add-to-list 
                    (make-local-variable 'grep-find-ignored-directories)
                    "blur"))))))
((nil . ((my-ignore-blur-p . t))))