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 に記述しました。


 完全な修正を行うためには、

  • 【ifsw NI_CO_LAYOUT_SELECT】〜【endif】
  • 【ifsw ASUKA_KANA_LAYOUT_21C290_SELECT】〜【endif】
  • 【ifsw ASUKA_KANA_LAYOUT_21C345_SELECT】〜【endif】

の中にも if(n)sw への対策が必要になります(修正時の考え方は全く同じ)。


 ……とはいえ、NICOLAの中の ifsw〜endif スイッチ群を除去するのは(オリジナルとの動作互換性は確保したいので)乗り気にはなれず、

  • とりあえず先に NI_CO_LAYOUT は定義してしまう。
  • NI_CO_LAYOUTの下に ifsw〜endif で括った他配列定義を置き、必要に応じて NI_CO_LAYOUT を上書きしつつ定義する。

という方法を取るほうが良さそうです。
 ただし、 ifsw〜endif で定義するほかの配列については、定義中に ifsw〜endif のネストを含めるわけにはいかないので……少なくとも、

  • 【NI_CO_LAYOUT_SELECT】は配列定義中一番最初に、かつ外側には ifsw〜endif を置かず、そのまま定義する。
  • 【ifsw ASUKA_KANA_LAYOUT_21C290_1234567890_SELECT】〜【endif】をNICOLAのあとに個別定義する。
  • 【ifsw ASUKA_KANA_LAYOUT_21C290_7125469803_SELECT】〜【endif】をNICOLAのあとに個別定義する。
  • 【ifsw ASUKA_KANA_LAYOUT_21C345_1234567890_SELECT】〜【endif】をNICOLAのあとに個別定義する。
  • 【ifsw ASUKA_KANA_LAYOUT_21C345_7125469803_SELECT】〜【endif】をNICOLAのあとに個別定義する。

という方法を取る必要が出てきます。
 面倒といえば面倒……ですが、 NI_CO_LAYOUT 以外はそれほど配列内スイッチが増えることはなさそうなので、とりあえずはこの方向で。


 この定義は、今日の日記で実際にやったことそのままのスクリプトから、

  • if(n)sw〜endif を使って「同期シフト」と「同期連続シフト」を切り替えできるようにしよう。
  • 配列定義を複数書いて、それを if(n)sw〜endif でスイッチできるようにしよう。

と目論んで記述したものです。
 ただし、現時点ではこのスクリプトではエラーをはきます。原因も不明なままです。

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

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


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

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


# 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		TRUE


# ● 【未実装】小指シフトキーの挙動をMS-IMEローマ字入力にあわせる。
#  小指シフトキー+文字キーで英字が入り、以降は英字入力モードへと移行します。
#  小指シフトキーの単独Down→直後に小指シフトキーの単独Upでカナモードに戻ります。
#  「飛鳥カナ配列」「小梅配列」などで使用することができます(任意使用)。
#  FALSEにすると、小指Shift入力は小指Shiftキーを押している間のみ有効になります。
#  TRUE で有効、FALSE で無効
define	UNINTERRUPTED_ALPHABET_ENABLE		TRUE


# ● 【未実装】最上段の数字並びを「7125469803」に変更する。
#  数字段を、いわゆる「飛鳥並び」に変更します。
#  「飛鳥カナ配列」でテーブルが対応する場合のみ有効となります。
#  TRUE で有効、FALSE で無効
define	ASUKA_KANA_LAYOUT_7125469803		TRUE


# ● ひらがなの配列を変更する。
#  定義されている配列から、必要な配列を選択することができます。
#  二つ以上をTRUEにした場合、スクリプトの最後端に近いものが選択されます。
#  TRUE で有効、FALSE で無効
#
#	NICOLA(親指シフト)を有効にする設定
define	NI_CO_LAYOUT_SELECT		TRUE
#
#	【配列未定義】飛鳥カナ配列 21世紀-290を有効にする設定
define	ASUKA_KANA_LAYOUT_21C290_SELECT		FALSE
#
#	【配列未定義】飛鳥カナ配列 21世紀-345を有効にする設定
define	ASUKA_KANA_LAYOUT_21C345_SELECT		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
ifsw NI_CO_LAYOUT_SELECT
# 
# ここからNICOLA(日本語コンソーシアム基準配列)の文字配列部分定義。
# http://nicola.sunicom.co.jp/spec/kikaku.htm
# 

#------------------------------------------------------------------------------
# 通常キー
#------------------------------------------------------------------------------

# 以下キーごとの設定 カスタマイズできます

func _TABLE_OS VK_BACKSLASH	# [\|]
	SETVAR0	_kana_ORG	# ¥
	SETVAR1	_kana_NOP	# 
	SETVAR2	_kana_NOP	# 
	SETVAR3	_kana_SHORG	# |
	CALL	_subRIGHT
endfunc

endif
#キー配列定義 ifsw NI_CO_LAYOUT_SELECT 、ここまで。


ifsw ASUKA_KANA_LAYOUT_21C290_SELECT
# 
# ここから飛鳥カナ配列21世紀-290版の文字配列部分定義。
# http://www.eurus.dti.ne.jp/~yfi/aska_arrangement/index.html
# 

#------------------------------------------------------------------------------
# 通常キー
#------------------------------------------------------------------------------

# 以下キーごとの設定 カスタマイズできます
func _TABLE_OS VK_BACKSLASH	# [\|]
	SETVAR0	_kana_ORG	# ¥
	SETVAR1	_kana_NOP	# 
	SETVAR2	_kana_NOP	# 
	SETVAR3	_kana_SHORG	# |
	CALL	_subRIGHT
endfunc

endif
#キー配列定義 ifsw ASUKA_KANA_LAYOUT_21C290_SELECT 、ここまで。


ifsw ASUKA_KANA_LAYOUT_21C345_SELECT
# 
# ここから飛鳥カナ配列21世紀-345版の文字配列部分定義。
# http://ameblo.jp/asuka-layout/entry-10028753072.html
# 

#------------------------------------------------------------------------------
# 通常キー
#------------------------------------------------------------------------------

# 以下キーごとの設定 カスタマイズできます
func _TABLE_OS VK_BACKSLASH	# [\|]
	SETVAR0	_kana_ORG	# ¥
	SETVAR1	_kana_NOP	# 
	SETVAR2	_kana_NOP	# 
	SETVAR3	_kana_SHORG	# |
	CALL	_subRIGHT
endfunc

endif
#キー配列定義 ifsw ASUKA_KANA_LAYOUT_21C345_SELECT 、ここまで。





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

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

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

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