40%分割キーボードに手を出しました (ソフトウェア編)
Table of Contents
はじめに
本記事はハードウェア編の続きです。
今回は、実際に40%の小型キーボードを使う上で数字キーや修飾キー (ControlキーやAltキーなど) をどのように入力しているか、 どのような設定にしているか、ソフトウェア寄りの部分を紹介します。
配列は調整し続けていてキリがないので、購入後数週間程度の設定を紹介します。
ハードウェア編で詳しく紹介しましたが、今回設定するキーボードは左右分割型の片側3列×6行+親指3キーの21キー、左右合わせて42キーです。
引き続き初心者が書いているのでそこはご了承お願いします。
基本機能
キーボードの設定をするにあたって、以下の機能を基本的な機能として使用しました。
レイヤー
ある条件下で配列が変化する機能です。
今回はあるキーが押し下げられている間他のキーを変化させる形で使います。
一般的なキーボードでよく使われている場面としては、ノートPCや60%キーボードなどのキー数が限られた環境で「Fn」キーを押している間だけ1、2、3、…キーがFn1、Fn2、Fn3、…と変化するなどがあります。
このFnキーに相当する機能を利用して42キーのキーボードで数字や記号、ファンクションキー、カーソルキーなどを入力できるようにしていきます。
レイヤー1枚だけでは足りなりので、何枚も使っていきます。
タップ・ホールド
キーボードのキーには、普通に押し下げて離しただけで作用するキー (アルファベットや数字、エンター、スペースなど) の他に、長押しして他のキーが押された時に作用するキー (Shift や Ctrl などの修飾キーなど)があります。 前述のレイヤー切り替えキーも後者に相当します。
これら二種類のキーを同じキーに割り当てることで、単体で押された時と長押しされた時で異なる挙動をさせることが可能です。
例えば、スペースキーが単押し (タップ) された時はスペースで、長押し (ホールド) された時は Shift キーとして動作させることが可能です。
今回はこのタップ・ホールドによるキー割り当てを多用します。
設定方針
基本的にはUS配列、QWERTY配列をベースとします。
基本的な設定はremap等のグラフィカルで手軽なソフトウェアでも可能ですが、今回はレイヤー数増し増し&タップホールドの微調整がしたかったということで、QMKを使ってコードを書いて設定しました。
日本語入力については、変換キーで日本語入力ON、無変換キーで日本語入力OFFに切り替えるMac風の方式を採ります。 なので全角半角キーは設置せず、変換・無変換キーを配置します。
また、Vimというテキストエディタ使っている関係上 : と Esc を多用するので、これらは押しやすいところに配置します。
(余談ですが、この記事もVimで書いています。)
Home Row Mods
ホームポジションのキーにタップ・ホールドで Shift や Ctrl などの修飾キーを割り当てます。
詳しくはこちら (本当にめっちゃ詳しい) (英語)
今回のキーボードは片側3行x6列あってアルファベットの外側にも左右一列ずつ空きがあるのですが、そこにしか修飾キーがないと毎回小指を伸ばして押すことになってしまうので、できるだけホームポジションで完結させるためにHome Row Modsを採用することにしました。
また、両手に修飾キーを割り当てることができる点もメリットです。
具体的には、左手側はASDFに Win、Alt、Ctrl、Shift を、右手側は;LKJに Win、Alt、Ctrl、Shift を割り当てました。
外側から内側に向かって左右対照に Win、Alt、Ctrl、Shift です。
タップとホールド判定のタイミングを上手く設定しないと誤爆が発生しやすいので、あとで微調整の方法についても記述します。
キーボード + マウスでゲームをする時は WASD 等のキーが長押しできないと困るので、ゲーム用に左手ホームポジションの修飾キーをなくしたレイヤーも別途用意します。
Miryoku Layout
片側3行5列+親指3キーの36キーキーボード向けの配列です。 今回はそのまま使うのではなく、微調整して3行6列のキーボードに設定していきます。
特徴としては、
- Home Row Mods
- 親指キーはタップホールドでレイヤー切り替え
- レイヤーは片手用に設計され、反対の手の親指キーを押し下げて有効になる
- レイヤーを切り替える親指キーと同じ側に修飾キーが配置される
などがありますが、レイヤー構造は見た方が早いので画像を引用します。
これはオリジナルのMiryoku配列のNum (数字) レイヤーの配列です。
右手親指の中央のボタンが灰色になって押し下げされていることを表しています。
右手は Shift, Ctrl, Alt, Super (Win) の修飾キーだけが設定されていて、左手側に数字や記号が全て収められています。
8つくらいレイヤーが定義されていますが、私はMediaキーのレイヤーとショートカット類のレイヤーは使いそうにないので今回は設定しません。 代わりに左右両方に数字レイヤーを設定し、前述のゲーム用レイヤーも追加します。
設定
実際に設定していきます。 9割方私の作業ログです。
QMKのセットアップ
以降の作業ではQMKというソフトウェアを使ってキーボードのファームウェアを書き換えていきます。
まずQMKを使えるようにします。 私はArch Linuxを使っているので、
sudo pacman -S qmk
でインストールは終わりました。
その後、
qmk setup
qmk config user.keyboard=crkbd/rev1 user.keymap=miyaco
qmk new-keymap
で自分用キーマップの準備が行なわれます。
流用する際はkeyboardとkeymapの部分を適宜変更してください。
以降は ~/qmk_firmware/keyboards/crkbd/keymaps/miyaco/ 以下のファイルを編集していきます。
とりあえず動作確認でキーボードを接続してコンパイルとファームウェアの書き込みを試しておきます。
qmk compile
qmk flash
qmk flash の後にコントローラーをリセットするように言われるので、PCと接続している方のキーボードのリセットボタンを押して書き込みが終わるのを待ちます。
以下のような表示になればOKです。
Ψ Compiling keymap with make -r -R -f builddefs/build_keyboard.mk -s flash KEYBOARD=crkbd/rev1 KEYMAP=miyaco KEYBOARD_FILESAFE=crkbd_rev1 TARGET=crkbd_rev1_miyaco INTERMEDIATE_OUTPUT=.build/obj_crkbd_rev1_miyaco VERBOSE=false COLOR=true SILENT=false QMK_BIN="qmk"
avr-gcc (GCC) 13.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Size before:
text data bss dec hex filename
0 23032 0 23032 59f8 crkbd_rev1_miyaco.hex
Compiling: quantum/keymap_introspection.c [OK]
Linking: .build/crkbd_rev1_miyaco.elf [OK]
Creating load file for flashing: .build/crkbd_rev1_miyaco.hex [OK]
Copying crkbd_rev1_miyaco.hex to qmk_firmware folder [OK]
Checking file size of crkbd_rev1_miyaco.hex [OK]
* The firmware size is fine - 23032/28672 (80%, 5640 bytes free)
Flashing for bootloader: caterina
Waiting for USB serial port - reset your controller now (Ctrl+C to cancel).................. (※ ここでキーボードリセット)
Device /dev/ttyACM0 has appeared; assuming it is the controller.
Waiting for /dev/ttyACM0 to become writable.
avrdude: AVR device initialized and ready to accept instructions
avrdude: device signature = 0x1e9587 (probably m32u4)
avrdude: Note: flash memory has been specified, an erase cycle will be performed.
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: processing -U flash:w:.build/crkbd_rev1_miyaco.hex:i
avrdude: reading input file .build/crkbd_rev1_miyaco.hex for flash
with 23032 bytes in 1 section within [0, 0x59f7]
using 180 pages and 8 pad bytes
avrdude: writing 23032 bytes flash ...
Writing | ################################################## | 100% 1.69 s
avrdude: 23032 bytes of flash written
avrdude: verifying flash memory against .build/crkbd_rev1_miyaco.hex
Reading | ################################################## | 100% 0.19 s
avrdude: 23032 bytes of flash verified
avrdude done. Thank you.
各レイヤーの設定
各レイヤーの画像を作る気力がなかったので keymap.c のソースコードをそのまま載せます。
レイヤー数を8まで増やすため、config.h で
#define DYNAMIC_KEYMAP_LAYER_COUNT 8
を指定しておきます。
ベースレイヤー
ベースレイヤーはデフォルトで使用される最も基本となるレイヤーです。
QWERTY配列+Home Row Modsにしています。
#include QMK_KEYBOARD_H
#include "keymap_extras/keymap_japanese.h"
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_split_3x6_3( // Default
//,---------------------------------------------------------------------------------------. ,------------------------------------------------------------------------------------.
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
//|---------------+-------------+-------------+-------------+-------------+---------------| |---------------+--------------+-------------+-------------+----------------+--------|
KC_CAPS, LGUI_T(KC_A), LALT_T(KC_S), LCTL_T(KC_D), LSFT_T(KC_F), KC_G, KC_H, RSFT_T(KC_J), RCTL_T(KC_K), RALT_T(KC_L), RGUI_T(KC_SCLN), KC_QUOT,
//|---------------+-------------+-------------+-------------+-------------+---------------| |---------------+--------------+-------------+-------------+----------------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSPC,
//|---------------+-------------+-------------+-------------+-------------+---------------+--------------| |---------------+---------------+--------------+-------------+-------------+----------------+--------|
LT(5, KC_TAB), LT(3, JP_MHEN), LT(6, KC_SPC), LT(2, KC_ENT), LT(1, JP_HENK), LT(4, KC_ESC)
//`--------------------------------------------' `----------------------------------------------'
),
...
JP_MHEN (無変換) と JP_HENK (変換) を使うために冒頭で #include "keymap_extras/keymap_japanese.h" しています。
KC_○ はそれぞれのキーを表します。
KC_Q を押せば Q が入力されます。
LALT_T(KC_S) などはタップボールドの設定で、タップ (単押し) ではカッコ内のキー (この場合は S)、ホールド (長押し) では ALT が入力されます。
最下段は親指キーで、例えば LT(5, KC_TAB) はタップでカッコ内右のキー (この場合は TAB)、ホールドではレイヤー5が有効になります。
左手外側のキーは TAB、CapsLock、Shift としています。
CapsLock はOS上の別ソフト (keyd) で Esc / Ctrl のタップホールドにしています。
右手外側のキーは -、'、バックスペース、としています。
英語ユーザーは - をレイヤーに入れてしまうことが多いようですが、日本語を入力していると - は多用するのでベースレイヤーに配置しました。
' はUS配列でセミコロンの隣なのでそのまま置いています。
バックスペースキーは押しにくい位置ですが、普段は Ctrl + h でバックスペースにしていて滅多にバックスペースキーは使わないので問題ありません。
バックスペースキーを多用する場合は親指に割り当てるといいと思います。
数字レイヤー
数字レイヤーはレイヤー1と3です。
左右どちらに配置するのが使いやすいのかわからなかったので、前述のMiryokuレイアウトのNumレイヤーを左右同じようにテンキーのような形で配置しています。 一番外側のキーは適当です。
...
[1] = LAYOUT_split_3x6_3( // Num 1 (left hand)
//,-----------------------------------------------------. ,-----------------------------------------------------.
KC_GRV, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LCTL, KC_MINS, KC_4, KC_5, KC_6, KC_EQL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_GRV, KC_1, KC_2, KC_3, KC_BSLS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
KC_DOT, KC_0, KC_MINS, KC_ENT, _______, KC_RALT
//`--------------------------' `--------------------------'
),
...
[3] = LAYOUT_split_3x6_3( // Num 2 (right hand)
//,-----------------------------------------------------. ,-----------------------------------------------------.
KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_7, KC_8, KC_9, KC_RBRC, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LCTL, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_EQL, KC_4, KC_5, KC_6, KC_MINS, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSLS, KC_1, KC_2, KC_3, KC_GRV, KC_DEL,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, _______, KC_SPC, KC_MINS, KC_0, KC_DOT
//`--------------------------' `--------------------------'
),
...
数字レイヤーは今後どちらか片方だけにしたいとは思っているのですが、空いたレイヤーに入れたい機能も特にないのでどうなるかわかりません。
記号レイヤー
記号レイヤーはレイヤー2です。
...
[2] = LAYOUT_split_3x6_3( // Symbols (with shift)
//,-----------------------------------------------------. ,-----------------------------------------------------.
KC_TILD, KC_LCBR, KC_AMPR, KC_ASTR, KC_LPRN, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LCTL, KC_UNDS, KC_DLR, KC_PERC, KC_CIRC, KC_PLUS, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
KC_LPRN, KC_RPRN, KC_UNDS, _______, _______, KC_RALT
//`--------------------------' `--------------------------'
),
...
配列はレイヤー1でシフトキーを押し下げている状態とほぼ同じです。
実はほとんどの記号は数字レイヤーでシフトキー押し下げで入力できるのですが、キー三つ押しは大変かもしれないということで記号専用のレイヤーも作っています。
本家Miryokuのレイアウトでも記号のレイヤーは独立して設定されています。
ファンクションレイヤー
ファンクションキーなどが入っているレイヤーです。
レイヤー4に設定しています。
...
[4] = LAYOUT_split_3x6_3( // Function
//,-----------------------------------------------------. ,-----------------------------------------------------.
RGB_HUI, KC_F12, KC_F7, KC_F8, KC_F9, KC_PSCR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
RGB_VAI, KC_F11, KC_F4, KC_F5, KC_F6, KC_SCRL, XXXXXXX, KC_RSFT, KC_RCTL, KC_RALT, KC_RGUI, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
RGB_SAI, KC_F10, KC_F1, KC_F2, KC_F3, KC_PAUS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
TG(7), _______, KC_SPC, KC_ENT, _______, _______
//`--------------------------' `--------------------------'
),
...
Fn1からFn9までは数字レイヤーと同じ並びで、PrintScreenなどのキーもこのレイヤーに置いています。
特殊なキーとしては、LEDの色を調整するキーが左端の列に置いてあります。
カーソルレイヤー
カーソルキーとHome/End/PageUp/PageDwonを配置しているレイヤーです。
レイヤー5に設定しています。
...
[5] = LAYOUT_split_3x6_3( // Nav (vim-like keymap)
//,-----------------------------------------------------. ,-----------------------------------------------------.
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_INS, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
_______, _______, KC_SPC, KC_ENT, _______, TG(7)
//`--------------------------' `--------------------------'
),
...
オリジナルのMiryokuレイアウトでは JKL; の位置が ←↓↑→ に対応していますが、私はVimのキーバインドに慣れているので、一つ左にずらして HJKL を ←↓↑→ に割り当てています。
本家Miryokuでも設定でこの切り替えは提供されています。
マウスレイヤー
キーボードでマウス操作もできるようにしています。
レイヤー6に設定しています。
...
[6] = LAYOUT_split_3x6_3( // Mouse (vim-like keymap)
//,-----------------------------------------------------. ,-----------------------------------------------------.
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
XXXXXXX, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
_______, _______, _______, KC_BTN2, KC_BTN1, KC_BTN3
//`--------------------------' `--------------------------'
),
...
カーソルレイヤーと同様にVim風のレイアウトにしています。
マウスボタンは親指に割り当てられています。
ホイールの上下左右も設定されています。
ゲーム用レイヤー
オリジナルのMiryokuレイアウトにはないレイヤーです。
左手ホームポジション長押しによる修飾キーの入力を無効にしているレイヤーです。
...
[7] = LAYOUT_split_3x6_3( // Gaming
//,-----------------------------------------------------. ,----------------------------------------------------------------------------.
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_SCLN, KC_MINS,
//|--------+--------+--------+--------+--------+--------| |--------+-------------+-------------+-------------+----------------+--------|
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, RSFT_T(KC_J), RCTL_T(KC_K), RALT_T(KC_L), RGUI_T(KC_SCLN), KC_QUOT,
//|--------+--------+--------+--------+--------+--------| |--------+-------------+-------------+-------------+----------------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSPC,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+-------------+-------------+-------------+----------------+--------|
KC_ESC, XXXXXXX, KC_SPC, KC_ENT, XXXXXXX, TG(7)
//`--------------------------' `-------------------------------'
)
このレイヤーは親指キー長押しではなく、ファンクションレイヤーまたはカーソルレイヤーの TG(7) を押すことで切り替わるようにしています。
右手側親指の TG(7) が押されるまでこのレイヤーに留まります。
ライティングの設定
今回のキーボードはLEDが搭載されているので光らせていきます。
ただ、無駄に光らせても仕方ないので、通常使用の時とゲーム用レイヤーの時で色を変えて見分けやすくします。 派手なエフェクトは使わず、レイヤーに応じて全体の色だけを変更します。
まず、rules.mk ファイルに RGBLIGHT_ENABLE = yes を追加してRGBライティングを有効にします。
その後、keymap.c に以下のコードを追加します。
// RGB Layer
layer_state_t layer_state_set_user(layer_state_t state) {
uint8_t layer = biton32(state);
switch(layer) {
case 7:
rgblight_sethsv(HSV_PURPLE);
break;
default:
rgblight_sethsv(HSV_TURQUOISE);
break;
}
return state;
}
これでflashしてキーボードに書き込むと、通常時は青白い発光で、ゲーム用レイヤーでだけ紫のゲーミングな発光になります。
この変更はこちらの記事を参考にさせていただきました。
余談:ライティングの設定を調べるといろいろ複雑な設定があったのですが、全体の色を一括して変更するだけなら今回の数行の設定のような感じで大丈夫そうです。
タップホールドの微調整
今回アルファベットキーにも大量に長押し修飾キーを割り振っているので、デフォルト設定で使うと意図しない誤爆が発生すると思います。
タップかホールドかの判定には TAPPING_TERM という値 (ミリ秒) が使われます。
これは、この時間より長く押されていた場合にホールドとして判定するというもので、デフォルトでは一律200ミリ秒に設定されています。
私は薬指や小指のTAPPING_TERMを長めにすることで誤爆は減りました。
(しかし、Shift の誤爆はまだたびたび発生しています……)
設定方法
まず、config.h で #define TAPPING_TERM_PER_KEY を設定してキー別にTAPPING_TERMを設定できるようにします。
そして、keymap.c でキー別の TAPPING_TERM を返す関数を定義します。
#ifdef TAPPING_TERM_PER_KEY
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case LGUI_T(KC_A):
case RGUI_T(KC_SCLN):
return TAPPING_TERM + 20;
case LALT_T(KC_S):
case RALT_T(KC_L):
return TAPPING_TERM + 100;
case LCTL_T(KC_D):
case RCTL_T(KC_K):
return TAPPING_TERM;
case LSFT_T(KC_F):
case RSFT_T(KC_J):
return TAPPING_TERM - 30;
default:
return TAPPING_TERM;
}
}
#endif
config.h でデフォルトの TAPPING_TERM は200に設定されているはずなので、これで小指は220ms、薬指は300ms、…などと設定できているはずです。
Permissive Hold
他に PREMISSIVE_HOLD という設定もあるのですが、これは合わなかったので無効にしています。
参考リンクだけ載せておきます。
- https://docs.qmk.fm/#/tap_hold?id=permissive-hold
- https://precondition.github.io/home-row-mods#permissive-hold
まとめ
以上でソフトウェア編は終わりです。
全体のまとめをまとめ編として記事にしているので、よろしければそちらもご覧ください。