IME を使用しない漢字の直接入力 (バージョン 1.1.0)
IME を使わずに漢字を直接入力する、AutoHotkey v1 用のスクリプトを作成しています。
はじめに
単漢字入力システム (direct-input23.ahk) をバージョンアップしました。本記事の内容はバージョン 1.1.0 を対象としています。
2024-11-16 追記
バージョン 1.2.0 を公開しました。
新機能については、「バージョン 1.2.0 の記事」を参照してください。システム全体の説明やインストール方法については、このまま本記事をご覧ください。
主な機能
IME を使用せずに漢字を入力します
変換キーを使用しません
入力した読みが辞書にマッチした時点で自動的に変換されます
ただし、読みは 2 文字または 3 文字までで、登録単語には単漢字もしくは姓/名を想定しています
半角 2 文字で漢字変換する「連想入力」方式と同じような考え方だと思いますが、本システムでは 2 文字および 3 文字の読みで漢字変換を行います。
運用には AutoHotkey を使用します。自分用に作ったものでまったくユーザーフレンドリではないので、本記事 (長い) をすっと読める方におすすめします。
動作環境
AutoHotkey v1 が動作する環境
動作確認は Windows 10 + AutoHotkey v1.1.24.02 で行っております。
本システムの辞書に登録していない文字は通常どおり IME を使用して入力します。開発中に動作確認している IME は ATOK 2015 です (他の IME でも動作します)。
インストール方法
ダウンロード先
zip をダウンロードしてください。
インストール手順
AutoHotkey が動作する環境を準備してください。
ダウンロードしたリポジトリを適当なフォルダに配置してください。
動作確認
動作に必要なファイルはサンプルとして添付していますので、とりあえず試してみたい方は、そのまま「direct-input23.ahk」をダブルクリックしてスクリプトを実行してください。
画面左上に次のような小さいウィンドウが表示されます。
![](https://assets.st-note.com/img/1729977409-kzKrWxZ6YqTALaHBMVtiRXIj.png)
メモ帳を開いて「fk sz sat fd (スペースは不要)」と入力すると「福沢諭吉」と (漢字 1 文字ごとに) 変換されます。
重要: 添付している辞書ファイルはあくまでサンプルとして使用してください。この辞書は作成者が完全な独自ルールで作成したものであり、この中の読みを覚えてもまったくメリットはありません。本入力システムを継続してご利用いただく場合は、ご自身で読みのルールを決めて新しく辞書を作成することをお勧めします。
動作確認用のテストページ (必要に応じて)
トップ画像でも使用しているテストページを utils\inputtest フォルダに用意しています。任意の http サーバで動かしてください。
http サーバが必要な場合は utils フォルダの testserver.py をご利用ください。utils フォルダで
python testserver.py
を実行すれば、http://localhost:8000/inputtest/inputtest.html でアクセスできます。
初期状態で利用する場合は、Google chrome でアクセスしてください。
テストページには、入力対象 (人名漢字)、その読み、および入力フォームが表示されます。読みに従ってフォームに文字を入力してください。入力できるだけで特に機能はありません、すみません。表示される人名は inputtest/names.txt に記述していますので、自由に編集してご利用ください。
また、読みが一部しか表示されない人名もあると思いますが、これは該当する漢字が辞書に登録されていないためです。漢字の読みは、inputtest.html と同じフォルダにある dictionary.txt ファイルから取得します。ご自分で用意した辞書でテストページを使いたい場合は、お使いの辞書ファイルをこのフォルダに「dictionary.txt」という名前でコピーしてご利用ください。
基本的な設定
本スクリプトの動作に必要な設定はすべて、同じフォルダにある direct-input23.ini に記述します。最小構成で「動作対象ウィンドウ」と「辞書ファイル」の指定が必要です。
重要: ini ファイルは Shift-JIS で保存してください。
動作対象ウィンドウの指定 (必須)
本スクリプトを動作させるウィンドウを、[Group] セクションの「group=」に「, (カンマ)」 区切りで (1行で) 指定します (ここに指定したタイトルを持つウィンドウが、#IfWinActive の対象として追加されます)。
[Group]
group=メモ帳,Chrome
注意: 行の末尾には「,」を付けないでください。
辞書ファイル
[Filesect(番号)] セクションの「dict=」に、辞書ファイルを指定します。
[FileSet1]
name=Dictionary-1
dict=dictionary.txt
log=convert_history.txt
「name=」と「log=」は、ひとまずそのままでも構いません。これらの設定は、後述する「辞書の切替」機能および「変換履歴」機能 (いずれも本バージョンの追加機能) を使用する場合に使用します。辞書ファイルの詳細・構造は後述します。
その他の設定
direct-input23.ini ファイルでは、そのほかに「変換履歴機能」と「併用する IME の動作」を指定する項目があります。これらについては、それぞれのセクションで説明でします。
使い方
基本的な使い方
辞書に登録した文字 (語句) は本システムで、辞書に登録していない文字は IME をオンにして入力します。
重要 : 1 文字削除 (Back Space) するには「^h」ホットキーを使用してください。このホットキーで Backspace を SendInput すると同時に、本システムの各種バッファを操作しています。現在の入力バッファの内容 (変換待ちの文字列) は、画面左上の情報ウィンドウに表示されますので、興味がある方は入力しながらご覧ください。キー割り当ては変更可能です。
辞書には「(読み)=(登録文字)」の形式で単語を登録していきます (「=」を含む行がエントリして認識されます。行頭にセミコロンを置いただけでは無効になりません)。このときに、読みが重複しないように登録する必要があるので注意してください。読みが重複している場合は、後に登録された単語が有効になります。
読みに使用できる文字は「英数字とピリオド」です。これらの文字はホットキーとして登録されていますので、その他の文字が必要な場合はスクリプト本体でホットキーとして追加してください。
本システムは変換処理よりも辞書の内容が重要となります。辞書の作り方しだいで変換速度・効率に大きな差が出ますので、がんばって辞書を鍛えてください。
再変換機能
たとえば、辞書に「高(読み=tt)」と「博(hk)」という登録があるときに、苗字としてよく出てくる「高橋」さんを「tth」という読みで登録したとします。このとき「高博」を入力するつもりで「tthk」と入力すると「高橋k」と変換されてしまいます。仕組みは後で解説しますが、このような場合はホットキー「^l」(エル) で区切り位置を修正できます (1 回押せば、「高橋k」→「高博」に再変換されます)。
トップ画像の GIF アニメでは、3 段目の名前を入力するときにこの機能を使用しています (「yykb」と入力して「悠b」が表示された後に、^l を押して「祐希」に再変換しています)。
IME との連携
IME をオンにすると本スクリプトの変換はオフになり、IME をオフにすると本スクリプトの変換がオンになります。IME のオン/オフは「半角/全角」キーで行いますが、実際のキー入力を発生させずに、スクリプト側で IME の状態を変更しています。環境によって、この辺りの動作が問題になりそうな場合はご注意ください。
また、キーの入力ごとに IME のオン/オフを判定しているので、速度面で動作が不安定になる可能性があります。使い初めからしばらくは入力漏れなどがないかよくご確認ください (自分の 10 年くらい前の古い PC でもキーを取りこぼすような問題は発生してませんが、念のため)。
IME の使用頻度は辞書の完成度しだいで変わってくると思いますので、このあたりの動作は今後もう少し詰めて、設定で切り替えできるようにした方がいいかなと思っています。
ショートカット的な機能として、F1 キーで IME を指定入力モードでオンにできます。特定のモード (半角固定など) に切り替えて入力する頻度が高い場合は、そちらも利用してみてください。初期状態では「半角英数」モードに切り替わるようになっています。解除は「半角/全角」 キーです (F1 キーの二度押しでは解除されません)。この割り当ては変更可能です。
注意: 本スクリプト実行中は Caps Lock キーがききません。大文字を入力する場合は、Caps Lock キーオフの状態で Shift + 英字キーを使用してください。Caps Lock キーがオンになっていると Shift + 英字キーを押しても小文字の入力となります。
設定
ヒント: 使用する IME (側) の設定や環境によっては、特に設定しなくても動く場合があるようです。IME が普段どおりに動作しない場合は、こちらの手順で設定してみてください。
ご使用中の IME の種類に応じて、direct-input23.ini の次のセクションに入力モードと変換モードを設定します (「ひらがな」とか「連文節」とかです)。
[ConvMode]
mode=25
[SentenceMode]
mode=8
[F1ConvMode]
mode=16
[F1SentenceMode]
mode=0
指定する値は、付属の ime_mode_test.ahk スクリプトで確認できます (eamat. 氏製の IME.ahk の仕様に準じています)。現在の IME の状態に応じて各モードの値が表示されますので、[ConvMode] セクションに入力モード、[SentenceMode] セクションに変換モードを、それぞれ「mode=」 の後に指定してください。
![](https://assets.st-note.com/img/1729998749-MCFc57Zls8z1o39aXmqYHtgr.png)
[F1~] のセクションには F1 キーでオンにする入力・変換モードを指定します。これらの値も、設定したい IME のモードを ime_mode_test.ahk スクリプトで調べて、同様に指定してください (ホットキーの割り当てを F1 以外に変更した場合も、"F1" の部分は変更しないでください)。
登録済みエントリの「読み」検索
辞書に登録した漢字の読みが思い出せない場合に利用してください。
カーソル位置から 1 文字戻って文字列を取得し (内部で SendInput, +{LEFT}^c します)、クリップボードの内容で辞書内を検索して、結果をメッセージボックスに表示します。検索した単語が登録されていない場合は、メッセージボックス自体表示されません。
この機能はホットキーの「^g」に割り当てています。IME オン → 検索する漢字の入力 → ^g で検索、というフローを想定しています。検索後は IME がオフになります。
単語登録
辞書エントリを、クリップボード経由で辞書ファイルに登録します。
tak=高尾
のように、辞書エントリと同じ形式の文字列をクリップボードにコピーしたうえで、「^F8」を押してください。
同じ読みのエントリがすでに登録されている場合は該当エントリを修正、同じ読みがない場合は辞書ファイルの末尾にエントリを追加します。一度に登録できるエントリは 1 件のみです。
辞書を更新する際に、``日付時刻 + 辞書ファイル名`` という形式の名前でバックアップファイルが作成されます。バックアップは辞書ファイルを更新するごとに作成されますので、追加・変更するエントリがたくさんある場合は直接テキストエディタで編集することをお勧めします (「バックアップを作成せずに更新」ボタンはいつか作ります)。
削除機能は (いまのところ) ありません。エントリを削除したい場合もテキストエディタで。
辞書はたいへん貴重な資産ですから、定期的にバックアップを取って大切に扱いましょう (経験談)。
キーバインドは変更可能です。
重要: 辞書ファイルの改行コードは CRLF です。お手元のファイルが LF になっている場合は、お手数ですが CRLF への変更をお願いします。
入力履歴と再変換履歴
定期的に入力内容・再変換の履歴をログファイルに出力します。後述するスクリプトなどを使用して統計情報を作成し、辞書の最適化などに利用してください。
入力および再変換した単語をまずバッファに格納し、入力デバイス (キーボードとマウス) の状態をタイマーで定期的に監視して、アイドル状態のときにファイルへ出力 (追記) しています。
ログファイルには次のような内容が出力されます。
2024-10-12 08:50:38
裕 石 千 早川 一 藤岡 平 鷲 一
rc 2024-10-12 08:50:38
rc 廣
履歴データを出力した日時と書き込み時点でバッファに格納されていたデータ (スペース区切り) を、それぞれ 1 行で追記します。先頭に「rc」がついている行は再変換の履歴です (再変換前の漢字です。再変換後の漢字は「rc」が付いてない方に入ってます)。
これらの書き込みを行った後、バッファはクリアされます。ファイルへの出力はタイマーでの実行を待つ以外にも、「!F9 (変更可)」で随時書き出しできます。
本バージョンではシステムのリロードを !F11 に割り当てていますが、このホットキーを使用した場合も、リロードの前に履歴を書き出します。
設定場所
設定ファイル direct-input23.ini の次のセクションで指定します。
[LogEnable] セクション
・enable=1: 履歴の出力を有効にします。または、
・enable=0: 履歴の出力を無効にします。無効にした場合もバッファへの格納は行っています。ログファイルへの出力処理で書き込みするかどうかの違いです。
[MonitorTimer] セクション
・timer=[数値 (ミリ秒)]: デバイスの監視タイマーを設定します。初期値は 60000 (ミリ秒)。この間隔でデバイスを監視し、デバイスが使用されていない状態が 10 秒以上続いていれば履歴バッファを出力します。
出力先ファイルは、辞書ファイルと一緒に ini ファイルに設定します (詳細は、後の「辞書の切替」で説明します)。
kanji-frequency-counter.py
履歴データを集計するスクリプトを用意しました。現状は全期間の入力データのみを単純に集計しています (再変換データの集計はもう少し先でやる予定です)。
入力・出力データのファイル名は埋め込んじゃってますので、お手数ですが編集してお使いください。スクリプトの実行後に出力される kanji_frequency_log.txt が統計ファイルです。
注意 (重要)
履歴機能は、辞書の最適化 (登録単語や読みの選定など) に利用する目的で作成しています。ほかの用途には使用しないでください。出力ファイルには入力した内容がほぼそのまま記録されますので、重要なデータを入力する際には履歴機能をオフにするか、本スクリプト自体を停止することをお勧めします。
出力ファイルも、解析して不要になったら速やかに削除することをお勧めします。
辞書の切替
複数の辞書を用意して切り替えながら使用できます。たとえば、人名用のほかに住所用の辞書も使いたいような場合に役立つかもしれません。
辞書の指定は、direct-input23.ini ファイルに次のような形式で記述します。
[FileSet1]
name=人名
dict=.\dictionary_name.txt
log=.\convert_history_name.txt
[FileSet2]
name=住所
dict=.\dictionary_address.txt
log=.\convert_history_address.txt
[Currentset]
set=1
name: 辞書セットの名前 (識別用ラベル)
dict: 辞書ファイルの名前
log: 変換履歴の出力先ファイルの名前
を 1 セットとして、[Fileset(番号)] セクションに記述します。
[CurrentSet] セクションの「set=」は、スクリプトの起動時に読み込まれる辞書のインデックス番号を表します (インデックス番号は、ini ファイルに記述されている辞書セットに対して、上から順に 1、2、… の連番で割り当てられます)。
スクリプトをリロードする際に「!F11 (初期状態)」を使用すると、この値を現在読み込まれているセット番号で書き換えてからリロードを行います (つまり、切り替えたファイルセットを、リロード後にそのまま使用できます)。このセット番号の書き換えは、トレイアイコンの右クリックメニューからリロードした場合は発生しません。
初期状態では「!F1」、「!F2」 にそれぞれ辞書セット1、2 への切替を割り当てています。また「!F3」で辞書セットの選択ダイアログが表示されますので、そちらでも変更できます。これらのホットキーは変更可能です。
履歴機能が有効で未出力の履歴データがある場合は、辞書の切替前に自動で出力されます。
単語の登録・修正機能は、その時点でアクティブな辞書に対して実行されます。
その他の機能
リセット機能
!F11 でシステムをリセット・リロードします。履歴機能が有効な場合、出力されていない再変換がバッファに残っていれば、リセットの前にこれらの履歴が出力されます。
情報ウィンドウ
画面左上に、本システムの動作状況を示す情報ウィンドウを表示しています。表示される内容は、
辞書セット番号
直前の変換内容
現在の入力バッファ
です。また、本スクリプト/IME の状態に応じて背景色が変化します。本スクリプトの入力が有効な状態だと、薄い灰色で表示されます。IME オン、F1 入力モード、スクリプトのサスペンド状態でそれぞれ色が変化します (IME の種類によっては、正常に動作しない可能性があります)。
このウィンドウは ^!p で表示/非表示を切り替えられます。
サスペンド機能
!F12 で入力システムを停止 (サスペンド) します。もう一度押すと、サスペンドが解除されます。
動作の仕組み
入力バッファ
入力したキーは本システムの入力バッファに追加され、バッファ内が 2 文字または 3 文字となったときに変換処理が発生します。辞書の検索は、入力内容に対して読みが最長一致となるように行っています。したがって、読み 2 文字が変換された時点では入力バッファはクリアされず、続く 1 文字で 3 文字読みの登録が見つかると、先の変換を破棄し、あとから見つかった単語に置き換えます (動画の「大輔」の部分。「ds」で「山崎」に変換されたあと、「dsk」で直前の「山崎」が BS 2回で破棄され「大輔」に変換されています)。
最初の 2 文字読みの変換を明示的に確定したい場合は、^!Space などに登録している clearBuffer() を呼び出すホットキーを使用してください (名前のとおり、入力バッファをクリアします)。
もしくは、先に説明した再変換機能を使用すれば、直前の (読み 3 文字の) 変換を取り消して、最初の 2 文字の変換を確定できます。
入力バッファの処理はあまり本気でやっていないので、別のウィンドウに移動したりとかでちょいちょいクリアされてしまうことがあります。逆にクリアされずにたまってしまうこともありますので、そのときは前述した ^!Space などのホットキーを利用してください。
辞書について
登録単語の読みがすべて 2 文字であれば気にする必要はないのですが、3 文字の読みが混ざると、上で説明したようにどうしても単語の区切りが意図したとおりにならないケースが発生します。もう一度別の例をあげると、
ky=喜
kyv=京子
vv=子
という登録があるときに「喜子」を入力するには、「ky vv」(スペースは入力しません) とタイプしますが、変換では入力バッファの前方から最長一致になる単語を検索していきますので、まず「喜」、続いて (1文字目の「喜」を破棄して)「京子」に変換され、そのあと「v」を入力しても「京子k」(kyv v) となってしまいます。
このような場合、「^l」に登録している再変換機能 (reConvert() 関数) を使用すると、直前に変換した内容 (この場合は「京子」の「kyv」) を入力バッファに戻し、最所の 2 文字を優先的に再変換・確定します。残った部分は辞書にマッチすれば変換、なければそのままバッファに残るような仕組みです。^l を「京子」の状態で押せば「喜v」に、「京子v」で押せば「喜子」に再変換される、という具合です。
再変換はできますが、あまり利用すると IME (の変換キー) を使用しない (= 打鍵数が減る)、というメリットが薄れてしまうので、できれば再変換は避けるのが理想です。これは辞書の編成や最適化によって回避できると思います。方法はいろいろありますが長くなりますので、この辺りはまた別の機会に。
(本体も含めて) 雑な作りで申し訳ないのですが、辞書の統計情報を表示するページを utils/statistics に用意しましたので (statistics.html)、辞書を作成する際に参考にしてみてください。初期状態では、同一フォルダにある deictionary.txt の内容を解析します。
その他・データ (人名) について
本スクリプト、およびスクリプトの補助ツールなどの作成にあたっては、Claude Sonnet 3.5 を使用しています。
また、本ページの画像や入力テストで使用している人名は、いずれも架空のものです。実在の人物とは一切関係ありません。
免責事項
当ソフトウェアの使用に関連して生じたいかなる損害、損失、またはトラブルについても、一切の責任を負いません。これには、データの損失、収益の損失、ビジネスの中断、およびその他の金銭的損失が含まれますが、これに限られません。
謝辞
IME の制御に IME.ahk を使用しています。本システムに未登録の文字の入力が楽になりました。作製者の eamat. 様に心より感謝申し上げます。