Отключить предупреждение о emacs.d в пути загрузки
В последней версии 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
Есть ли способ отключить только это предупреждение?
(так как я хочу сохранить свой emacs.d в пути загрузки, а теперь как быстрый грубый взлом, я пошел на (setq warning-minimum-level :error)
, но я предпочел бы как можно скорее избавиться от него)
Ответы
Ответ 1
Не отключайте предупреждение. Это там по уважительной причине: ~/.emacs.d
не должно быть в вашем load-path
.
Это связано с тем, что Emacs записывает файлы в этот каталог, и поэтому возможно (существуют существующие случаи) для этих файлов, которые конфликтуют с именами библиотек elisp. Если у вас есть этот каталог в вашем пути загрузки, и у вас такое столкновение имен, то Emacs попытается загрузить неправильный файл, если требуется эта библиотека.
Просто измените конфигурацию. Тривиально перемещать библиотеки elisp, которые вы разместили в этом каталоге, в подкаталог, а затем обновлять код, добавляющий ~/.emacs.d
к вашему пути загрузки, чтобы вместо этого добавить новый подкаталог:
(add-to-list 'load-path (expand-file-name "~/.emacs.d/lisp"))
Ответ 2
предосторожность
Ваш .emacs.d
может безопасно находиться в вашем load-path
только в конце. Это гарантирует, что если файл в .emacs.d
конфликтует с библиотекой, библиотека будет иметь приоритет. С помощью add-to-list
вы можете сделать это, установив третий параметр (APPEND
) на t
:
(add-to-list 'load-path (expand-file-name "~/.emacs.d") t)
Отключение предупреждения
Добавление 'initialization
в warning-suppress-types
или warning-suppress-log-types
будет подавлять предупреждение, но вы также не увидите ошибок или предупреждений, если что-то пойдет не так в вашем файле инициализации.
Решение, которое я использую в my .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
, может быть хорошей идеей разблокировать его, создав выделенный каталог для файлов сохранения различных пакетов, например:
(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-"))
Кроме того, некоторые пакеты используют hardcoded paths вместо locate-user-emacs-file
, но это также легко исправить:
(setq smex-save-file (locate-user-emacs-file "smex"))
В большинстве пакетов используется locate-user-emacs-file
, хотя, по моему опыту, этот способ организации save файлов требует меньше кода, чем тот, который был у оригинального "кончика организации" (как написано выше, вышеупомянутые фрагменты кода являются единственными параметрами сохранения в моя конфигурация Emacs, в то время как исходный метод требовал строки для каждого пакета).
Я не знаю, является ли этот метод предполагаемым использованием или злоупотреблением переменной user-emacs-directory
. Я использую его, и он работает без проблем до сих пор, но ваш пробег может отличаться.
Ответ 3
У меня была такая же проблема недавно, в 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 для пользователя без полномочий root (Ubuntu 11.10).
Ответ 4
Вы можете добавить initialization
к warning-suppress-log-types
(вообще не записывайте предупреждение) или warning-suppress-types
(запишите предупреждение, но не всплывайте буфер предупреждений).