はじめに
enthumble (アンサンブル) というソフトウェアの機能を、最終的には AutoHotkey のスクリプトで代用し、それと DvorakJ を併用する。
enthumble (アンサンブル) と DvorakJ の併用の失敗
enthumble (アンサンブル)という、無変換キーと他のキーを組み合わせるキーカスタマイズの機能と、DvorakJ を併用できないかとの問い合わせを受けた。どうやら、enthumble (アンサンブル)とDvorakJ では挙動が競合してしまうため、できれば、DvorakJ 単独で enthumble (アンサンブル)の機能を使用したいということだった。挙動が競合しているというのは、具体的には、無変換キーと文字キーに関するキーフックが重複していることを意味している。
DvorakJ 単独での実装
質問者により作成された「[無変換]+[文字]と[変換]+[文字]」用設定ファイルはつぎのとおりである。
-muhenkan[ {F1}|{F2} |{F3} |{F4}|{F5}|{F6}|{F7}|{F8}|{F9} |{F10} |{F11}|{F12} |{Home}|{End}| | |{BS}|{BS}|{↑}|{PgUp}|{Del} | ^a |^s |^d |^f | | |{←}|{↓}|{→} |{PgDn}| ^z |^x |^c |^v | | |{BS}|{BS}|{Del} |{Del} | ]
ただ、この設定では、enthumble (アンサンブル)の機能を完全に使用できていない。以下の二つの設定が抜け落ちているのだ。
- 無変換とSpaceを同時に押してEnterを出力する
- 無変換と変換を同時に押してEscを出力する
AutoHotkey のスクリプトによる実装
現行の DvorakJ では、上記の二つの設定を実現することができない。該当する出力処理を実装していないからだ。
そこで、私が代案として提示したのは、AutoHotkey と DvorakJ を併用することである。 enthumble (アンサンブル)の機能に該当する部分を AutoHotkey のスクリプトとして実装し、それと DvorakJ を併用する。まずAutoHotkey_L を導入してから、以下の設定を UTF-8 で保存する。ファイル名は my_muhenkan.ahk としておこう。
; 1st sc07B & sc002::send, {F1} sc07B & sc003::send, {F2} sc07B & sc004::send, {F3} sc07B & sc005::send, {F4} sc07B & sc006::send, {F5} sc07B & sc007::send, {F6} sc07B & sc008::send, {F7} sc07B & sc009::send, {F8} sc07B & sc00A::send, {F9} sc07B & sc00B::send, {F10} sc07B & sc00C::send, {F11} sc07B & sc00D::send, {F12} ; 2nd sc07B & sc011::send, {Home} sc07B & sc012::send, {End} sc07B & sc015::send, {BS} sc07B & sc016::send, {BS} sc07B & sc017::send, {Up} sc07B & sc018::send, {PgUp} sc07B & sc019::send, {Del} ; 3rd sc07B & sc01E::send, ^a sc07B & sc01F::send, ^s sc07B & sc020::send, ^d sc07B & sc021::send, ^f sc07B & sc024::send, {left} sc07B & sc025::send, {down} sc07B & sc026::send, {right} sc07B & sc027::send, {PgDn} ; 4th sc07B & sc02C::send, ^z sc07B & sc02D::send, ^x sc07B & sc02E::send, ^c sc07B & sc02F::send, ^v sc07B & sc032::send, {BS} sc07B & sc033::send, {BS} sc07B & sc034::send, {Del} sc07B & sc035::send, {Del} ; [muhenkan]+[Space]->[Enter] sc07B & space::send,{Enter} ; [muhenkan]+[henkan]->[Esc] sc07B & sc079::send,{ESC} ; [muhenkan]->[muhenkan] sc07B::send,{sc07B}
簡単に解説しておく。"::" の左側には処理対象のキーを、右側には処理内容を記す。たとえば、"sc07B & sc01E::send, ^a" で、無変換キー(sc07B)とAキー(sc01E)を押したときに、Ctrl + A (^a) を出力することになる。出力対象のキーについてはホットキー - AutoHotkeyJpを、処理内容についてはコマンド - AutoHotkeyJpを参照すること。
DvorakJ を起動し、つづけてこのスクリプトを起動させれば、期待する通りの挙動を得られるだろう。ただし、DvorakJ の「[無変換]+[文字]と[変換]+[文字]」の設定を無効にする必要がある。
なお、シフトキーの効果を上記のキーバインドに反映させるには、"send," の直後に {blind} を追記すること。いくつか例を挙げておこう。
sc07B & sc024::send, {blind}{left} sc07B & sc025::send, {blind}{down} sc07B & sc026::send, {blind}{right}
AutoHotkey のスクリプトからの DvorakJ の起動管理
上記のスクリプトを少々改良し、 DvorakJ の起動を管理しよう。DvorakJ を先に起動しておくのは、DvorakJ のキーフックを先に有効にするということである。その後で、上記のスクリプトのキーフックを有効にする必要がある。これより、上記のスクリプトを起動した時点でDvorakJ が起動しているか否かを判定し、それに応じて処理をすることが考えられるだろう。具体的には、つぎのような処理を行うことになる。
- DvorakJ が既に起動しているときは処理を続行する
- DvorakJ が起動していなければ、DvorakJ を起動させ、一定時間経過後にスクリプト自身を実行し直す。
この処理を AutoHotkey のスクリプトで行うには、以下の記述をスクリプトのファイルの冒頭に追記すること。DvorakJ_path := "" の "" 内には、 "Z:\test\DvorakJ.exe" のように DvorakJ.exe のパスを記入しなければならない。この記述でどういう処理をするかというと、"DvorakJ" というタイトルのウィンドウが存在しないときには、DvorakJ.exe を起動し、5000ミリ秒(つまり5秒)間待機し、スクリプト自身を再度実行するのである。この設定を用いるならば、スタートアップに登録している DvorakJ.exe のショートカットを削除しておくこと。
#SingleInstance force DvorakJ_path := "" DetectHiddenWindows, On if not ( WinExist("DvorakJ") ) { run, % DvorakJ_path sleep, 5000 reload }
おわりに
以上、enthumble (アンサンブル) の機能を AutoHotkey のスクリプトで代用し、それと DvorakJ を併用することについて説明した。結局のところ、DvorakJ の機能を AutoHotkey のスクリプトで補完することになったわけだ。興味を抱いた方はいろいろと改変してみてはいかがだろうか。
後日追記
加除訂正を施した。