em1key/oyayubiwmを使った「同期連続シフトなNICOLA」、if(n)sw〜endif化に失敗した定義……が、なぜ失敗したのかようやく理解できた。

(過去:em1keyを使って「飛鳥カナ配列」の「同期連続シフト」を実現するための改造ポイントに関するメモ。)
(過去:em1key/oyayubiwmを使った「同期連続シフトなNICOLA」、if(n)sw〜endif化に失敗した定義。)
(過去:em1key/oyayubiwmを使った「同期連続シフトなNICOLA」、if(n)sw〜endif化+カナ配列部分の切替に失敗した定義。)


 {ifpc|ifce|ifsw|ifnsw}〜endifはネストしちゃだめ!って、しっかりマニュアルに書いてありました。
 しかもしっかり読んでいたはずなのに、どうして実際に定義を書くと、こういうことをやってしまうのだろうか……orz。

間違っている定義。

# 左親指シフト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

# 右親指シフト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

修正後の定義。

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


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

 昨日の定義では↑を「FALSE」にしていましたが、「TRUE」にしてもエラーが出る点は変わりませんでした……って、ここは原因じゃなかったのだから当然ですね^^;。
 以下のように、元からあった外側の ifsw〜endif を外すと、 ifsw〜endif のネスト状態が解消されるので、しっかり定義が通ってくれます。
 ただし、ROS_KEYCODE3〜1には(定義中のキー割り当てを書き換えない限りは)普段同じキーコードが入りますし、おなじように LOS_KEYCODE3〜1にも、普段同じキーコードが入ります。
 この場合、 ROS_KEYCODE3〜2 と LOS_KEYCODE3〜2 は逆順に上書き登録されても実害はないのですが、○OS_KEYCODE1 には ALTキー関連の処理が入っているので、せめて ○OS_KEYCODE1 は最後に登録してやらないといけません……そこで、親指シフトの登録順序を ○OS_KEYCODE3 → ○OS_KEYCODE2 → ○OS_KEYCODE1 にしてみました。
 ……うーん、こんなテキトーでよいのだろうか^^;。

#------------------------------------------------------------------------------
# 親指シフトキー
#------------------------------------------------------------------------------

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


## 
## 2007年5月22日11:40:06変更。
## ifsw UNINTERRUPTED_SHIFT_ENABLE を有効にするために、以下の点を変更。
## ・定義順を逆転(重複時は最後に定義されたものが有効になる……なルールを利用する)。
## ・○親指シフト3〜2の外側にある ifsw を除去。
## 




# 左親指シフト3
	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


# 左親指シフト2
	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


# 左親指シフト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


# 右親指シフト3
	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


# 右親指シフト2
	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


# 右親指シフト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


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

ちなみに。

 【em1key/oyayubiwmを使った「同期連続シフトなNICOLA」、if(n)sw〜endif化+カナ配列部分の切替に失敗した定義。】についても、同じく「NICOLAの配列定義中に if(n)sw〜endif が使われている(BS/ESCキーの割り当て用)」ので、こちらも同じように処置することになります。
 #やり方は該当記事の先頭に記しました。


 NICOLAは一番初めに「ifsw〜endifを使わず」定義して、その下に他の配列の定義を「配列ごと if(n)sw〜endif で括って、配列内部の if(n)sw〜endif は除去して」置いてみました……うまく em1keypc に通ったようで、一安心。
 きちんと連続シフトNICOLAは動いているようなので、後は飛鳥の配列を定義すれば「スイッチで切り替えるだけでNICOLAと飛鳥が使える」ということになりそうです。


 って、NICOLAで同期連続シフトを使うことはないだろうし、飛鳥で同期シフトを使うこともないだろうから……

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

の部分は、それぞれの配列内部で define するほうがよいのかも……?


 手元の定義では飛鳥の配列部分を定義していない(まだNICOLAが複数定義されたままの状態)ので……こちらは何時やるべきか、ちょっと迷っています。
 いずれにせよ、なんとなく……ですけど、 em1key と oyayubiwm がどういう風に親指シフトを実現しているのかが見えたというのは、個人的に弄っていて楽しかったです。
 時間が取れ次第、飛鳥の配列を入れてテストしてみたいですね。


 あとは、ここから親指ひゅんQのロジックを見て理解できるようになっているかどうか&SCIMAnthyのソースを見て理解できるようになっているかどうか……と、そこにいくまでには、もう少し準備が必要になってしまうかもしれません。