em1key/oyayubiwmを使った「同期連続シフトなNICOLA」、if(n)sw〜endif化に失敗した定義。

 2007年5月22日12:01:45追記。
 この定義がうまく動かない理由は、単純に「ifsw〜endif」をネスとしていたことにありました……一晩寝て気づきましたorz。
 修正方法は http://d.hatena.ne.jp/maple_magician/20070522/1179802763 に記述しました。


 この定義は、今日の日記で実際にやったことそのままのスクリプトから、さらに if(n)sw〜endif を使って「同期シフト」と「同期連続シフト」を切り替えできるようにしようと目論んで記述したものです。
 ただし、現時点ではこのスクリプトではエラーをはきます。原因も不明なままです。

 動作に支障が出ることについては、 WindowsXP+em1keypc で確認しました。

 ただし、改造した部分に関する動作品質はあくまでも「かえでクオリティ」なので、その点についてはご注意ください。
 この定義で妙な動きをする場合、それはもちろん私の責任です、はい。
 それと、まだ「飛鳥カナ配列」の文字配列は定義していません……そのため、「同期連続シフトなNICOLA」と表現していたりします。


 では、以下に定義を貼ります。
 (全文を貼るとはてなからリジェクトされるようで、とりあえず変更箇所のみを貼ります)

#
# asuka_negligence_wm 飛鳥カナ配列「シフト制御なし」版
#
# これは、oyayubiwm(v1.42)を元にした「飛鳥カナ配列21世紀-290版」の
# スクリプトです……が、「飛鳥配列定義」も「シフト残り対策」も
# 行っていない、手抜きバージョンです。
#
# なぜか、2994行:判定できないコマンドです	ALLOCVSTATE	0で止まります。
#
#


# 2007 Hiroyuki Ogasawara
# vim:ts=4 sw=4:
# em1key script file
# http://www.vector.co.jp/authors/VA004474/

# 「親指シフト」用定義ファイル

# このファイルはバージョン更新時に上書きされる可能性があります。
# 書き換えて使っている場合は更新前に必ずバックアップを取っておくように
# してください。
# ● 外部キーボードで [Ctrl]/[CapsLock] の交換を行います (CEのみ)
#  TRUE で有効、FALSE で無効
define	CSW_CTRLSWAP_ENABLE		FALSE


# ● 外部キーボードで [ESC]/[半/全] を交換します (CEのみ)
#  TRUE で有効、FALSE で無効
define	CSW_ESCSWAP_ENABLE		FALSE


# ● 「同期シフト」から「同期連続シフト」に変更する。
#  親指シフトキーを押している間は、全ての文字がシフト修飾されるようになります。
#  「飛鳥カナ配列」「TRONかな配列」などで使用します。
#  TRUE で有効、FALSE で無効
define	UNINTERRUPTED_SHIFT_ENABLE		FALSE
#------------------------------------------------------------------------------
# 初期化関数
#-----------------------------------------------------------------------------

# 初期化 起動時に呼ばれる
func TABLE_FUNC	0
	# 初期化
	CLEARALLSTATE
	WINCMD WINCMD_GETIMEMODE

	# EMONE/ZERO3 の内蔵キーかどうかの判定を行います。これを off にすると
	# すべてのキーボードで有効扱いになります。
	SETSYSFLAG	SYSFLAG_SCANTEST

	# 初期状態で使用するキーテーブルの選択
	# TABLEID_DEFAULT にすると 親指シフト入力 が off になります。
	SETTABLE	TABLEID_EXT

	# タイトル&ヘルプ設定
	string	0	"oyayubiwm v1.42 「親指シフト」入力(+連続シフト)"
	SETHELP		0
	string	0	""
	SETHELP		1
	string	0	"★外部キーボードで親指シフト入力できます★"
	SETHELP		2
	string	0	"  [無変換]=左親指シフト [変換]=右親指シフト"
	SETHELP		3
	string	0	"このスクリプトは改変版です。苦情は以下まで。"
	SETHELP		4
	string	0	" http://d.hatena.ne.jp/maple_magician/"
	SETHELP		5

	ifsw CSW_COUNT
		LOAD	0
		STOREVAR	_WK_COUNT
		STOREVAR	_WK_RCOUNT
		STOREVAR	_WK_UPDATE
	endif
endfunc
#------------------------------------------------------------------------------
# 親指シフトの実行ロジック
#------------------------------------------------------------------------------

