引数がたくさんあるコマンドを何度か実行したくて,そのさいに,コマンドの一部分だけを書き換えながら実行したい,ということがある.
簡単な場合だと,3つの足し算を何度かやりたいとき,
% expr 1 + 2 + 3
6
% expr 4 + 5 + 6
15
みたいなのをちまちま打っていくのはめんどう.そこで,interactive.rbというのを作った.
interactive.rb
3つの足し算なので,毎回書き換えたいところをHERE
として,interactive.rbに与えて起動する.
% ruby interactive.rb expr HERE + HERE + HERE
起動すると,順番に,いまコマンドはこうなってるけど,どうしますか? と聞かれるので,1, 2, 3と順番に入力して,最後にyすると実行してくれる.実行すると,また最初から引数どうしますか?って聞いてくれる.
command: expr HERE + HERE + HERE
> 1
command: expr 1 + HERE + HERE
> 2
command: expr 1 + 2 + HERE
> 3
execute expr 1 + 2 + 3? (y/N)
> y
6
command: expr HERE + HERE + HERE
> 4
command: expr 4 + HERE + HERE
> 5
command: expr 4 + 5 + HERE
> 6
execute expr 4 + 5 + 6? (y/N)
> y
15
実世界での使い方
コマンドラインからWebアプリケーションのHTMLのテンプレートファイルをリファクタリングするツールを作っているのだけど,コマンドラインから複雑な入力を何度も与えるのが大変だった.
そこで,以下のように,このテンプレートファイルを切り出して,このディレクトリに置いていきたい,という形でinteractive.rbを起動すると,入力に集中することができて便利.
_(なんとか).htmlに切り出したいので,_HERE.html という形で指定する.
% ruby interactive.rb xrt extract templates/bookmark/add.html HERE templates/ bookmark/_HERE.html
command: xrt extract templates/bookmark/add.html HERE templates/ bookmark/_HERE.html
> <input type="text" id="url"
command: xrt extract templates/bookmark/add.html <input type="text" id="url" templates/ bookmark/_HERE.html
> input_url
execute xrt extract templates/bookmark/add.html <input type="text" id="url" templates/ bookmark/_input_url.html? (y/N)
> y
% git diff
diff --git a/templates/bookmark/add.html b/templates/bookmark/add.html
index ce6b9da..ea2a9c2 100644
--- a/templates/bookmark/add.html
+++ b/templates/bookmark/add.html
@@ -5,7 +5,7 @@
<tr>
<th><label for="url">URL</label></th>
<td>
- <input type="text" id="url" name="url" class="text" value="[% entry ? entry.url : c.req.param('url') %]"/>
+ [% INCLUDE "bookmark/_input_url.html" %]
</td>
</tr>
<tr>