我正在写我的第一个.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
我究竟做错了什么?
我正在写我的第一个.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
我究竟做错了什么?
的一般格式.dir-locals.el
如下所述:
(emacs) Directory Variables
RET要评估代码,您必须使用特殊的伪变量 name eval
,如下所述:
(emacs) Specifying File Variables
RET例如:
((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
不是一个自动缓冲区局部变量,我们没有在这里明确地将它设置为目录局部变量(这里有问题的“局部变量”是eval
),所以当以grep-find-ignored-directories
这种方式设置时,它是全局设置的,这肯定是不是你想要的1。
你可以尝试这样的事情:
((nil . ((eval . (eval-after-load "grep"
'(add-to-list
(make-local-variable 'grep-find-ignored-directories)
"blur"))))))
但实际上这仍然是错误的,因为一旦您访问了该目录下的文件,无论您当时处于哪个eval-after-load
缓冲区,该文件(这是一个全局设置)都会在加载后立即触发,因此您可以轻松在您调用 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 中,您可以执行以下操作:
(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
变量中指定的自定义函数将返回一个非nil
值,这将导致“模糊”包含在忽略目录列表中。
(nb 我为函数和变量使用了相同的名称,因为我可以——elisp 为变量和函数提供了单独的名称空间——但这不是必需的。为了清楚起见,我指的是代码中的函数,eval-after-load
并且函数代码中的变量和 .dir-locals.el 文件)。
或者您可以将my-ignore-blur-p
函数的行为基于dir
参数(正在搜索的目录),并完全忽略局部变量。这将使列表中包含或省略“模糊”的决定完全独立于您启动 rgrep 命令的缓冲区,这可能更可取。
1如果您想要将“模糊”添加到grep-find-ignored-directories
全局,那么根本不要使用- 只需将您的调用添加到您的 .emacs 文件中。.dir-locals.el
eval-after-load
该文件有特定的格式.dir-locals.el
。您需要将某种模式与某些变量相关联。如果要对所有模式应用变量,请使用nil
. 以下作品:
((nil
(eval-after-load "grep" '(add-to-list 'grep-find-ignored-directories "blur"))))
但是,这可能不是(可能不是)您想要的。如果您grep
在编辑此目录中的任何文件之前加载,则不会产生任何影响。