理系学生日記

おまえはいつまで学生気分なのか

モジュール名からモジュールのソースファイルをシームレスに開く elisp Ver.2

モジュール名からモジュールのソースファイルをシームレスに開く 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 がいつ構築されて、その取得元はどこなのかよくわかってない