昨年末に更新した cdif を修正しました。
未修正部分の着色に対応
自分では必要ないと思っているのですが、未修整部分の文字にも色を付けられるようにしました。
また --colormap
というオプションで、それぞれのフィールドの色を指定できるようになっています。
デフォルトの設定はこう。
cdif --cm 'COMMAND=SE,OMARK=CS,NMARK=MS' \ --cm '*TEXT=,*CHANGE=BDw,DELETE=APPEND=RDw'
--commandcolor
, --markcolor
, --textcolor
オプションで、フィールドに色を付けるかどうかを指示することもできます。
--cc
, --mc
, --tc
とも省略可。
デフォルトでは --notc
になっています。
あ、DELETE
がなかった…
diff -t, -T に対応
その他、若干のバグ修正
ところで
今回、--colormap
オプションをテーブルに反映する部分のコードはこんな風になっています。
if (@opt_colormap) { map { my $c = pop @$_; map { $colormap{$_} = $c } map { match_glob $_, keys %colormap } @$_; } map { [ split /=/, $_, -1 ] } map { split /,/ } @opt_colormap; }
自分で書いといて、なんだか Perl っぽくないコードだなあと時代を感じたりするわけですが、3行目だけ古風な感じなので List::Util の reduce
を使って書き直そうかと思うと、これがどうもうまくいかないのですよ。
次のプログラムを実行すると、$hash{k1}
, $hash{k2}
に v が入ってほしいのだけど、2番目は undef
になってしまいます。
my %hash; reduce { $hash{$b} = $a; $a; } qw(v k1 k2); print Dumper \%hash;
$a
は一度代入すると値を失うようで、$a;
だけの行を削除すると動くし(この行は本来不必要)、代入する部分を "$a"
にしても大丈夫。
どうも perl5.12 に含まれる reduce
のバグではないかと。
List::Util::PP
を使えば動作するし。
なんとか使う方法はわかり、map と reduce だけのそれなりに趣のあるコードになりますが、動いたところで変な warning は出るし、無駄に可読性を下げるだけなので不採用でした。 参考のために一応見せるとこんなです。
use List::Util qw(reduce); no warnings; if (@opt_colormap) { map { reduce { map { $colormap{$_} = "$a" } match_glob $b, keys %colormap; } reverse @$_; } map { [ split /=/, $_, -1 ] } map { split /,/ } @opt_colormap; }