例によって PerlScript でサクラエディタ用マクロを作ってみた。
AsciiView.pls
選択文字列中で 7-bit ASCII 以外の部分を \x80 に置換するだけのマクロです。
その文字列が「バイト単位の parse しかしてくれないプログラムからどう見えるか」を調べるのに使います。
Shift_JIS で書かれたスクリプトや設定ファイルでよくわからない挙動が起きたときに便利ではないかと。
■動作例
Perl クックブックに「レシピ 6.17 ネストされている文字列に対してマッチングを行う」というサンプルがあります。
my $np;
$np = qr{
\(
(?:
(?> [^()]+ ) # バックトラックを行わない非格納カッコでグループ化
|
(??{ $np }) # マッチング用丸カッコでグループ化
)*
\)
}x;
これ、普通はちゃんと動作するんですが、これを Shift_JIS で書いた(&事情により use encoding 指定のない)使い捨てスクリプトにコピペすると、うまく動作しません。以下のエラーメッセージが吐かれます。
Unmatched [ in regex; marked by <-- HERE in m/
\(
(?:
(?> [^()]+ ) # バックトラックを行わない非格納 <-- HERE カッコでグ
ループ化
|
(??{ $np }) # ・ at - line 7.
このエラーメッセージだけだと、何が言いたいのか分かりにくいと思います。
そこで AsciiView.pls で該当部分を変換すると、こんな感じに。
my $np;
$np = qr{
\(
(?:
(?> [^()]+ ) # ・o・b・N・g・・・b・N・・・s・・・・・・・・・i・[・J・b・R・・・O・・・[・v・・
|
(??{ $np }) # ・}・b・`・・・O・p・・・J・b・R・・・O・・・[・v・・
)*
\)
}x;
(※実際は \x80 に置き換えるんですが、IE だと � とか表示されて見にくいのでここでは中点にしています。)
こうしてしまうと、
・コメント中「マ」の 2 byte 目が "}" で、ここまでが正規表現として解釈されている
・"}" の直後に /x オプションが無いため "#" 以降がコメントとして解釈されていない
・"[" が "]" で閉じられていないためエラーになっている
ことがわかりますね。
昨日も Smarty 用のテンプレートファイルが Shift_JIS になっててよくわからない挙動になってたので、説明に使ったり。結構重宝してます。
■動作の詳細
ちなみに、やってることは単純で、簡略化して書くとこれだけです。
# 選択文字列の取得
my $seltext = GetSelectedString();
# 7-bit ASCII 以外の文字を \x80 に置換
$seltext =~ tr/\x81-\xff/\x80/;
# 置換後文字列の出力
InsText($seltext);
(実際には矩形選択時の場合分けとかやってるので、もうちょっと長くなってます)
■注意点
サクラエディタは内部コードが Shift_JIS なので、それ以外のファイルに対して使ってもあまり意味ないです。(EUC-JP のファイルでこのマクロを動作させても、Shift_JIS として解釈されます)