install-file, install-elisp-module
Mikio Nakajima
minakaji @ osaka.email.ne.jp
2000年 11月 19日 (日) 17:02:50 JST
install-file を使って、例えば、src directory が ~/tmp/src で target
directory が ~/tmp/target、コピーの対象のファイルが
~/tmp/src/deep/hoge.txt だったときに ~/tmp/src/ を default-directory
として
(install-file "deep/hoge.txt " "." "~/tmp")
とすると、現状では ~/tmp/deep/hoge.txt にコピーしようとしますよね?
で、~/tmp/deep がなかった場合は
File error: "Opening output file", "no such file or directory", "/home/minakaji/tmp/deep"
とかいうエラーになってしまいます。これは install-elisp-module も同様です。
install-file だけであればディレクトリ階層を保ったままのインストールす
る仕様の方 (エラーにならないように PARENTS 引数付きで make-directory
を呼んでおけば OK) がベターなような気がするのですが、
同様の関数に install-elisp-module があり、こっちはちょっと事情が違いま
す。
例えば、SKK-10.x, Daredevil SKK などでは、
skk をトップディレクトリとし、ここに主要なプログラムを置き、
skk/experimental のようなサブディレクトリに experimental なプログラム
などを配しています。Emacs Lisp で書いたインストーラを使っているので、
一々 default-directory を変えずに、トップディレクトリから見た相対ディ
レクトリ標記で
(install-elisp-modules '(experimental/skk-annotation) "."
"/usr/local/share/emacs/20.7/site-lisp/skk")
などと書いて
/usr/local/share/emacs/20.7/site-lisp/skk/skk-annotation.el
とインストールしてくれるとと嬉しいのですが、現状では
/usr/local/share/emacs/20.7/site-lisp/skk/experimental/skk-annotation.el
にインストールしようとしてやはりエラーになります。
install-elisp-module で target の full-path name を計算する際に
file-name-nondirectory を使えばぼくが想定しているような仕様になります
が、このように変更して困る方はいらっしゃいませんか?
(defun install-elisp-module (module src dest &optional just-print)
(let ((targets (list (concat (symbol-name module) ".el")
(concat (symbol-name module)".elc")))
src-file dest-file)
(while (setq src-file (car targets))
(setq src-file (expand-file-name src-file src))
(if (not (file-exists-p src-file))
nil
(if just-print
(princ (format "%s -> %s\n" src-file dest))
(setq dest-file
(expand-file-name (file-name-nondirectory src-file) dest))
(if (file-exists-p dest-file)
(delete-file dest-file))
(copy-file src-file dest-file t t)
(princ (format "%s -> %s\n" src-file dest)))
(if (string= (substring src-file -3) ".el")
nil
(catch 'tag
(while (file-exists-p src-file)
(condition-case err
(progn
(delete-file src-file)
(throw 'tag nil))
(error (princ (format "%s\n" (nth 1 err))))))))
(setq targets (cdr targets))))))
commit しようかと思って、他のパッケージを混乱させるのではないかと、す
んでのところで思い留まっています。ぼくの頭では install-file との仕様も
統一できないのも悩みの一つです。
ご指南の程、宜しくお願いいたします m(__)m。
--
中島幹夫 <minakaji @ osaka.email.ne.jp>
http://www.asahi-net.or.jp/~gy2m-nkjm/
More information about the APEL-ja
mailing list