Отключить предупреждение о emacs.d в пути загрузки
в последней версии emacs
( от 24.3.50
snapshot) при запуске появляется предупреждение, когда .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 в пути загрузки, пока как быстрый грубый hack пошел к (setq warning-minimum-level :error)
, но я бы предпочел избавиться от этого как можно скорее)
4 ответов
не отключайте предупреждение. Это там по уважительной причине:~/.emacs.d
не должно быть в вашем load-path
.
это потому, что Emacs записывает файлы в этот каталог ,и поэтому это возможно (там are существующие случаи) для этих файлов, конфликтующих с именами библиотек elisp. Если у вас есть этот каталог в пути загрузки, и у вас есть такое столкновение имен, то Emacs попытается загрузить неправильный файл, если эта библиотека необходима.
просто изменить ваша конфигурация. Тривиально перемещать библиотеки elisp, которые вы разместили в этом каталоге, в подкаталог, а затем обновлять код, который добавлял ~/.emacs.d
к вашему load-path, так что он добавляет новый подкаталог вместо:
(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp"))
Примечание
код .emacs.d
можно смело в свой load-path
только в конце. Это гарантирует, что если файл в вашем .emacs.d
конфликты с библиотекой, библиотека будет иметь приоритет. С add-to-list
, вы можете сделать это, установив третий параметр (APPEND
) к t
:
(add-to-list 'load-path (expand-file-name "~/.emacs.d") t)
отключить предупреждение
добавлять 'initialization
to 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))
это потребует обновления, если предупреждение изменится.
организация Совет
если вы хотите сохранить личные файлы напрямую в ваш .emacs.d
каталог, это может быть хорошей идеей, чтобы unclutter его, сделав выделенный каталог для savefiles различных пакеты, например:
(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
хотя, по моему опыту, этот метод организации savefiles требует меньше кода, чем исходный "совет организации" (на момент написания этого, вышеуказанные фрагменты кода являются единственными настройками savefile в моей конфигурации Emacs, в то время как исходный метод требовал строки для каждого пакет.)
я не знаю, является ли этот метод намеренным использованием или злоупотреблением user-emacs-directory
переменной. Я использую его и он работает без проблем до сих пор, но ваш пробег может варьироваться.
недавно у меня была такая же проблема, на 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
Он работал как шарм для меня.
Ref. Источник ответа был взят из проблема разрешения с emacs для некорневого пользователя (Ubuntu 11.10).
вы могли бы добавить initialization
или warning-suppress-log-types
(не регистрируйте предупреждение вообще), или warning-suppress-types
(зарегистрируйте предупреждение, но не открывайте буфер предупреждений).