cperl-modeにanythingを使った補完機能を追加するperl-completion.elをcodereposにコミットしました

これはなに?

cperl-mode向けのマイナーモードです。
useしているメソッド、インストールされているモジュール、組み込み変数,関数、他のperlバッファの関数,変数、バッファのdabbrev候補などを補完したりperldocを引いたりする動作をanythingのUIで実行することができます。

インストール

以下から最新版をダウンロードできます。
http://svn.coderepos.org/share/lang/elisp/perl-completion/trunk/perl-completion.el
ロードパスが通った場所に置いてcperl-modeのhookでマイナーモードをonにしてください、以下、設定サンプルです。

(add-hook 'cperl-mode-hook (lambda ()
                             (require 'perl-completion)
                             (perl-completion-mode t)))

メソッドの補完に使用しているので Class::Inspector がインストールされていない場合はインストールしてください。

cpan -i Class::Inspector

外部コマンドを呼ぶ部分があるので以下のプログラムがインストールされている必要があります。

find、xargs、egrep、sort、uniq

linux, unix系の環境なら問題ないと思います。
windows環境の場合はcygwinが入っていてpathが通っていればOKです。多分。

ドキュメント

簡単な使い方の説明

主な機能は補完とperldocを引く動作です。

動作は以下のような流れになります。
起動(C-RET or M-TAB(C-M-i))-> パターンを入力して絞り込み -> C-n,p で上下選択 -> アクション選択(RET,J,K,L,O,TAB)

絞り込みはスペース区切りで複数の文字を入力できます。
例、Plagger::Plugin::Widget::Simple::Widget を選択するために plu wi si wi を入力。
これはanythingのマッチの際に plu.*?wi.*?si.*?wi という正規表現に置換されます

メインのアクションは以下の三つです。
RET 入力
L ドキュメントをチラ見(look)
J,K でLで表示したドキュメントスクロール
D ドキュメントを開く
O モジュールのファイルを開く(対象がモジュール場合のみ)

補完部分

plcmp-smart-complete (C-RET or M-TAB(C-M-i))
ほんのちょっと賢い補完です。
このマイナーモードのメインのコマンドです。
コマンド起動時にバッファを解析してコンテキスト合わせた補完候補を表示してくれます。

少しがんばってもコンテキストが特定できなかった場合は、素直にあきらめて全ての補完候補を表示するようになっています。
無理に補完候補を調節するより、それっぽい補完候補を全て表示してanythingで絞り込む方が強力だと思ったからです。

基本的に補完を行いたい場所で C-RET(control + return)を押せば良いように作っています。

emacsのマーカー(カーソル)を `!!' として、以下に現在実装されている全てのパターンを書きます。補完候補は出現順です。

$self->`!!'
  • バッファ内の関数
  • useされているモジュールの全てのメソッド(Class::Inspectorを使って習得)
  • dabbrev
Foo::Bar->`!!'
$ua->`!!' #モジュールが特定できなかった場合
  • バッファ内でuseされているモジュールの全てのメソッド(Class::Inspectorを使って習得)
  • dabbrev
my $ua = LWP::UserAgent->new();  #オブジェクト指向インターフェイスのメソッド呼び出し
$ua->`!!' #(結構適当なので必ず検知できるわけではないです)
  • LWP::UserAgentのメソッド(Class::Inspectorを使って習得)
use `!!'
  • インストールされている全てのモジュール


上記に当てはまらない場合は、全ての補完候補を表示します。
ここら辺の仕組みは今後変更するかもしれません。
追ってこのブログに書くように努力します。

絞り込み部分

入力した文字が正規表現として扱われ補完候補が絞り込まれます。
注意して欲しい点は、表示されている文字列にマッチするという点です。
[LWP::UserAgent] | agent
という候補を選択するために agent と入力しても他のメソッドもヒットしてしまいます。
ここら辺は不便だと思っているので、将来的に純粋な補完候補のみにマッチするようにするカスタム可能な仕組みを実装するつもりです。

ちょっと綺麗ではないですが、現状の回避策として ag ag と入力すると ag.*?ag という正規表現になるのでLWP::UserAgentのagentメソッドにマッチするようになります。

perldoc

L J K で最速perldoc研究会です。
補完時にモジュール、組み込み関数、組み込み変数等を選択している時、L(shift + l)を押すとperldocをチラ見でき、J,Kでスクロールできます。
地味に便利です。

その他 メモ等

ブクマコメント、キーワード等はウォッチしてますので、なにかアイデアなどいただけたらとてもうれしいです。

遅ればせながらtwitterも始めたので話しかけてくれてもうれしいです。
http://twitter.com/imakado

謝辞

以下の方のエントリー等からアイデアを得たりコードを参考にさせてもらいました

id:antipopさん

インストールされているモジュール習得
EmacsでPerlのモジュール名を動的に補完する - Kentaro Kuribayashi's blog