每次我尝试创建或访问扩展名为".txt"的文件时,都会得到如下所示的堆栈跟踪:
Debugger entered--Lisp error: (wrong-number-of-arguments quote 0)
quote()
set-auto-mode-0(quote nil)
set-auto-mode()
normal-mode(t)
after-find-file(nil t)
find-file-noselect-1(#<buffer file.txt> "~/path/to/file.txt" nil nil "~/path/to/file.txt" (24122033 2049))
find-file-noselect("/home/me/path/to/file.txt" nil nil)
ido-file-internal(raise-frame)
ido-find-file()
call-interactively(ido-find-file nil nil)
但是,缓冲区"file.txt"在基本模式下是打开的。无论我使用 ido_find-file
还是M-x find file
都会发生这种情况。
我试图通过在init.el
文件中添加以下行来解决此问题:
(add-to-list 'auto-mode-alist '("\.txt$" . text-mode))
。我已经将txt
更改为[tT][xX][tT]
,为$
换了一个\'
,并尝试了fundamental-mode
而不是text-mode
;但是,似乎没有任何更改组合可以使错误消失。
我正在使用 GNU Emacs 24.3.1(i686-pc-linux-gnu,GTK+ 版本 3.4.2),在 xubuntu Linux 上。
我认为错误以 set-auto-mode()
开头,但我不确定,也不知道为什么那里的括号是空的。有没有其他人遇到过这个问题,或者知道我在这里做错了什么?
如果这是一个自动模式问题,请评估以下内容以确认 Emacs 从中获取的模式:
(assoc-default "foo.txt" auto-mode-alist 'string-match)
如果是nil
,那肯定是问题所在,您的auto-mode-alist
配置确实有问题。
不过,可能不是这样 - Emacs在set-auto-mode
中尝试了很多其他的东西,所以你可能需要缩小范围。
试试这个:
- M-x
find-library
RETfiles
RET - M-x
eval-buffer
RET - C-xC-f
foo.txt
RET
在计算了函数之后(注意,你真的可以只计算set-auto-mode
),你现在应该在点击调试器时得到一个更详细的堆栈跟踪,这样你就能够准确地找出set-auto-mode
调用set-auto-mode-0
发生的位置,以及因此哪种机制导致主模式符号的nil
值。
(如果您不确定如何从那里继续,请将堆栈跟踪粘贴到问题中。
我怀疑问题来自文件/home/me/path/to/file.txt
中的错误局部变量声明。 您是否在该文件中有一个局部变量声明,它是否可能包含不应该存在的引号 ( '
)?
但我同意@phils给出的好建议,以追踪这一点。 set-auto-mode
可以通过几种不同的方式尝试确定模式。 您需要找出正在使用哪一个(除非我的猜测有所帮助)。