前準備
- rubyをインストール
- TEXCELL Ruby用クリップボードライブラリをインストール
- clipboard_v100.7z をダウンロード
- lhaplusなどで解凍
- できたclipboard.rbをC:\Ruby\lib\ruby\site_ruby\2.X.Xとかにコピー
- diff/lcsライブラリをインストール
- コマンドラインから”gem install diff-lcs”
- マクロの保存
- マクロをコピペして名前をつけて保存(文字コードはUTF-8、BOM付き)
- 必要に応じて編集(引数の有無で「標準速度」と「高速を」を切り替えられます)
使い方
- grepを実行
- 実行結果に適当な名前を付けて保存
- 実行結果を編集
- マクロを実行するとファイルが書き換えられる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | //grep結果を編集して置換 //前準備 //1.rubyをインストール //2.TEXCELLRuby用クリップボードライブラリをインストール // ・https://www.texcell.co.jp/ruby/Lib/clipboard_v100.7zをダウンロード // ・lhaplus(https://forest.watch.impress.co.jp/library/software/lhaplus/)などで解凍 // ・できたclipboard.rbをC:\Ruby\lib\ruby\site_ruby\2.X.Xとかにコピー //3.diff/lcsライブラリをインストール // ・コマンドラインから"gem install diff-lcs" //4.マクロの保存 // ・マクロをコピペして名前をつけて保存(文字コードはUTF-8、BOM付き) // ・必要に応じて編集(引数の有無で「標準速度」と「高速を」を切り替えられます) //使い方 //1.grepを実行 //2.最初に実行結果に適当な名前を付けて保存 //3.実行結果を編集 //4.マクロを実行するとファイルが書き換えられる selectall;copy; //runsync2"rubyw -x "+currentmacrofilename+" "+filename;//標準速度 runsync2"rubyw -x "+currentmacrofilename+" "+filename+" k";//高速 execmacrodirectory+"\\tmp.mac";endmacro; /* #! ruby # encoding: utf-8 # grep結果を編集して置換 Encoding.default_external='UTF-8' #$stdout=open("tmp_log.txt","w") #$stderr=open("tmp_err.txt","w") require'diff/lcs' require'clipboard' cbd=ClipBoard.new(__ENCODING__) #オプション k:高速 y:ゆっくり opt=(ARGV[1]?ARGV[1]:"y") # 差分の取得(BOM除去) bf=open(ARGV[0].encode(Encoding::UTF_8)).read. gsub(/\xEF\xBB\xBF|\xEF\xBF\xBE/,"").split(/\R/) af=cbd.getText. gsub(/\xEF\xBB\xBF|\xEF\xBF\xBE/,"").split(/\R/) ar1,ar2,arr=[],[],[] diffs=Diff::LCS.diff(bf,af) diffs.flatten.each{|diff| ar1<<diff.elementifdiff.deleting? ar2<<diff.elementifdiff.adding?} # 連想配列に代入 hs={} ar1.each{|e| fn1,ln1,txd=/([^:]*?)\(([^:]+?)\):(.*)/.match(e).to_a.values_at(1,2,3) ar2.each{|f| fn2,ln2,txa=/([^:]*?)\(([^:]+?)\):(.*)/.match(f).to_a.values_at(1,2,3) iffn1==fn2 hs[fn2]=[]unlesshs.has_key?(fn2) hs[fn2]<<[ln1,txd,txa]ifln1==ln2 end }} hs=hs.reject{|k,v|k==nil} # 文字単位で差分を取得 arr=arr.delete_if{|e|e[0]==nil} hss,ar3,ar4,ar5,arr2={},[],[],[],[] hs.each{|k,v| hss[k]=[]unlesshss.has_key?(k) v.each{|e| sdiffs=Diff::LCS.sdiff(e[1],e[2])ife[1] sdiffs.each_with_index{|f,i| iff.new_element!=f.old_element f.new_element=="\\"?new="\\\\":new=f.new_element hss[k]<<[e[0],f.new_position,new,f.old_element] end}}} # 秀丸マクロ作成 macro=open("tmp.mac","w") macro.print%|\uFEFF| macro.puts%|setcompatiblemode0x20030;$dir=directory+"\\\\";| hss.each{|k,v|kk=k.gsub(/\\/){'\\\\'} macro.puts%|if(findhidemaru($dir+"#{kk}")==-1){openfile$dir+"#{kk}";}| macro.puts%|setactivehidemarufindhidemaru($dir+"#{kk}");| macro.puts%|disabledraw;selectall;| macro.puts%|colormarker0x000000,0xc2c79e,11,1;| macro.puts%|escape;begingroupundo;| macro.puts%|enabledraw;|if/y/=~opt v.each{|e| m=0 macro.puts%|moveto20,#{e[0]};| macro.puts%|right#{e[1]+m};| unless e[1]+m==0 ife[3] macro.puts%|delete;| m=m-1 end ife[2] macro.puts%|insert"#{e[2]}";| m=m+1ife[3] end } macro.puts%|endgroupundo;enabledraw;| } macro.puts%|gofiletop;goupdatedown;endmacro;| __END__ */ |
1 |
コメント