错误的类型参数:listp,.dir-locals.el中的eval-after-load

时间:2013-04-26 13:19:36

标签: emacs eval-after-load

我正在写第一个.dir-locals.el,我在*Messages*收到错误。

代码:

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

跟踪:

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

我做错了什么?

2 个答案:

答案 0 :(得分:8)

此处描述.dir-locals.el的一般格式:

要评估代码,您必须使用特殊的伪变量名eval,如下所述:

e.g:

((nil . ((indent-tabs-mode . t)
         (eval . (eval-after-load "grep"
                   '(add-to-list 'grep-find-ignored-directories "blur")))
         (fill-column . 80)))
 (c-mode . ((c-file-style . "BSD")
            (subdirs . nil))))

然而grep-find-ignored-directories不是一个自动的缓冲区局部变量,我们在这里没有明确地将它设置为目录局部变量(这里的'局部变量'是{ {1}}),所以当eval以这种方式设置时,它会全局设置,这肯定不是你想要的 1

您可以尝试这样的事情:

grep-find-ignored-directories

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

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

grep

这确保了目录下的所有文件都将获得本地值(而其他文件则不会)。

现在,这是解决一般问题的一种方法,但是看看这个特定情况, Ch v ((nil . ((eval . (progn (require 'grep) (add-to-list (make-local-variable 'grep-find-ignored-directories) "blur")))))) ,这个变量提供了一些功能这可以使解决方案更简单,并且不需要不必要地加载grep。

你的.dir-locals.el文件可以设置一个局部变量:

grep-find-ignored-directories

在您的.emacs中,您可以执行以下操作:

((nil . ((my-ignore-blur-p . t))))

然后,当您从设置了此局部变量的任何缓冲区执行(defun my-ignore-blur-p (dir) "Return non-nil when the `my-ignore-blur-p' local variable is set." (local-variable-if-set-p 'my-ignore-blur-p)) (eval-after-load "grep" '(add-to-list 'grep-find-ignored-directories (cons 'my-ignore-blur-p "blur"))) 时,我们在全局rgrep变量中指定的自定义函数将返回非grep-find-ignored-directories值,这将导致“模糊”被包含在被忽略目录列表中。

(nb我对函数和变量都使用相同的名称,因为我可以 - elisp为变量和函数分别有单独的名称空间 - 但这不是必需的。为清楚起见,我指的是 nil代码中的函数,以及函数代码和.dir-locals.el文件中的变量

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


1 如果向dir全局添加“模糊”是你想要的,那么就不要使用grep-find-ignored-directories - 只是将您的.dir-locals.el电话添加到.emacs文件中。

答案 1 :(得分:0)

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

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

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