blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

enthumble (アンサンブル) の機能と DvorakJ を併用する

はじめに

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 (アンサンブル)の機能を完全に使用できていない。以下の二つの設定が抜け落ちているのだ。

  1. 無変換Spaceを同時に押してEnterを出力する
  2. 無変換変換を同時に押して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 のスクリプトで補完することになったわけだ。興味を抱いた方はいろいろと改変してみてはいかがだろうか。

後日追記

加除訂正を施した。