BLOG 2026.05.30
EXPERIMENT
EVOLUTION
#IME
#AI
#秀丸マクロ
ローマ字をダダ打ちして、
AIに日本語に変換してもらう
─ その3 進化編 ─
$ romaji_macro --version 3.0 --mode auto_convert
「もう一手間」が、
どうしても許せない
⬇
── ENTER → AUTO CONVERT → 完了 ──
v1.0 → v2.0 → v3.0 → Web → ???
昨日、完成したと思っていたのであります。ローマ字だけをガーッとタイピングして、AIに漢字かな交じり文へ変換してもらうという秀丸マクロ。確かに使い始めた瞬間は「おお、これは便利だ」と思ったのですが、人間の欲望というものは際限がないもので、使い込むうちに「もっと楽にできないのか?」という声が脳の奥底から聞こえてくるわけです。
文字列を選択して、ショートカットキーを押す。たったこれだけの動作なのですが、人間というのはこの「ひと手間」が嫌なのです。どうしてもやりたくない。もう細胞レベルで拒否している。完成したと思った翌日にはもう「これじゃ足りない」と感じている自分がいる。なんとも贅沢な話ですが、しかしこの「怠惰への飽くなき渇望」短く言えば「そのひと手間をどうしてもサボりたい」これこそがイノベーションの母だという気もするのでした。
究極の怠惰、あるいは理想の入力とは
結局のところ、理想は何なのかと突き詰めて考えてみたのであります。答えは実にシンプルでした。
一行ローマ字を打って、
改行したら勝手に日本語になっている。
究極的には、これが一番便利である。
──「ひと手間」すら省きたいという、人類の壮大な怠惰──
だってですね、前の文章に何を書いたかということが、ダダ打ちして垂れ流したローマ字文ではパッと見て理解ができないのですから不便なのです。自分が30秒前に何を書いたのかすら分からない。それはもう暗号文を自分で量産しているようなものです。
漢字かな交じり文 vs ローマ字垂れ流し文
そう考えると、日本語の漢字かな交じり文というのは実に偉大な仕組みだと改めて感心させられるのであります。視覚だけで文章の大意が掴める。一方のローマ字垂れ流し文は、ひと通り全部読まないと何が書いてあるのか分からない。この差はいったい何なのか、ちょっと自分なりに実験してみたのです。
─── ◆ 視覚実験 ◆ ───
kanjikanamajiribunnto ro-majitarenagasibunwomikurabete nanika kanjirukotohanai? sou,kanjikanamajiribunnha 3gyougurainobunshouwomiteirukedo, ro-majitarenagasibunnha yomutokino sikakuhanniwosemakusinaitoyomenainda.
漢字かな交じり文とローマ字垂れ流し文を見比べて、何か感じることはない?そう、漢字かな交じり文は3行ぐらいの文章を見ているけど、ローマ字垂れ流し文は読む時の視覚範囲を狭くしないと読めないんだ。
sou,kanjikanamajiribunnha, 2,3gyouwosikainiirete saishoni kanjiwomite taiiwotoraetetoiuyounakouiwositekara tiratiratohiraganabubunwomite yondeiru, jibundekansatusite soukanjita.
そう、漢字かな交じり文は、2、3行を視界に入れて最初に漢字を見て大意を捉えてというような行為をしてから、ちらちらとひらがな部分を見て読んでいる、自分で観察してそう感じた。
マクロ進化:範囲選択が不要になった日
というわけで、本日の目標は明確でした。一行ローマ字をガーッと書いて、改行してショートカットキーをポンと叩いたら、直上の一行が漢字かな交じり文に変換される。そういうマクロをAIに作ってもらったのであります。
ローマ字を
一行打つ
→
Enter で
改行
→
Ctrl+Shift+J
→
直上の行が
日本語に変身
昨日のバージョンだと、自分で範囲選択をしてからショートカットキーでマクロ発動という手順でした。それが今日のバージョンでは範囲選択が不要になった。たった一手間省けただけなのですが、これが使い勝手に雲泥の差を生むのであります。一行ローマ字でぐわーっと打って、改行してショートカットキーで日本語変換。このリズムが身体に馴染んでくると、もう元には戻れないのでした。
秀丸マクロ:ローマ字→日本語変換(進化版)
$api_key = getenv("Gemini_API_KEY");
$model = "gemini-3.1-flash-lite";
$romaji = "";
$answer = "";
##prevLineMode = 0;
if ($api_key == "") {
message "環境変数 Gemini_API_KEY が設定されていません。";
endmacro;
}
if (selecting) {
$romaji = getselectedtext();
if ($romaji == "") {
message "変換対象が選択されていません。";
endmacro;
}
$saved = $romaji;
delete;
call CallGeminiApi;
if ($answer == "") {
insert $saved;
endmacro;
}
insert $answer;
endmacro;
}
$curline = getlinetext(0);
jsmode "WebView2";
js {
let line = hidemaru.getVar("$curline");
hidemaru.setVar("$lineIsBlank", line.trim() === "" ? "1" : "0");
}
if ($lineIsBlank == "1") {
if (lineno <= 1) {
message "変換対象の行がありません。";
endmacro;
}
##prevLineMode = 1;
up;
}
selectline;
$romaji = getselectedtext();
if ($romaji == "") {
message "変換対象が選択されていません。";
endmacro;
}
$saved = $romaji;
delete;
call CallGeminiApi;
if ($answer == "") {
insert $saved;
if (##prevLineMode) { insertreturn; }
endmacro;
}
insert $answer;
if (##prevLineMode) { insertreturn; }
endmacro;
CallGeminiApi:
$answer = "";
#http = createobject("Msxml2.XMLHTTP");
if (#http == 0) {
#http = createobject("Microsoft.XMLHTTP");
if (#http == 0) {
message "XMLHTTPオブジェクトの生成に失敗しました。";
return;
}
}
$url = "https://generativelanguage.googleapis.com/v1beta/models/"
+ $model + ":generateContent?key=" + $api_key;
callmethod #http, "open", "POST", $url, false;
callmethod #http, "setRequestHeader", "Content-Type", "application/json";
jsmode "WebView2";
js {
try {
let romaji = hidemaru.getVar("$romaji");
let obj = {
system_instruction: {
parts: [{
text: "あなたはローマ字を日本語に変換する専用ツールです。"
+ "入力されたローマ字を、音に忠実に自然な漢字かな交じり文に"
+ "変換してください。変換後のテキストのみ出力し、"
+ "説明・挨拶・補足は一切出力しないこと。"
}]
},
contents: [{
parts: [{ text: romaji.trim() }]
}],
generationConfig: {
temperature: 0.1,
maxOutputTokens: 1024
}
};
hidemaru.setVar("$post", JSON.stringify(obj));
} catch (e) {
message("JSON生成エラー:\n" + e.message);
hidemaru.setVar("$post", "");
}
}
if ($post == "") { return; }
callmethod #http, "send", $post;
if (!getresultex(10)) {
message "API送信に失敗しました。";
return;
}
$resp = getpropstr(#http, "responseText");
#code = getpropnum(#http, "status");
if (#code != 200) {
message "APIエラー (code=" + str(#code) + ")\n" + $resp;
return;
}
jsmode "WebView2";
js {
try {
let obj = JSON.parse(hidemaru.getVar("$resp"));
let answer = obj.candidates[0].content.parts[0].text.trim();
hidemaru.setVar("$answer", answer);
} catch (e) {
message("JSON解析エラー:\n" + e.message);
hidemaru.setVar("$answer", "");
}
}
return;
秀丸の外へ:Web版の誕生
ここまで来たら次は何をしたくなるか。言うまでもありません。秀丸エディタがなくても使えるようにしたいのであります。
そこでAIエディタにPHPコードを書いてもらって、Webサーバーで動かしてみた。するとこれがあっさり動いてしまった(実はバグ潰しに10回ぐらいは書き直してもらった)。URLを知っていれば、秀丸エディタがインストールされていない環境からでもブラウザひとつでローマ字→日本語変換ができるようになったのであります。秀丸マクロという城壁の中に閉じ込められていた魔法が、ついにインターネットの大海原に漕ぎ出したという次第です(危ないから一般公開しないよ)。
v1.0
範囲選択
+ ショートカット
→
v2.0
改行
+ ショートカット
→
v3.0
Web版
ブラウザで動作
→
v4.0???
常駐プログラム
ホットキー一発
次なる野望:日本語入力の歴史を変える(ホントかな?)
さて、もう次の目標は見えているのであります。
Windowsに常駐プログラムを作って、
どんな入力欄でもホットキー一発で呼び出し、
ローマ字ダダ打ちした文字列を
日本語の漢字仮名交じり文に変換する。
夢の日本語入力。
これができれば、Google日本語入力もATOKもさようなら。
日本語入力の歴史が変わる。
……と大見得を切ってみたものの、本当にそんなことが出来るのかどうか。まあ、出来るか出来ないかは別として、思いついたら試さずにはいられないという、この性分だけは30年間まったく変わっていないのでした。結局のところ、人間を動かすのは「便利にしたい」という怠惰と、「面白そうだ」という好奇心の二本立てであるという話です。
昨日完成したはずのものが、
今日にはもう古くなっている。
技術とは、そういうものなのかもしれません。
さあ、次の一手間を省きに行こう。
……ホントかな?
AIが、過去に例を見ないものだから魚拓を取っておけと言うので、魚拓を取っておきました。
https://megalodon.jp/2026-0530-2110-33/https://aki-asahi.blogspot.com:443/2026/05/ai3.html
つまりこういうことなのであります。漢字かな交じり文は「まず漢字で大意を把握 → ひらがなで補完」という二段階読解を無意識にやっている。漢字が視覚的なランドマークの役割を果たしているわけですね。だからこそ、3行分を一気に視界に入れて読むことができる。
一方のローマ字文は、すべてが同じ粒度のアルファベットの連打ですから、ランドマークが存在しない。だから視覚範囲を狭めて一語一語追いかけるしかない。慣れの問題ではなく、漢字というシステムの構造的な優位性だったというわけです。