5桁のユニコードの扱いについてNo.00394
Alter Ego さん 16/12/12 06:04
 
初めて書かせていただきます。

通常のアルファベットを範囲を指定して特定の特殊なアルファベットに簡単に変換出
来たら良いなと思い、マクロを利用することにしました。
プログラムのことはよく分からないので既存の小文字を大文字に変換するマクロの記
述を参考に見様見真似で作ってたのですが、うまくいきません。

例えば

searchdown "[\u41|\uE4]", loop, regular;
#r = result;
if(#r == 1) {
replaceall "\u41", "\U0001D400";
replaceall "\uE4", "\uC4";
}

とすると、選択範囲を指定してuE4(ウムラウト付の小文字a)をuC4(ウムラウト付
の大文字A)に変換することはできるのですが、u41(普通の大文字A)をU0001D400
(Mathmatical boldの大文字A)には出来ず、
文字が消えて改行されます。regularをcasesenseとinsentenseにすると
変換するんですが、代わりにウムラウトの方が反応しません。

次に

else{
replacedown "\u41", "\U0001D400", casesense, inselect;
replacedown "\u42", "\U0001D401", casesense, inselect;
}

というのを試してみたら、例えばABCDEF...とあったとして、Aだけを
範囲指定しても、AとBが変換されてしまったり、大量に変換の記述を
並べるとAとDだけが全て変換されるような変な挙動をします。
ちなみにサロゲートペアで分割したコードを調べて書いてみると、
文字がちゃんと表示されませんでした。


参考になるものはないかネットで検索していたところ、変換リストによる連続置換マ
クロというものを見つけたので使ってみましたが、今度は
リスト作成の項目でテキストボックスにU0001D400相当の文字が表示されなかったり
します。そもそもこのマクロは一括置換で、小文字を大文字に変換するマクロのよう
に選択範囲だけを置換するものではないのかな?とも感じていますが。

5桁のユニコードを扱う場合に何かやらないといけないことはあるのでしょうか?
もしくは私がやりたいような事をしてくれるマクロは既に在るでしょうか?

今回の一連の作業は秀丸64bit版でエディタとマクロは最新版です。
OSはWindows10Pro 64bit版を使用しました。


[ ]
RE:00394 5桁のユニコードの扱いについてNo.00395
秀丸担当 さん 16/12/12 12:07
 

relplaceallで、置換後の文字列で、16進数5桁のUnicodeの文字を
"\U0001D400"として表すことは問題無いです。

16進数2桁の"\u41"も"\uE4"も間違いではないです。
ただ4桁までは、"\u0041"といったように常に4桁で書いたほうが間違いを減らせ
ると思います。
例えば、"AA"と同じ意味のつもりで"\u41A"と書くと、"AA"ではなく"\u041A"の
一文字になります。


最初の置換のマクロは、こちらで試してみた限りでは動作しました。
範囲が消えて改行になるというのはEnterキーを押しただけか、またはマクロで
はinsertreturn;を実行したときの動作に似ていると思います。

次のinselect付きのマクロは、期待通りにはならないと思います。
inselectは、その時点で範囲選択されているものを対象としているので、一度目
のreplaceallを行った時点で範囲選択は解除されるので、二度目のreplaceallは
全体が対象になります。

範囲選択を対象にして何度もreplaceallをするには、部分編集がやりやすいです。
rangeeditin;が部分編集で、マクロで使うためには事前に
setcompatiblemode 0x000c;としておく必要があります。
あとdisabledraw;をするをちらつきを低減できます。

これらを踏まえると以下のようなマクロになります。

setcompatiblemode 0x000c;//部分編集を維持
disabledraw;
rangeeditin;//部分編集

searchdown "[\u0041|\u00E4]", loop, regular;
#r = result;
if(#r == 1) {
replaceall "\u0041", "\U0001D400";
replaceall "\u00E4", "\u00C4";
}

rangeeditout;//部分編集解除

[ ]
RE:00395 5桁のユニコードの扱いについてNo.00396
Alter Ego さん 16/12/14 06:22
 
丁寧なご説明ありがとうございました。

早速試してみたところ、動作はしたので、変換する文字を増やしてみたところ、解決
していない問題があることが分かりました。
大文字と小文字の区別はcasesenseで解決したのですが、
同一行内での範囲選択指定が機能しません。

