load-relative 20170526.310(in MELPA)
relative file load (within a multi-file Emacs package)

概要

他言語を使っていると、ついその機能が羨しく思ったりするものです。

このパッケージはRubyの

  • FILE
  • require_relative

をEmacs Lispに移植したものです。

このパッケージを導入するだけで、
自分自身をrequireすることなく以下の関数・マクロが使えます。

  • require-relative
  • load-relative
  • FILE
  • provide-me

autoloadに感謝あるのみです。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてload-relativeを使う方は
以下のコマンドを実行します。

M-x package-install load-relative

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name load-relative

FILE

(__FILE__)

で現在読み込んでいるファイル名を返します。

require-relative

(require-relative "foo")

でカレントディレクトリのfoo.elを require します。

シンボルではなくて文字列を使うことに注意してください。

load-relative

require-relativeの load 版です。

(load-relative '("foo" "bar"))

とリストを取ることもできます。

provide-me

通常のprovideは自分自身のbasenameを指定する必要がありますが、

(provide-me)

と書くだけで provide に展開してくれます!

それならば、安心してファイル名を変更できますね!!

使用例

以下のファイル fuga.el と hoge.el を用意してください。

;;; fuga.el
(setq fuga 1)
(provide-me)
;;; hoge.el
(require-relative "fuga")
(defun test ()
  (interactive)
  (message "fuga = %s\n(featurep 'fuga) = %S\n(featurep 'hoge) = %S"
           fuga (featurep 'fuga) (featurep 'hoge)))
(provide-me)

このようにEmacsを起動し、M-x testを実行すると

$ emacs -Q -f package-initialize -l hoge.el

ちゃんとrequireされていることがわかります。

fuga = 1
(featurep 'fuga) = t
(featurep 'hoge) = t


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。