はじめに
こんにちは、Ctrlです。
CTRL配列 を基軸としたキーマップを「CTRL配列 v.6.0」のメジャーアップデートとしてまとめました。2025年最終盤と言えるバージョンです。
使用しているPCB:物理キーボード
使用している物理キーボードは@takashicompanyさんのWorm Eatenです。
keymap.c
#include QMK_KEYBOARD_H
enum layer_number {
_BASE = 0,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,
};
enum custom_keycodes {
PRN = SAFE_RANGE,BRC,CBR,ABK,
};
#define SEND_PAIR(str) if (record->event.pressed) SEND_STRING(str);
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case PRN: SEND_PAIR("()"); break;
case BRC: SEND_PAIR("[]"); break;
case CBR: SEND_PAIR("<>"); break;
case ABK: SEND_PAIR("{}"); break;
}
return true;
}
enum {
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,LAH,RAE,UCH,DCE,USH,DSE,
};
#define TD_LTR(kc) ACTION_TAP_DANCE_DOUBLE(KC_##kc, S(KC_##kc))
#define TD_ROW(a, b, c, d, e) \
[a] = TD_LTR(A), [b] = TD_LTR(B), [c] = TD_LTR(C), [d] = TD_LTR(D), [e] = TD_LTR(E)
tap_dance_action_t tap_dance_actions[] = {
[A] = TD_LTR(A), [B] = TD_LTR(B), [C] = TD_LTR(C), [D] = TD_LTR(D), [E] = TD_LTR(E), [F] = TD_LTR(F),
[G] = TD_LTR(G), [H] = TD_LTR(H), [I] = TD_LTR(I), [J] = TD_LTR(J), [K] = TD_LTR(K), [L] = TD_LTR(L),
[M] = TD_LTR(M), [N] = TD_LTR(N), [O] = TD_LTR(O), [P] = TD_LTR(P), [Q] = TD_LTR(Q), [R] = TD_LTR(R),
[S] = TD_LTR(S), [T] = TD_LTR(T), [U] = TD_LTR(U), [V] = TD_LTR(V), [W] = TD_LTR(W), [X] = TD_LTR(X),
[Y] = TD_LTR(Y), [Z] = TD_LTR(Z),
[LAH] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME),
[RAE] = ACTION_TAP_DANCE_DOUBLE(KC_RGHT, KC_END),
[UCH] = ACTION_TAP_DANCE_DOUBLE(KC_UP, C(KC_HOME)),
[DCE] = ACTION_TAP_DANCE_DOUBLE(KC_DOWN, C(KC_END)),
[USH] = ACTION_TAP_DANCE_DOUBLE(S(KC_UP), RCS(KC_HOME)),
[DSE] = ACTION_TAP_DANCE_DOUBLE(S(KC_DOWN), RCS(KC_END)),
};
#define INS KC_INS
#define COMM KC_COMM
#define DOT KC_DOT
#define BSPC KC_BSPC
#define PGUP KC_PGUP
#define PGDN KC_PGDN
#define DEL KC_DEL
#define SPC KC_SPC
#define BTN1 KC_BTN1
#define BTN2 KC_BTN2
#define BTN3 KC_BTN3
#define ESC KC_ESC
#define TAB KC_TAB
#define ENT KC_ENT
#define RGHT KC_RGHT
#define LEFT KC_LEFT
#define HOME KC_HOME
#define END KC_END
#define PLUS KC_PLUS
#define MINS KC_MINS
#define UNDS KC_UNDS
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
LT(_7,TAB), TD(LAH), TD(RAE), TD(UCH), LT(_0,BTN3), /* */ LT(_0,BTN3), TD(UCH), LT(_3,COMM), LT(_6,DOT), LT(_7,TAB),
LT(_4,ENT), LT(_6,DOT), LT(_3,COMM), LT(_2,BTN1), LT(_1,BTN2), /* */ LT(_1,BTN2), LT(_2,BTN1), TD(LAH), TD(RAE), LT(_4,ENT),
LT(_8,ESC), XXXXXXX, XXXXXXX, TD(DCE), LT(_5,SPC), /* */ LT(_5,SPC), TD(DCE), XXXXXXX, XXXXXXX, LT(_8,ESC),
XXXXXXX, XXXXXXX, XXXXXXX, LT(_10,DEL), LT(_9,BSPC), /* */ LT(_9,BSPC), LT(_10,DEL), XXXXXXX, XXXXXXX, XXXXXXX),
[_0] = LAYOUT(
QK_BOOT, C(KC_F), C(KC_H), RCS(KC_C), _______, /* */ _______, RCS(KC_C), C(KC_H), C(KC_F), QK_BOOT,
S(ENT), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, /* */ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, S(ENT),
A(KC_F), XXXXXXX, XXXXXXX, C(KC_Y), C(KC_Z), /* */ C(KC_Z), C(KC_Y), XXXXXXX, XXXXXXX, A(KC_F),
XXXXXXX, XXXXXXX, XXXXXXX, S(DEL), RCS(KC_S), /* */ RCS(KC_S), S(DEL), XXXXXXX, XXXXXXX, XXXXXXX),
[_1] = LAYOUT(
XXXXXXX, XXXXXXX, XXXXXXX, A(TAB), XXXXXXX, /* */ XXXXXXX, A(TAB), XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, /* */ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, G(TAB), /* */ G(TAB), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, G(MINS), G(PLUS), /* */ G(MINS), G(PLUS), XXXXXXX, XXXXXXX, XXXXXXX),
[_2] = LAYOUT(
XXXXXXX, RCS(KC_T), C(KC_T), XXXXXXX, XXXXXXX, /* */ XXXXXXX, XXXXXXX, C(KC_T), RCS(KC_T), XXXXXXX,
C(KC_W), A(LEFT), A(RGHT), _______, XXXXXXX, /* */ XXXXXXX, _______, A(LEFT), A(RGHT), C(KC_W),
XXXXXXX, XXXXXXX, XXXXXXX, RCS(TAB), C(TAB), /* */ RCS(TAB), C(TAB), XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, RCS(PGUP), RCS(PGDN), /* */ RCS(PGUP), RCS(PGDN), XXXXXXX, XXXXXXX, XXXXXXX),
[_3] = LAYOUT(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, /* */ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC_UNDS, KC_TILD, _______, KC_MINS, KC_PLUS, /* */ KC_PLUS, KC_MINS, _______, KC_TILD, KC_UNDS,
XXXXXXX, XXXXXXX, XXXXXXX, KC_COLN, KC_SLSH, /* */ KC_SLSH, KC_COLN, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, KC_EXLM, KC_QUES, /* */ KC_QUES, KC_EXLM, XXXXXXX, XXXXXXX, XXXXXXX),
[_4] = LAYOUT(
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, /* */ KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX,
_______, KC_F5, KC_F6, KC_F7, KC_F8, /* */ KC_F5, KC_F6, KC_F7, KC_F8, _______,
XXXXXXX, XXXXXXX, XXXXXXX, KC_F9, KC_F10, /* */ KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, KC_F11, KC_F12, /* */ KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX),
[_5] = LAYOUT(
XXXXXXX, S(LEFT), S(RGHT), TD(USH), C(KC_A), /* */ C(KC_A), TD(USH), S(LEFT), S(RGHT), XXXXXXX,
C(KC_V), S(HOME), S(END), C(KC_C), C(KC_X), /* */ C(KC_X), C(KC_C), S(HOME), S(END), C(KC_V),
RCS(KC_V), XXXXXXX, XXXXXXX, TD(DSE), _______, /* */ _______, TD(DSE), XXXXXXX, XXXXXXX, RCS(KC_V),
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, A(KC_F4), /* */ A(KC_F4), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX),
[_6] = LAYOUT(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, /* */ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
ABK, _______, PRN, BRC, CBR, /* */ CBR, BRC, PRN, _______, ABK,
XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, KC_BSLS, /* */ KC_BSLS, KC_SCLN, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, KC_DQUO, KC_QUOT, /* */ KC_DQUO, KC_TILD, XXXXXXX, XXXXXXX, XXXXXXX),
[_7] = LAYOUT(
_______, KC_GRV, KC_CIRC, KC_HASH, KC_DLR, /* */ KC_DLR, KC_HASH, KC_CIRC, KC_GRV, _______,
XXXXXXX, XXXXXXX, XXXXXXX, KC_EQL, KC_ASTR, /* */ KC_ASTR, KC_EQL, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, KC_PIPE, KC_PERC, /* */ KC_PERC, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, KC_AMPR, KC_AT, /* */ KC_AT, KC_AMPR, XXXXXXX, XXXXXXX, XXXXXXX),
[_8] = LAYOUT(
XXXXXXX, KC_1, KC_2, KC_3, KC_4, /* */ KC_1, KC_2, KC_3, KC_4, XXXXXXX,
XXXXXXX, KC_5, KC_6, KC_7, KC_8, /* */ KC_5, KC_6, KC_7, KC_8, XXXXXXX,
_______, XXXXXXX, XXXXXXX, KC_9, KC_0, /* */ KC_9, KC_0, XXXXXXX, XXXXXXX, _______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, /* */ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX),
[_9] = LAYOUT(
TD(X), TD(S), TD(T), TD(R), TD(P), /* */ TD(P), TD(R), TD(T), TD(S), TD(X),
TD(K), TD(Z), TD(D), TD(N), TD(H), /* */ TD(H), TD(N), TD(D), TD(Z), TD(K),
TD(G), XXXXXXX, XXXXXXX, TD(M), TD(B), /* */ TD(B), TD(M), XXXXXXX, XXXXXXX, TD(G),
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, /* */ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX),
[_10] = LAYOUT(
TD(L), TD(O), TD(E), TD(Y), TD(W), /* */ TD(W), TD(Y), TD(E), TD(O), TD(L),
TD(A), TD(J), TD(C), TD(I), TD(F), /* */ TD(F), TD(I), TD(C), TD(J), TD(A),
TD(Q), XXXXXXX, XXXXXXX, TD(U), TD(V), /* */ TD(V), TD(U), XXXXXXX, XXXXXXX, TD(Q),
XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, /* */ XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX),
};
最後に
最近は左手片手のみで利用しており、右手で使うことが少なくなりましたが、また左肩が痛くなった時のために残してあります。
両手での入力も目指していましたが、やはり片手でどちらかの手はマウスに置きっぱなしにしたいので左右で使えるレイヤーのみに絞り込みました。
配置における大きな違いは左右のアローキーを薬指と中指に配置し、ホームポジションでカーソル気の移動がしやすくなったことです。
Upload Labs というゲームにハマったことが理由でもあり、結果としてマインクラフトなどのゲームも専用のレイヤーを使わなくても遊びやすくなりました。
ブラウザの操作やVS Code のキーボードショートカットは主に人差し指、記号の入力は小指、薬指、中指、文字の入力は親指が担当する形です。
今まではそれぞれのレイヤーに入力しや茶飲みを追求してバラバラに配置していましたが、Upload Labsをプレイする中で整理整頓に対する考え方なども変わり、違った視点から再構築できたのは非常にうれしかったです。
最後までお読みいただきありがとうございました!
面白いアイデアやアドバイスなどありましたら、是非ともお願いします!