Подтвердить что ты не робот

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

4b9b3361

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