keyhacで[半角/全角]キーの1回・2回押しでIME OFF・ONを切り替える

またまたkeyhacでのカスタマイズネタについて。IMEのON/OFFはいつまで経っても大して使い勝手が良くならない。どうゆうことかと言うと文字をタイプし始めてから「あ!半角のままだった……」と気づきIMEをONにして漢字入力する。またその逆も。
これは[半角/全角]キーがトグルスイッチになっているためで、いまどちらの状態にあるのかを把握せずにON/OFFできるようになれば大幅に打ち損じが減るんじゃないかと思いついた。つまり……

★ 現状

IME OFFの状態でキーを押すとIMEONONのときに押すとOFFになる。

★ 変更後

1回ポンっと押すとIMEをOFF、ダブルクリックのようにタタンっと2回連続押しだとIMEがONになる。
これをkeyhacで実現するのが、以下のスクリプトです。

■ コード

from keyhac import *

def configure(keymap):

    ## IMEを切り替える
    #
    #  @param flag      切り替えフラグ(True:IME ON / False:IME OFF)
    #
    def switch_ime(flag):

        # バルーンヘルプを表示する時間(ミリ秒)
        BALLOON_TIMEOUT_MSEC = 500

        # if not flag:
        if flag:
            ime_status = 1
            message = u"[あ]"
        else:
            ime_status = 0
            message = u"[_A]"

        # IMEのON/OFFをセット
        keymap.wnd.setImeStatus(ime_status)
        # IMEの状態をバルーンヘルプで表示
        keymap.popBalloon("ime_status", message, BALLOON_TIMEOUT_MSEC)

    ## キーの1回/2回押しで引数の関数コールを切り替える
    #
    #  @param func      コールする関数
    #
    #  引数の func は1回押しなら func(True)、2回連続押しなら func(False)
    #  でコールされる
    #
    def double_key(func, cache_t={}):

        # 2回連続押し判断の許容間隔(ミリ秒)
        TIMEOUT_MSEC = 500

        func_name = func.__name__

        # 前回時刻
        t0 = 0
        if func_name in cache_t:
            t0 = cache_t[func_name]
        # 現在時刻を保存
        import time
        cache_t[func_name] = time.clock()
        # 前回実行からの経過時間(ミリ秒)
        delta_t = (cache_t[func_name] - t0) * 1000

        # 関数コール
        if delta_t > TIMEOUT_MSEC:
            func(False)     # 1回押し
        else:
            func(True)      # 2回連続押し

    keymap_global = keymap.defineWindowKeymap()

    if 1:   # [半角/全角]
        keymap_global["U-(243)"] = lambda: double_key(switch_ime)  # 押す
        keymap_global["D-(243)"] = lambda: None                    # 離す
        keymap_global["U-(244)"] = lambda: double_key(switch_ime)  # 押す
        keymap_global["D-(244)"] = lambda: None                    # 離す

    if 0:   # [変換]
        keymap_global["S-(28)"] = "(28)"            # Shift+[変換]で再変換
        keymap_global["(28)"] = lambda: double_key(switch_ime)

    if 0:   # [無変換]
        keymap_global["(29)"] = lambda: double_key(switch_ime)

↑ [変換]・[無変換]キーがいい場合は、if 1 に変更してください。

■ さいごに

慣れれば便利だと思うので、よかったら使ってみてください!

■ 参考リンク