Masteries

技術的なことや仕事に関することを書いていきます.

プラグインを入れてReplyを更に便利にする

天皇誕生日という週の真ん中に現れた祝日, 皆様如何お過ごしでしょうか. papixです.

12月23日と言えば前述の通り天皇誕生日ですが, それに加えて今年のYAPC実行委員長だった我らが@yusukebeさんの誕生日でもあります.
更に私事ではありますが, 今日は自分の母親の誕生日でもあり, 個人的には非常におめでたい一日だったりします.

...という前置きは置いといて, 唐突ではありますがPerl Advent Calendarの23日目の記事をお届けしたいと思います.
今回は, 以前Perl入学式Advent Calendarの15日目で紹介したReplyを, 更に便利に使えるようにするプラグインやモジュールを紹介したいと思います.
いわば, Perl Advent CalendarとPerl入学式 Advent Calendarの奇跡のコラボ! といった感じですね!

Replyのプラグイン

Replyには, プラグインによってReplyそのものの機能を拡張する仕組みがあります.
プラグインの中にはReplyをインストールした際に自動的に使えるようになるものもありますし, CPANからインストールすることで使えるようになるものもあります.
今回は, その中でも有用なプラグインをいくつか紹介したいと思います.

なお, 利用するプラグインは, Replyの設定ファイルである.replyrcで指定することができます.
このファイルは, Replyを始めて起動したタイミングで(存在しなければ)自動的に生成されます.
デフォルトでは, 以下のようになっています.

script_line1 = use strict  
script_line2 = use warnings  
script_line3 = use 5.018002  
  
[Interrupt]  
[FancyPrompt]  
[DataDumper]  
[Colors]  
[ReadLine]  
[Hints]  
[Packages]  
[LexicalPersistence]  
[ResultCache]  
[Autocomplete::Packages]  
[Autocomplete::Lexicals]  
[Autocomplete::Functions]  
[Autocomplete::Globals]  
[Autocomplete::Methods]  
[Autocomplete::Commands]  

この中の, [Interrupt]とか[FancyPrompt]が, プラグインを有効にする設定です.
例えば次に説明するReply::Plugin::DataPrinterを有効にするのであれば, 次のように書きます.

[DataPrinter]  

プラグインのパッケージ名から, Reply::Plugin::を取り除いたものを記述すればOK, という訳ですね!

DataDumper / DataDump / DataPrinter

入力したコードの実行結果を表示する際に使う, ダンパーを設定することが出来ます.

$ reply  
0> my $hoge = 'fuga';  
$res[0] = 'fuga' # ここを出力する際のダンパーを設定出来る  
  
1>  

上記の出力は, 自動的に生成される.replyrcで最初から指定されているDataDumper(Data::Dumperを利用してダンプ)の場合のものです.
これをDataDump(Data::Dumpを利用してダンプ)に変更すれば, 次のような出力になります.

$ reply  
0> my $hoge = 'fuga';  
$res[0] = "fuga"  
1>  

常日頃使っているダンパーモジュールを設定しておけば, 同じような出力が得られるので非常に使い勝手が良くなるでしょう.

LoadClass

デフォルトで利用するように設定されていますが, 非常に便利なプラグインです.
入力したコードの中で, まだロードしていないモジュールの関数を呼び出している場合に, それを自動的にuseして, 使えるようにしてくれます.

$ reply  
0> DateTime->now  
$res[0] = 2014-12-23T14:25:04 # DateTimeをuseしていないのに, 使える!  

ちなみに, LoadClassプラグインを有効にしていない場合, 先ほどのコードを入力すると次のように出力されます.

$ reply  
0> DateTime->now  
Can't locate object method "now" via package "DateTime" (perhaps you forgot to load "DateTime"?) at reply input line 1.  

Editor

Reply上で, 少し長めのコードを書く時に便利なプラグインです.
.replyrcに次のような設定しておけば, 入力コードとして#eを入力した際に, 自動的にエディタ(次の場合, vim)が立ち上がります.

[Editor]  
editor = vim  

そのエディタ上でコードを書いて保存して終了すると, 記述したコードがReply上で実行されます.
例えば, エディタ上で次のようなコードを入力した場合...

my $hoge = +{ hoge => 123, fuga => 234 };  
use DDP { deparse => 1 };  
DDP::p $hoge;  
  
print $hoge->{hoge} . "\n";  
print $hoge->{fuga} . "\n";  

出力は以下のようになります.

$ reply  
0> #e  
\ {  
    fuga   234,  
    hoge   123  
}  
123  
234  
$res[0] = 1  

更にこの後, 続けて#eを入力すれば, 先ほどエディタで記述したコードを再び編集することが出来ます.
Vimの場合, 簡単なスクリプトであればquickrunなどで実行し, 試してみる方法がありますが, Replyを使ったこちらの実行方法もなかなか簡単なのではないでしょうか.

ちなみに, Editorプラグインを利用する場合, エディタを呼び出す為にProc::InvokeEditorというモジュールが必要になるようです.
予めcpanmコマンドなどでインストールしておきましょう.

Carp::Reply

Replyのプラグインではありませんが, こちらのモジュールも非常に便利なので紹介します.
Carp::Replyを使えば, Perlスクリプトの任意のタイミングでCarp::Reply::replを実行することで, Replyを呼び出すことができます.

use strict;  
use warnings;  
use utf8;  
use Carp::Reply;  
  
print "hello, world!\n";  
my $hoge = 123;  
  
Carp::Reply::repl;  
  
print "hoge: $hoge\n";  

例えば, このスクリプトsample.plという名前で保存し, 実行すると...

$ perl sample.pl  
hello, world!  
Now at sample.pl:9 (frame 0)  
Backtrace:  
Trace begun at sample.pl line 9  
0>  

このように, Carp::Reply::replまでのコードを実行した上で, Replyが起動します.
この時点で, 既に$hogeには123が代入されているので, Reply上で$hogeの値を出力すると...

0> $hoge  
$res[0] = 123  
1>  

このように, 正しく123が得られます.
更に, Reply上で$hogeの値を書き換え, Ctrl + dでReplyを抜けると...

1> $hoge = 321  
$res[1] = 321  
2> # Ctrl + dでReplyを抜ける  
hoge: 321  

sample.pl$hogeの値が, Replyで書き換えた321になった上で実行されていることがわかります.

このように, Carp::Replyを使えば, Reply経由で任意のタイミングにおけるいろいろな変数の中身を確認したり, 変更したりすることができます.
是非, 日々のデバッグ作業にお役立て下さい.

まとめ

Replyを使う上で便利なプラグインやモジュールの紹介をしました.
ここで紹介した以外にも, Replyは様々なプラグインをデフォルトで提供していますし, CPANを探せば@tsucchiさんのReply::Plugin::DataDumperAutoEncodeなど, 様々なプラグインがあります.

Replyは非常に便利なツールですが, プラグインを導入したり, 或いは作ったりすれば更に便利になります. 実際, 自分も今回の記事を書いている上でReply::Plugin::Editorの存在を知り, 試してみたところ非常に使い勝手が良かったので, 早速.replyrcに設定を追加したりしました.

いろいろ試してみて, 皆さん独自の, 使い勝手のいいReplyを作っていきましょう!

...さて, 投稿時間をイジって12月23日の23時59分に投稿したように偽造しておりますが, 実はこの記事はその時間から少し遅れて12月24日の午前1時くらいに投稿しております... 本当にすいません!
気を取り直しまして, 明日(?)の12月24日のPerl Advent Calendarは@punytanさんの予定となっております. ヾ(o゜ω゜o)ノ゛''''プニプニ!