|
白馬の王子様さん、こんにちは。
Unicode を扱えるようにした改良版が末尾にあります。
マクロを使う前に2つの準備作業が必要です。
準備1: ht_tools.dll をインストールします。
http://homepage3.nifty.com/_htom/macro/macro_dll.html#label-13
このページから「開発版」をダウンロードし、解凍して出てきた ht_tools.dll を g
odoku.mac と同じフォルダに置きます。
準備2: 誤読辞書.txt を秀丸エディタで開き、UTF-16 で保存し直します。
《→ファイル - 名前を付けて保存 - エンコード》
これでアクセント付きアルファベットなども扱えるようになるはずです。
フランス語とドイツ語だけならこれで困らないと思いますが、ひとたび Unicode に
対応すると複雑な問題が次々に湧いてきます:
(1) サロゲートペア (日本語、中国語など)
「𡈽」など一部の漢字は内部的に2文字として扱われます。
サロゲートペアの文字を修正候補として登録すると、メニュー上では不可視の候補が
2個あるように見えます。
(2) 結合文字 (ヒンディー語、タイ語など)
例えばデーヴァナーガリーの「की」は使用者の感覚では1文字ですが、
内部的には2文字として扱われます。
これを修正候補として登録すると、メニュー上では「क」と「ी」という
2つの候補が現れます。
アイヌ語の「セ゚」なども同様に、「セ」と半濁点に分解されてしまいます。
(3) 書字方向 (アラビア語、ヘブライ語など)
右から左へ書く言語での動作は、私に適否を判断できる知識がないため、試していま
せん。
サロゲートペアや結合文字にきちんと対応するためには、根本的に「修正候補は1文
字」という基本設計を見直さなければなりません。
もしライブラリに公開するとなると、このへんをきちんと対応しなければならないで
しょうね。
// godoku.mac
$dic = currentmacrodirectory + "\\誤読辞書.txt";
$sec = "候補";
$keys = "1234567890QWERTYUIOPASDFGHJKL;ZXCVBNM<>/";
loaddll currentmacrodirectory + "\\ht_tools.dll";
if (!result) {
message "ht_tools.dll を " + currentmacrobasename + " と同じフォルダに置い
てください";
endmacro;
}
begingroupundo;
call Main;
if ($$return != "") message currentmacrobasename + ":\n" + $$return;
endgroupundo;
freedll;
endmacro;
Main:
if (!selecting) {
if (unicode <= 32) return "修正したい文字にカーソルを置いて実行してください";
right;
beginsel;
left;
endsel;
} else if (multiselecting || rectselecting || seltoplineno != selendlineno) {
return "複数範囲、BOX範囲、改行を含む範囲は処理できません";
}
$$org = gettext(seltopx, seltopy, selendx, selendy, true);
if ($$org == "") return "修正対象文字が空でんがな";
if ($$org == "=") return "「=」は処理できませんわ";
if ($$org == "[") return "「[」は処理できませんぜ";
$$list = dllfuncstrw("GetIniStrW", $dic, $sec, $$org);
$$menu[0] = "登録...";
while (##i < wcslen($$list)) {
$$key = " (&" + midstr($keys, ##i % strlen($keys), 1) + ")";
$$menu[##i + 1] = wcsmidstr($$list, ##i, 1) + $$key;
##i = ##i + 1;
}
if (##i > 0) {
menuarray $$menu, ##i + 1;
##ans = result - 1;
}
if (##ans < 0) return;
if (##ans > 0) {
$$x = wcsmidstr($$list, ##ans - 1, 1);
insert $$x;
$$list = $$x + wcsleftstr($$list, ##ans - 1) + wcsmidstr($$list, ##ans);
} else {
$$adds = input("「" + $$org + "」に対する修正候補を登録します", $$list);
if ($$adds == "") return;
insert wcsleftstr($$adds, 1);
$$list = $$adds + $$list;
}
while (##j < wcslen($$list)) {
$$x = wcsmidstr($$list, ##j, 1);
if (wcsstrstr($$uniq, $$x) < 0) $$uniq = $$uniq + $$x;
##j = ##j + 1;
}
##_ = dllfuncw("WriteIniStrW", $dic, $sec, $$org, $$uniq);
return;
|
|