SWAP HANDSのススメ

スワップハンドすごい

スワップハンドすごい
分割キーボードなのに片手で全キー入力できる
マイクラでマウス構えながら/spawnできるし
頬杖付きながら簡単な文字入力なら行える
みんなスワップハンド導入すべき

自分はお行儀よくキーボードの正面に座って両手で操作している割合は多くないです
ゲームしながら絵を描きながらお菓子を食べながら…そんなときは大抵片手操作です
分割じゃないキーボードを使っていたときは、よく片手でプログラミングしてました
(もちろん両手を使ったほうが速い)
分割では距離がね…うn…

そんなわけで片手で入力できないのは自分的にはありえないので早速Re42にスワップハンドを導入しました
普通のキーボードの片手タイピングに比べ、速度はかなり落ちますがホームポジションから動かないで済むようになったのは悪くなかったです

配置検討

入れ替え図画像

色々試した結果、上図のようになりました
スワップハンド中は最上段が
左:DEL Y U I O P 右: Q W E R T ESC
になります
スワップハンド中のタブとクォートについては別レイヤーにトグルSH_TGを配置して誤魔化します(この記事では割愛)

実装

公式に書いてある通り
rules.mkSWAP_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_QUOTS(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_TAPDOUBLE_HOLDについてはこちら
  • tap_code16jp(keycode)についてはこちら (keymap_jp.hを使っていないならtap_code16(keycode)でいいです)
  • スワップハンドの状態はグローバル変数swap_handsで参照と更新ができます(QMKのソース漁ってやっと解った)
    ロータリーエンコーダーも切り替えたい場合はこの値で判定するといいかもしれません
  • 副産物ですが、この指定でSH_TG中にさらにスワップハンドすると元の状態になるようにできましたやったー!

,

Related posts

このブログの今後について

⊏'ꣲ'|
キーボードについてあらかた書いてしまったので、
今後はキーボードとは関係ない記事が増えていくと思います
ホールドでレイヤー1、タップしてから再度ホールドでレイヤー2とか、
普段はホールドでレイヤ切り替えだけど、そのままタブ押したときだけAltになるとか
ちまちま変なことやっているけれど、汎用的ではないしGitHubにあるソースを見てください

モドタップの挙動を修正する

デフォルトのモドタップの問題
デフォルトのモドタップには以下の問題があります

レイヤーの切り替え(LT(kc))にIGNORE_MOD_TAP_INTERRUPTが効かない
素早く入力したときに想定通り入力できないというあれです
別レイヤーにMT(kc)を配置した場合、レイヤーを切り替えるとホールドも解除されてしまう
例えばデフォルトレイヤーのみにA~Z、LOWERレイヤーにGUI_T(kc)を配置してWin+Rをタップしようとして
LOWERホールド→GUI_T(kc)ホールド→LOWER解除→R
と入力した場合、Winは就職されずに単にRになってしまいます
タップダンスで細かく色々できそうだけどなんか書きにくそう(個人の感想)

先人
こちらの方も同じ問題にぶちあたって解決したようです
http://akakyouryuu.com/blog/qmk-firmware%E3%81%AEtap-hold%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B/
それはそれとして
上記記事を見つける前に自前で実装してしまったので、メモっておきます
ソースコード
config.h
#define TAPPING_TERM 200
keymap.c(もしくはヘッダファイルも作って別ファイルへ)
#include QMK_KEYBOARD_H
#include "fix_tap_hold.h"

tap_state_t tap_state;

static struct {
uint16_t keycode;
...

SHIFT+JP_XXXをUS配列に対応させる

JP_XXXとShfitキーとの組み合わせがおかしい
keymap.cでkeymap_jp.hをincludeしてKC_XXXの代わりにJP_XXXを使えば、
日本語キーボードと認識された状態でも目的の記号を入力するようにできるみたいです
ですが、例えばSHIFT+JP_2を押しても@じゃなくて"になってしまう
SHIFT+JP_QUOTにいたっては"じゃなくて'のままです
どうしたものか
(さらに…)

QMK firmwareでタップ数をカウントアップして表示する

OLEDで何かできないか
まずはファームの勉強を兼ねてOLEDで何かできないか考えたところ
タップ数をカウントアップして表示するのが難易度低そうで良さそうかな
と思い実行してみました(c経験ほぼ0)
グローバル変数にタップ数保持して、ぷりんとえふ?とかいうの使えばいいんでしょ!
それくらい解っちゃうんだから!
printfが使えない!
だめでした
printfを使うためにstdio.hをincludeしたらhexファイルのサイズが大きくなりすぎてエラーになってしまいました…
できました
ちょっと考えてprintfやitoa無しでできました
パズルみたいでたのしいですね
itoaの実装方法はググればいくらでも出てきますが、
表示するだけなら最初から文字列で持つ方が単純でよさそうでした
(WPMを自力で算出するとかなら話は別ですが…)
まず、keymap.cの適当なところに以下を追加します
char tap_count = "00000";
void countup_taps(void) {
for (int i = 4;...

Re42で遊ぶ

Re42 !
九嶋さん(@kushima8)にRe42(とRe40)のテスト版を提供いただいたので、ファームをあれこれいじって遊んでいます
ありがてぇありがてぇ
遊んでいるうちにQMK Firmwareについて色々知見が溜まってきたので、
時間ができたときにこのブログに書いていこうかなと思います
(さらに…)

Latest posts

このブログの今後について

⊏'ꣲ'|
キーボードについてあらかた書いてしまったので、
今後はキーボードとは関係ない記事が増えていくと思います
ホールドでレイヤー1、タップしてから再度ホールドでレイヤー2とか、
普段はホールドでレイヤ切り替えだけど、そのままタブ押したときだけAltになるとか
ちまちま変なことやっているけれど、汎用的ではないしGitHubにあるソースを見てください

モドタップの挙動を修正する

デフォルトのモドタップの問題
デフォルトのモドタップには以下の問題があります

レイヤーの切り替え(LT(kc))にIGNORE_MOD_TAP_INTERRUPTが効かない
素早く入力したときに想定通り入力できないというあれです
別レイヤーにMT(kc)を配置した場合、レイヤーを切り替えるとホールドも解除されてしまう
例えばデフォルトレイヤーのみにA~Z、LOWERレイヤーにGUI_T(kc)を配置してWin+Rをタップしようとして
LOWERホールド→GUI_T(kc)ホールド→LOWER解除→R
と入力した場合、Winは就職されずに単にRになってしまいます
タップダンスで細かく色々できそうだけどなんか書きにくそう(個人の感想)

先人
こちらの方も同じ問題にぶちあたって解決したようです
http://akakyouryuu.com/blog/qmk-firmware%E3%81%AEtap-hold%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B/
それはそれとして
上記記事を見つける前に自前で実装してしまったので、メモっておきます
ソースコード
config.h
#define TAPPING_TERM 200
keymap.c(もしくはヘッダファイルも作って別ファイルへ)
#include QMK_KEYBOARD_H
#include "fix_tap_hold.h"

tap_state_t tap_state;

static struct {
uint16_t keycode;
...

SHIFT+JP_XXXをUS配列に対応させる

JP_XXXとShfitキーとの組み合わせがおかしい
keymap.cでkeymap_jp.hをincludeしてKC_XXXの代わりにJP_XXXを使えば、
日本語キーボードと認識された状態でも目的の記号を入力するようにできるみたいです
ですが、例えばSHIFT+JP_2を押しても@じゃなくて"になってしまう
SHIFT+JP_QUOTにいたっては"じゃなくて'のままです
どうしたものか
(さらに…)

Leave a Comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です