Skip to content

Instantly share code, notes, and snippets.

@snize
Created October 12, 2023 14:54
Show Gist options
  • Save snize/50e1611fcdb75a405cbee63773840556 to your computer and use it in GitHub Desktop.
Save snize/50e1611fcdb75a405cbee63773840556 to your computer and use it in GitHub Desktop.
英字の自作キーボードでprk_firmwareを利用している場合の英数/かな切り替えの時差式単押しキー
# https://github.com/picoruby/prk_firmware/wiki/Layers-and-mode-key_ja
# key1 key2 key3 key4
kbd.add_layer :default, %i(SPC_LAYER1 KC_A KC_B CTR_ENT_LAYER2) # :default レイヤーは最初に追加する必要がある
kbd.add_layer :layer1, %i(SPC_LAYER1 KC_1 KC_2 CTR_ENT_LAYER2)
kbd.add_layer :layer2, %i(SPC_LAYER1 KC_F1 KC_F2 CTR_ENT_LAYER2)
kbd.define_mode_key :SPC_LAYER1, [ :KC_SPACE, :layer1, 200, 200 ]
kbd.define_mode_key :CTR_ENT_LAYER2,[ %i(KC_RCTL KC_ENTER), :layer2, 300, 150 ]
# ^^^^^^^^^^^^^^^^^^^^ ^^^^^^^ ^^^ ^^^
# (1) (2) (3) (4)
# (1): 押したときに呼び出される、以下のいずれか
# キーコードのシンボル または 複数キーコードの配列 または Proc
# (2): キーコードのシンボル(モディファイアのみ) または 保持されるレイヤーのシンボル
# または Proc
# (3): リリース時間の閾値(ミリ秒)
# もしこの時間内にキーを離したら、(1)キーが一度呼び出される
# (4): 再押下時間の閾値(ミリ秒)
# (3)の状態にあるとき、この時間内にキーをまた押した場合、(1)キーが押されたままになる
#-------------------------------------------------------------------------------
# NG 公式のドキュメントにもあるように、KC_LANG2 の部分はモディファイヤかレイヤーのシンボルかProcしか指定できないので動かない
kbd.define_mode_key :LANGTOGL, [ :KC_LANG1, :KC_LANG2, 120, 120 ]
# OK Procは指定できるので kbd.send_key でキーコードを直接送ってる
kbd.define_mode_key :LANGTOGL, [ Proc.new { kbd.send_key %i[KC_MHEN KC_LANG2] }, Proc.new { kbd.send_key %i[KC_HENK KC_LANG1] }, 120, nil ]
# 以下でもOK
kbd.define_mode_key :LANGTOGL, [ %i[KC_MHEN KC_LANG2], Proc.new { kbd.send_key %i[KC_HENK KC_LANG1] }, 120, nil ]
# macのJISキーボードの英数/かなの様なキーの割り当てをしたいが1キーしかなく物理的に足りない
# Windowsの半角全角キーはトグルでありIMEの状態を覚えておく必要があるのでそれは嫌
# 妥協案として1キーにはまとめるが、押下する時間の長さで挙動が変わるためトグルではないことが実現できる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment