TTTキーボード研究室


Leia4 mini配列 QMK Firmwareソースコード(Keyboardio Atreusキーボード)

●説明

Keyboardio Atreusキーボード用のソースコードです。QMK Firmware 0.26を使用しています。ファイル名は「keymap.c」です。

Mac OS(iOS、iPad OS)、Windows(JIS配列)、Androidに対応しています。それぞれレイヤーを用意してあります。

表計算アプリ(Numbers)でキーマップとコンボのコードを自動生成しています。それほど読みにくくはないと思います。ただ、コンボ定義が無駄に長いことがよくわかるとは思います。

コンボはQMK Firemwareのマニュアル通りに書いています。
コンボに数字を割り振っているのはデバッグをやりやすくするためです。似たような文が並んでいるので、こうしないとどこが問題なのかがわかりにくいのです。

関数process_record_userが処理の本体ですが、ここも難しいことはしていません。順に
・デバッグモードのON/OFF(実際には使用する機会はないでしょう)
・英数モード、かなモードの切り替え(無駄なコードが残っています)
・略語
を処理しています。

関数keyboard_post_init_userは接続先のOSを調べる関数です。詳しくは検索してください。MacとWindowsはちゃんと見分けることができているようです。

ファイル「rules.mk」には次の2行を追加してください。
COMBO_ENABLE=yes #コンボ
OS_DETECTION_ENABLE = yes #OS判別



	// Keyboardio Atreus
	// Leia4 2024
	// 
	// 0.00 2024/11/25  LEIA4(QMK 0.26)
	// 0.10 2024/12/29  コンボv403、略語v401
	// 0.20 2025/01/19  
	// 0.30 2025/02/18  
	// 0.30b 2025/03/02  レイヤー整理、コンボの追加
	// 0.40 2025/03/11  
	
	//OS判別
	#include "os_detection.h"
	
	enum planck_layers {
	  _BASE_MAC,
	  _BASE_WIN,
	  _BASE_AOS,
	  _SYMBOL_1_US,
	  _SYMBOL_1_JP,
	  _NUMBERS_US,
	  _NUMBERS_JP,
	  _RESET,
	};
	
	//  JISキーコード
	#define	JC_COLN	KC_QUOT	// :コロン
	#define	JC_LPRN	KC_ASTR	// (
	#define	JC_RPRN	KC_LPRN	// )
	#define	JC_AMPR	KC_CIRC	// &
	#define	JC_EQL	KC_UNDS	// =
	#define	JC_LBRC	KC_RBRC	// [
	#define	JC_RBRC	KC_NUHS	// ]
	#define	JC_AT	KC_LBRC	//@
	#define	JC_UNDS	LSFT(KC_INT1)	// _アンダーバー
	
	#include QMK_KEYBOARD_H
	
	const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
	
	  [_BASE_MAC] = LAYOUT(												
		LALT(LGUI(LSFT(KC_V))),	KC_Y,	KC_O,	KC_U,	LT(_RESET,KC_ESCAPE),			KC_UP,	KC_N,	KC_K,	KC_M,	LCMD(KC_W),
		KC_F1,	KC_E,	KC_I,	KC_A,	KC_SLSH,			KC_DOWN,	KC_T,	KC_S,	KC_R,	KC_PLUS,
		LCMD(KC_Z),	KC_COMM,	KC_DOT,	KC_W,	KC_LBRC,	KC_LPRN,	KC_LEFT,	KC_RGHT,	KC_H,	KC_X,	KC_MINS,	KC_EQL,
		LCMD(KC_X),	LCMD(KC_C),	LCMD(KC_V),	KC_LSFT,	LT(_NUMBERS_US,KC_TAB),	LT(_SYMBOL_1_US,KC_BSPC),	LT(_NUMBERS_US,KC_ENTER),	LT(_SYMBOL_1_US,KC_SPC),	KC_LCMD,	LOPT_T(KC_LNG2),	LCTL_T(KC_LNG1),	KC_UNDS
	  ),												
	  [_BASE_WIN] = LAYOUT(												
		KC_DEL,	KC_Y,	KC_O,	KC_U,	LT(_RESET,KC_ESCAPE),			KC_UP,	KC_N,	KC_K,	KC_M,	LCTL(KC_W),
		KC_F1,	KC_E,	KC_I,	KC_A,	KC_SLSH,			KC_DOWN,	KC_T,	KC_S,	KC_R,	KC_PLUS,
		LCTL(KC_Z),	KC_COMM,	KC_DOT,	KC_W,	JC_LBRC,	JC_LPRN,	KC_LEFT,	KC_RGHT,	KC_H,	KC_X,	KC_MINS,	JC_EQL,
		LCTL(KC_X),	LCTL(KC_C),	LCTL(KC_V),	KC_LSFT,	LT(_NUMBERS_JP,KC_TAB),	LT(_SYMBOL_1_JP,KC_BSPC),	LT(_NUMBERS_JP,KC_ENTER),	LT(_SYMBOL_1_JP,KC_SPC),	KC_LCTL,	LALT_T(KC_LNG2),	LWIN_T(KC_LNG1),	JC_UNDS
	  ),												
	  [_BASE_AOS] = LAYOUT(												
		KC_DEL,	KC_Y,	KC_O,	KC_U,	LT(_RESET,KC_ESCAPE),			KC_UP,	KC_N,	KC_K,	KC_M,	LCTL(KC_W),
		KC_F1,	KC_E,	KC_I,	KC_A,	KC_SLSH,			KC_DOWN,	KC_T,	KC_S,	KC_R,	KC_PLUS,
		LCTL(KC_Z),	KC_COMM,	KC_DOT,	KC_W,	JC_LBRC,	JC_LPRN,	KC_LEFT,	KC_RGHT,	KC_H,	KC_X,	KC_MINS,	JC_EQL,
		LCTL(KC_X),	LCTL(KC_C),	LCTL(KC_V),	KC_LSFT,	LT(_NUMBERS_US,KC_TAB),	LT(_SYMBOL_1_JP,KC_BSPC),	LT(_NUMBERS_US,KC_ENTER),	LT(_SYMBOL_1_JP,KC_SPC),	KC_LCTL,	LALT_T(KC_LNG2),	LWIN_T(KC_LNG1),	JC_UNDS
	  ),												
	
	[_SYMBOL_1_US] = LAYOUT(												
		_______,	KC_Q,	KC_AMPR,	KC_C,	_______,			KC_PGUP,	_______,	KC_G,	KC_F,	_______,
		KC_COLN,	KC_L,	KC_EXLM,	KC_V,	_______,			KC_PGDN,	KC_D,	KC_Z,	KC_P,	KC_BSLS,
		KC_SCLN,	KC_J,	KC_QUES,	KC_CIRC,	KC_RBRC,	KC_RPRN,	KC_HOME,	KC_END,	KC_B,	KC_AT,	_______,	KC_TILD,
		_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______
	),												
	[_SYMBOL_1_JP] = LAYOUT(												
		_______,	KC_Q,	JC_AMPR,	KC_C,	_______,			KC_PGUP,	_______,	KC_G,	KC_F,	_______,
		JC_COLN,	KC_L,	KC_EXLM,	KC_V,	_______,			KC_PGDN,	KC_D,	KC_Z,	KC_P,	KC_BSLS,
		KC_SCLN,	KC_J,	KC_QUES,	KC_CIRC,	JC_RBRC,	KC_RPRN,	KC_HOME,	KC_END,	KC_B,	JC_AT,	_______,	KC_TILD,
		_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______
	),												
	
	[_NUMBERS_US] = LAYOUT(												
		KC_F1,	KC_F2,	KC_F3,	KC_F4,	KC_F8,			KC_PSLS,	KC_P7,	KC_P8,	KC_P9,	_______,
		KC_DQUO,	KC_DLR,	KC_PERC,	KC_PAST,	KC_PSLS,			KC_PDOT,	KC_P4,	KC_P5,	KC_P6,	_______,
		KC_QUOT,	LCMD(KC_KP_PLUS),	LCMD(KC_KP_MINUS),	KC_PPLS,	KC_PMNS,	_______,	_______,	KC_P0,	KC_P1,	KC_P2,	KC_P3,	KC_GRV,
		_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______
	),												
	[_NUMBERS_JP] = LAYOUT(												
		KC_F1,	KC_F2,	KC_F3,	KC_F10,	KC_F12,			KC_PSLS,	KC_P7,	KC_P8,	KC_P9,	_______,
		KC_DQUO,	KC_DLR,	KC_PERC,	KC_PAST,	KC_PSLS,			KC_PDOT,	KC_P4,	KC_P5,	KC_P6,	_______,
		KC_QUOT,	LCTL(KC_KP_PLUS),	LCTL(KC_KP_MINUS),	KC_PPLS,	KC_PMNS,	_______,	_______,	KC_P0,	KC_P1,	KC_P2,	KC_P3,	KC_GRV,
		_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______
	),												
	
	[_RESET] = LAYOUT(												
		QK_BOOT,	_______,	_______,	_______,	_______,			TO(_BASE_MAC),	TO(_BASE_WIN),	TO(_BASE_AOS),	_______,	QK_BOOT,
		_______,	_______,	_______,	_______,	_______,			_______,	_______,	_______,	_______,	_______,
		_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,
		_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______,	_______
	),												
	
	};
	
	// コンボ
	//  定数の定義
	
	enum combo_events {
	  C_g_001,
	  C_z_002,
	  C_d_003,
	  C_b_004,
	  C_p_005,
	  C_p_006,
	  C_p_007,
	  C_f_008,
	  C_f_009,
	  C_p_010,
	  C_q_011,
	  C_q_012,
	  C_l_013,
	  C_j_014,
	  C_c_015,
	  C_c_016,
	  C_v_017,
	  C_ai_018,
	  C_ei_019,
	  C_ou_020,
	  C_you_021,
	  C_yuu_022,
	  C_oi_023,
	  C_ui_024,
	  C_uu_025,
	  C_ann_026,
	  C_ann_027,
	  C_ann_028,
	  C_inn_029,
	  C_inn_030,
	  C_inn_031,
	  C_unn_032,
	  C_unn_033,
	  C_unn_034,
	  C_enn_035,
	  C_enn_036,
	  C_enn_037,
	  C_onn_038,
	  C_onn_039,
	  C_onn_040,
	  C_ya_041,
	  C_yu_042,
	  C_yo_043,
	  C_ye_044,
	  C_ye_045,
	  C_ye_046,
	  C_nn_047,
	  C_xtu_048,
	  C_no_049,
	  C_no_050,
	  C_no_051,
	  C_no_052,
	  C_ga_053,
	  C_ga_054,
	  C_ga_055,
	  C_mo_056,
	  C_mo_057,
	  C_mo_058,
	  C_to_059,
	  C_to_060,
	  C_to_061,
	  C_to_062,
	  C_de_063,
	  C_de_064,
	  C_de_065,
	  C_ne_066,
	  C_tu_067,
	  C_xtuta_068,
	  C_xtute_069,
	  C_ha_070,
	  C_ni_071,
	  C_ni_072,
	  C_he_073,
	  C_wo_074,
	  C_F2_075,
	  C_F3_076,
	  C_F4_077,
	  C_home_078,
	  C_end_079,
	  C_pgup_080,
	  C_pgdown_081,
	COMBO_LENGTH
	};
	
	uint16_t COMBO_LEN = COMBO_LENGTH; // remove the COMBO_COUNT define and use this instead!
	
	//  入力キーの組み合わせの定義
	const uint16_t PROGMEM g_001_combo[]={KC_K,KC_M, COMBO_END};
	const uint16_t PROGMEM z_002_combo[]={KC_S,KC_R, COMBO_END};
	const uint16_t PROGMEM d_003_combo[]={KC_T,KC_S, COMBO_END};
	const uint16_t PROGMEM b_004_combo[]={KC_H,KC_X, COMBO_END};
	const uint16_t PROGMEM p_005_combo[]={KC_R,KC_X, COMBO_END};
	const uint16_t PROGMEM p_006_combo[]={KC_R,KC_MINS, COMBO_END};
	const uint16_t PROGMEM p_007_combo[]={KC_R,KC_H, COMBO_END};
	const uint16_t PROGMEM f_008_combo[]={KC_R,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM f_009_combo[]={KC_M,LCMD(KC_W), COMBO_END};
	const uint16_t PROGMEM p_010_combo[]={KC_R,KC_PLUS, COMBO_END};
	const uint16_t PROGMEM q_011_combo[]={KC_Y,LALT(LGUI(LSFT(KC_V))), COMBO_END};
	const uint16_t PROGMEM q_012_combo[]={KC_Y,KC_DEL, COMBO_END};
	const uint16_t PROGMEM l_013_combo[]={KC_E,KC_F1, COMBO_END};
	const uint16_t PROGMEM j_014_combo[]={KC_COMM,LCMD(KC_Z), COMBO_END};
	const uint16_t PROGMEM c_015_combo[]={KC_U,LALT(LGUI(LSFT(KC_V))), COMBO_END};
	const uint16_t PROGMEM c_016_combo[]={KC_U,KC_DEL, COMBO_END};
	const uint16_t PROGMEM v_017_combo[]={KC_A,KC_F1, COMBO_END};
	const uint16_t PROGMEM ai_018_combo[]={KC_A,KC_I, COMBO_END};
	const uint16_t PROGMEM ei_019_combo[]={KC_E,KC_I, COMBO_END};
	const uint16_t PROGMEM ou_020_combo[]={KC_O,KC_U, COMBO_END};
	const uint16_t PROGMEM you_021_combo[]={KC_Y,KC_O, COMBO_END};
	const uint16_t PROGMEM yuu_022_combo[]={KC_Y,KC_U, COMBO_END};
	const uint16_t PROGMEM oi_023_combo[]={KC_E,KC_A, COMBO_END};
	const uint16_t PROGMEM ui_024_combo[]={KC_I,KC_SLSH, COMBO_END};
	const uint16_t PROGMEM uu_025_combo[]={KC_U,LT(_RESET,KC_ESCAPE), COMBO_END};
	const uint16_t PROGMEM ann_026_combo[]={KC_A,KC_DOT, COMBO_END};
	const uint16_t PROGMEM ann_027_combo[]={KC_A,KC_W, COMBO_END};
	const uint16_t PROGMEM ann_028_combo[]={KC_A,KC_LBRC, COMBO_END};
	const uint16_t PROGMEM inn_029_combo[]={KC_I,KC_COMM, COMBO_END};
	const uint16_t PROGMEM inn_030_combo[]={KC_I,KC_DOT, COMBO_END};
	const uint16_t PROGMEM inn_031_combo[]={KC_I,KC_W, COMBO_END};
	const uint16_t PROGMEM unn_032_combo[]={KC_U,KC_I, COMBO_END};
	const uint16_t PROGMEM unn_033_combo[]={KC_U,KC_A, COMBO_END};
	const uint16_t PROGMEM unn_034_combo[]={KC_U,KC_SLSH, COMBO_END};
	const uint16_t PROGMEM enn_035_combo[]={KC_E,KC_COMM, COMBO_END};
	const uint16_t PROGMEM enn_036_combo[]={KC_E,KC_DOT, COMBO_END};
	const uint16_t PROGMEM enn_037_combo[]={KC_E,KC_W, COMBO_END};
	const uint16_t PROGMEM onn_038_combo[]={KC_O,KC_E, COMBO_END};
	const uint16_t PROGMEM onn_039_combo[]={KC_O,KC_I, COMBO_END};
	const uint16_t PROGMEM onn_040_combo[]={KC_O,KC_A, COMBO_END};
	const uint16_t PROGMEM ya_041_combo[]={KC_W,KC_DOT, COMBO_END};
	const uint16_t PROGMEM yu_042_combo[]={KC_W,KC_COMM, COMBO_END};
	const uint16_t PROGMEM yo_043_combo[]={KC_COMM,KC_DOT, COMBO_END};
	const uint16_t PROGMEM ye_044_combo[]={KC_Y,KC_E, COMBO_END};
	const uint16_t PROGMEM ye_045_combo[]={KC_Y,KC_I, COMBO_END};
	const uint16_t PROGMEM ye_046_combo[]={KC_Y,KC_A, COMBO_END};
	const uint16_t PROGMEM nn_047_combo[]={KC_N,KC_K, COMBO_END};
	const uint16_t PROGMEM xtu_048_combo[]={KC_X,KC_MINS, COMBO_END};
	const uint16_t PROGMEM no_049_combo[]={KC_N,KC_DOWN, COMBO_END};
	const uint16_t PROGMEM no_050_combo[]={KC_N,KC_T, COMBO_END};
	const uint16_t PROGMEM no_051_combo[]={KC_N,KC_S, COMBO_END};
	const uint16_t PROGMEM no_052_combo[]={KC_N,KC_M, COMBO_END};
	const uint16_t PROGMEM ga_053_combo[]={KC_K,KC_T, COMBO_END};
	const uint16_t PROGMEM ga_054_combo[]={KC_K,KC_S, COMBO_END};
	const uint16_t PROGMEM ga_055_combo[]={KC_K,KC_R, COMBO_END};
	const uint16_t PROGMEM mo_056_combo[]={KC_M,KC_S, COMBO_END};
	const uint16_t PROGMEM mo_057_combo[]={KC_M,KC_R, COMBO_END};
	const uint16_t PROGMEM mo_058_combo[]={KC_M,KC_T, COMBO_END};
	const uint16_t PROGMEM to_059_combo[]={KC_T,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM to_060_combo[]={KC_T,KC_H, COMBO_END};
	const uint16_t PROGMEM to_061_combo[]={KC_T,KC_X, COMBO_END};
	const uint16_t PROGMEM to_062_combo[]={KC_T,KC_R, COMBO_END};
	const uint16_t PROGMEM de_063_combo[]={KC_S,KC_H, COMBO_END};
	const uint16_t PROGMEM de_064_combo[]={KC_S,KC_X, COMBO_END};
	const uint16_t PROGMEM de_065_combo[]={KC_S,KC_MINS, COMBO_END};
	const uint16_t PROGMEM ne_066_combo[]={KC_N,KC_UP, COMBO_END};
	const uint16_t PROGMEM tu_067_combo[]={KC_T,KC_DOWN, COMBO_END};
	const uint16_t PROGMEM xtuta_068_combo[]={KC_DOWN,KC_S, COMBO_END};
	const uint16_t PROGMEM xtute_069_combo[]={KC_DOWN,KC_K, COMBO_END};
	const uint16_t PROGMEM ha_070_combo[]={KC_H,KC_MINS, COMBO_END};
	const uint16_t PROGMEM ni_071_combo[]={KC_X,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM ni_072_combo[]={KC_S,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM he_073_combo[]={KC_H,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM wo_074_combo[]={KC_W,KC_LBRC, COMBO_END};
	const uint16_t PROGMEM F2_075_combo[]={KC_F1,KC_Y, COMBO_END};
	const uint16_t PROGMEM F3_076_combo[]={KC_F1,KC_O, COMBO_END};
	const uint16_t PROGMEM F4_077_combo[]={KC_F1,KC_U, COMBO_END};
	const uint16_t PROGMEM home_078_combo[]={KC_UP,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM end_079_combo[]={KC_DOWN,KC_RGHT, COMBO_END};
	const uint16_t PROGMEM pgup_080_combo[]={KC_UP,KC_LEFT, COMBO_END};
	const uint16_t PROGMEM pgdown_081_combo[]={KC_DOWN,KC_LEFT, COMBO_END};
	
	combo_t key_combos[] = {
	  [C_g_001] = COMBO_ACTION(g_001_combo),
	  [C_z_002] = COMBO_ACTION(z_002_combo),
	  [C_d_003] = COMBO_ACTION(d_003_combo),
	  [C_b_004] = COMBO_ACTION(b_004_combo),
	  [C_p_005] = COMBO_ACTION(p_005_combo),
	  [C_p_006] = COMBO_ACTION(p_006_combo),
	  [C_p_007] = COMBO_ACTION(p_007_combo),
	  [C_f_008] = COMBO_ACTION(f_008_combo),
	  [C_f_009] = COMBO_ACTION(f_009_combo),
	  [C_p_010] = COMBO_ACTION(p_010_combo),
	  [C_q_011] = COMBO_ACTION(q_011_combo),
	  [C_q_012] = COMBO_ACTION(q_012_combo),
	  [C_l_013] = COMBO_ACTION(l_013_combo),
	  [C_j_014] = COMBO_ACTION(j_014_combo),
	  [C_c_015] = COMBO_ACTION(c_015_combo),
	  [C_c_016] = COMBO_ACTION(c_016_combo),
	  [C_v_017] = COMBO_ACTION(v_017_combo),
	  [C_ai_018] = COMBO_ACTION(ai_018_combo),
	  [C_ei_019] = COMBO_ACTION(ei_019_combo),
	  [C_ou_020] = COMBO_ACTION(ou_020_combo),
	  [C_you_021] = COMBO_ACTION(you_021_combo),
	  [C_yuu_022] = COMBO_ACTION(yuu_022_combo),
	  [C_oi_023] = COMBO_ACTION(oi_023_combo),
	  [C_ui_024] = COMBO_ACTION(ui_024_combo),
	  [C_uu_025] = COMBO_ACTION(uu_025_combo),
	  [C_ann_026] = COMBO_ACTION(ann_026_combo),
	  [C_ann_027] = COMBO_ACTION(ann_027_combo),
	  [C_ann_028] = COMBO_ACTION(ann_028_combo),
	  [C_inn_029] = COMBO_ACTION(inn_029_combo),
	  [C_inn_030] = COMBO_ACTION(inn_030_combo),
	  [C_inn_031] = COMBO_ACTION(inn_031_combo),
	  [C_unn_032] = COMBO_ACTION(unn_032_combo),
	  [C_unn_033] = COMBO_ACTION(unn_033_combo),
	  [C_unn_034] = COMBO_ACTION(unn_034_combo),
	  [C_enn_035] = COMBO_ACTION(enn_035_combo),
	  [C_enn_036] = COMBO_ACTION(enn_036_combo),
	  [C_enn_037] = COMBO_ACTION(enn_037_combo),
	  [C_onn_038] = COMBO_ACTION(onn_038_combo),
	  [C_onn_039] = COMBO_ACTION(onn_039_combo),
	  [C_onn_040] = COMBO_ACTION(onn_040_combo),
	  [C_ya_041] = COMBO_ACTION(ya_041_combo),
	  [C_yu_042] = COMBO_ACTION(yu_042_combo),
	  [C_yo_043] = COMBO_ACTION(yo_043_combo),
	  [C_ye_044] = COMBO_ACTION(ye_044_combo),
	  [C_ye_045] = COMBO_ACTION(ye_045_combo),
	  [C_ye_046] = COMBO_ACTION(ye_046_combo),
	  [C_nn_047] = COMBO_ACTION(nn_047_combo),
	  [C_xtu_048] = COMBO_ACTION(xtu_048_combo),
	  [C_no_049] = COMBO_ACTION(no_049_combo),
	  [C_no_050] = COMBO_ACTION(no_050_combo),
	  [C_no_051] = COMBO_ACTION(no_051_combo),
	  [C_no_052] = COMBO_ACTION(no_052_combo),
	  [C_ga_053] = COMBO_ACTION(ga_053_combo),
	  [C_ga_054] = COMBO_ACTION(ga_054_combo),
	  [C_ga_055] = COMBO_ACTION(ga_055_combo),
	  [C_mo_056] = COMBO_ACTION(mo_056_combo),
	  [C_mo_057] = COMBO_ACTION(mo_057_combo),
	  [C_mo_058] = COMBO_ACTION(mo_058_combo),
	  [C_to_059] = COMBO_ACTION(to_059_combo),
	  [C_to_060] = COMBO_ACTION(to_060_combo),
	  [C_to_061] = COMBO_ACTION(to_061_combo),
	  [C_to_062] = COMBO_ACTION(to_062_combo),
	  [C_de_063] = COMBO_ACTION(de_063_combo),
	  [C_de_064] = COMBO_ACTION(de_064_combo),
	  [C_de_065] = COMBO_ACTION(de_065_combo),
	  [C_ne_066] = COMBO_ACTION(ne_066_combo),
	  [C_tu_067] = COMBO_ACTION(tu_067_combo),
	  [C_xtuta_068] = COMBO_ACTION(xtuta_068_combo),
	  [C_xtute_069] = COMBO_ACTION(xtute_069_combo),
	  [C_ha_070] = COMBO_ACTION(ha_070_combo),
	  [C_ni_071] = COMBO_ACTION(ni_071_combo),
	  [C_ni_072] = COMBO_ACTION(ni_072_combo),
	  [C_he_073] = COMBO_ACTION(he_073_combo),
	  [C_wo_074] = COMBO_ACTION(wo_074_combo),
	  [C_F2_075] = COMBO_ACTION(F2_075_combo),
	  [C_F3_076] = COMBO_ACTION(F3_076_combo),
	  [C_F4_077] = COMBO_ACTION(F4_077_combo),
	  [C_home_078] = COMBO_ACTION(home_078_combo),
	  [C_end_079] = COMBO_ACTION(end_079_combo),
	  [C_pgup_080] = COMBO_ACTION(pgup_080_combo),
	  [C_pgdown_081] = COMBO_ACTION(pgdown_081_combo),
	};
	
	//  2打鍵略語の構造体、変数
	
	struct shorten{
		uint16_t	first;  //1文字目
		uint16_t	second; //2文字目
		uint16_t	bs;   //backspaceが必要==1
		char	cont[8];  //2文字目以降
	};
	
	static struct shorten set[]={
	{KC_H,KC_K,0,"oka"},
	{KC_H,KC_N,0,"unn"},
	{KC_H,KC_S,0,"asi"},
	{KC_H,KC_MINS,0,"igasi"},
	{KC_H,KC_T,0,"odo"},
	
	{KC_K,KC_N,0,"ono"},
	{KC_K,KC_R,0,"ara"},
	{KC_K,KC_S,0,"udasai"},
	{KC_K,KC_T,0,"oto"},
	{KC_K,KC_H,0,"awa"},
	{KC_K,KC_K,1,"gatu"},
	{KC_K,KC_MINS,0,"ita"},
	
	{KC_M,KC_K,0,"asenn"},
	{KC_M,KC_N,0,"ono"},
	{KC_M,KC_S,0,"asu"},
	{KC_M,KC_T,0,"asita"},
	{KC_M,KC_H,0,"ade"},
	{KC_M,KC_MINS,0,"inami"},
	
	{KC_N,KC_M,0,"ado"},
	{KC_N,KC_H,0,"iha"},
	{KC_N,KC_K,0,"ano"},
	{KC_N,KC_R,0,"aru"},
	{KC_N,KC_S,0,"ari"},
	{KC_N,KC_T,0,"iti"},
	{KC_N,KC_MINS,0,"isi"},
	
	{KC_R,KC_R,0,"eru"},
	{KC_R,KC_MINS,0,"areru"},
	
	{KC_S,KC_K,0,"oko"},
	{KC_S,KC_M,0,"ama"},
	{KC_S,KC_N,0,"ono"},
	{KC_S,KC_R,0,"uru"},
	{KC_S,KC_S,0,"imasu"},
	{KC_S,KC_T,0,"ita"},
	{KC_S,KC_X,0,"imasita"},
	{KC_S,KC_MINS,0,"yunn"},
	{KC_S,KC_H,1,"zyunn"},
	{KC_S,KC_W,0,"iki"},
	
	{KC_T,KC_H,0,"oha"},
	{KC_T,KC_K,1,"deki"},
	{KC_T,KC_M,0,"ame"},
	{KC_T,KC_R,1,"deru"},
	{KC_T,KC_S,1,"desu"},
	{KC_T,KC_T,1,"desita"},
	{KC_T,KC_MINS,1,"desyou"},
	{KC_T,KC_X,0,"ugi"},
	
	{KC_W,KC_K,0,"ake"},
	
	{KC_Y,KC_K,0,"oku"},
	{KC_Y,KC_R,0,"ori"},
	
	{KC_W,KC_W,1,"yann"},
	{KC_W,KC_DOT,1,"yunn"},
	{KC_W,KC_COMMA,1,"yonn"},
	
		{0,0,0,""}
	};
	
	static uint16_t cons_on=1;  //2打鍵略語 1=on/0=off
	static uint16_t jp_on=0;  // 1=日本語/0=英数 起動時パスワード入力のために英数モードを初期値にしている
	static uint16_t first_on;
	static uint16_t i;
	
	//  コンボの処理
	void process_combo_event(uint16_t combo_index, bool pressed) {
	
	  first_on=0; //コンボを実行する時は2打鍵をリセットする
	
	switch(combo_index) {
	  case C_g_001: if (pressed) {SEND_STRING("g");}break;
	  case C_z_002: if (pressed) {SEND_STRING("z");}break;
	  case C_d_003: if (pressed) {SEND_STRING("d");}break;
	  case C_b_004: if (pressed) {SEND_STRING("b");}break;
	  case C_p_005: if (pressed) {SEND_STRING("p");}break;
	  case C_p_006: if (pressed) {SEND_STRING("p");}break;
	  case C_p_007: if (pressed) {SEND_STRING("p");}break;
	  case C_f_008: if (pressed) {SEND_STRING("f");}break;
	  case C_f_009: if (pressed) {SEND_STRING("f");}break;
	  case C_p_010: if (pressed) {SEND_STRING("p");}break;
	  case C_q_011: if (pressed) {SEND_STRING("q");}break;
	  case C_q_012: if (pressed) {SEND_STRING("q");}break;
	  case C_l_013: if (pressed) {SEND_STRING("l");}break;
	  case C_j_014: if (pressed) {SEND_STRING("j");}break;
	  case C_c_015: if (pressed) {SEND_STRING("c");}break;
	  case C_c_016: if (pressed) {SEND_STRING("c");}break;
	  case C_v_017: if (pressed) {SEND_STRING("v");}break;
	  case C_ai_018: if (pressed) {SEND_STRING("ai");}break;
	  case C_ei_019: if (pressed) {SEND_STRING("ei");}break;
	  case C_ou_020: if (pressed) {SEND_STRING("ou");}break;
	  case C_you_021: if (pressed) {SEND_STRING("you");}break;
	  case C_yuu_022: if (pressed) {SEND_STRING("yuu");}break;
	  case C_oi_023: if (pressed) {SEND_STRING("oi");}break;
	  case C_ui_024: if (pressed) {SEND_STRING("ui");}break;
	  case C_uu_025: if (pressed) {SEND_STRING("uu");}break;
	  case C_ann_026: if (pressed) {SEND_STRING("ann");}break;
	  case C_ann_027: if (pressed) {SEND_STRING("ann");}break;
	  case C_ann_028: if (pressed) {SEND_STRING("ann");}break;
	  case C_inn_029: if (pressed) {SEND_STRING("inn");}break;
	  case C_inn_030: if (pressed) {SEND_STRING("inn");}break;
	  case C_inn_031: if (pressed) {SEND_STRING("inn");}break;
	  case C_unn_032: if (pressed) {SEND_STRING("unn");}break;
	  case C_unn_033: if (pressed) {SEND_STRING("unn");}break;
	  case C_unn_034: if (pressed) {SEND_STRING("unn");}break;
	  case C_enn_035: if (pressed) {SEND_STRING("enn");}break;
	  case C_enn_036: if (pressed) {SEND_STRING("enn");}break;
	  case C_enn_037: if (pressed) {SEND_STRING("enn");}break;
	  case C_onn_038: if (pressed) {SEND_STRING("onn");}break;
	  case C_onn_039: if (pressed) {SEND_STRING("onn");}break;
	  case C_onn_040: if (pressed) {SEND_STRING("onn");}break;
	  case C_ya_041: if (pressed) {SEND_STRING("ya");}break;
	  case C_yu_042: if (pressed) {SEND_STRING("yu");}break;
	  case C_yo_043: if (pressed) {SEND_STRING("yo");}break;
	  case C_ye_044: if (pressed) {SEND_STRING("ye");}break;
	  case C_ye_045: if (pressed) {SEND_STRING("ye");}break;
	  case C_ye_046: if (pressed) {SEND_STRING("ye");}break;
	  case C_nn_047: if (pressed) {SEND_STRING("nn");}break;
	  case C_xtu_048: if (pressed) {SEND_STRING("xtu");}break;
	  case C_no_049: if (pressed) {SEND_STRING("no");}break;
	  case C_no_050: if (pressed) {SEND_STRING("no");}break;
	  case C_no_051: if (pressed) {SEND_STRING("no");}break;
	  case C_no_052: if (pressed) {SEND_STRING("no");}break;
	  case C_ga_053: if (pressed) {SEND_STRING("ga");}break;
	  case C_ga_054: if (pressed) {SEND_STRING("ga");}break;
	  case C_ga_055: if (pressed) {SEND_STRING("ga");}break;
	  case C_mo_056: if (pressed) {SEND_STRING("mo");}break;
	  case C_mo_057: if (pressed) {SEND_STRING("mo");}break;
	  case C_mo_058: if (pressed) {SEND_STRING("mo");}break;
	  case C_to_059: if (pressed) {SEND_STRING("to");}break;
	  case C_to_060: if (pressed) {SEND_STRING("to");}break;
	  case C_to_061: if (pressed) {SEND_STRING("to");}break;
	  case C_to_062: if (pressed) {SEND_STRING("to");}break;
	  case C_de_063: if (pressed) {SEND_STRING("de");}break;
	  case C_de_064: if (pressed) {SEND_STRING("de");}break;
	  case C_de_065: if (pressed) {SEND_STRING("de");}break;
	  case C_ne_066: if (pressed) {SEND_STRING("ne");}break;
	  case C_tu_067: if (pressed) {SEND_STRING("tu");}break;
	  case C_xtuta_068: if (pressed) {SEND_STRING("xtuta");}break;
	  case C_xtute_069: if (pressed) {SEND_STRING("xtute");}break;
	  case C_ha_070: if (pressed) {SEND_STRING("ha");}break;
	  case C_ni_071: if (pressed) {SEND_STRING("ni");}break;
	  case C_ni_072: if (pressed) {SEND_STRING("ni");}break;
	  case C_he_073: if (pressed) {SEND_STRING("he");}break;
	  case C_wo_074: if (pressed) {SEND_STRING("wo");}break;
	  case C_F2_075: if (pressed) {tap_code16(KC_F2);}break;
	  case C_F3_076: if (pressed) {tap_code16(KC_F3);}break;
	  case C_F4_077: if (pressed) {tap_code16(KC_F4);}break;
	  case C_home_078: if (pressed) {tap_code16(KC_HOME);}break;
	  case C_end_079: if (pressed) {tap_code16(KC_END);}break;
	  case C_pgup_080: if (pressed) {tap_code16(KC_PGUP);}break;
	  case C_pgdown_081: if (pressed) {tap_code16(KC_PGDN);}break;
	}
	}
	
	//  接続時にOSの判別
	void keyboard_post_init_user(void){
	  wait_ms(400);
	  switch (detected_host_os()) {
		case OS_WINDOWS:
		  layer_move(_BASE_WIN);
		  break;
		case OS_MACOS:
		case OS_IOS:
		  layer_move(_BASE_MAC);
		  break;
		case OS_LINUX:
		  layer_move(_BASE_WIN);
		  break;
		default:
		layer_move(_BASE_AOS);
	  }
	}
	
	
	
	//  分岐と文字列出力
	
	bool process_record_user(uint16_t keycode, keyrecord_t *record) {
	
	  //modキーの状態
	  const uint8_t mods = get_mods();
	  const uint8_t oneshot_mods = get_oneshot_mods();
	
	   switch (keycode) {
		//コンボ ON/OFF
		case KC_F21:
		  if(record->event.pressed) {
			combo_enable();
			return false;
		   } else {
			return true;
		   }
		   break;
		case KC_F22:
		  if(record->event.pressed) {
			combo_disable();
			return false;
		   } else {
			return true;
		   }
		   break;
	
		//2打鍵略語 ON/OFF
		case KC_F23:
		  if(record->event.pressed) {
			cons_on=1;
			return false;
		   } else {
			return true;
		   }
		   break;
		case KC_F24:
		  if(record->event.pressed) {
			cons_on=0;
			return false;
		   } else {
			return true;
		   }
		   break;
	
		//かな・英数の切り替え いろいろなcaseを用意しているが、不要ならコメントアウトして良い
		case KC_LNG2:  //Mac、Windows英数モードKC_LANG2 record->event.pressedでないとうまくいかない?
		case LALT_T(KC_LNG2):  //Mac英数モード optionキーと兼用
		case LSFT_T(KC_LNG2):  //Mac英数モード shiftキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG2);//key down
			jp_on=0;
			first_on=0;
			return false;
		   } else {
			return true;
		   }
		   break;
		case KC_CAPS:  //Win英数モード
		//case KC_MHEN:  //Win英数モード
		case LALT_T(KC_CAPS):  //Win英数モード altキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG2);//key down
			//tap_code16(KC_CAPS);//古いWindowsの場合
			jp_on=0;
			first_on=0;
			return false;
		   } else {
			return true;
		   }
		   break;
		case LALT_T(KC_HOME):  //Android英数モード 意味のないキーを割り当てている
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			//key downは無視
			jp_on=0;
			first_on=0;
			return true;
		   } else {
			return true;
		   }
		   break;
		case KC_LNG1: //Mac、WindowsかなモードKC_LANG1
		case LCTL_T(KC_LNG1): //Macかなモード ctrlキーと兼用
		case LGUI_T(KC_LNG1): //Macかなモード commandキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG1);//key down
			jp_on=1;
			first_on=0;
			  return false;
			} else {
			  return true;
			}
			break;
		case KC_GRV:  //Winかなモード
		//case KC_HENK:  //Winかなモード
		case LGUI_T(KC_GRV):  //Winかなモード guiキーと兼用
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			tap_code16(KC_LNG1);//key down
			//tap_code16(KC_GRV);//古いWindowsの場合
			//tap_code16(KC_HENK);//別の定義
			jp_on=1;
			first_on=0;
			return false;
		  } else {
			return true;
		  }
		  break;
		case LGUI_T(KC_END):  //Androidかなモード 意味のないキーを割り当てている
		  if(record->tap.count  && record->event.pressed) {// タップの処理
			//key downは無視
			jp_on=1;
			first_on=0;
			return true;
		  } else {
			return true;
		  }
		  break;
		//default:
	   }
	
	
	  //  かなモードの時、2打鍵略語処理
	  if (jp_on==1 && cons_on==1) {
		if (first_on==0) {  //1打目の処理
		  switch (keycode) {
			case KC_D: 
			case KC_G: 
			case KC_H: 
			case KC_K: 
			case KC_M: 
			case KC_N: 
			case KC_R: 
			case KC_S: 
			case KC_T: 
			case KC_W: 
			case KC_X: 
			case KC_Y: 
			case KC_Z: 
			  if (record->event.pressed) {
				register_code(keycode);  //key downn
			  } else {
				unregister_code(keycode); //key up
				first_on=keycode; //1打目のキーコードを記録
			  }
			  if ((mods | oneshot_mods) & MOD_MASK_CAG) { // CTRL/ALT/GUIが対象。SHIFTは対象外
				first_on=0; //modキーが押されているなら 2打鍵をリセット
			  }
			  return false; //false
			break;
		  }
		} else {  //2打目の処理
		  i=0;
		  while(set[i].first != 0){
			  if(first_on==set[i].first && keycode==set[i].second) {
			  if (record->event.pressed) {
				if (set[i].bs==1) {
				  tap_code(KC_BSPC); //1文字目を削除
				}
				  send_string(set[i].cont);  //key downで残りの文字列を出力
				} else {
					  first_on=0; //key upの時にフラグをリセット
				  }
				  return false;
			  };
			i++;
		  };
	
		  first_on=0;//どれにも当てはまらなければ強制的に1文字目に戻す
		  return true;
		}
	  } else {//英数モードの時は何もしない
		if (record->event.pressed) {
		  } else {
		  }
	  }
	  return true;
	};
	


[TTTキーボード研究室 TOP] [東京タヌキ探検隊! TOP]