PERL5LIBに編集中のCatAppのlibまでのパスを追加するelisp
(defun perllib-check-path (lst lib-path) (let ((dir (car lst)) (lst (cdr lst))) (setf lib-path (concat lib-path "/" dir)) (if lst (if (string= dir "lib") lib-path (perllib-check-path lst lib-path))))) (defun set-perl5lib () "insert path to PERL5LIB if its path includes 'lib' directory." (interactive) (setf path-list (cdr (split-string buffer-file-name "/")) lib-path (perllib-check-path path-list "")) (if lib-path (let () (setenv "PERL5LIB" lib-path) (message (concat "PERL5LIB=" lib-path))))) (provide 'set-perl5lib)
例えばこれをset-perl5lib.elとかに保存しておいて、「M-x load-file /path/to/set-perl5lib.el」とか、elファイル置き場に置いといて、.emacsに「(require 'set-perl5lib)」とかやっておけばおk。使うときは「M-x set-perl5lib」を実行。
プログラム見ればわかるとおり、「lib」というディレクトリ名があったらそこまでのパスをPERL5LIBに登録するだけなので、実はCatalystは使う必要はありません。まあでも時流的に、たいていは自作モジュールはlib以下におくよね、と。libが2個目以上あるときは知らん。
シチュエーションとしては、Flymakeを使ってるときに自作モジュールのロードエラーになったときにどうぞ(因みに、そもそもはid:typesterの要望です)。だからホントはFlymakeに組み込むのがベストなんだろうけど、ひとまず満足してしまったので、一旦放流。これを組み込んでくれる猛者がいるといいなぁ…。
(追記)
あっさり対応できた。以下、.emacs上での操作。まずあらかじめ上のスクリプトを「(require 'set-perl5lib)」でロードしておき、flymake-perl-load関数をオーバーライドする。関数内ならどこでもいいと思うけど、とりあえず僕は最後の「(flymake-mode t)」の直前に「(set-perl5lib)」を追加。これでOK!
(defun flymake-perl-load () (interactive) (defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted) (setq flymake-check-was-interrupted t)) (ad-activate 'flymake-post-syntax-check) (setq flymake-allowed-file-name-masks (append flymake-allowed-file-name-masks flymake-allowed-perl-file-name-masks)) (setq flymake-err-line-patterns flymake-perl-err-line-patterns) (set-perl5lib) ;ここに追加した (flymake-mode t))
(更に追記 1/18)
id:typesterより「codereposに上げるべき」とおだてられ、ついに僕もcodereposデビューしました!
→http://coderepos.org/share/browser/lang/elisp/set-perl5lib
因みにid:yappo氏より
なんと200人目のコミッター当選です!
おめでとうございます!
とメールが。ありがとうございます。
(ジョークだと思ってコミッタ一覧を確認しに行ったのは内緒:-D)
これを社内IRCに投げたら、更にid:typesterから「#codereposにも来い」と誘われたので、これから行ってきます。ちょー緊張する。