gistyに自分の全gistに対してgrepで全文検索を実行するコマンドを追加してみた

最近自分のgist達をgrepする機会が多くて、
そのたびにfind ~/gisty | xargs grep hogeとかやってて、「面倒ダナー」って思ったのでgistyをforkして*1grepコマンドを追加してみた。

以下、動作イメージ

 $ gisty grep hoge
/Users/snaka/gisty/151696/hateDAopener.js:140:     * @return [{"url": "(url)", "name": "hogehoge", "tags": "[hoge]"}, ... ]
/Users/snaka/gisty/151696/hateDAopener.js:194:     * @param String Title and Tags ex. "[hoge, fuga]About me."
/Users/snaka/gisty/127290/gistfile1.txt:277:            liberator.dump("***hoge");
/Users/snaka/gisty/109212/CanvasSample.html:12:          drawText({ position: [50, 15], string: "hoge" });
/Users/snaka/gisty/90215/gntp.rb:155:      :name     => "hoge",
/Users/snaka/gisty/90215/gntp.rb:161:    :name  => "hoge",
/Users/snaka/gisty/90215/gntp.rb:163:    :text  => "hogeほげ?",
/Users/snaka/gisty/63046/vimperator_plugin_template.js:84:            ["hoge", fuga"],
/Users/snaka/gisty/63046/vimperator_plugin_template.js:85:            ["hoge1", fuga1"],
/Users/snaka/gisty/63046/vimperator_plugin_template.js:113:    /* この関数を呼び出す場合は api.hoge() という感じで呼び出す */
/Users/snaka/gisty/63046/vimperator_plugin_template.js:114:    hoge: function(a,b) {
/Users/snaka/gisty/48974/gistfile1.txt:2:// @name           (hoge)
/Users/snaka/gisty/48974/gistfile1.txt:14://   (hoge hoge)
/Users/snaka/gisty/762058bf07fda317318b/MechanizeSample.rb:53:page.save_as "./hoge.csv"

gistyはよくできていて、コマンドの実装は bin/gisty の中で、cmdメソッドに、コマンド名(シンボルで)とそのコマンドの処理内容をブロックで渡してあげるだけでいい。

主な変更点は bin/gisty の以下の箇所。

diff --git a/bin/gisty b/bin/gisty
index 3514351..7e3f75c 100755
--- a/bin/gisty
+++ b/bin/gisty
@@ -22,6 +22,7 @@ usage:
   gisty commands
 commands:
   gisty list                          show local list.
+  gisty grep word                     execute grep with all gists.
   gisty post file1 file2 ...          post new gist.
   gisty private_post file1 file2 ...  post new private gist.
   gisty sync                          sync remote gist. (clone all remote gist)
@@ -44,6 +45,17 @@ cmd :list do
   end
 end
 
+cmd :grep do |word|
+  list = @g.list
+  (list[:public] + list[:private]).each do |i|
+    i[1].each do |f|
+      target = File.join ENV['GISTY_DIR'], i[0], f
+      result = `grep -H -n #{word} "#{target}"`
+      puts result if result != ""
+    end
+  end
+end
+
 cmd :sync do
   @g.sync
   puts '---'

これだけでgrepコマンドが実装できた。素晴らしい。

ちなみにソースはgithubに置いてるので、お好きにどうぞ。
snaka's gisty at master - GitHub

ToDo

  • GemCutterに上げる(gem名はどうしよ?)どうもGithubみたいに fork版とわかるような仕組みが今のところないようなので、GemCutterにあげるのはやめておく。
  • fork後の本家修正を取り込む

追記:インストール方法について

とりあえず以下のようにインストールできます。

$ wget http://cloud.github.com/downloads/snaka/gisty/snaka-gisty.gem
$ sudo gem install snaka-gisty.gem

追記:2009.12.29 gemコマンドから直接インストールする方法

以下のコマンドでgithubから直接インストールすることができます。

$ gem install --source http://github.com/snaka/gisty/raw/master/ gisty

*1:fork自体はずいぶん前にやってたんだけど、ずっと放置状態だった。