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