我正在写第一个.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
我做错了什么?
答案 0 :(得分:8)
此处描述.dir-locals.el
的一般格式:
(emacs) Directory Variables
RET 要评估代码,您必须使用特殊的伪变量名eval
,如下所述:
(emacs) Specifying File Variables
RET 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
,则无效。