Skip to content

Instantly share code, notes, and snippets.

@ahy4
Last active May 16, 2025 08:20
Show Gist options
  • Save ahy4/03970f4a6a127e1dc593287aac1a983f to your computer and use it in GitHub Desktop.
Save ahy4/03970f4a6a127e1dc593287aac1a983f to your computer and use it in GitHub Desktop.
キーマップ
#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