# KeyBuffer
# 一般キーの情報をバッファリングする
func TABLE_FUNC _subPushKey
		TESTGSTATE	_gs_ISLEFT		# ←左親指押下中は1、右親指押下中は0。
		STOREVAR	_KB_ISLEFT		# →_subFlushAll で_OB_ISLEFTと比較。
		LOADVAR		_IN_DF_FUNC		# ←LOADVAR 0(無シフト文字)。
		STOREVAR	_KB_DF_FUNC		# →_subFlushKeyでCALLVERされる。
		LOADVAR		_IN_OS_FUNC		# ←LOADVAR 1(同手シフト文字)。
		STOREVAR	_KB_OS_FUNC		# →_subFlushAllでCALLVERされる。 
		LOADVAR		_IN_CR_FUNC		# ←LOADVAR 2(対手シフト文字)。
		STOREVAR	_KB_CR_FUNC		# →_subFlushAllでCALLVERされる。 
		LOADVAR		_IN_SH_FUNC		# ←LOADVAR 3(小指シフト文字)。
		STOREVAR	_KB_SH_FUNC		# →_subFlushKeyでCALLVERされる。 
		LOADVAR		GVAR_KEYCODE	# ←VAR37(呼び出し時キーコード)保管。
		STOREVAR	_KB_KEYCODE		# →_subExecKeyで自分自身か否か判定。
		LOADVAR		GVAR_EVENTTIME	# ←VAR38(キー呼び出し時刻)保管。
		STOREVAR	_KB_TIME		# →_subExecKeyでOB_TIMEから引き算。
		SETGSTATE	_gs_KEYBUFFER	# →宣言「文字バッファがあるよ!」
		RETURN	0
endfunc

# OSBuffer
# 親指シフトキーをバッファリングする
func TABLE_FUNC _subPushOS
		TESTGSTATE	_gs_ISLEFT		# ←左親指押下中は1、右親指押下中は0。
		STOREVAR	_OB_ISLEFT		# _subFlushAll で_KB_ISLEFTと比較。
		LOADVAR		_IN_DF_FUNC		# ←LOADVAR 0(無シフト文字)。
		STOREVAR	_OB_FUNC		# _subFlushKeyでCALLVERされる。
		LOADVAR		GVAR_KEYCODE	# ←VAR37(呼び出し時キーコード)保管。
		STOREVAR	_OB_KEYCODE		# _subExecKeyで自分自身か否か判定。
		LOADVAR		GVAR_EVENTTIME	# ←VAR38(キー呼び出し時刻)保管。
		STOREVAR	_OB_TIME		# →_subExecKeyでOB_TIMEから引き算。
		SETGSTATE	_gs_OSBUFFER	# →宣言「親指バッファがあるよ!」
		RETURN	0
endfunc


# キーバッファの送信を行う
#   シフト無しの送信のみ、親指シフト状態は変更しない。
func TABLE_FUNC _subFlushKey	#_subFlushAllから呼ばれる関数。
		TESTGSTATE	_gs_KEYBUFFER
		IF_FALSE	80			# キーバッファが無い場合は飛ぶ(何もしない)
		IF_SHIFT	60			# 小指シフトなら飛ぶ
		# デフォルトコード送信
		ifsw LOS_ALT_PATCH_ENABLE1
			RAWUP	VK_LMENU
		endif
		CALLVAR	_KB_DF_FUNC			# 通常コード実行(VAR 0=無シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
	LABEL	80
		RETURN	0
	LABEL	60
		# 小指シフト
		RAWUP	VK_SHIFT			# 小指shift キーのキャンセル
		CALLVAR	_KB_SH_FUNC			# 小指shift 実行(VAR 3=小指シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
		RETURN	0
endfunc


# キーバッファの送信する
#   バッファをすべて解消する。親指シフトがあれば考慮する。
func TABLE_FUNC _subFlushAll
		TESTGSTATE	_gs_KEYBUFFER
		IF_FALSE	80		# キーバッファが無い場合は飛ぶ
		# キーバッファあり
		TESTGSTATE	_gs_OSBUFFER
		IF_TRUE		20		# 親指シフトありなら飛ぶ
		# シフトなし、キーバッファのみ
		CALL	_subFlushKey
		RETURN	0
	LABEL	20
		# キーバッファも親指シフトもある場合
		#  クロスシフト判定
		LOADVAR		_OB_ISLEFT
		CMPVAR_EQ	_KB_ISLEFT
		IF_FALSE	40	# クロスならとぶ
		# 通常親指シフト
		ifsw LOS_ALT_PATCH_ENABLE1
			RAWUP	VK_LMENU
		endif
		CALLVAR	_KB_OS_FUNC			# 親指シフト実行(VAR 1=同手シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
		ifnsw UNINTERRUPTED_SHIFT_ENABLE
			RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥では不使用★★
		endif
		RETURN	0
	LABEL	40
		# クロス親指シフト
		ifsw LOS_ALT_PATCH_ENABLE1
			RAWUP	VK_LMENU
		endif
		CALLVAR	_KB_CR_FUNC			# クロスシフトの実行(VAR 2=対手シフト文字)
		RESETGSTATE	_gs_KEYBUFFER	# キーバッファをクリア
		ifnsw UNINTERRUPTED_SHIFT_ENABLE
			RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥では不使用★★
		endif
		RETURN	0
	LABEL	80
		# キーバッファが無い場合
		TESTGSTATE	_gs_OSBUFFER
		IF_FALSE	60				# 親指シフトが無ければ飛ぶ
		CALLVAR	_OB_FUNC			# 親指シフト単独機能の実行
		RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥でも使用★★
	LABEL	60
		RETURN	0
