1

Emacs 不断地问我

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

我很困惑为什么我不能阻止 Emacs 进行这个查询。我都设置了

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

nil钩子上tex-mode

我已经验证它的价值确实是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 的问题对我开始调试这里发生的事情非常有用。

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

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

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

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

这似乎是问题所在。正在发生的事情是,它没有被设置为,而是require-final-newlinenil设置为(nil).

我可以坚持使用钩子来完成我想要的。但是,现在我很好奇。我是否得到.dir-locals.el错误的语法。这是我的完整.dir-locals.el文件

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

1 回答 1

2

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

我在该文件中有一行内容为

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

那是错的。它设置require-final-newline(nil),而不是nil

如果我将语法更正为

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

一切都按预期和预期工作。

于 2022-02-15T20:30:13.957 回答