$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

emacsで、インストールしているperl moduleのソースを一瞬で表示する

 emacsperlのコードを呼んでいると、このモジュールの中身どうなってるんだっけって思って調べることがよくあります。そんな時、perldoc -mをemacs上で呼ぶと便利です。

 emacs上でperldoc -mを使う方法はid:antipopさんがブログに書いていて、EmacsでPerl開発する上で必須な設定 #3 - perldoc-m - delirious thoughtsを参照すれば使うことが出来ます。今回は更にそれを改造して、もう少し使いやすくしてみました。

perldoc-m

改造したperldoc-mは以下のとおりです。id:motemenさんの作ったpm-packages.plが必要になります。

;; モジュールソースバッファの場合はその場で、
;; その他のバッファの場合は別ウィンドウに開く。
(defun perldoc-m ()
  (interactive)
  (let ((module)
        (module-list)
        (pop-up-windows t)
        (cperl-mode-hook nil))

    ;; regionがあったらそれのmoduleを、それ以外だったらsymbolを使う
    ;; それでもなかったら入力
    (cond ((use-region-p)
           (setq module (buffer-substring (region-beginning) (region-end))))
          (t
           (setq module (thing-at-point 'symbol))
           (unless module
             (setq module-list
                   (split-string (shell-command-to-string "pm-packages.pl") "\n"))
             (setq module (completing-read "Module Name: " module-list)))))

    (let ((result (substring (shell-command-to-string (concat "perldoc -m " module)) 0 -1))
          (buffer (get-buffer-create (concat "*Perl " module "*")))
          (pop-or-set-flag (string-match "*Perl " (buffer-name))))

      ;; error handling
      (when (string-match "No module found for" result)
          (message "%s" result))

      (with-current-buffer buffer
        (toggle-read-only -1)
        (erase-buffer)
        (insert result)
        (goto-char (point-min))
        (cperl-mode)
        (toggle-read-only 1))
      (if pop-or-set-flag
          (switch-to-buffer buffer)
        (display-buffer buffer)))))

これで何が出来るかというと

  • region選択していた場合は、その選択していたモジュール名を使ってperldoc -m出来る
  • 選択していない場合は、現在位置のモジュール名からperldoc -m出来る(DBI::dbみたいな名前だと、誤爆がおこる)
  • 現在位置に何もない場合は、現在インストールしているモジュールから補完しながら選択できる

こんな感じ。
f:id:shiba_yu36:20130126180555j:plain
f:id:shiba_yu36:20130126180604j:plain

今回の技術的tips

use-region-p

region選択しているか分かる。これを使うと選択範囲の有無によって動作を変える賢いコマンドを作れるので便利。

インストール済みのperlのモジュールのリストを作る

これはmotemenさんのコマンドを使うと楽に出来る。https://github.com/motemen/pm-packages.plに置かれている。出力内容を改行でsplitすれば終わり。

(setq module-list
    (split-string (shell-command-to-string "pm-packages.pl") "\n"))

まとめ

今回はemacsでperldoc -mを簡単に使う方法を紹介しました。perlbrew.elなどと一緒に使えば、perlのバージョンも考慮してくれるはずです。