【问题标题】:Disable warning about emacs.d in load path在加载路径中禁用有关 emacs.d 的警告
【发布时间】:2014-09-06 21:05:17
【问题描述】:

在最新版本的̀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 保留在加载路径中,所以现在作为一个 快速的 brute hack 我选择了 (setq warning-minimum-level :error),但我希望尽快摆脱它可能)

【问题讨论】:

标签: emacs emacs24


【解决方案1】:

我最近在 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 my_user:my_group ~/.emacs.d

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

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

【讨论】:

  • 通过回答这个问题,您似乎是在说文件系统权限问题导致 Emacs 发出有关 load-path 的警告消息,其中包含 ~/.emacs.d/。我真的不相信发生了这样的事。很明显,您确实遇到了权限问题,但这肯定不是一个合适的问题。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我知道最好不要这样做,但我要求快速临时修复。外部库在他们自己的 subir el-get,elpa,plugins 中,只是我的一些个人 elisp 文件在 emacs.d 中,您应该给出不这样做的理由,而不是仅仅解释错误消息。
  • 答案已更新。我知道这不是您要求的,但移动库一个快速修复,所以我看不出试图规避警告有什么好处。
  • 对不起,我是新手,对于其他新手,请在您的 shell 中执行以下命令序列: cd emacs.d, mkdir lisp, mv * ./lisp, emacs -nw, Cx Cf ~/ .emacs,如上编辑行
  • AudioDroid:不,你当然不想mv * ./lisp!这将移动 all 文件!您只想移动您自己放置在那里的任何.el.elc 文件,初始化文件除外。不要移动任何其他内容,当然也不要移动 Emacs 写入该目录的任何内容。
【解决方案3】:

注意事项

您的.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 将抑制警告,但如果您的init 文件出现问题,您也不会看到错误或警告。

我在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 的路径,但您可以将其更改为您想要保存文件的目录(您可能还希望在某处保留旧值):

(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,所以根据我的经验,这种组织保存文件的方法比原始“组织提示”中的代码需要更少的代码(在撰写本文时,上述代码片段是唯一的保存文件设置)我的 Emacs 配置,而原始方法需要每个包一行)。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • '(warning-suppress-types '((initialization ))) 添加到自定义文件就可以了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2016-08-16
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多