在加载路径中禁用有关emacs.d的警告

Adr*_*sbe 19 emacs emacs24

在最新的版本emacs(从24.3.50快照)没有在启动时警告.emacs.d恰好是在负载路径.

Warning (initialization): Your `load-path' seems to contain
your `.emacs.d' directory: ~/.emacs.d/
This is likely to cause problems...
Consider using a subdirectory instead, e.g.: /home/adriean/.emacs.d/lisp
Run Code Online (Sandbox Code Playgroud)

有没有办法禁用这个警告?

(因为我想把我的emacs.d放在加载路径中,现在作为一个快速的暴力黑客我去了(setq warning-minimum-level :error),但我宁愿尽快摆脱这个)

phi*_*ils 25

不要禁用警告.这是有充分理由的:~/.emacs.d不应该在你的load-path.

这是因为Emacs的文件写入到该目录,因此它可能(存在现有的情况下),这些文件与elisp的库的名称冲突.如果您的加载路径中有此目录,并且您有这样的名称冲突,那么如果需要该库,Emacs将尝试加载错误的文件.

只需更改配置即可.将放置在该目录中的elisp库移动到子目录中,然后更新添加~/.emacs.d到加载路径的代码,以便添加新的子目录,这是微不足道的:

(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp"))
Run Code Online (Sandbox Code Playgroud)

  • 答案已更新.我知道这不是你要求的,但是移动库*是一个快速解决方案,所以我看不到试图规避警告的任何好处. (3认同)
  • AudioDroid:不,你当然*不想*mv*./ lisp`!这会移动*all*文件!您只想移动自己放置的任何`.el`和`.elc`文件,但init文件除外.不要移动任何其他内容,当然也不要移动Emacs写入该目录的任何内容. (2认同)

Pkk*_*kkm 10

预防

.emacs.d可以安全地在你load-path的最后.这将确保如果您.emacs.d与库冲突的文件,该库将优先.使用add-to-list,您可以通过将第三个参数(APPEND)设置为t:

(add-to-list 'load-path (expand-file-name "~/.emacs.d") t)
Run Code Online (Sandbox Code Playgroud)

禁用警告

添加'initializationwarning-suppress-typeswarning-suppress-log-types抑制警告,但你也不会看到错误或警告,如果出现错误在你的init文件.

我在.emacs.d使用的解决方案是根据警告消息选择性地忽略此警告的建议:

(defadvice display-warning
    (around no-warn-.emacs.d-in-load-path (type message &rest unused) activate)
  "Ignore the warning about the `.emacs.d' directory being in `load-path'."
  (unless (and (eq type 'initialization)
               (string-prefix-p "Your `load-path' seems to contain\nyour `.emacs.d' directory"
                                message t))
    ad-do-it))
Run Code Online (Sandbox Code Playgroud)

如果警告消息发生更改,则需要更新.

组织提示

如果要将个人文件直接保存在.emacs.d目录中,最好通过为各种包的存储文件创建专用目录来整理它,例如:

(defvar my-savefile-dir (expand-file-name "savefiles" "~/.emacs.d")
  "The directory for automatically generated save/history/etc. files.")
Run Code Online (Sandbox Code Playgroud)

然后,对于放入其文件的每个包,.emacs.d如下所示:

(setq tramp-persistency-file-name
      (expand-file-name "tramp" my-savefile-dir))
Run Code Online (Sandbox Code Playgroud)

更新组织提示

自从编写上述内容以来,我发现软件包通常用于locate-user-emacs-file获取存储数据的文件路径.此函数返回文件的绝对路径user-emacs-directory.默认情况下,user-emacs-directory包含您的路径.emacs.d,但您可以将其更改为您想要保存文件的目录(您可能还希望在某处保留旧值):

(defvar main-dir user-emacs-directory
  "The root directory of my Emacs configuration.")
(setq user-emacs-directory (expand-file-name "savefiles/" main-dir))
;; The trailing slash is mandatory.
Run Code Online (Sandbox Code Playgroud)

这将使大多数包存储他们的文件.emacs.d/savefiles.如果要创建异常,以便给定的包直接存储其文件.emacs.d,请使用以下内容:

(setq package-user-dir (expand-file-name "elpa" main-dir))
Run Code Online (Sandbox Code Playgroud)

您还必须更改在init文件之前加载的包的设置,因此使用原始值user-emacs-directory:

(setq auto-save-list-file-prefix
      (locate-user-emacs-file "auto-save-list/.saves-"))
Run Code Online (Sandbox Code Playgroud)

此外,一些软件包使用硬编码路径而不是locate-user-emacs-file,但这也很容易修复:

(setq smex-save-file (locate-user-emacs-file "smex"))
Run Code Online (Sandbox Code Playgroud)

locate-user-emacs-file虽然大多数软件包都使用,但根据我的经验,这种组织保存文件的方法需要的代码少于原始"组织提示"的代码(截至编写时,上面的代码片段是我的Emacs配置中唯一的保存文件设置,而原始方法每个包需要一行).

我不知道这种方法是预期用途还是滥用user-emacs-directory变量.我使用它,它到目前为止没有问题,但你的里程可能会有所不同.