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 #----------------------------------------------------------------------------- # 「親指シフト」ここまで #-----------------------------------------------------------------------------