Отключить предупреждение о 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 (зарегистрируйте предупреждение, но не открывайте буфер предупреждений).