QA@IT

emacs 起動時に、emacs 拡張のファイル内で、特定のディレクトリを指定するには

2801 PV

foo.el という emacs 拡張があります。
emacs-foo というディレクトリがあります。
layout.xml.mustache というテンプレートファイルがあります。
それぞれ、以下のように配置します。

~/.emacs.d/elisp/emacs-foo/foo.el
~/.emacs.d/elisp/emacs-foo/templates/layout.xml.mustache

このとき、foo.el 内で、templates のパスを、環境に依存せずに取得する方法があるでしょうか。

ボツ案

以下の設定では、emacs 起動時に foo.el がバッファに読み込まれているわけではないのでエラーとなります。

;;foo.el
(defvar foo-template-directory (file-name-directory (buffer-file-name)))

以下の設定では、foo-template-directory として "~/" が設定されてしまいます。

;;foo.el
(defvar foo-template-directory default-directory)

以下の設定では、/.emacs.d/emacs-foo の部分がハードコーディングされています。変数 user-emacs-directory (;;=> "~/.emacs.d/") を用いても同様です。

;;foo.el
(defvar foo-template-directory (concat (getenv "HOME") "/.emacs.d/emacs-foo/templates"))

回答

load-file-nameを利用することができます.
これは requireloadで該当のファイルを読み出したとき,
そのロードされたファイルのパスが設定されます.

なので (file-name-directory load-file-name)のようにする
ことで、そのロードされたファイルがあるディレクトリを取得する
ことができます. -lオプション等直接そのファイルをロードする
ときには load-file-namenilなので, その場合は,
default-directoryを設定しておけばよいと思います.

auto-completeの ac-dictionary-directoriesの設定等で利用されて
いるので参考にしてみてください.

https://github.com/auto-complete/auto-complete/blob/master/auto-complete.el#L143

編集 履歴 (0)
  • 意図した挙動になりました。ありがとうございました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。