在最新的版本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)
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)
添加'initialization
到warning-suppress-types
或warning-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
变量.我使用它,它到目前为止没有问题,但你的里程可能会有所不同.