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

时间:2014-07-16 10:56:56

标签: 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

有没有办法禁用此警告?

(因为我想把我的emacs.d保留在加载路径中,现在作为快速暴力黑客我去了(setq warning-minimum-level :error),但我更愿意将其删除为(尽快)

4 个答案:

答案 0 :(得分:24)

不要禁用警告。它有充分的理由:~/.emacs.d不应该出现在load-path

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

只需更改配置即可。将您放在该目录中的elisp库移动到子目录中,然后更新将~/.emacs.d添加到您的加载路径的代码,以便添加改为使用新的子目录:

(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp"))

答案 1 :(得分:10)

预防

您的.emacs.d只能在最后安全地进入您的load-path。这将确保如果.emacs.d中的文件与库冲突,则库将优先。使用add-to-list,您可以通过将第三个参数(APPEND)设置为t来执行此操作:

(add-to-list 'load-path (expand-file-name "~/.emacs.d") t)

禁用警告

'initialization添加到warning-suppress-typeswarning-suppress-log-types会取消警告,但如果初始文件出现问题,您也不会看到错误或警告。

我在my .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))

如果警告消息发生变化,则需要更新。

组织提示

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

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

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

(setq tramp-persistency-file-name
      (expand-file-name "tramp" my-savefile-dir))

更新到组织提示

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

(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.

这将使大多数软件包将其文件存储在.emacs.d/savefiles中。如果要创建例外,以便给定的包直接将其文件存储在.emacs.d中,请使用以下内容:

(setq package-user-dir (expand-file-name "elpa" main-dir))

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

(setq auto-save-list-file-prefix
      (locate-user-emacs-file "auto-save-list/.saves-"))

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

(setq smex-save-file (locate-user-emacs-file "smex"))

大多数软件包使用locate-user-emacs-file,因此根据我的经验,这种组织保存文件的方法需要的代码少于原始组织提示的代码#34; (在编写本文时,上面的代码片段是我的Emacs配置中唯一的保存文件设置,而原始方法需要每个包的一行)。

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

答案 2 :(得分:2)

我最近遇到了同样的问题,在4.4.0-22-generic GNU / Linux(Ubuntu 16.04 LTS)上,对我来说唯一有用的是:

$ chown -R my_user ~/.emacs.d
$ # Fix the 'broken' permissions

您可能只需执行chown: cannot read directory '/home/my_user/.emacs.d': Permission denied

sudo chown -R topenmind ~/.emacs.d

它对我来说就像一个魅力。

参考。答案的来源取自Permission issue with emacs for non-root user (Ubuntu 11.10)

答案 3 :(得分:1)

您可以将initialization添加到warning-suppress-log-types(根本不记录警告)或warning-suppress-types(记录警告,但不要弹出)警告缓冲区。)