web-dev-qa-db-ja.com

ロードパスの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)に行きましたが、私はできるだけ早くこれを取り除くことを好むでしょう)

19
AdrieanKhisbe

警告を無効にしないでください。それは正当な理由でそこにあります:~/.emacs.dはあなたのload-pathにあるべきではありません。

これは、Emacsがこのディレクトリにファイルを書き込むためです。したがって、これらのファイルがelispライブラリの名前と競合する可能性があります(are既存のケースがあります)。ロードパスにこのディレクトリがあり、そのような名前が衝突している場合、そのライブラリが必要な場合、Emacsは間違ったファイルをロードしようとします。

構成を変更するだけです。そのディレクトリに配置したelispライブラリをサブディレクトリに移動してから、ロードパスに~/.emacs.dを追加していたコードを更新して、代わりに新しいサブディレクトリを追加するのは簡単です。

(add-to-list 'load-path (expand-file-name "~/.emacs.d/LISP"))
24
phils

予防措置

.emacs.dは最後にのみload-pathに安全に含めることができます。これにより、.emacs.d内のファイルがライブラリと競合する場合、ライブラリが優先されます。 add-to-listを使用すると、3番目のパラメーター(APPEND)をtに設定することでこれを行うことができます。

(add-to-list 'load-path (expand-file-name "~/.emacs.d") t)

警告を無効にする

'initializationwarning-suppress-typesまたはwarning-suppress-log-typesに追加すると警告が抑制されますが、initファイルで問題が発生した場合でもエラーや警告は表示されません。

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-"))

さらに、一部のパッケージはlocate-user-emacs-fileの代わりにハードコードされたパスを使用しますが、これも簡単に修正できます。

(setq smex-save-file (locate-user-emacs-file "smex"))

ほとんどのパッケージはlocate-user-emacs-fileを使用しますが、私の経験では、保存ファイルを整理するこの方法は、元の「整理のヒント」からのものよりも少ないコードで済みます(これを書いている時点では、上記のコードの断片が私のEmacs構成、元の方法ではパッケージごとに1行必要でした)。

このメソッドがuser-emacs-directory変数の使用目的なのか乱用なのかわかりません。私はそれを使用し、今のところ問題なく動作しますが、マイレージは異なる場合があります。

10
Pkkm

私は最近、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

それは私にとって魅力のように機能しました。

参照。回答のソースは root以外のユーザー(Ubuntu 11.10)のemacsでのアクセス許可の問題 から取得されました。

2
Thanos

initializationwarning-suppress-log-types(警告をまったくログに記録しない)またはwarning-suppress-types(警告をログに記録しますが、警告バッファーをポップアップしない)のいずれかに追加できます。

1
legoscia