SKKIME使いのためのXKeymacs
キーボードユーティリィティ XKeymacs 3.48改 20110426b
ご注意
改造版につき、オリジナル版と微妙に動作が異なる箇所があります。
前の版から移行するにあたり、必ず以下の点を確認してから使ってください。特に強調表示されている箇所はよく確認されることをお勧めします。
- SKKIMEにおけるIME ON操作を全てのアプリケーションに適用させるため、デフォルト無効となるアプリケーションはありません。
原作ではデフォルト無効設定となっていた以下のアプリケーションは、設定画面で「XKeymacsを無効にする」を個別に登録する必要があります。
- Mule/Meadow/Emacs/Xyzzy などのEmacs操作系のエディタ
- sh/bash/csh/tcsh/pdksh/zsh などのUnix系シェル
- AstecX/Xwin などのX-Windowサーバ
- Lisp Works Personal Edition
- Tera Term Pro
- Visual Slick Edit
- コマンドプロンプト等のコンソールウィンドウの判定方式が変わり、特定のアプリケーション名に依存しない広範囲のアプリケーションをコンソールと認識するようになっています。
また、アプリケーション名の検出アルゴリズムが異なるため、従来は個別に登録する必要があったコンソール関連の設定は不要となる可能性があります。
- コマンドプロンプト等のコンソールウィンドウでの kill-line の動作が変更され(従来はカーソルが進むだけ)、行末までクリア(CTRL+HOME)で代用されるようになりました。ただし、消去された部分のクリップボードへの転送は行なわれず、アンドゥもできません。ご注意ください。
- GUIの登録に使用されるウィンドウ名はほとんど加工せずに使われます。これにより、設定は従来版と異なるラベルで登録されますが、動作に影響はありません。従来の設定もそのまま引き継いで動作しますし、設定を上書きしてしまっても問題ありません。なお内部動作においては従来通り、プロセス名(.exeの拡張子が付いた括弧内のファイル名)だけが使用されます。
- 32ビットのプロセスと64ビットのプロセスの設定は区別されます。ただし、コンソール(コマンドプロンプト cmd.exe等)とIMEについては32/64ビットの判定は行なわれず、32ビット版の設定がそのまま適用されます。より正確に言うと、64ビット環境では64ビットバイナリ側が32ビット版の設定を利用します。64ビット環境では、32ビットのアプリケーションであっても、コンソールウィンドウは64ビットプロセスが管理しているためです。
- Windows XP以前において、複数のIMEの切り替えには対応していません。Vista以降ではもとのXKeymacsでも切り替えには未対応でしたので、特に動作は変わりません。IMEを切り替えた場合はプログラムを終了させて再度実行しなおしてください。
- Windows XP以降専用です。Windows 2000での動作も考慮したプログラムにはなっていますが、動かすためにはフリーソフトのVC2010用パッチ当てツール等を用いる必要があります。
改造元
インストール方法
原作であるXKeymacs 3.47のアーカイブを展開し、そこへ本アーカイブ内の実行ファイルを上書きしてください。
原作では etc フォルダ以下に設定ファイルがありますが、ディスク容量が気になる場合はフォルダごと削除してしまっても構いません。実行ファイル単独の状態でも問題なく動きます。
32ビットOSの場合は、32ビット版バイナリ(XKeymacs.exe)のみを実行してください。
64ビットOSの場合は、32ビット版バイナリ(XKeymacs.exe)および64ビット版バイナリ(XKeymacs64.exe)を同時に実行してください。順番はどちらが先でもOKです。(実は起動順序によってIMEに関連する細かな動作が変わります。詳細は後述)
改造箇所
- 64ビット版アプリケーションは、プロセス名の末尾に " *64" と表示されます。レジストリ等への設定でもこの名称が用いられます。
- 従来の32ビット版単独では64ビットアプリケーションの切り替わりを検出できないため、64ビット環境では32ビット版バイナリと64ビット版バイナリの両方を同時に実行すると、自動的に双方が同期を取りながら動作します。片側だけ動かした場合は、反対側のアプリケーションの識別ができない状態(従来の「64ビット版」ビルドと同様)の動作となります。
- 設定の同期処理の実装が不十分なため、32ビット側のダイアログで設定を行った場合、64ビット側でもダイアログを開いて(ダイアログ上では更新されているように見えますが内部は更新されていないので)そのままOKを押して双方に設定を反映させる必要があります。この部分は次期バージョンでGUIを一本化する際に併せて修正する予定です。
- フックした瞬間や同じ系列のイベントが連続した場合に情報をキャッシュし処理を減らしました。その他、API呼び出しや文字列コピー・比較処理等の回数を削減を行なって軽量化してあります。DLL寄生部分の軽量化、サイズ最小化については今後さらに見直す予定です。
- フック処理内部で浮動小数点数を一切使わないよう改良
- 通常アプリケーションのウィンドウのタイトル名判定処理を削除
- コンソールアプリケーションの判定を個別のプログラム名になるべく依存せずに行なうよう改良
- コンソールウィンドウのシステムメニューの操作(yank等の速度)を微妙に高速化
- Windows XP以前の環境において、マウスカーソルの位置によってシステムメニューの操作が行なわれない可能性があるバグを修正しました。(現在のコードでも激しくマウスを動かしながら連続操作しようとすると失敗しますが、通常の利用において問題になることはなくなったと考えています)
- Windows 7ではキーボードショートカット機能を用いてより高速に操作を完了するようにしました。(Vistaは環境がないため未調査)
- AOL Netscapeの判定を除外(旧MozillaおよびFirefoxの設定は変わらず)
- 起動時に勝手に etc フォルダおよびその直下のファイルを作成しないように変更
- 「Ticket #19627: Windows 7でコンソールアプリの識別に失敗する」を修正
- コンソール判定対象プロセスに conhost.exe を追加
- 「Ticket #19732: IME オープンで、既に開いてあればそのキーを IME に渡してほしい」を改良
- Open Input Method の動作を変更
- Windowsイベントがなくなってから2秒でメモリ開放(GUI側のみ)
- GUI側のみに必要なモジュールをDLL側から分離(アイコン設定関連、固定文字列判定処理などは理論的には全て移して寄生するDLL側を相当軽量にできるはず。少しづつ変更予定)
- VC++2010/SDK7.1用にプロジェクトを変更
- 64ビット版は名称を XKeymacs64 に変更
- セクション名や格納順序を最適化
- 日本語ダイアログフォントをMS UI Gothic(9)に変更
- 英語ダイアログフォントをMS Shell Dlg(8)に変更
- 不要なリソースを削除
ご注意
今回はわりと大胆に改造したので、もしかするといろいろエンバグしているかもしれません。どんな些細なことでも気づいたことがあればお気軽にご連絡ください。
本プログラムの構造上、64ビット環境では一部問題が残っています。32/64ビット版を同時に動かすと、先に常駐した側のXKeymacsでは、内部でIME状態取得を必要とする機能が動作しなくなります。ただし、toggle-ime に関しては非常時は漢字キー押下処理で代用されるため大抵の環境では問題ないと思われます。それ以外のIME ON/OFF動作については未定義時と同じ扱いとなります。
IME状態取得が必要なコマンドを利用する場合は、32/64ビットのうち利用したい側を後から起動するようにしてください。例えば、Firefox(32ビットアプリケーション)で主にIME制御を行ないたいという場合は、64ビット版を先に、32ビット版を後から実行します。
SKKIMEと併用してCTRL+J動作をアプリによって使い分けたいのにこんなオチでは悲しすぎますが、必ずいつか根本的に解決したいと思っています。ひとまず今の時点で用意できるのはここまでです。
ご意見募集中
本プログラムに関して改良のアイディアや使用レポートなど、どんな情報でもお気軽にお知らせください。
XKeymacsは非常に多彩な機能と、独自操作のためのノウハウの塊のようなソフトなため、まだ全ての機能の把握や効果的な動作テストが行なえていない状態です。また、アプリケーションのバージョンアップにより、従来のXKeymacsではおかしな操作になっているが直されていないソフト、標準設定ではうまく動かないソフトなどもあると思われます。
あと、本バージョンで削除した、WinXP版での複数IMEの検出は必要とされているのかどうか、とか、どういった利用法なのかについても把握したいと思っています。
更新履歴
- 20110306: 開発環境の変更、サイズ縮小、リソース修正、メモリ消費量改善、64ビット版試作、sourceforge.jpの修正要望の取り込み
- 20110422: 64ビットプロセス判定の追加, フック処理の軽量化, コードサイズ削減
- 20110422a: Windows XPにおいてウィンドウハンドルを正しく取得できないバグを修正
- 20110425: 32/64ビットプロセス間の同期処理の追加、フック処理の軽量化、コンソール操作の高速化
- 20110426: Windows XPでのコンソールのシステムメニュー操作速度の向上
- 20110426a: IME変換後にプロファイルが正しく切り替わらないバグを修正
- 20110426b: 64ビット版バイナリを先に常駐させた場合、システムフックが別のプロセスとなりコンソールのシステムメニューがキーボード操作できない時、従来通りマウスクリックでシミュレートするよう修正。あわせて、Windows 7のAeroテーマにてコンソールのシステムメニュー関連の操作が動作するよう変更
TODO
- Firefox4のXP版での動作が何だかおかしい。kill-ring-saveなどの挙動を要確認。
- Thunderbird3でカーソルが1文字進む現象の解明。
Mozilla系は描画もキー処理も何もかもが独自実装すぎて泣ける。
- まだ32ビット版/64ビット版同士で干渉しないような作りにしてあるため、双方で多少処理がかぶってしまって動作に無駄があることがわかっています。次のバージョンでは協調動作を行ない無駄のない動作になる予定です。
- 次の版ではレジストリ設定まわりが大幅に変わる可能性があります。
- フック用DLLのMFC/ATLへの依存を完全に排除したい → STLで書き直し中。まだコンパイル通らず。
- UNICODE対応化 → 起動まではできたがまともに動かず。クリップボードまわりを中心に修正がまだまだ必要
- 64ビット版側のGUI関連処理を削除し32ビット版側から自動的に呼び出すように → 現在はどちら側からでも設定可能
- レジストリを使わずに定義ファイルやスクリプトによる設定を可能にしたい
- DLLの共有セクションの扱いを何とかしたい。32/64間での共有方法はどうするか
- プロセス名はなるべくハードコーディングをなくす方向で修正中。判定ロジックはレジストリやスクリプト等で外部定義できるようにする。
謝辞
最新版ソースへの改造と公開をご快諾くださった作者の大石様に感謝します。
co (Twitter♺)