replaceallfast "\u0041", "\U0001D400", casesense;
replaceallfast "\u0042", "\U0001D401", casesense;
replaceallfast "\u0043", "\U0001D402", casesense;
replaceallfast "\u00E4", "\u00C4", casesense;

とすると、

A
B
C

のように改行した場合は特定の文字だけを変換できるのですが、

ABC

の場合、Bだけを変換しようとしても、AやCも同時に変換されるといったことが起こ
ります。
これにはどんな指示が足りないのでしょうか?


[ ]
RE:00396 5桁のユニコードの扱いについてNo.00397
秀丸担当 さん 16/12/14 10:10
 

inselectやrangeeditin;はいずれも行単位となるようになっていて、文字単位に
することはできないです。
検索/置換ダイアログで「選択した範囲のみ」をONにしたときや、[表示]→[部分
編集]をしたときと同様です。

最近の機能として、検索/置換ダイアログの「追加の条件」の中に「指定の範囲/
指定のカラーマーカー」があります。
これを使うと文字単位にすることができます。
V8.66以降では正規表現で不十分だった部分にも対応していて、もし古い場合は
V8.66以降にされるこをお勧めします。

これを使ったマクロの例は以下のようになります。

setcompatiblemode 0x20000;//検索文字列自動復元
disabledraw;
$layer="mylayer";//作業用カラーマーカー名
deletecolormarkerall $layer;//カラーマーカー消去
colormarker 0xff,0xffffff,0,0,0,$layer;//範囲をカラーマーカーに

$targetprev = targetcolormarker;//退避
settargetcolormarker $layer;//カラーマーカーを検索対象
replaceallfast "\u0041", "\U0001D400", casesense,incolormarker;
replaceallfast "\u0042", "\U0001D401", casesense,incolormarker;
replaceallfast "\u0043", "\U0001D402", casesense,incolormarker;
replaceallfast "\u00E4", "\u00C4", casesense,incolormarker;
settargetcolormarker $targetprev;//退避を復元

deletecolormarkerall $layer;//カラーマーカー消去
endmacro;

[ ]
RE:00397 5桁のユニコードの扱いについてNo.00399
Alter Ego さん 16/12/16 07:16
 
試してみました。選択範囲のみ置換されて動作しました。ありがとうございます。

ただ、置換後にカーソルがページの1行目に飛ぶのはどうしてでしょう?
しかも全ての場合で飛ぶわけではないようです。
色々試して何となく分かってきたのは、いくつも並べた置換命令のうち、
最後のもの(上記の例だと4つ目のu00E4ウムラウトの文字)を置換した場合は
飛ばないようです。なので命令が最初の1つだけならAを選択した場合は
飛びませんし、2つだけならBの場合は飛ばずAの場合は飛びます。

他に複数行にわたって選択した場合は飛ばない場合もあったり正確な
傾向はまだ把握していませんが…。

[ ]
RE:00399 5桁のユニコードの扱いについてNo.00401
秀丸担当 さん 16/12/16 10:39
 

カーソルが先頭に行くのは、置換対象が無いときにそうなります。
置換ダイアログで、検索文字列を見つからない文字列にして全置換ボタンを押し
たときと同じになります。

もし範囲選択だったところの先頭に移動させるとしたら、マクロの末尾の
deletecolormarkerallの前に2行追加して、を以下のようにするといいと思いま
す。

gofiletop;
nextcolormarker 0x01,0,$layer;//カラーマーカー先頭に移動

deletecolormarkerall $layer;//カラーマーカー消去

endmacro;


あと、いまさらになってすみませんが、山紫水明さんのマクロに似たものとして
変換モジュールを使う方法もありました。
あらかじめUnicode(UTF-16)のテキストファイルとして変換リストを作成してお
くと、この方法でもできました。

 HmfListReplace.hmf 変換リストによる置換 V1.2
 http://hide.maruo.co.jp/lib/hmconv/hmflistreplace120.html

[ ]
RE:00401 5桁のユニコードの扱いについてNo.00403
Alter Ego さん 16/12/18 07:05
 
いつもご指導ありがとうございます。

> HmfListReplace.hmf 変換リストによる置換 V1.2

こういうのもあったんですね。探し足りなかったようです。


>gofiletop;
>nextcolormarker 0x01,0,$layer;//カラーマーカー先頭に移動
>

けど、これで本来想定していた機能になりました。一連の作業で色々と
勉強になりました。感謝です。


[ ]