blog.euxn.me

qmk-firmware でのキー配列

2017-12-16 Sat.

まえおき

この記事は自作キーボード Advent Calendar 2017の 16 日目です

昨日は@ntoofu が作っているキーボードで紹介に預かりました。ハード側には詳しくないので、キーマップとかの方をがんばっています

主に ErgoDox と HHKB(Alternative Controller) を使用しています

キー配列でのこだわり

以下は US 配列を前提にします。

QWERTY ベースであること

Dvorak とかオレオレ配列とかにすると、仮に慣れることができたとしても人間に戻れなくなるので、QWERTY から大きく外れないようにしています

外出先でノートを使う際には OS 側でリマップをしなければなりませんが、OS 側で再現させるのが大変、という理由もあります

IME ON/OFF はトグルキーではなくそれぞれキーを用意する

通常の Windows JIS 配列のように IME の状態を脳で記憶するのは非常に負担です

Mac OS JIS 配列のかな/英数キーのように、ワンショットでそれぞれの状態に変更するキーを作ると劇的に楽になります

Mac で Cmd のワンショットに割りあてる話をよく見ますが、自分はそれぞれ左右の Shift キーのワンショットを IME 変更に割り当てています

(そもそも左右の Shift すら Shift ではないのですが……)

こちらについては昨年、ErgoDox「この中でいらないキーには IME 担当になってもらいまーーーす www」という記事に詳細が書いてありますが、 HENK/MHEN キーを使って OS 側で制御する等しないといけなさそうです

メタキーレイヤーでの機能は最小限にし、ベースレイヤーをなるべく引き継ぐ

レイヤー切り替えができるとついついメタキーレイヤーを作りがちですが、何かあるたびにメタキーを押す、というのも疲れるものです

可能であれば、ベースレイヤーと、そこに収まらないキーを置くレイヤーの 2 つにし、メタキーレイヤーに持たせる役割は少ない方が、なんだかんだで楽でした

自分は Emacs のカーソルをメタキーレイヤーに入れているくらいになりました

Space キーに Shift を兼ねさせ、小指を解放する

これは私がもう人間に戻れなくなってしまった部分なのですが、 Space キーの長押しに Shift を割りあてるという、いわゆる SandS をやっています

Space の連打とか、Shift の空押しというキーバインドが使えなくなってしまいますが、まああまり弊害はありません

通常の Shift キーは小指で押すと思うのですが、左小指は Ctrl 、右小指は Enter に使うため、Shift と兼ねられなくなるという問題があります(ここで薬指を持ち出すとポジションが大きく崩れるのでつらい)

Ctrl と GUI を入れ替えるキーを作る

母艦はゲーム用の Windows と開発用の Linux 、ノートは Mac という状況なので、 OS コンパチでないといけません

ただし、 qmk-firmware における GUI が Mac における Cmd に割当たるため、Ctrl だと問題が出てきます

(非 Mac ユーザ向けに説明すると、 Mac ではコピペとかは  Ctrl + C などではなく Cmd + C です。しかしターミナルでは Ctrl + C でプロセス終了となります。邪悪だなァーーー)

Mac の OS 標準機能でキーの入れ替えができるものの、なかなかつらいというのが現実。なのでキーボード側で入れ替えられるキーを作ることで解決しようとしました

こちらの切り替えもトグルではなくワンショットで行うことで、小指の位置にあるキーを Ctrl に Cmd にいつでも切り替えられるので楽になります

特にこのような半永久的なレイヤー切り替えは、OS 側で行うにはつらいものです

モディファイヤキーを各所に配置する

長押しすることがない Esc や Tab 、Enter 等は、長押しでモディファイヤにとにかく割り当てていきます

モディファイヤが複数あればその時に近い指のキーで推せるので、非常に楽になります

ソース

github.com/euxn23/qmk-firmware にあります

Other Works
2024-12-01 Sun.
OpenAPI Spec を出力できる DSL、TypeSpec の実践例
- ドワンゴ教育サービス開発者ブログ

2024-11-16 Sat.
型付き API リクエストを実現するいくつかの手法とその選択
- TSKaigi Kansai 2024

2024-09-10 Tue.
corepack が標準同梱じゃなくなる未来、 mise でパッケージマネージャを管理する
- Zenn

2024-09-10 Tue.
言語環境の管理は *env や *vm を超えて、 mise へ
- Zenn

2024-06-28 Fri.
TypeSpec を使い倒してる
- Kyoto.js 22

2024-05-11 Sat.
Powerfully Typed TypeScript
- TSKaigi 2024

2024-05-10 Fri.
pnpm の node_modules を探検して理解しよう
- ドワンゴ教育サービス開発者ブログ

2024-03-17 Sun.
neverthrow で局所的に Result 型を使い、 try-catch より安全に記述する
- Zenn

2023-12-20 Wed.
レガシーブラウザ向けのビルドオプションを剪定する
- ドワンゴ教育サービス開発者ブログ

2023-05-26 Fri.
Next.js で dynamic import を使い Client だけで動かす Component を実現する
- Zenn

2023-05-02 Tue.
Node.js でファイル名から拡張子を取り除く/取り出すために path.parse を使う
- Zenn

2023-02-27 Mon.
WSL2 で外部からアクセス可能にするために bridge mode を有効にする
- Zenn

2023-01-26 Thu.
init.vim & dein から init.lua & lazy.nvim へ、シンプル設定で移行した
- Zenn

2023-01-13 Fri.
kindle の本をブクログ形式の csv でエクスポートする@2023初春
- Zenn

2023-01-10 Tue.
自宅サーバの移設に際して docker から nerdctl に移行した
- Zenn

2023-01-10 Tue.
自宅サーバを rootless に移行した際のトラブル対応
- Zenn

2021-11-11 Thu.
並列実行した Promise で throw されても全てハンドルしたいときの方法(allSettled, finally, etc...)
- Zenn