问题
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