blechmusikの日記

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

任意のモードを設定し、そのモードを任意のキーで切り替えるスクリプト

以下のとおりのコメントを受けた*1

直接入力と日本語を分けているように 変換を押したら「A配列モード」を呼び出し、もう一度変換を押すことで元に戻るような設定の書き方はあるのでしょうか?
viのコマンドモード?(ちょっとしか使ったことないので不正確だと思いますが)に近いような感覚で ON/OFFができ「変換は数字+カーソル移動モードの配列を呼び出す」「無変換は記号モードの配列を呼び出す」

AutoHotkey_Lのスクリプトでこのとおりに実装してみた。以下の圧縮ファイルには、スクリプトそのものとスクリプトを実行バイナリ化したものを収録している。


実装例ではつぎのように動作する。

「数字+カーソル移動モード」への切り替え
変換キー
「記号モード」への切り替え
無変換キー
モードの解除
使用中のモード用のキーを押す
モードの切り替え時
切り替えるモード名を表示する(1秒間)
「数字+カーソル移動モード」時
キーAで1を出力する
「数字+カーソル移動モード」時
キーAで-を出力する

キーAのようにモードによって振る舞いを変えたいキーについては、 #if 以下に設定を追加すればよい。詳しくは以下のソースを参照のこと。

;; -*-mode: ahk; coding:utf-8-dos-*-"
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#singleinstance force

;; utf-8
FileEncoding, CP65001


;; 変換キーで「数字+カーソル移動モード」の配列を呼び出す
;; 無変換キーで「記号モード」の配列を呼び出す
;; 
;; モードを解除するには、「使用中のモード」へと切り替えるキーを再度押すこと
;; プログラムを終了するには F12 を押す

;; ================================================================
;; モードの初期化
initialize_key_layout_mode()

;; モード変更時にモードの情報を表示する時間(ミリ秒)
RemoveToolTip_time := 1000
return

;; ============================================================
;; モード変更用のキー

;; 無変換->記号モード
sc07B::
	set_key_layout_mode("記号")
return

;; 変換->数字+カーソル移動モード
sc079::
	set_key_layout_mode("数字とカーソル移動")
return

;; ============================================================
;; F12 を押せばプログラムを終了する
F12::
	MsgBox, 4, プログラムの終了, プログラムを終了しますか?
	IfMsgBox, Yes
		ExitApp
return

;; ============================================================

;; #If - AutoHotkeyJp
;; http://sites.google.com/site/autohotkeyjp/reference/commands/-If

;; キーリスト - AutoHotkeyJp
;; http://sites.google.com/site/autohotkeyjp/reference/KeyList

#if get_key_layout_mode("記号")
	A::
		send,-
		return
#if

#if get_key_layout_mode("数字とカーソル移動")
	A::
		send,1
		return
#if



get_num_for_key_layout_mode(str){
	return % (str = "数字とカーソル移動") ? 1 
		   : (str = "記号") ? 2 
		   : 0
}

get_str_for_key_layout_mode(num){
	return % (num = 1) ? "数字+カーソル移動モード"
		   : (num = 2) ? "記号モード"
		   : "通常通り"
}

initialize_key_layout_mode(){
	global
	key_layout_mode := 0
}

set_key_layout_mode(str){
	global key_layout_mode
	global RemoveToolTip_time
		
	ret := get_num_for_key_layout_mode(str)
	;; toggle
	key_layout_mode := (key_layout_mode = ret) ? 0 : ret
	
	if (0 < ret) {
		ToolTip, % "-> " get_str_for_key_layout_mode(key_layout_mode)
		SetTimer, RemoveToolTip, %RemoveToolTip_time%
	}

	return key_layout_mode
}

get_key_layout_mode(str){
	global key_layout_mode
	
	ret := get_num_for_key_layout_mode(str)
	
	return % (ret = key_layout_mode) ? True : False
}


RemoveToolTip:
	SetTimer, RemoveToolTip, Off
	ToolTip
return