コマンドラインから検索

From Milkode

Jump to: navigation, search

Contents

[edit] gmilkについて

gmilkというコマンドを使うとMilkodeデータベースの内容をgrepのようにコマンドラインから検索することが出来ます。なお同様のことがmilk grepからも出来ます。

$ gmilk print ccccc
a_project/c.rb:1:print 'cccccc'

[edit] 基本の検索

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

$ mcd ruby
/Users/auser/.milkode/packages/zip/ruby-1.9.2-p290

gmilk キーワード1 キーワード2 ....でAND検索です。数千や数万オーダーのファイル数が登録されていても1秒位で検索出来ます。

$ gmilk rb_define_method split
string.c:7505:    rb_define_method(rb_cString, "split", rb_str_split_m, -1);
ext/tk/tcltklib.c:10519:    rb_define_method(ip, "_split_tklist", ip_split_tklist, 1);
ext/bigdecimal/bigdecimal.c:2038:    rb_define_method(rb_cBigDecimal, "split", BigDecimal_split, 0);

キーワードを重ねることで絞り込み検索になります。

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

gmilkはパッケージ内のどこにいてもパッケージ全体を検索します。 小さなことですが使ってみると現在位置を意識する必要がなくなり、キーワードだけで目的の箇所を探すことが出来るため、コーディングや文書の作成に集中しやすくなります。

$ 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);

[edit] 現在位置から検索

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

# ruby-1.9.2-p290/doc/rake/exampleに移動
$ mcd
/Users/auser/.milkode/packages/zip/ruby-1.9.2-p290
$ cd doc/rake/example
 
# 現在位置(ruby-1.9.2-p290/doc/rake/example)から検索
$ gmilk -d.
Rakefile1:3:task :default => [:main]
Rakefile2:4:task :default => [:main]
 
# 一つ上(ruby-1.9.2-p290/doc/rake)から検索
$ gmilk -d.. task default
../rakefile.rdoc:216:the with_defaults method in the task body.  Here is the above example
../CHANGES:85:* Changed RDoc test task to have no default template. This makes it
../CHANGES:195:* Made the RDoc task default to internal (in-process) RDoc formatting.
../rational.rdoc:91:named, rake will invoke the task "default".
../README:54:  task :default => [:test]
../README:64:* A task named "default". This task does nothing by itself, but it has exactly
../README:65:  one dependency, namely the "test" task. Invoking the "default" task will
../README:69:"default" task in the Rakefile:
Rakefile1:3:task :default => [:main]
Rakefile2:4:task :default => [:main]

[edit] ファイルパスで絞り込み

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

# READMEというファイルから'Mac'と書いてある行を検索
$ gmilk -f README Mac
README.EXT:1297:** Macros for the Compatibilities
README:20:    as well as Windows, Mac OS X, BeOS etc.)
ext/tk/README.tcltklib:64: --enable-mac-tcltk-framework  (MacOS X) use Tcl/Tk framework
ext/tk/lib/README:23:tkmacpkg.rb	Mac resource support
README.ja:24:    動くだけでなく,Windows, Mac OS X,BeOSなどの上でも動く
ext/tk/README.macosx-aqua:2:  *** for MacOS X Aqua (Tcl/Tk Aqua) users ***

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

[edit] 拡張子で絞り込み

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

# 大量に出る検索結果を
$ gmilk rb_define_method 
string.c:7453:    rb_define_method(rb_cString, "initialize", rb_str_init, -1);
.
.
.
# 拡張子.hで絞り込み
$ gmilk rb_define_method -s h
ext/openssl/ossl_pkey.h:137:	rb_define_method(class, #name, ossl_##keytype##_get_##name, 0);	\
ext/openssl/ossl_pkey.h:138:	rb_define_method(class, #name "=", ossl_##keytype##_set_##name, 1);\
include/ruby/ruby.h:1055:void rb_define_method(VALUE,const char*,VALUE(*)(ANYARGS),int);
include/ruby/intern.h:170:void rb_define_method_id(VALUE, ID, VALUE (*)(ANYARGS), int);
ext/openssl/ruby_missing.h:15:	rb_define_method(klass, "initialize_copy", func, 1)

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

# .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.
.
.
doc/rake/release_notes/rake-0.8.7.rdoc:37:The easiest way to get and install rake is via RubyGems ...
doc/rubygems/LICENSE.txt:1:RubyGems is copyrighted free software by Chad Fowler, Rich Kilmer, Jim

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

[edit] find-mode

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

$ mcd ruby
/Users/auser.milkode/packages/zip/ruby-1.9.2-p290

# .hを全て表示
$ gmilk -s h
debug.h
dln.h
enc/iso_2022_jp.h
enc/unicode/name2ctype.h
enc/utf_7.h
enc/x_emoji.h
encdb.h
eval_intern.h
ext/Setup.atheos
ext/bigdecimal/bigdecimal.h
.
.
.

# 'README'と'ja'を含むファイルを全て検索
$ gmilk -f README -f ja
README.EXT.ja
README.ja
doc/pty/README.expect.ja
doc/pty/README.ja
ext/readline/README.ja
sample/drb/README.rd.ja

[edit] 更新しながら検索

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

# -uを付けるとパッケージを更新した後、検索。
$ gmilk -u test BUG
package    : ruby-1.9.2-p290
 
ChangeLog:14748:	* KNOWNBUGS.rb, bootstraptest/test_fork.rb: move a fixed test.
ChangeLog:19504:	  test_complexrational.rb: [BUG] in IA-64 architecture
ChangeLog:29330:	* KNOWNBUGS.rb, bootstraptest/test_method.rb: move fixed test.
ChangeLog:29435:	* KNOWNBUGS.rb: add a test.  see [ruby-dev:36028]
ChangeLog:34493:	* KNOWNBUGS.rb, bootstraptest/pending.rb: move a bug (?) to pending.
ChangeLog:34650:	* KNOWNBUGS.rb, bootstraptest/pending.rb: move pending bug.
ChangeLog:34657:	* KNOWNBUGS.rb, bootstraptest/test_proc.rb: add/move solved test.
ChangeLog:34786:	* KNOWNBUGS.rb, bootstraptest/test_method.rb: move solved test.
ChangeLog:34998:	* KNOWNBUGS.rb, bootstraptest/test*.rb: move solved bugs.
ChangeLog:35217:	* test_knownbug.rb -> KNOWNBUGS.rb: renamed.
ChangeLog:78067:	* test/soap/calc/test_calc_cgi.rb: take over $DEBUG to ruby process
common.mk:432:	-$(RUNRUBY) "$(srcdir)/bootstraptest/runner.rb" --ruby="$(PROGRAM)" $(OPTS) $(srcdir)/KNOWNBUGS.rb
 
# -a が付いていれば全てのパッケージを更新してから検索
$ gmilk -u -a all test case
package    : a_project
package    : milkode-0.2.4.5
package    : ruby-1.9.2-p290
result     : 3 packages, 3340 records. (0.33sec)
*milkode*  : 3 packages, 3340 records in /Users/auser.milkode/db/milkode.db.
 
ChangeLog:39178:	* test/ruby/test_m17n_comb.rb: use allpairs.rb to reduce test cases.
ChangeLog:56536:	* common.mk (test-all): separate directory where running test cases
ChangeLog:80028:	  run testcases automatically.
test/rubygems/test_gem_installer.rb:1:require_relative 'gem_installer_test_case'
test/rexml/data/test/tests.xml:42:    
test/rubygems/test_gem_uninstaller.rb:1:require_relative 'gem_installer_test_case'

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

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

$ gmilk -a dddddd
../../../../../../Documents/a_project/d.rb:1:puts 'dddddd'
sprintf.c:217: *            | with one digit before the decimal point as [-]d.dddddde[+-]dd.
sprintf.c:222: *        f   | Convert floating point argument as [-]ddd.dddddd,
test/net/http/test_http.rb:303:    data = 'aaabbb cc ddddddddddd lkjoiu4j3qlkuoa'

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

$ gmilk -a puts -n 5
../../../../../../Documents/a_project/c.rb:1:puts 'cccccc'
../../../../../../Documents/a_project/d.rb:1:puts 'dddddd'
../../../../../../../../opt/local/lib/ruby/gems/1.8/gems/milkode-0.2.4.5/Rakefile:7:#   $stderr.puts e.message
../../../../../../../../opt/local/lib/ruby/gems/1.8/gems/milkode-0.2.4.5/Rakefile:8:#   $stderr.puts "Run `bundle install` to install missing gems"
../../../../../../../../opt/local/lib/ruby/gems/1.8/gems/milkode-0.2.4.5/Rakefile:63:  puts "--- rvm 1.9.2@milkode ---"

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

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

$ gmilk -p a_project cccccc
Documents/a_project/c.rb:1:puts 'cccccc'

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

$ gmilk -p a_project -p ruby dddddd
Documents/a_project/d.rb:1:puts 'dddddd'
.mikode/packages/zip/ruby-1.9.2-p290/sprintf.c:217: *            | with one digit before the decimal point as [-]d.dddddde[+-]dd.
.mikode/packages/zip/ruby-1.9.2-p290/sprintf.c:222: *        f   | Convert floating point argument as [-]ddd.dddddd,
.mikode/packages/zip/ruby-1.9.2-p290/test/net/http/test_http.rb:303:    data = 'aaabbb cc ddddddddddd lkjoiu4j3qlkuoa'

[edit] 大文字小文字

Comming Soon !!

[edit] 色付け

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

Gmilk-color.png

[edit] その他のコマンド

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

$ gmilk -h
gmilk [option] pattern
    -f, --file-keyword KEYWORD       File path. (Enable multiple call)
    -d, --directory DIR              Start directory. (deafult:".")
    -s, --suffix SUFFIX              Suffix.
    -r, --root                       Search from package root.
    -p, --package PACKAGE            Specify search package.
    -a, --all                        Search all package.
    -n NUM                           Limits the number of match to show.
    -i, --ignore                     Ignore case.
        --color                      Color highlight.
        --no-snip                    There being a long line, it does not snip.
        --cache                      Search only db.
        --verbose                    Set the verbose level of output.
    -u, --update                     With update db.
Personal tools