̀ 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)
に行きましたが、私はできるだけ早くこれを取り除くことを好むでしょう)
警告を無効にしないでください。それは正当な理由でそこにあります:~/.emacs.d
はあなたのload-path
にあるべきではありません。
これは、Emacsがこのディレクトリにファイルを書き込むためです。したがって、これらのファイルがelispライブラリの名前と競合する可能性があります(are既存のケースがあります)。ロードパスにこのディレクトリがあり、そのような名前が衝突している場合、そのライブラリが必要な場合、Emacsは間違ったファイルをロードしようとします。
構成を変更するだけです。そのディレクトリに配置したelispライブラリをサブディレクトリに移動してから、ロードパスに~/.emacs.d
を追加していたコードを更新して、代わりに新しいサブディレクトリを追加するのは簡単です。
(add-to-list 'load-path (expand-file-name "~/.emacs.d/LISP"))
.emacs.d
は最後にのみload-path
に安全に含めることができます。これにより、.emacs.d
内のファイルがライブラリと競合する場合、ライブラリが優先されます。 add-to-list
を使用すると、3番目のパラメーター(APPEND
)をt
に設定することでこれを行うことができます。
(add-to-list 'load-path (expand-file-name "~/.emacs.d") t)
'initialization
をwarning-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
変数の使用目的なのか乱用なのかわかりません。私はそれを使用し、今のところ問題なく動作しますが、マイレージは異なる場合があります。
私は最近、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でのアクセス許可の問題 から取得されました。
initialization
をwarning-suppress-log-types
(警告をまったくログに記録しない)またはwarning-suppress-types
(警告をログに記録しますが、警告バッファーをポップアップしない)のいずれかに追加できます。