4

我正在写我的第一个.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

我究竟做错了什么?

4

2 回答 2

8

的一般格式.dir-locals.el如下所述:

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

例如:

((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.eleval-after-load

于 2013-04-27T01:06:50.117 回答
-1

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

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

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

于 2013-04-26T14:02:56.577 回答