emacsで利用するperlを切り替えるperlbrew.elというのをantipopさんが作っていたのですが、少し動かなかった部分を修正したので、紹介したいと思います。
emacsとperlbrew
perlbrewを使っているとPATHなどの関係から使いたいperlのversionを指定できない時があります。そんな時はperlbrew.elが使えます。
インストール
まず、https://raw.github.com/kentaro/perlbrew.el/master/perlbrew.el からダウンロードしてきて、以下の設定をします。
(require 'perlbrew) (perlbrew-use "perl-5.14.2")
これによりデフォルトでperl-5.14.2を利用できます。
利用するperlを切り替える
M-x perlbrew-useとすると利用するperlを切り替えることができます。TABで補完できます。これを実行することで、自動的にPATHやexec-pathを切り替えてくれるので、外部プログラムを呼ぶときも適用されます。
perlbrewのディレクトリを変更する
perlbrew-dirという変数を用意したので~/perl5/perlbrewみたいなのを渡してあげると変更できます。
使い方例
https://github.com/shibayu36/emacs/blob/master/emacs.d/inits/20-edit-mode-perl.el あたりを見ていただけると、使い方例が分かります。
技術的な話
今回パッチを送るにあたっていろいろと学んだことがあったので書きます。
ユーザがカスタマイズできる変数を定義する
defgroupとdefcustomを使うとできるようです。今回は以下のように定義しました。
(defgroup perlbrew nil "perlbrew" :group 'perlbrew) (defcustom perlbrew-dir (concat (getenv "HOME") "/perl5/perlbrew") "your perlbrew directory" :group 'perlbrew)
groupを定義して、そのgroupにcustom変数をひもづけるイメージです。groupは他のgroupにひもづけることもできたりします。
ユーザ入力を補完できるようにする
今回はperlbrew-useしたときに、インストールしているperlのversionを補完したいという状況でした。そういう場合はcompleting-readが利用できます。
(defun perlbrew-use (version) (interactive (list (completing-read "Version: " (perlbrew-list)))) (setq perlbrew-perls-dir (concat perlbrew-dir "/perls")) ...
(perlbrew-list)は現在インストールされているperlをリストとして返すので、補完が可能になります。
join
join難しかったけど、mapconcatでできるようです。
(mapconcat 'identity (list) ":")
リストからある条件にマッチするものを削除する
これはclのremove-ifでできました。
(remove-if (lambda (i) (not (string-match "^\\(perl\\|[0-9]\\|system\\)" i)))
最後に
elisp書こうとするといつもやっている言語で出来ることがどうやってやればいいかなかなか分からなくて、辛い感じになってきたので最近はEmacs LISP本を読んでいます。なんか間違ってること書いてたら教えてください。