|
|
|
|
代入文が (中略) てことで、誰か nvi か Vim のもここらへん(↓)にきぼんぬでござるー。
src = ARGF .read
max = src .split(/\n/) .grep(/^\s*(\S+)\s*=/) {$1.size} .max
dst = src .gsub(/^(\s*)(\S+)\s*=\s*(.*?)$/m) { format("%s%-#{max}s = %s", $1, $2, $3) }
print dst
で試しに書いてみたら56行で萎え。文字列処理はRubyの得意分野であることを差し引いてもこれはヒドイ。一番の原因(違い)はブロックの有無。gsub の replacement の部分を実現するのにわざわざデリゲータ(MatchEvaluator)を定義しないといけないのは辛い。Rubyを知らなければ堪えられるのかもしれないが、一度手にした文明は捨てられんのですよ。C#2.0(Visaul C# 2005)からは匿名メソッドが使えるので、同じ処理が簡潔になることを祈る。
% time cat code.txt | ruby indent.rb ruby indent.rb 0.02s user 0.01s system 109% cpu 0.027 total % mcs indent.cs % time cat code.txt | ./indent.exe ./indent.exe 0.27s user 0.06s system 38% cpu 0.846 total10倍以上違う。コーディングの内容が若干違う(C#側では1文字ずつ読み込んでたり)のもあるが、多分 nomo 起動のオーバーヘッドが大きそうな予感(全体の実行時間も短いから余計顕著に)。手元の Windows で indent.exe を実行したらかなり速かったし、間違いない!って、あなた、CeleとP4の違いがありますからー、残念!というか、ここらへんのバイナリ互換っぷりが凄い楽しい>.NET Framework。
(defun equal-indent-region ()
(interactive)
(if (> (point) (mark))
(exchange-point-and-mark))
(call-process-region (point) (mark) "indent-equal.rb" t t t)
)
(global-set-key "\C-c=" 'equal-indent-region)
あとはC-c=を打つべし!打つべし!あー、綺麗に揃うわい。適材適所マンセー。
map = :'a,'b !indent-equal.rbとかなんとか書いておけば、 '=' [ENTER] で揃いまくり。ヤター。
| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |
| 前 | 2004年 9月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 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 | ||
そろえるんだからキーワードは align で。でも cc-align.el にはそういう関数はないようで…。