Milkode

Table of Contents

gmilkについて

gmilkというコマンドを使うとgrepのようにコマンドラインから検索することが出来ます。

$ gmilk print                     # 'milk grep print' でも同じ
a_project/c.rb:1:print 'cccccc'

基本の検索

登録したパッケージ内から実行します。

$ cd /path/to/ruby-1.9.2-p290

gmilk キーワード1 キーワード2 ..でAND検索です。

$ gmilk rb_define_method split
string.c:7505:    rb_define_method(rb_cString, "split", rb_str_split_m, -1);
.
.

パッケージ内のどこにいてもパッケージ全体を検索します。
小さなことですが使ってみると現在位置を意識する必要がなくなり検索しやすくなります。

$ cd doc/rake/example                      # 移動しても・・
$ gmilk rb_define_method split rb_cString  # パッケージ全体を検索出来る!
../../../string.c:7505:    rb_define_method(rb_cString, "split", rb_str_split_m, -1);

現在位置から検索

<-d 相対パス>オプションを指定することで現在位置を基準として検索することが出来ます。

# 現在位置から検索
$ gmilk -d . test
 
# 一つ上から検索
$ gmilk -d .. test

ファイルパスで絞り込み

<-f パス名>を指定することでファイルパスで結果を絞り込むことが出来ます。

# ディレクトリ階層も表現出来る
$ gmilk -f doc/rake/example task default
doc/rake/example/Rakefile1:3:task :default => [:main]
.

拡張子で絞り込み

<-s 拡張子>を指定することで拡張子で絞り込むことが出来ます。

# 拡張子.hで絞り込み
$ gmilk rb_define_method -s h
ext/openssl/ossl_pkey.h:137:   rb_define_method(class, #name, ossl_##keytype##_get_##name, 0); \
.

複数個指定することも出来ます。

# .rdoc と .txt で絞り込み
$ gmilk rubygems -s rdoc -s txt -i
doc/rubygems/History.txt:7:http://rubygems.org is now the default source for downloading gems.
.

何かを検索する際、目的とするファイルの拡張子が分かっていることは結構多いです。
候補が減ることにより検索も速くなるので、積極的に使うことをおすすめします。

find-mode

キーワードを指定せずに-d-s-fだけを指定するとfind-modeになります。検索条件にマッチしたファイル一覧が表示されます。

# .cppを全て表示
$ gmilk -s cpp
debug.cpp
.
     
# 'README'と'ja'を含むファイルを全て検索
$ gmilk -f README -f ja
README.EXT.ja
README.ja
.

更新しながら検索

重要な機能です。<-u>を付けるとパッケージを更新(milk update)してから検索を開始します。
パッケージ内に修正を加えたら定期的に-uを付けましょう。

$ gmilk -u test
package    : ruby-1.9.2-p290
ChangeLog:39178:   * test/ruby/test_m17n_comb.rb: use allpairs.rb to reduce test cases.
.
.

全てのパッケージから検索

<-a>を付けると全てのパッケージを検索対象に含めます。

$ gmilk -a dddddd
../../../../../../Documents/a_project/d.rb:1:puts 'dddddd'
.
.

検索結果が多すぎる時は<-n>オプションで表示数を抑制しましょう。

$ gmilk -a puts -n 2
../../../../../../Documents/a_project/c.rb:1:puts 'cccccc'
../../../../../../Documents/a_project/d.rb:1:puts 'dddddd'

パッケージ名を指定して検索

<-p>で検索するパッケージを指定することが出来ます。

$ gmilk -p a_project cccccc

パッケージは複数指定出来ます。

$ gmilk -p a_project -p ruby dddddd

大文字小文字の区別

# 全て小文字なら大文字/小文字を区別しないように
$ gmilk milkode test
sample.txt:10:A Milkode test.
test/milkode_test_work.rb:16:class MilkodeTestWork
test/test_cdstk_command.rb:8:require 'milkode_test_work'
 
# 大文字小文字混ざりの時は厳密に区別します
$ gmilk Milkode test
sample.txt:10:A Milkode test.
 
# 小文字を厳密に区別したい時は--case-sensitive(--cs)オプションを使います
$ gmilk milkode test --cs
test/test_cdstk_command.rb:8:require 'milkode_test_work'

色付け

<–color>で検索結果を色付けすることが出来ます。

gmilk-color

その他のコマンド

ヘルプを参考にして下さい。

$ gmilk -h
gmilk [option] pattern
gmilk is 'milk grep'.

Stateful:
    -l,                              Change state 'line'. (Match line words.)
    -k,                              Change state 'keyword'. (Match file-content or file-path.)
    First state is 'line'.
    Example:
      gmilk line1 line2 -k keyword1 keyword2 -l line3 -k keyword3 ...

Gotoline:
    -g,                              Go to line mode.
    Enter a file name and line number. If you omit the line number jumps to the line:1.
    Example:
      gmilk -g database lib 7
      lib/database.rb:7:xxxxxxxxxxxxxxx
      database_lib.rb:7:yyyyyyyyyyyyyyy

      gmilk -g lib/database.rb:7 test/test_database.rb:5
      lib/database.rb:7:xxxxxxxxxxxxxxx
      test/test_database.rb:5:yyyyyyyyy

Normal:
    -a, --all                        Search all package.
    -c, --count                      Disp count num.
        --cache                      Search only db.
        --color                      Color highlight.
        --cs, --case-sensitive       Case sensitivity.
    -d, --directory DIR              Start directory. (deafult:".")
        --db DB_DIR                  Specify dbdir. (Use often with '-a')
    -f, --file-path FILE_PATH        File path. (Enable multiple call)
    -i, --ignore                     Ignore case.
    -n NUM                           Limits the number of match to show.
        --no-snip                    There being a long line, it does not snip.
    -p, --package PACKAGE            Specify search package.
    -r, --root                       Search from package root.
    -s, --suffix SUFFIX              Suffix.
    -u, --update                     With update db.
        --verbose                    Set the verbose level of output.
    -v, --version                    Show this version.