ちょびっと追記したり、書きなおしたりしました。
Hachioji.pm #26のハッカソンでなにつくろうかなーと思ってたので、
ちょうど旬だったplenvのemacs lisp拡張でも書いてみようかなと思い至った。
plenv.el
(require 'plenv)
としておくと、だいたいperlbrew.elで出来た事は出来るようにしたりしたり、
plenv が良い感じ - unknownplace.orgとか読んでふーんってなったので、flymakeとの連携が楽になるようにバージョン検出の部分をemacs lispに移植したりしてる。
具体的にはguess-plenv-perl-pathとguess-plenv-versionというやつを提供していて、
guess-plenv-perl-pathを使うとplenvで使うperlのホンモノのpathが取れたり、
後者はカレントディレクトリで使われるperlのpathを返してくるようになっている。
これによってshell scriptを経由しなくなったのでそういう部分のオーバーヘッドはだいぶ減ったはず。
あとはFile::Basename#dirname的な処理をもうちょっとシンプルにするともうちょっと速くなるはずかなというところ。
正規表現でやるといいのかなこういうの。うまい方法だれか教えて下さい!
ところでplenvにはrbenv shellにあたるものがない。これはPLENV_VERSIONという環境変数で代替しているようで、
PLENV_VERSION=5.16.2 plenv exec hoge.pl
とかやって使うっぽい。shellに慣れてれば楽かもしれない。
しかし、emacsなどではそうも行かないのでplenv-shellというのをでっちあげて、setenvするようにしたりとかいうのを工夫したりした。
flymakeでplenvのperlを使うには
plenv.elがguess-plenv-perl-pathという関数を定義するので、
それを使って良い感じにflymakeのperlのパスを弄ってあげると良い。
ぼくのemacs lispでは以下のような感じになっている。
(require 'plenv) ;; for guess-plenv-perl-path (require 'flymake) (defconst flymake-allowed-perl-file-name-masks '(("\\.pl$" flymake-perl-init) ("\\.pm$" flymake-perl-init) ("\\.psgi$" flymake-perl-init) ("\\.t$" flymake-perl-init))) (defun flymake-perl-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-with-folder-structure)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list (guess-plenv-perl-path) (list "-wc" local-file))))
書いてみた感想
emacs lispほとんど書いた事なかったので完全に手探りだった。
基本的にはこれのperlbrew版に当たる、perlbrew.elをコピペしてコードを読みながら書き換えて行った。
というか、replace-string perlbrew plenvした。
思ってたほどemacs lispはむずかしくなくて、lispの流儀をなんとなく感じながら書き換えたらなんとなく動くものが出来た。
個人的にはflymakeするときに使うperlがよしなに切り替えられればゴールとしては十分だったので、
一旦そこまで作って、ブログを書くに至った。
あとは、defmacroするのが楽しかった。
Hachioji.pm #26の感想
Hachioji.pmは初参加だったのだけど、スライドのupに苦戦してメモ取れてなかったりでざっくりとしか覚えていなかったり、その2日後が引越しだったので焦ってたということもあり感想記事を書いていなかったので今ざっくり感想を書いておこうと思う。
ハッカソンも初参加でおどおどしてしまったけど、次からはなかなかもくもくできそう!って感じだった。
本編もid:moznionさんをひたすら弄ってたり、隣の個室の人となんか叫んでたり、すごくおもしろかった。