终端中的 Emacs 打开文件无法正确加载配置。但是在 emacs 中打开文件会正确加载配置

Emacs openfile in terminal don't load configuration correctly. But open file in emacs do load configuration correctly

终端中的 Emacs 打开文件无法正确加载配置。但是在 emacs 中打开文件会正确加载配置。
我已经为 cpp 尝试了几种 emacs 配置:

(eval-after-load "cc-vars" '(lambda() (c-set-style "linux")))

另一个

(add-hook 'c-mode-hook '(lambda() (c-set-style "linux")))

另一个

(eval-after-load "cc-vars" '(setq c-default-style "linux")))

如果我键入 emacs filename 它们将无法加载。似乎 emacs 总是加载默认的 gnu 样式。

输入后M-x c-mode可以正确载入。或者我在终端中打开 emacs 然后 C-x C-f 加载文件,这些配置也会被加载。

有什么原因吗?

我也试过

(c-set-style "linux")

直接在配置中。
他们与 emacs filename 一起工作。但是当我打开非 cpp 文件时,会出现一个错误,提示无法在该文件上应用 c-set-style

来自CC-mode manual:

When you create a new buffer, its style will be set from c-default-style.

来自Emacs manual

You can also set the variable c-default-style to specify the default style for various major modes

来自 c-set-style 函数的文档:

Set the current buffer to use the style STYLENAME.

这意味着对 c-set-style 的任何调用都必须确保当前缓冲区是您要为其设置样式的缓冲区;在 init 文件的顶层放置这样的调用绝对不是一个好主意。

最简单的解决方法就是将 (setq c-default-style "linux") 放在顶层,如果您确实需要,然后将其包裹在 eval-after-load 中。该变量就是为此而设计的,如果需要,应保留挂钩以更精确地控制当前文件的样式(如 c-default-style 文档所建议)。

对我来说,(eval-after-load "cc-vars" '(setq c-default-style "linux")) 似乎工作正常:如果我打开 CC-mode 覆盖的任何文件,将应用 Linux 样式。请注意,c-modeCC modes 是不同的东西,存在 c-mode-hookc++-mode-hookc-mode-common-hook,它们都是不同的,并且会 运行在不同的时间。