Disable warning about emacs.d in load path

前提是你 提交于 2019-12-28 04:03:33

问题


In latest version of ̀emacs ( from 24.3.50 snapshot) there is a warning at startup when .emacs.d happens to be in the load path.

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

Is there a way to disable just this warning?

(since I wanna keep my emacs.d in the load path, for now as a quick brute hack I went for (setq warning-minimum-level :error), but I would prefer to get rid of this as soon as possible)


回答1:


Don't disable the warning. It's there for a good reason: ~/.emacs.d shouldn't be in your load-path.

This is because Emacs writes files to this directory, and therefore it's possible (there are existing cases) for those files to conflict with the names of elisp libraries. If you have this directory in your load path, and you have such a name clash, then Emacs will attempt to load the wrong file if that library is required.

Just change your configuration. It's trivial to move the elisp libraries you've placed in that directory into a sub-directory, and then update the code which was adding ~/.emacs.d to your load-path, so that it adds the new sub-directory instead:

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



回答2:


Precaution

Your .emacs.d can safely be in your load-path only at the end. This will ensure that if a file in your .emacs.d conflicts with a library, the library will take precedence. With add-to-list, you can do this by setting the third parameter (APPEND) to t:

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

Disabling the warning

Adding 'initialization to warning-suppress-types or warning-suppress-log-types will suppress the warning, but you also won't see errors or warnings if something goes wrong in your init file.

The solution I use in my .emacs.d is an advice that selectively ignores this warning based on the warning message:

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

This will need updating if the warning message changes.

Organization tip

If you want to keep personal files directly in your .emacs.d directory, it may be a good idea to unclutter it by making a dedicated directory for the savefiles of various packages, for example:

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

and then, for each package that puts its file in .emacs.d, something like this:

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

Update to organization tip

Since writing the above, I've discovered that packages usually use locate-user-emacs-file to get the paths to files in which they store their data. This function returns an absolute path to a file in user-emacs-directory. By default, user-emacs-directory contains the path to your .emacs.d, but you can change this to a directory where you want your savefiles (you'll probably also want to preserve the old value somewhere):

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

This will make most packages store their files in .emacs.d/savefiles. If you want to make an exception, so that a given package stores its files directly in .emacs.d, use something like this:

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

You'll also have to change settings of packages that get loaded before your init file, and therefore use the original value of user-emacs-directory:

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

In addition, some packages use hardcoded paths instead of locate-user-emacs-file, but that's easy to fix too:

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

Most packages use locate-user-emacs-file though, so in my experience this method of organizing savefiles requires less code than the one from the original "organization tip" (as of writing this, the above fragments of code are the only savefile settings in my Emacs configuration, while the original method required a line for each package).

I don't know if this method is an intended use or an abuse of the user-emacs-directory variable. I use it and it works without issues so far, but your mileage may vary.




回答3:


I had the same issue recently, on 4.4.0-22-generic GNU/Linux (Ubuntu 16.04 LTS) and for me the only thing that worked is:

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

You might get chown: cannot read directory '/home/my_user/.emacs.d': Permission denied then simply do:

sudo chown -R topenmind ~/.emacs.d

It worked like a charm for me.

Ref. The source of the answer was taken from Permission issue with emacs for non-root user (Ubuntu 11.10).




回答4:


You could add initialization to either warning-suppress-log-types (don't log the warning at all), or warning-suppress-types (log the warning, but don't pop up the warnings buffer).



来源:https://stackoverflow.com/questions/24779041/disable-warning-about-emacs-d-in-load-path

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!