endfunc
#------------------------------------------------------------------------------
# 親指シフトキー
#------------------------------------------------------------------------------

# 親指シフトキーはいくつでも設定できます

# 左親指シフト1
func _TABLE_OS	LOS_KEYCODE1
		ifsw UNINTERRUPTED_SHIFT_ENABLE
			IF_DOWN 100	#キーUp以外では直下の行を無視。
				CALL	_subFlushAll
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100
		endif
		ifsw LOS_ALT_PATCH_ENABLE1
		# 左親指シフトキーに ALT を割り当てた場合の処理。かなり強引。
				IF_UP	10
				RAWUP VK_LMENU
			LABEL	10
		endif
		ALLOCVSTATE	0
		SETGSTATE	_gs_ISLEFT	# 左
		SETVAR0	LOS_SHARE_FUNC1
		CALL	_subExecOS
endfunc


# 左親指シフト2
ifsw LOS_KEYCODE2
	func _TABLE_OS	LOS_KEYCODE2
		ifsw UNINTERRUPTED_SHIFT_ENABLE
			IF_DOWN 100	#キーUp以外では直下の行を無視。
				CALL	_subFlushAll
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100
		endif
		ALLOCVSTATE	0
		SETGSTATE	_gs_ISLEFT	# 左
		SETVAR0	LOS_SHARE_FUNC2
		CALL	_subExecOS
	endfunc
endif


# 左親指シフト3
ifsw LOS_KEYCODE3
	func _TABLE_OS	LOS_KEYCODE3
		ifsw UNINTERRUPTED_SHIFT_ENABLE
			IF_DOWN 100	#キーUp以外では直下の行を無視。
				CALL	_subFlushAll
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100
		endif
		ALLOCVSTATE	0
		SETGSTATE	_gs_ISLEFT	# 左
		SETVAR0	LOS_SHARE_FUNC3
		CALL	_subExecOS
	endfunc
endif


# 右親指シフト1
func _TABLE_OS	ROS_KEYCODE1
		ifsw UNINTERRUPTED_SHIFT_ENABLE
			IF_DOWN 100	#キーUp以外では直下の行を無視。
				CALL	_subFlushAll
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100
		endif
		ALLOCVSTATE	0
		RESETGSTATE	_gs_ISLEFT	# 右
		SETVAR0	ROS_SHARE_FUNC1
		CALL	_subExecOS
endfunc


# 右親指シフト2
ifsw ROS_KEYCODE2
	func _TABLE_OS	ROS_KEYCODE2
		ifsw UNINTERRUPTED_SHIFT_ENABLE
			IF_DOWN 100	#キーUp以外では直下の行を無視。
				CALL	_subFlushAll
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥ではここで使用★★
			LABEL 100
		endif
		ALLOCVSTATE	0
		RESETGSTATE	_gs_ISLEFT	# 右
		SETVAR0	ROS_SHARE_FUNC2
		CALL	_subExecOS
	endfunc
endif


# 右親指シフト3
ifsw ROS_KEYCODE3
	func _TABLE_OS	ROS_KEYCODE3
		ifsw UNINTERRUPTED_SHIFT_ENABLE
			IF_DOWN 100	#キーUp以外では直下の行を無視。
				CALL	_subFlushAll
				RESETGSTATE	_gs_OSBUFFER	# 親指shift状態をクリア★★飛鳥では不使用★★
			LABEL 100
		endif
		ALLOCVSTATE	0
		RESETGSTATE	_gs_ISLEFT	# 右
		SETVAR0	ROS_SHARE_FUNC3
		CALL	_subExecOS
	endfunc
endif

#-----------------------------------------------------------------------------
# 「親指シフト」ここまで
#-----------------------------------------------------------------------------