日記/2009-6-28
set-perl5lib.elをActivePerl対応にする場当たり的改造
Emacs22から標準で入ってるflymakeはとても便利。上の動画はHaskellでのデモですが、Perlでも、こちらのページに書かれているような感じで設定すれば、上の動画同様、エラーの箇所を赤くして教えてくれますし、カーソルをエラー行へ持ってきて「M-x flymake-display-err-minibuf」とやれば(私は「C-c ;」に割り当ててます)、どんなエラーかミニバッファに出してくれます。
ちなみに、私のところでは上の動画ほどもっさりしてません。もう少し軽快に動作してくれます。
set-perl5lib.elのActivePerl対応
私は、WindowsXP + ActivePerl + nt-emacs、という環境でFreeStyleWikiをいじくって遊んでいますが、上でリンクした.emacsの設定例のページで紹介されているset-perl5lib.elがうまく動作しませんでした。追加されるパスが、cygwin風の「/cygdrive/c/home/……」となってしまい、ActivePerlで用いるWindows風書式「c:/home/……」とつじつまが合わないためのようです。
2009/06/28現在、set-perl5lib.elの最新版であるRevision 18431をCodeReposのページで確認すると、そこには以下のようなコメントが。
Revision 18431, 2.6 kB (checked in by holidays-l, 10 months ago) lang/elisp/set-perl5lib: CygPerlに対応してみました。WinPerlで動かなくなってる気がするので誰かなんとかして。
なんとかしたかったんですが、残念ながら頭が悪くてかっこよくはいきませんでした。
以下の改造で、ActivePerlで動作するようになると思います。しかしながら、この改造を施すと、今度はCygwinのPerlでは動かなくなります。というか、UNIX系のOSでの動作についてはまったく考慮していないので、Windows + ActivePerlでしか動きません。ご注意ください。
--- set-perl5lib.el.org 2009-06-27 20:23:43.464125000 +0900 +++ set-perl5lib.el 2009-07-26 13:30:14.406500000 +0900 @@ -48,7 +48,7 @@ (interactive) (let* ((path-list (cdr (split-string (if (string-match "^.:" buffer-file-name) - (concat (cygwin-mount-get-cygdrive-prefix) + (concat (mapconcat 'identity (split-string buffer-file-name ":") "")) (buffer-file-name) ) @@ -58,7 +58,8 @@ (when (or (and lib-path current-perl5lib (not (string-match lib-path current-perl5lib))) (not current-perl5lib)) - (setenv "PERL5LIB" (concat lib-path ":" current-perl5lib)) - (message "Added %s into PERL5LIB" lib-path)))) + (and lib-path + (setenv "PERL5LIB" (concat lib-path ";" current-perl5lib)) + (message "Added %s into PERL5LIB" lib-path))))) (provide 'set-perl5lib)
改造済みファイルも以下に貼っつけときます。
- set-perl5lib.el(403)
add-perl5lib.el
set-perl5lib.elは、読み込んだファイルのパスの中に「lib」というディレクトリ名があったら、そこまでのパスをPERL5LIBに追加してくれるわけですが、「lib」がないパスを追加したいときもあります。
例えば、FreeStyleWiki本家のサイトに投稿されているCardFormプラグインには、CardFuncBase.pmというベースクラスがあるため、CardList.pmの冒頭のコードは以下のようになっています。
package plugin::cardform::CardList; use strict; use vars qw(@ISA); @ISA = qw(plugin::cardform::CardFuncBase); use plugin::cardform::CardFuncBase; ……
この場合、例えば、CardForm プラグインがインストールされているディレクトリが、「c:/home/mechanist/fswiki/plugin/cardform」だとすると、追加したいパスは、「c:/home/mechanist/fswiki」になるわけです。
そこで、任意のパスをPERL5LIBに追加できる、add-perl5lib.elも作ってみました(まんまset-perl5lib.elのパクリ)。
.emacsに「(require 'add-perl5lib)」と書いておき、「M-x add-perl5lib」で実行して、追加したいパスを入力すればOK。
ちなみにこちらも、Windows + ActivePerlでしか動きません。
- add-perl5lib.el(388)
参考
- PERL5LIBに編集中のCatAppのlibまでのパスを追加するelisp - taiyo独言
- set-perl5lib.elの作者のページ。ありがとうございます。
- EmacsでPerl開発する上で必須な設定 #2 - flymake - antipop
- .emacsの設定を紹介しているページ。ありがとうございます。
- このために昨日買いました。まだ全然読めてません。
馬鹿
言われてみれば当たり前のことなんですが、PERL5LIBのパスの区切り文字が「;」であることになかなか気づかず、はまりました……。
さらに馬鹿
add-perl5libでは、英語として間違ってると言われたけど(確かに「add-path-to-perl5lib」などとすべき)、もういい!
さらにさらに馬鹿
set-perl5lib.elの改造部分を、2009/07/26に修正。
元は、58行目からの改造は以下のようになってました。
@@ -58,7 +58,8 @@ (when (or (and lib-path current-perl5lib (not (string-match lib-path current-perl5lib))) (not current-perl5lib)) - (setenv "PERL5LIB" (concat lib-path ":" current-perl5lib)) - (message "Added %s into PERL5LIB" lib-path)))) + (and lib-path + (setenv "PERL5LIB" (concat current-perl5lib ";" (expand-file-name lib-path))) + (message "Added %s into PERL5LIB" lib-path))))) (provide 'set-perl5lib)
ですが、よかれと思って追加した、ファイル名を絶対パス名に変換する「expand-file-name」のせいで、うまく動かなくなっちゃってました(6月末の時点では動いてたんだけどなあ……)。
そこで、添付ファイルは、この「expand-file-name」をとっぱらって、パスの区切りをコロンからセミコロンに変えただけのものにしておきました。これだと追加されるパスの頭に「c:」というドライブレターがつかないのですが、でも、うまく動くようです。
もし、これでうまく動かない場合は、元のように「expand-file-name」を追加してください。
きちんとデバッグしたいところなんだけど……。すいません。