我无法让Emacs停止询问我在文件末尾添加换行符的问题



Emacs一直在问我

Buffer text.txt does not end in newline.  And one? (y or n)

我很困惑为什么我不能阻止Emacs进行这项调查。我已经设置了两个

require-final-newline
mode-require-final-newline

在到CCD_ 2的挂钩中到nil

当我在文件中工作时,我已经验证了它的值确实是nil。尽管如此,Emacs仍在继续进行调查。

我已经查看了basic-save-buffer的代码。代码的相关部分是:

(or (eq require-final-newline t)
(eq require-final-newline 'visit-save)
(and require-final-newline
(y-or-n-p
(format "Buffer %s does not end in newline.  Add one? "
(buffer-name)))))

Emacs似乎永远不应该到达y-or-n-p,因为它作为and测试的第二部分出现,其中第一部分评估为nil

这是怎么回事?

我的Emacs是GNU 27.2。

我玩了一些重写代码的游戏。例如,

(or (eq require-final-newline t)
(eq require-final-newline 'visit-save)
(and nil
(y-or-n-p
(format "Buffer %s does not end in newline.  Add one? "
(buffer-name)))))

行为如我所料。

我也尝试过类似的东西:

(or (eq require-final-newline t)
(eq require-final-newline 'visit-save)
(and require-final-newline
(progn
(message (concat "[2] require-final-newline: " (format "%S" require-final-newline)))
(sit-for 1)
t)
(y-or-n-p
(format "Buffer %s does not end in newline.  Add one? "
(buffer-name)))))

消息报告require-final-newlinenil,但获取消息的唯一方法是使其成为t

怎么回事?

更新

我可以进入并自定义变量。当我这样做并将其设置为Don't add newlines时,这个烦人的问题就消失了。但是,我对此并不满意。不管我处于什么模式,这似乎都会在全局范围内设置这个值。这不是我想要的。它只适用于特定的文件,当在tex-mode中时,我希望它适用。

进一步更新:

@实际上,phils的问题对我开始调试这里发生的事情非常有用。

我想我已经找到问题了。我仍然对如何解决它感兴趣。

我正在使用.dir-locals.el为我正在处理的本地文件设置一些参数。如果我删除.dir-locals.el文件并通过钩子进行设置(就像我以前认为的那样(,一切都会正常运行。

然而,如果我使用.dir-locals.el文件集参数,那么事情就会停止正常工作。在.dir-locals.el文件中,我有以下行:

(nil . ((require-final-newline nil)))

这似乎就是问题所在。现在的情况是,require-final-newline没有被设置为nil,而是被设置为(nil)

我可以坚持使用钩子来完成我想要的任务。但是,现在我很好奇。我是不是搞错了tex-mode0的语法。这是我完整的.dir-locals.el文件

(
(nil . ((fill-column . 70)))
(nil . ((mode .tex)))
(nil . ((require-final-newline nil)))
)

我遇到的问题是由于.dir-locals.el文件中的语法错误。

我在那个文件里有一行是

(nil . ((require-final-newline nil)))

这是错误的。它将require-final-newline设置为(nil),而不是nil

如果我将语法更正为

(nil . ((require-final-newline . nil)))

一切都按预期进行。

最新更新