Skip to content

Instantly share code, notes, and snippets.

@mits111
Created July 21, 2026 01:31
Show Gist options
  • Select an option

  • Save mits111/eb8cd7379d6c0faef0079456ea8d7f26 to your computer and use it in GitHub Desktop.

Select an option

Save mits111/eb8cd7379d6c0faef0079456ea8d7f26 to your computer and use it in GitHub Desktop.
ファイル冒頭よりキーマップ定義領域_(01)、process_record_user()_(02)、process_OASYS()_(03)
// Based on QMK Firmware (GPL-2.0-or-later)
// https://github.com/qmk/qmk_firmware
#include QMK_KEYBOARD_H
#include "keymap.h"
//モッドタップ
#define ES_CTL LCTL_T(KC_ESC)
#define GU_F6 LGUI_T(KC_F6)
#define GU_BS LGUI_T(KC_BACKSPACE) // tap = BS , hold = gui , tap and hold = BS
//タップダンス用のキー定義
#define TD_RN TD(TAP_DANCE_KEY_RN) // NUMキー
#define TD_LF TD(TAP_DANCE_KEY_LF) // FUNKキー
#define TD_TO TD(TAP_DANCE_KEY_TO) // TABキー & option
enum custom_keycodes {
RTHUMB = SAFE_RANGE,
LTHUMB,
R2THUMB,
L2THUMB,
KANA,
NUM,
FUNC,
ROMAN,
OACO,
NICOLA,
MAC,
WIN,
SHARE,
EXN
};
enum layer_number {
_ROMAN = 0,
_OACO,
_OASYS,
_NUM,
_FUNC,
_ADJUST,
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ROMAN] = LAYOUT_split_3x6_3_ex2(
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
TD_TO, KC_Q, KC_W, KC_E, KC_R, KC_T, NUM, TD_RN, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINUS,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
ES_CTL, KC_A, KC_S, KC_D, KC_F, KC_G, TD_LF, FUNC, KC_H, KC_J, KC_K, KC_L, 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_RSFT,
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
GU_BS, LTHUMB, KC_SPACE, KC_ENT, RTHUMB, KC_RGUI
//`--------------------------' `--------------------------'
),
[_OACO] = LAYOUT_split_3x6_3_ex2(//TD_TO
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
TD_TO, KC_Q, KC_W, KC_E, KC_R, KC_T, NUM, TD_RN, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINUS,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
ES_CTL, KC_A, KC_S, KC_D, KC_F, KC_G, TD_LF, KC_ENT, KC_H, KC_J, KC_K, KC_L, 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_RSFT,
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
GU_BS, LTHUMB, L2THUMB, R2THUMB, RTHUMB, KC_SPACE
//`--------------------------' `--------------------------'
),
[_OASYS] = LAYOUT_split_3x6_3_ex2(
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
TD_TO, KC_Q, KC_W, KC_E, KC_R, KC_T, NUM, TD_RN, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
ES_CTL, KC_A, KC_S, KC_D, KC_F, KC_G, TD_LF, KC_ENT, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_BSPC,
//|--------+--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
L2THUMB, LTHUMB, GU_F6, KC_SPACE, RTHUMB, KANA
//`--------------------------' `--------------------------'
),
[_NUM] = LAYOUT_split_3x6_3_ex2( //KC_CIRC^,KC_AMPR&,KC_DLR$,KC_PERC%,KC_UNDS_,
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
_______, KC_1, KC_2, KC_3, KC_4, KC_5, _______, _______, KC_6, KC_7, KC_8, KC_9, KC_0, KC_PIPE,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
_______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______, XXXXXXX, KC_CIRC, KC_AMPR,KC_EQL, KC_MINUS, KC_PLUS, KC_ASTR,
//|--------+--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------+--------|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_GRAVE, KC_TILD, KC_UNDS, KC_LCBR, KC_RCBR, KC_BSLS, _______,
//|--------+--------+--------+-------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
_______, KC_LCBR, _______, _______, KC_RCBR, _______
//`--------------------------' `--------------------------'
),
[_FUNC] = LAYOUT_split_3x6_3_ex2(
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_UP, KC_F8, KC_F9, KC_F10,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
_______, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_PGUP, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------+--------|
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_DEL, KC_PGDN, XXXXXXX, XXXXXXX, XXXXXXX, _______,
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
_______, _______, _______, _______, _______, _______
//`--------------------------' `-------------------------'
),
[_ADJUST] = LAYOUT_split_3x6_3_ex2(
//,--------------------------------------------------------------. ,--------------------------------------------------------------.
QK_BOOT, XXXXXXX, WIN, EXN, ROMAN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, OACO, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
XXXXXXX, XXXXXXX, SHARE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------' `--------+--------+--------+--------+--------+--------+--------|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, NICOLA, MAC, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX,
//|--------+--------+--------+--------+--------+--------+--------. ,--------+--------+--------+--------+--------+--------+--------|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
//`--------------------------' `--------------------------'
)
};
bool process_record_user(uint16_t keycode, keyrecord_t* record) {
if (func_next_key && record->event.pressed) {
uint16_t func_keycode = keymap_key_to_keycode(_FUNC, record->event.key);
func_next_key = false;
if (func_keycode != KC_TRANSPARENT && func_keycode != KC_NO) {
tap_code16(func_keycode);
return false;
}
// _FUNC が透過(_______)のキーはそのまま通常処理へフォールスルー
}
switch (keycode) {
case KC_LSFT:
// TABタップ&ホールド(LGUI+LALT)中は左ShiftでFUNCレイヤーも有効にする
if (record->event.pressed) {
if (to_tap_state.state == TAP_AND_HOLD) {
tab_hold_func = true;
layer_on(_FUNC);
update_tri_layer(_NUM, _FUNC, _ADJUST);
return false; // Shift自体は送信しない
}
} else if (tab_hold_func) {
tab_hold_func = false;
layer_off(_FUNC);
update_tri_layer(_NUM, _FUNC, _ADJUST);
return false;
}
return true;
case NUM:
if (record->event.pressed) { //tap で IME/OFF
layer_on(_NUM);
update_tri_layer(_NUM, _FUNC, _ADJUST);
numkey_time = timer_read32();
}
else {
layer_off(_NUM);
update_tri_layer(_NUM, _FUNC, _ADJUST);
uint32_t release_time = timer_read32();
if ((!num_executed) && (release_time - numkey_time < TAPPING_TERM)){
if (base_layer == _OASYS) {
tap_code(KC_F2);
}
else {
set_ime_status(false);
if(mac_key) tap_code(KC_LNG2);
else tap_code(KC_INT5);//for Windows
}
}
if(num_executed) num_executed = false;
}
return false;
case LGUI_T(KC_BACKSPACE):
if (record->tap.count > 0) {
if (record->event.pressed) {
gu_bs_held = true;
gu_bs_time = timer_read32();
} else {
if (gu_bs_repeating) {
unregister_code(KC_BACKSPACE);
gu_bs_repeating = false;
} else {
process_bs();
}
gu_bs_held = false;
}
return false;
}
// ここで GUIキー
return true;
case ROMAN:
if (record->event.pressed) {
set_single_persistent_default_layer(_ROMAN);
base_layer = _ROMAN;
}
return false;
case OACO:
if (record->event.pressed) {
set_single_persistent_default_layer(_OACO);
base_layer = _OACO;
}
return false;
case NICOLA:
if (record->event.pressed) {
set_single_persistent_default_layer(_OASYS);
base_layer = _OASYS;
shared_N_key = false;
ex_N_key = false;
}
return false;
case SHARE:
if (record->event.pressed) {
set_single_persistent_default_layer(_OASYS);
base_layer = _OASYS;
shared_N_key = true;
ex_N_key = false;
}
return false;
case EXN:
if (record->event.pressed) {
set_single_persistent_default_layer(_OASYS);
base_layer = _OASYS;
shared_N_key = false;
ex_N_key = true;
}
return false;
case MAC:
if (record->event.pressed) {
user_config.mac_mode = true;
eeconfig_update_user(user_config.raw);
mac_key = user_config.mac_mode;
}
return false;
case WIN:
if (record->event.pressed) {
user_config.mac_mode = false;
eeconfig_update_user(user_config.raw);
mac_key = user_config.mac_mode;
}
return false;
}
if(IS_LAYER_ON(_NUM)){
uint8_t base_key = keycode & 0xFF; // シフト修飾付きキーコード(KC_EXLM等)は下位バイトで判定
if (base_key > KC_A && base_key < KC_SLASH){
if (record->event.pressed) num_executed = true;
}
return true;
}
if (!is_ime_on() || base_layer == _ROMAN) {
switch (keycode) {
case LTHUMB:
if(record->event.pressed ){
if(get_mods() & MOD_MASK_SHIFT){
paren_hold_mode = true;
register_code(KC_9);
return false;
}
else{
register_code(KC_LBRC);
return false;
}
}
else{
if((get_mods() & MOD_MASK_SHIFT) || (paren_hold_mode)){
paren_hold_mode = false;
unregister_code(KC_9);
return false;
}
else{
unregister_code(KC_LBRC);
return false;
}
}
case RTHUMB:
if(record->event.pressed ){
if(get_mods() & MOD_MASK_SHIFT){
paren_hold_mode = true;
register_code(KC_0);
}
else{
register_code(KC_RBRC);
}
return false;
}
else{
if((get_mods() & MOD_MASK_SHIFT) || (paren_hold_mode)){
paren_hold_mode = false;
unregister_code(KC_0);
}
else{
unregister_code(KC_RBRC);
}
return false;
}
case R2THUMB:
if (record->event.pressed) {
register_code(KC_SPACE);
}
else{
unregister_code(KC_SPACE);
}
return false;
case KANA:
if (record->event.pressed){
set_ime_status(true);
if(mac_key) tap_code(KC_LNG1);
else tap_code(KC_INT4);
}
return false;
default:
return true;
}//switch (keycode) {
}//if (!is_ime_on() || base_layer == _ROMAN) {
else if (base_layer == _OASYS || base_layer == _OACO){
//ここから親指シフト
switch (keycode) {
case KC_A ... KC_Z:
//1 ~ 0 はcorneでは使わない
if (record->event.pressed) {
if (get_mods()) return set_mod(keycode);
process_OASYS(Fig_Key_Down, keycode, set_timer(keycode));
} else {
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case KC_ENTER:
if (record->event.pressed) {
process_OASYS(Break_key, keycode, 0);
//key_field 設定の同期を取るため親指シフト処理に投げる
}
return true;
case KC_SPACE:
if (record->event.pressed) {
if (get_mods()) return set_mod(keycode);
process_OASYS(Thumb_Key_Down, keycode, set_timer(keycode));
}
else{
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case KC_MINUS:
case KC_SEMICOLON ... KC_SLASH:
//KC_LEFT_BRACKET'[' はCorne では使用しない
if (record->event.pressed) {
if (get_mods()) return set_mod(keycode);
process_OASYS(Fig_Key_Down, keycode, set_timer(keycode));
}
else {
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case RTHUMB:
if (record->event.pressed) {
if(get_mods() & MOD_MASK_SHIFT){
paren_hold_mode = true;
register_code(KC_0);
return false;
}
if (get_mods()) return set_mod(keycode);
process_OASYS(Thumb_Key_Down, keycode, set_timer(keycode));
}
else{
if((get_mods() & MOD_MASK_SHIFT) || (paren_hold_mode)){
paren_hold_mode = false;
unregister_code(KC_0);
return false;
}
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case LTHUMB:
if (record->event.pressed) {
if(get_mods() & MOD_MASK_SHIFT){
paren_hold_mode = true;
register_code(KC_9);
return false;
}
if (get_mods()) return set_mod(keycode);
process_OASYS(Thumb_Key_Down, keycode, set_timer(keycode));
}
else{
if((get_mods() & MOD_MASK_SHIFT) || (paren_hold_mode)){
paren_hold_mode = false;
unregister_code(KC_9);
return false;
}
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case L2THUMB:
case R2THUMB:
if (record->event.pressed) {
if(get_mods() & MOD_MASK_SHIFT){
convert_hold_mode = true;
register_code(KC_SPACE);
return false;
}
if (get_mods()) return set_mod(keycode);
process_OASYS(Thumb_Key_Down, keycode, set_timer(0));
}
else{
if((get_mods() & MOD_MASK_SHIFT) || (convert_hold_mode)){
convert_hold_mode = false;
unregister_code(KC_SPACE);
return false;
}
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case KANA:
if (record->event.pressed) {
if (get_mods()) return set_mod(keycode);
process_OASYS(Thumb_Key_Down, keycode, set_timer(keycode));
}
else{
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return false;
case GU_F6: //key_field同期をとるため親指シフト処理に投げる
if (record->event.pressed) {
if (get_mods()) return set_mod(keycode);
process_OASYS(Thumb_Key_Down, keycode, set_timer(keycode));
}
else{
if(get_mods() || (extension_mod) ) return reset_mod();
process_OASYS(Key_up, keycode, set_timer(0));
}
return true;
default:
return true;
}
}
return true;
}
void process_OASYS(SYS_EVENT event, uint16_t key, uint32_t event_time) {
/* 状態遷移表を忠実になぞる*/
switch (state) {
case on_init:
//set_init();
switch (event) {
case Fig_Key_Down:
set_fig(key, event_time);
state = on_fig;
break;
case Thumb_Key_Down:
set_thumb(key, event_time);
state = on_thumb;
break;
case Break_key:
//key field 設定
if(key == KC_ENTER) set_enter_field();
break;
default:
tm_key = 0;
break;
}
break;
case on_fig:
switch (event) {
case Fig_Key_Down:
send_key(fig, thumb);
set_fig(key, event_time);
break;
case Thumb_Key_Down:
if(key == LTHUMB){
set_pause_key((uint8_t)fig); // for oaco
}
set_thumb(key, event_time);
state = fig_to_thumb;
break;
case Key_up:
if (key == fig) {
send_key(fig, thumb);
set_init();
}
break;
case Time_over:
if( fig == tm_key){
send_key(fig, thumb);
set_init();
}
break;
case Break_key:
send_key(fig, thumb);
if(key == KC_ENTER) set_enter_field();
set_init();
break;
default:
break;
}
break;
case on_thumb:
switch (event) {
case Fig_Key_Down:
fig = key;
send_key(fig, thumb);
set_init();
break;
case Thumb_Key_Down:
send_key(0, thumb);
set_thumb(key, event_time);
state = on_thumb;
break;
case Key_up:
if (key == thumb) {
send_key(0, thumb);
set_init();
}
break; // 6/13
case Time_over:
if(thumb == tm_key){
send_key(0, thumb);
set_init();
}
break;
case Break_key:
send_key(fig, thumb);
if(key == KC_ENTER) set_enter_field();
set_init();
break;
default:
break;
}
return;
case fig_to_thumb: // 文字キー親指キーセット状態で
switch (event) {
case Fig_Key_Down: // 文字キーが押された
// 3キー分岐処理
if ((thumb_time - fig_time) >= (event_time - thumb_time)) {
send_key(fig, 0);
fig = key;
pause_key = 0; //for oaco
send_key(fig, thumb);
set_init();
} else {
send_key(fig, thumb);
clear(thumb);
set_fig(key, event_time);
state = on_fig;
}
break;
case Thumb_Key_Down:
send_key(fig, thumb);
clear(fig);
set_thumb(key, event_time);
state = on_thumb;
break;
case Key_up:
if (key == fig && shared_N_key) { // 変換キー共用型
if ((event_time - thumb_time < NICOLA_TIME) && ((thumb_time - fig_time) > (event_time - thumb_time))) {
send_key(fig, 0);
clear(fig);
set_thumb(key, event_time);
state = on_thumb;
break;
}
}
send_key(fig, thumb);
set_init();
break;
case Time_over:
if( thumb == tm_key){
send_key(fig, thumb);
set_init();
}
break;
case Break_key:
send_key(fig, thumb);
if(key == KC_ENTER) set_enter_field();
set_init();
break;
default:
break;
}
break;
default:
return;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment