Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

Ruby開発環境「RDE」向けのRubyマクロ:Grepマクロ

私の職場ではエディタのライセンスを取得しておりません。
WindowsOSおよびMicrosoftOfficeのライセンスのみです。
従って、エディタ等のツールについては基本的にフリーウェア(無料の意味ではありません)を
利用する事が推奨されています。

私がRDEを常用する理由もこのあたりにあるのです。
RDEは有名どころのエディタが有しているGrep機能をエディタ内部の機能として実装して
おりません。
Grep機能はマクロ(もちろんRuby)として登録して利用するスタイルになっております。

必要な機能は、Rubyマクロで書いて実装してね!って感じのスタイルですね。
このアプローチはRubyが分かる人前提ですがある意味正しいと思います。
RDEはCOM公開しているのでVBScriptでもJScriptでもマクロ記述可能です。
 ActiveScriptであればPythonだろうがPerlだろうがオッケーです。

以下のマクロ、不要部分やら・・ん!?・・的な部分もありますが、動作確認済み
ですのであしからず^^;

補足

出力先をコンソールにすると、Grep検索結果をダブルクリックするだけで該当ファイルを
開くことが可能です。

RDE側の設定

 ・Rubyスクリプト   : チェック
 ・実行前に引数に有力 : チェックしない
 ・対象        : 現在のファイル
 ・出力        : コンソールウィンドウ/新しいコードウィンドウ

ソースコード

#!/usr/bin/ruby
#==============================================================
# File name		:	rde_filegrep.rb
# Explanation
#		対象となるファイル以下のディレクトリすべてに対して指定したファイルのGrep(正規表現)結果を表示する
#		指定ファイルはワイルドカード対応
#		RDEから下記の指定でマクロ登録されている事を前提
#			・Rubyスクリプト			:チェック
#			・実行前に引数を入力	:チェック
#			・対象								:現在のファイル
#			・出力先							:コンソールウィンドウ / 新しいコードウィンドウ
#		
#		マクロ実行時に表示されるダイアログに入れるパラメータ
#		正規表現文字部分(例ではmy)は"で囲む必要なし
#		ファイル名パラメータ部分は'で囲んであげる事
#		usage	:	^#\sM.*\s '*.rb'
#		
# Argument
#		IN
#				ARGV[0]:
#				ARGV[1]:
#				ARGV[2]:
#		OUT
#				Nothing
# Return
#
# Author			:
#
# Memo
#
#==============================================================

#パラメータは以下の順で並んでいる事にする
#正規表現文字、対象ファイル名、RDEからのフルパスファイル名


#正規表現文字を取り出し
regexp = Regexp.new(ARGV.shift)

#対象ファイル名文字を取り出し
targetfile = ARGV.shift

#RDEからの対象となるテキストファイルのフルパスファイル名を取得
textname = ARGV.shift

#Grepする先頭のディレクトリパスをtextnameから取り出す。
topdir = File.dirname(textname)

#globに渡す文字列を作成
globstr = '**/' + targetfile

#現状のパスを保存
now_dir = Dir.pwd

#指定のフォルダにカレントを移動
Dir.chdir(topdir)

#見つけたファイルの数だけループ
Dir.glob(globstr).each { | file |
	
	#見つけたファイルに対してGrep実行
	begin
		File.open(file, "r"){|f|
			f.each_line{ | line |
				printf("%s\/%s: %d: %s\n", Dir.pwd, file, f.lineno , line.chomp) if regexp =~ line
			}
		}
	rescue
		sprintf("can't open %s: %s" ,  file, $!)
	end
}

#元のディレクトリに戻る
Dir.chdir(now_dir)