Last active
May 16, 2025 08:20
-
-
Save ahy4/03970f4a6a127e1dc593287aac1a983f to your computer and use it in GitHub Desktop.
キーマップ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include QMK_KEYBOARD_H | |
// キーマップの流し方 | |
// 1. qmk flash -kb ok60 -km custom | |
// 2. コンパイル成功したら fn + tab + ` を押す | |
// - 事故って↑ができない場合、ネジをとって背面のリセットボタンを押す | |
// キーコード | |
// * https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md | |
// * quantum/keycodes.h | |
// * quantum/quantum_keycodes_legacy.h | |
// 各種定義 | |
// * ~/qmk_firmware/quantum | |
// 新しいPCでのセットアップ | |
// * qmk いれる | |
// * qmk setup | |
// - => ~/qmk_firmware ができる | |
// * ~/qmk_firmware/keyboards/ok60/keymaps/custom/keymap.c にこのファイルを置く | |
enum layer { | |
L_L, // linux qwerty | |
L_W, // windows qwerty | |
L_M, // mac qwerty | |
L_F, // function keys | |
L_H, // hardware | |
L_N, // number keys | |
L_MK, // mouse keys | |
L_V, // void layer for maintenance keyboard physically | |
}; | |
enum custom_keycodes { | |
// Voidレイヤー用のMO(L_F) | |
VOID_F = SAFE_RANGE, | |
// Voidレイヤー用のDF(L_L) | |
VOID_L, // SAFE_RANGE以降の値は安全 | |
// Voidレイヤー用のDF(L_M) | |
VOID_M, | |
// Voidレイヤー用のDF(L_W) | |
VOID_W, | |
// Chrome でのタブ複製 | |
CR_DUP, | |
// Chrome で ChatGPT を開く | |
CR_GPT, | |
}; | |
// chrome のブラウザ操作 | |
#define CR_BACK LALT(KC_LEFT) // ブラウザバック | |
#define CR_FWRD LALT(KC_RGHT) // ブラウザフォワード | |
#define CR_LTAB LCTL(LSFT(KC_TAB)) // タブ切り替え(左) | |
#define CR_RTAB LCTL(KC_TAB) // タブ切り替え(右) | |
#define CR_USER LCTL(LSFT(KC_M)) // ユーザー切り替えを開く | |
// Windows のアプリ終了 | |
#define ALT_F4 LALT(KC_F4) // アプリ終了 | |
// スペースキーの左右キー | |
// win | |
#define WIN_L LGUI_T(KC_LALT) | |
#define WIN_R KC_RALT | |
// linux | |
#define LINUX_L LGUI_T(KC_INT5) | |
#define LINUX_R RALT_T(KC_INT4) | |
// mac | |
#define MAC_L LGUI_T(KC_LNG2) | |
#define MAC_R RALT_T(KC_LNG1) | |
// f を短押ししたときはf、長押ししたときはマウスキーレイヤーに切り替え | |
#define MK_F LT(L_MK, KC_F) | |
// _______ を KC_NO に変更 (デフォルトでは KC_TRANSPARENT) | |
#define _______ KC_NO | |
// LT: Layer Tap, 一つのキーに通常のキーコード入力と、レイヤー切り替え機能の両方を割り当てる | |
// MT: Mod Tap, 一つのキーに通常のキーコード入力と、修飾キー機能の両方を割り当てる | |
// ※基本的に LGUI_T などで十分 | |
// MO: Momentary Layer, 一時的なレイヤー切り替え | |
// DF: Default Layer, デフォルトレイヤーの切り替え | |
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |
// Linux QWERTY | |
[L_L] = LAYOUT_60_ansi( | |
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, | |
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, | |
KC_LCTL, KC_A, KC_S, KC_D, MK_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | |
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(L_N), | |
MO(L_F), KC_LALT, LINUX_L, KC_SPC, LINUX_R, KC_RALT, KC_RCTL, _______ | |
), | |
// Windows QWERTY | |
[L_W] = LAYOUT_60_ansi( | |
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, | |
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, | |
KC_LCTL, KC_A, KC_S, KC_D, MK_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | |
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(L_N), | |
MO(L_F), KC_LALT, WIN_L, KC_SPC, WIN_R, KC_RALT, KC_RCTL, _______ | |
), | |
// Mac QWERTY | |
[L_M] = LAYOUT_60_ansi( | |
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, | |
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, | |
KC_LCTL, KC_A, KC_S, KC_D, MK_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, | |
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MO(L_N), | |
MO(L_F), KC_LALT, MAC_L, KC_SPC, MAC_R, KC_RALT, KC_RCTL, _______ | |
), | |
// Fn | |
// Ctrl 系のキーの都合で mac ではちょっと使いにくい | |
[L_F] = LAYOUT_60_ansi( | |
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, | |
MO(L_H), ALT_F4, _______, _______, _______, CR_DUP, _______, CR_USER, _______, _______, _______, _______, _______, DF(L_V), | |
KC_TRNS, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, | |
KC_TRNS, _______, _______, CR_GPT, _______, _______, CR_BACK, CR_FWRD, CR_LTAB, CR_RTAB, _______, DF(L_L), | |
_______, KC_TRNS, KC_TRNS, KC_ESC, _______, _______, DF(L_M), DF(L_W) | |
), | |
// Number keys | |
[L_N] = LAYOUT_60_ansi( | |
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LCBR, KC_RCBR, KC_MINS, KC_EQL, KC_BSPC, | |
KC_TAB, KC_7, KC_8, KC_9, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSLS, | |
KC_0, KC_4, KC_5, KC_6, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, KC_ENT, | |
KC_TRNS, KC_1, KC_2, KC_3, _______, _______, _______, _______, KC_COMM, KC_DOT, KC_SLSH, _______, | |
_______, _______, _______, KC_SPC, _______, _______, _______, _______ | |
), | |
// Mouse keys | |
[L_MK] = LAYOUT_60_ansi( | |
// hjkl: 移動, space: 左クリック, tab,ctrl: 右クリック, nm: ブラウザBF, ud: ホイール | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |
MS_BTN2, _______, _______, _______, _______, _______, _______, MS_WHLU, _______, _______, _______, _______, _______, _______, | |
MS_BTN2, _______, _______, MS_WHLD, _______, _______, MS_LEFT, MS_DOWN, MS_UP, MS_RGHT, _______, _______, _______, | |
_______, _______, _______, _______, _______, _______, MS_BTN4, MS_BTN5, _______, _______, _______, _______, | |
_______, _______, _______, MS_BTN1, _______, _______, _______, _______ | |
), | |
// Hardware | |
[L_H] = LAYOUT_60_ansi( | |
// `: Put the keyboard into bootloader mode for flashing | |
// ファームウェアをflushするときはfn+tab+` | |
// q: Toggle RGB lighting on or off | |
// e: Cycle through modes, reverse direction when Shift is held | |
// r: Increase hue, decrease when Shift is held | |
// t: Decrease hue, increase when Shift is held | |
// y: Increase saturation, decrease when Shift is held | |
// u: Decrease saturation, increase when Shift is held | |
// i: Increase value (brightness), decrease value when Shift is held | |
// o: Decrease value (brightness), increase value when Shift is held | |
// c: Decrease the backlight level | |
// v: Turn the backlight on or off | |
// b: Increase the backlight level | |
// ,: Decrease the volume | |
// .: Increase the volume | |
// <> で音量調整と覚える | |
QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |
_______, UG_TOGG, _______, UG_NEXT, UG_HUEU, UG_HUED, UG_SATU, UG_SATD, UG_VALU, UG_VALD, _______, _______, _______, _______, | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |
_______, _______, _______, BL_DOWN, BL_TOGG, BL_UP, _______, _______, KC_VOLD, KC_VOLU, _______, _______, | |
_______, _______, _______, _______, _______, _______, _______, _______ | |
), | |
// Void | |
[L_V] = LAYOUT_60_ansi( | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, | |
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, VOID_L, | |
VOID_F, _______, _______, _______, _______, _______, VOID_M, VOID_W | |
), | |
}; | |
// 押されているキーの状態を保持 | |
static bool lctrl_pressed = false; | |
static bool void_fn_pressed = false; | |
void store_key_state(uint16_t keycode, keyrecord_t *record) { | |
switch (keycode) { | |
case KC_LCTL: | |
lctrl_pressed = record->event.pressed; | |
break; | |
case VOID_F: | |
void_fn_pressed = record->event.pressed; | |
break; | |
} | |
} | |
// lctrl + h を backspace にする | |
bool handle_ctrl_h(uint16_t keycode, keyrecord_t *record) { | |
// H が押されていない場合は無視 | |
if (keycode != KC_H) { return true; } | |
if (record->event.pressed && lctrl_pressed) { | |
unregister_code(KC_LCTL); // Ctrl+Backspace を押さないようにする | |
register_code(KC_BSPC); // 単体の Backspace を押す | |
return false; // 処理を中断 | |
} | |
// H が離れたときの処理 | |
// ↑で解除した Ctrl を再度押す | |
if (lctrl_pressed) { register_code(KC_LCTL); } | |
unregister_code(KC_BSPC); | |
return true; | |
} | |
// void レイヤーからの復帰 | |
bool handle_void_layer(uint16_t keycode, keyrecord_t *record) { | |
// 離し入力は無視 | |
if (!record->event.pressed) { return true; } | |
// fn を押してないときは無視 | |
if (!void_fn_pressed) { return true; } | |
switch (keycode) { | |
case VOID_L: | |
default_layer_set(1UL << L_L); | |
break; | |
case VOID_M: | |
default_layer_set(1UL << L_M); | |
break; | |
case VOID_W: | |
default_layer_set(1UL << L_W); | |
break; | |
} | |
return false; | |
} | |
// chrome のタブ複製 | |
bool handle_cr_dup(uint16_t keycode, keyrecord_t *record) { | |
/// CR_DUP 以外は無視 | |
if (keycode != CR_DUP) { return true; } | |
// 離し入力は無視 | |
if (!record->event.pressed) { return false; } | |
// Alt+d → Alt+Enter でタブ複製 (Alt+dはCtrl+lとほぼ同義) | |
register_code(KC_LALT); | |
tap_code_delay(KC_D, 50); | |
tap_code(KC_ENT); | |
unregister_code(KC_LALT); | |
return false; | |
} | |
// chrome で ChatGPT を開く | |
bool handle_cr_gpt(uint16_t keycode, keyrecord_t *record) { | |
/// CR_GPT 以外は無視 | |
if (keycode != CR_GPT) { return true; } | |
// 離し入力は無視 | |
if (!record->event.pressed) { return false; } | |
// Alt+d → chatgpt.com → Alt+Enter で ChatGPT を開く | |
register_code(KC_LALT); | |
tap_code_delay(KC_D, 50); | |
unregister_code(KC_LALT); | |
// IME を英語に (面倒なので現状は Linux 限定) | |
tap_code(KC_INT5); | |
send_string("chatgpt.com"); | |
register_code(KC_LALT); | |
tap_code_delay(KC_ENT, 50); | |
unregister_code(KC_LALT); | |
return false; | |
} | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
store_key_state(keycode, record); | |
return ( | |
handle_void_layer(keycode, record) && | |
handle_ctrl_h(keycode, record) && | |
handle_cr_dup(keycode, record) && | |
handle_cr_gpt(keycode, record) | |
); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment