Elispに外部プログラムやファイルを添付したとき、そのパスを適切に設定する方法を紹介します。
外部プログラム foo.rb を 使用する foo.el を開発しており、foo.rb は foo.el と同じディレクトリに配置するとします。
foo
├── foo.el
└── foo.rb
foo.rbのパスの変数foo-rb-programを次のように定義すると、状況に合わせてパスが設定されます。
- 開発中は
eval-bufferやeval-last-sexpなどによってfoo-rb-programを評価する。そのとき、自分のワーキングディレクトリからパスが設定される。 - Elispを配布したときは、
requireやloadで該当のファイルを読み出したとき、 そのロードされたファイルのパスからfoo-rb-programのパスが設定される。
(defvar foo-rb-program
(let ((current (or load-file-name (buffer-file-name))))
(expand-file-name "foo.rb" (file-name-directory current)))
"Path to the `foo.rb'.")
robe.el の コードを読んでいる時に知りました。