Sun, 21 Jul 2013
grepの代わりに、grin、ack、rak、ag
タイトル通り、最近はgrepより簡単に使える検索コマンドというのがいくつかあるようです。grin(pythonで書かれている。これだけ少し毛色が違う)、ack(perlで書かれている)、rak(ackのrubyを使った実装)、ag(the silver searcher)(ackよりも早く!を目指してCで書かれたもの)。簡単にというのは、「余分なものはデフォルトで検索対象から除外になっているので構文が簡単」くらいの意味です。grin some_regexみたいな感じ。みんな早い早い言ってますが、自分はvmware fusionでHaikuという環境なので、良く分りません。
ではさっそく…といきたいのですが、Haikuで使おうとすると難しいものもあります。grinはeasy_installを使って問題無くインストール完了しました。BeOSやHaikuでpythonのライブラリを入れたりする際に、上手くいかなかったことはほとんど経験がありません。ackはCPANから入れようとすると、エラーが出て途中で止ってしまいます。経験上、BeOSやHaikuでCPANを使って何かを入れようとしても、成功する確率はあまり高くありません。ackは必要なライブラリ等が全部ひとつのファイルに纏められた形のものがあるので、今回はそれをダウンロードしました。rakは、gemからインストールして問題無く使えました。CPANからの時ほどではありませんが、gemから何か入れようとしても、成功するかは微妙と思っています。BeOSやHaikuでは、ということでが。
ここで終っても良かったのですが、せっかくなのでag(the silver searcher)もコンパイルしてみました。configureスクリプトを騙してしまえば後は何とかなるだろうと思ったら、できあがったバイナリはディレクトリの情報をちゃんと取れていないっぽい感じで、検索結果が変でした。src/scandir.cにそれっぽい部分があったのでそれに乗っかって、以下のように修正したところ…上手くいったようです。
#if defined (__SVR4) && defined (__sun) || defined(__HAIKU__)
/*
* The d_name member of the dirent struct is declared as char[1] on
* Solaris, we need to actually allocate enough space for the whole
* string.
*/
d = malloc(sizeof(struct dirent) + strlen(entry->d_name) + 1);
#else
d = malloc(sizeof(struct dirent));
#endif
if (d == NULL) {
goto fail;
}
memcpy(d, entry, sizeof(struct dirent));
#if defined (__SVR4) && defined (__sun) || defined (__HAIKU__)
strcpy(d->d_name, entry->d_name);
#endif
ということで、自分用にバイナリを置いておくことにします。haikuportのlibpcre、libz、liblzma(xz-util)に依存しています。ag-0.15pre-haikur1a4-gcc4.zipちなみにオチはありません。あえて言えば、ちょっとだけでも自分で手をかけた分、agを使おうかなって感じです。