SWAP HANDSのススメ
Index
スワップハンドすごい
スワップハンドすごい
分割キーボードなのに片手で全キー入力できる
マイクラでマウス構えながら/spawnできるし
頬杖付きながら簡単な文字入力なら行える
みんなスワップハンド導入すべき
自分はお行儀よくキーボードの正面に座って両手で操作している割合は多くないです
ゲームしながら絵を描きながらお菓子を食べながら…そんなときは大抵片手操作です
分割じゃないキーボードを使っていたときは、よく片手でプログラミングしてました
(もちろん両手を使ったほうが速い)
分割では距離がね…うn…
そんなわけで片手で入力できないのは自分的にはありえないので早速Re42にスワップハンドを導入しました
普通のキーボードの片手タイピングに比べ、速度はかなり落ちますがホームポジションから動かないで済むようになったのは悪くなかったです
配置検討
画像
色々試した結果、上図のようになりました
スワップハンド中は最上段が
左:DEL
Y
U
I
O
P
右: Q
W
E
R
T
ESC
になります
スワップハンド中のタブとクォートについては別レイヤーにトグルSH_TG
を配置して誤魔化します(この記事では割愛)
実装
公式に書いてある通り
rules.mk
にSWAP_HANDS_ENABLE
を定義し、
keymap.c
にマッピングを定義します
マッピングの配列にセットする順序についてはキーボード名のヘッダファイルRe42.h
に定義されているLAYOUT
マクロを確認します
Re42は前半が左手、後半が右手となっているようなので、スワップハンドではコレを逆にします
- rules.mk
SWAP_HANDS_ENABLE = yes
- keymap.c
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = { // Left {{5, 4}, {0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}}, {{5, 5}, {0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}}, {{5, 6}, {0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}}, {{5, 7}, {4, 7}, {3, 7}, {2, 7}, {1, 7}, {0, 7}}, // Right {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {0, 0}}, {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}, {0, 1}}, {{1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {0, 2}}, {{5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}}, };
あとは、SH_T(key)
なりSH_TG
を配置すれば完了です
これらの切り替えに使うキーはスワップハンドしても位置が変わらないように左右対象に配置するのがおすすめです
SH_T(key)を修飾されたキーに対応させる
SH_T(key)
はそれ自体がModキーみたいなものなので、引数のkey
には修飾されたキーを指定できません
例えばJP_QUOT
はS(JP_7)
と等しいので、SH_T(JP_QUOT)
をタップしても'
ではなく単に7
がタップされてしまいます
これでは困るので、サクッと自作して解決します
- keymap.c
// 修飾キー対応のSH_Tの実装 bool sh_t16(uint16_t keycode) { swap_hands = !swap_hands; switch (tap_state) { case SINGLE_TAP: case DOUBLE_HOLD: tap_code16jp(keycode); //tap_code16(keycode); default: break; } return false; } // こんな感じで呼び出して使います bool process_record_user(uint16_t keycode, keyrecord_t *record) { process_fix_tap_hold(keycode, record); switch (keycode) { case SH_TAB: return sh_t16(KC_TAB); case SH_JPQT: return sh_t16(JP_QUOT); } return process_jp_symbols(keycode, record); }
SINGLE_TAP
やDOUBLE_HOLD
についてはこちらtap_code16jp(keycode)
についてはこちら (keymap_jp.h
を使っていないならtap_code16(keycode)
でいいです)- スワップハンドの状態はグローバル変数
swap_hands
で参照と更新ができます(QMKのソース漁ってやっと解った)
ロータリーエンコーダーも切り替えたい場合はこの値で判定するといいかもしれません - 副産物ですが、この指定で
SH_TG
中にさらにスワップハンドすると元の状態になるようにできましたやったー!
Leave a Comment