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