モジュール名からモジュールのソースファイルをシームレスに開く elisp - 理系学生日記で多少便利にはなったんだけど、以下の点に不満があったりしました。
- getenv で PERL5LIB 環境変数の値が取得できない場合がある*1
- perldoc でエラーが発生した場合に、何のエラーなのかが分からない
というわけで、PERL5LIB は自分で設定して、perldoc のエラー時にはエラーメッセージを出力するように変更した。
(defun find-module-source-file () (interactive) (setenv "PERL5LIB" (mapconcat 'expand-file-name '("~/perl5/lib/perl5" "~/perl5/lib/perl5/darwin-thread-multi-2level") ":")) (let ((module-name (cperl-word-at-point)) (buffer-name "*perldoc buffer*")) (if module-name (save-excursion (let* ((return-code (call-process "perldoc" nil buffer-name t "-l" module-name)) (return-value (progn (set-buffer buffer-name) (beginning-of-buffer) (buffer-substring (point-min) (progn (end-of-line) (point)))))) (kill-buffer buffer-name) (if (eq return-code 0) (find-file-read-only return-value) (message "An error occured in executing perldoc: %s" return-value)))) (message "Cannot retrieve a module name"))))
*1:emacs の process-environment がいつ構築されて、その取得元はどこなのかよくわかってない