在最新版本的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)
,但我更愿意将其删除为(尽快)
答案 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-types
或warning-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
(记录警告,但不要弹出)警告缓冲区。)