TTTキーボード研究室


Leia4 std配列 QMK Firmwareソースコード(minipeg48キーボード)

●説明

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

minipeg48キーボードは12×4の格子配列です。いわゆるPlanckキーボードです。

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判別


// minipeg48
// Leia4 2024
// 
// 0.00 2024/03/26  LEIA4(QMK 0.23)
// 0.01 2024/04/06  
// 0.02 2024/05/08  
// 0.03 2024/12/29  コンボv403、略語v401

//OS判別
#include "os_detection.h"

enum planck_layers {
  _BASE_WIN,
  _BASE_MAC,
  _BASE_AOS,
  _SYMBOL_1_JP,
  _SYMBOL_1_US,
  _SYMBOL_2_JP,
  _SYMBOL_2_US,
  _NUMBERS_JP,
  _NUMBERS_US,
  _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)	// _アンダーバー

//  コンマとドットのマクロ化
#define	US_COMMA LT(_SYMBOL_1_US,KC_COMMA)
#define	JP_COMMA LT(_SYMBOL_1_JP,KC_COMMA)
#define	US_DOT LT(_SYMBOL_2_US,KC_DOT)
#define	JP_DOT LT(_SYMBOL_2_JP,KC_DOT)

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

[_BASE_MAC] = LAYOUT_ortho_4x12(												
	KC_Q,	KC_Y,	KC_O,	KC_U,	KC_C,	LT(_RESET,KC_ESCAPE),	LGUI(KC_X),	KC_B,	KC_N,	KC_K,	KC_M,	KC_F,
	KC_L,	KC_E,	KC_I,	KC_A,	KC_V,	LGUI(KC_C),	LGUI(KC_V),	KC_G,	KC_T,	KC_S,	KC_R,	KC_P,
	LALT_T(KC_J),	US_COMMA,	US_DOT,	KC_W,	KC_Z,	XXXXXXX,	XXXXXXX,	KC_D,	KC_H,	KC_X,	KC_MINS,	KC_UP,
	LALT(LGUI(LSFT(KC_V))),	LSFT_T(KC_LNG2),	LGUI_T(KC_LNG1),	XXXXXXX,	LT(_NUMBERS_US,KC_TAB),	KC_BSPC,	KC_ENTER,	KC_SPC,	XXXXXXX,	KC_LEFT,	KC_DOWN,	KC_RGHT
),												
[_BASE_WIN] = LAYOUT_ortho_4x12(												
	KC_Q,	KC_Y,	KC_O,	KC_U,	KC_C,	LT(_RESET,KC_ESCAPE),	LCTL(KC_X),	KC_B,	KC_N,	KC_K,	KC_M,	KC_F,
	KC_L,	KC_E,	KC_I,	KC_A,	KC_V,	LCTL(KC_C),	LCTL(KC_V),	KC_G,	KC_T,	KC_S,	KC_R,	KC_P,
	LALT_T(KC_J),	JP_COMMA,	JP_DOT,	KC_W,	KC_Z,	XXXXXXX,	XXXXXXX,	KC_D,	KC_H,	KC_X,	KC_MINS,	KC_UP,
	KC_DEL,	LSFT_T(KC_LNG2),	LCTL_T(KC_LNG1),	XXXXXXX,	LT(_NUMBERS_JP,KC_TAB),	KC_BSPC,	KC_ENTER,	KC_SPC,	XXXXXXX,	KC_LEFT,	KC_DOWN,	KC_RGHT
),												
[_BASE_AOS] = LAYOUT_ortho_4x12(												
	KC_Q,	KC_Y,	KC_O,	KC_U,	KC_C,	LT(_RESET,KC_ESCAPE),	LCTL(KC_X),	KC_B,	KC_N,	KC_K,	KC_M,	KC_F,
	KC_L,	KC_E,	KC_I,	KC_A,	KC_V,	LCTL(KC_C),	LCTL(KC_V),	KC_G,	KC_T,	KC_S,	KC_R,	KC_P,
	LALT_T(KC_J),	US_COMMA,	US_DOT,	KC_W,	KC_Z,	XXXXXXX,	XXXXXXX,	KC_D,	KC_H,	KC_X,	KC_MINS,	KC_UP,
	KC_DEL,	LSFT_T(KC_LNG2),	LCTL_T(KC_LNG1),	XXXXXXX,	LT(_NUMBERS_US,KC_TAB),	KC_BSPC,	KC_ENTER,	KC_SPC,	XXXXXXX,	KC_LEFT,	KC_DOWN,	KC_RGHT
),												

[_SYMBOL_1_US] = LAYOUT_ortho_4x12(												
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_PPLS,	KC_PAST,	KC_PEQL,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_PERC,	KC_EXLM,	KC_AMPR,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_COLN,	KC_LPRN,	KC_RPRN,	_______,	KC_PGUP,
	_______,	_______,	_______,	XXXXXXX,	KC_TAB,	XXXXXXX,	XXXXXXX,	KC_SPC,	XXXXXXX,	KC_HOME,	KC_PGDN,	KC_END
),												
[_SYMBOL_1_JP] = LAYOUT_ortho_4x12(												
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_PPLS,	KC_PAST,	JC_EQL,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_PERC,	KC_EXLM,	JC_AMPR,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	JC_COLN,	JC_LPRN,	JC_RPRN,	_______,	KC_PGUP,
	_______,	_______,	_______,	XXXXXXX,	KC_TAB,	XXXXXXX,	XXXXXXX,	KC_SPC,	XXXXXXX,	KC_HOME,	KC_PGDN,	KC_END
),												
[_SYMBOL_2_US] = LAYOUT_ortho_4x12(												
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_PMNS,	KC_PSLS,	KC_AT,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_DLR,	KC_QUES,	KC_HASH,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_SCLN,	KC_LBRC,	KC_RBRC,	_______,	KC_PGUP,
	_______,	_______,	_______,	XXXXXXX,	KC_TAB,	XXXXXXX,	XXXXXXX,	KC_SPC,	XXXXXXX,	KC_HOME,	KC_PGDN,	KC_END
),												
[_SYMBOL_2_JP] = LAYOUT_ortho_4x12(												
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_PMNS,	KC_PSLS,	JC_AT,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_DLR,	KC_QUES,	KC_HASH,	_______,	_______,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_SCLN,	JC_LBRC,	JC_RBRC,	_______,	KC_PGUP,
	_______,	_______,	_______,	XXXXXXX,	KC_TAB,	XXXXXXX,	XXXXXXX,	KC_SPC,	XXXXXXX,	KC_HOME,	KC_PGDN,	KC_END
),												

[_NUMBERS_US] = LAYOUT_ortho_4x12(												
	KC_F1,	KC_F2,	KC_F3,	KC_F4,	KC_F8,	_______,	_______,	KC_P7,	KC_P8,	KC_P9,	KC_PSLS,	KC_PAST,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_P4,	KC_P5,	KC_P6,	KC_PPLS,	KC_PEQL,
	_______,	LGUI(KC_KP_PLUS),	LGUI(KC_KP_MINUS),	_______,	_______,	_______,	_______,	KC_P1,	KC_P2,	KC_P3,	KC_PMNS,	XXXXXXX,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_P0,	XXXXXXX,	KC_PDOT,	XXXXXXX,	XXXXXXX
),												
[_NUMBERS_JP] = LAYOUT_ortho_4x12(												
	KC_F1,	KC_F2,	KC_F3,	KC_F10,	KC_F12,	_______,	_______,	KC_P7,	KC_P8,	KC_P9,	KC_PSLS,	KC_PAST,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_P4,	KC_P5,	KC_P6,	KC_PPLS,	JC_EQL,
	_______,	LCTL(KC_KP_PLUS),	LCTL(KC_KP_MINUS),	_______,	_______,	_______,	_______,	KC_P1,	KC_P2,	KC_P3,	KC_PMNS,	XXXXXXX,
	_______,	_______,	_______,	_______,	_______,	_______,	_______,	KC_P0,	XXXXXXX,	KC_PDOT,	XXXXXXX,	XXXXXXX
),												

[_RESET] = LAYOUT_ortho_4x12(
  TO(_BASE_MAC),TO(_BASE_WIN),TO(_BASE_AOS),XXXXXXX,XXXXXXX,KC_F18,KC_F19,KC_F20,KC_F21,KC_F22,KC_F23,KC_F24, 
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, 
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX, XXXXXXX, 
  QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,XXXXXXX,XXXXXXX
),

};

// コンボ
//  定数の定義

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_ai_008,
C_ei_009,
C_ou_010,
C_you_011,
C_yuu_012,
C_yuu_013,
C_yuu_014,
C_oi_015,
C_ui_016,
C_ui_017,
C_uu_018,
C_uu_019,
C_ann_020,
C_ann_021,
C_ann_022,
C_ann_023,
C_ann_024,
C_inn_025,
C_inn_026,
C_inn_027,
C_inn_028,
C_inn_029,
C_unn_030,
C_unn_031,
C_unn_032,
C_unn_033,
C_enn_034,
C_enn_035,
C_enn_036,
C_enn_037,
C_enn_038,
C_enn_039,
C_onn_040,
C_onn_041,
C_onn_042,
C_ya_043,
C_ya_044,
C_yu_045,
C_yu_046,
C_yu_047,
C_yu_048,
C_yo_049,
C_yo_050,
C_ye_051,
C_ye_052,
C_ye_053,
C_ye_054,
C_yann_055,
C_yonn_056,
C_yonn_057,
C_yunn_058,
C_yunn_059,
C_nn_060,
C_xtu_061,
C_no_062,
C_no_063,
C_no_064,
C_no_065,
C_no_066,
C_ga_067,
C_ga_068,
C_ga_069,
C_mo_070,
C_mo_071,
C_mo_072,
C_mo_073,
C_to_074,
C_to_075,
C_to_076,
C_to_077,
C_to_078,
C_de_079,
C_de_080,
C_de_081,
C_ne_082,
C_tsu_083,
C_ha_084,
C_ha_085,
C_ha_086,
C_ha_087,
C_ni_088,
C_ni_089,
C_ni_090,
C_ni_091,
C_ni_092,
C_ni_093,
C_he_094,
C_wo_095,
C_wo_096,
C_wo_097,
C_wo_098,
C_wo_099,
C_home_100,
C_end_101,
C_pgup_102,
C_pgdown_103,
C_home_104,
C_end_105,
C_pgup_106,
C_pgdown_107,
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 ai_008_combo[]={KC_A,KC_I, COMBO_END};
const uint16_t PROGMEM ei_009_combo[]={KC_E,KC_I, COMBO_END};
const uint16_t PROGMEM ou_010_combo[]={KC_O,KC_U, COMBO_END};
const uint16_t PROGMEM you_011_combo[]={KC_Y,KC_O, COMBO_END};
const uint16_t PROGMEM yuu_012_combo[]={KC_Y,KC_U, COMBO_END};
const uint16_t PROGMEM yuu_013_combo[]={KC_U,KC_C, COMBO_END};
const uint16_t PROGMEM yuu_014_combo[]={KC_U,KC_N, COMBO_END};
const uint16_t PROGMEM oi_015_combo[]={KC_E,KC_A, COMBO_END};
const uint16_t PROGMEM ui_016_combo[]={KC_I,KC_V, COMBO_END};
const uint16_t PROGMEM ui_017_combo[]={KC_I,KC_T, COMBO_END};
const uint16_t PROGMEM uu_018_combo[]={KC_U,KC_C, COMBO_END};
const uint16_t PROGMEM uu_019_combo[]={KC_U,KC_N, COMBO_END};
const uint16_t PROGMEM ann_020_combo[]={KC_A,US_DOT, COMBO_END};
const uint16_t PROGMEM ann_021_combo[]={KC_A,JP_DOT, COMBO_END};
const uint16_t PROGMEM ann_022_combo[]={KC_A,KC_W, COMBO_END};
const uint16_t PROGMEM ann_023_combo[]={KC_A,KC_Z, COMBO_END};
const uint16_t PROGMEM ann_024_combo[]={KC_A,KC_H, COMBO_END};
const uint16_t PROGMEM inn_025_combo[]={KC_I,US_COMMA, COMBO_END};
const uint16_t PROGMEM inn_026_combo[]={KC_I,JP_COMMA, COMBO_END};
const uint16_t PROGMEM inn_027_combo[]={KC_I,US_DOT, COMBO_END};
const uint16_t PROGMEM inn_028_combo[]={KC_I,JP_DOT, COMBO_END};
const uint16_t PROGMEM inn_029_combo[]={KC_I,KC_W, COMBO_END};
const uint16_t PROGMEM unn_030_combo[]={KC_U,KC_I, COMBO_END};
const uint16_t PROGMEM unn_031_combo[]={KC_U,KC_A, COMBO_END};
const uint16_t PROGMEM unn_032_combo[]={KC_U,KC_V, COMBO_END};
const uint16_t PROGMEM unn_033_combo[]={KC_U,KC_T, COMBO_END};
const uint16_t PROGMEM enn_034_combo[]={KC_E,KC_J, COMBO_END};
const uint16_t PROGMEM enn_035_combo[]={KC_E,US_COMMA, COMBO_END};
const uint16_t PROGMEM enn_036_combo[]={KC_E,JP_COMMA, COMBO_END};
const uint16_t PROGMEM enn_037_combo[]={KC_E,US_DOT, COMBO_END};
const uint16_t PROGMEM enn_038_combo[]={KC_E,JP_DOT, COMBO_END};
const uint16_t PROGMEM enn_039_combo[]={KC_E,KC_W, COMBO_END};
const uint16_t PROGMEM onn_040_combo[]={KC_O,KC_E, COMBO_END};
const uint16_t PROGMEM onn_041_combo[]={KC_O,KC_I, COMBO_END};
const uint16_t PROGMEM onn_042_combo[]={KC_O,KC_A, COMBO_END};
const uint16_t PROGMEM ya_043_combo[]={KC_W,US_DOT, COMBO_END};
const uint16_t PROGMEM ya_044_combo[]={KC_W,JP_DOT, COMBO_END};
const uint16_t PROGMEM yu_045_combo[]={KC_W,US_COMMA, COMBO_END};
const uint16_t PROGMEM yu_046_combo[]={KC_W,JP_COMMA, COMBO_END};
const uint16_t PROGMEM yu_047_combo[]={US_DOT,LT(_NUMBERS_US,KC_SPC), COMBO_END};
const uint16_t PROGMEM yu_048_combo[]={JP_DOT,LT(_NUMBERS_US,KC_SPC), COMBO_END};
const uint16_t PROGMEM yo_049_combo[]={US_COMMA,US_DOT, COMBO_END};
const uint16_t PROGMEM yo_050_combo[]={JP_COMMA,JP_DOT, COMBO_END};
const uint16_t PROGMEM ye_051_combo[]={KC_Y,KC_L, COMBO_END};
const uint16_t PROGMEM ye_052_combo[]={KC_Y,KC_E, COMBO_END};
const uint16_t PROGMEM ye_053_combo[]={KC_Y,KC_I, COMBO_END};
const uint16_t PROGMEM ye_054_combo[]={KC_Y,KC_A, COMBO_END};
const uint16_t PROGMEM yann_055_combo[]={KC_J,KC_W, COMBO_END};
const uint16_t PROGMEM yonn_056_combo[]={KC_J,US_DOT, COMBO_END};
const uint16_t PROGMEM yonn_057_combo[]={KC_J,JP_DOT, COMBO_END};
const uint16_t PROGMEM yunn_058_combo[]={KC_J,US_COMMA, COMBO_END};
const uint16_t PROGMEM yunn_059_combo[]={KC_J,JP_COMMA, COMBO_END};
const uint16_t PROGMEM nn_060_combo[]={KC_N,KC_K, COMBO_END};
const uint16_t PROGMEM xtu_061_combo[]={KC_X,KC_MINS, COMBO_END};
const uint16_t PROGMEM no_062_combo[]={KC_N,KC_G, COMBO_END};
const uint16_t PROGMEM no_063_combo[]={KC_N,KC_T, COMBO_END};
const uint16_t PROGMEM no_064_combo[]={KC_N,KC_S, COMBO_END};
const uint16_t PROGMEM no_065_combo[]={KC_N,KC_A, COMBO_END};
const uint16_t PROGMEM no_066_combo[]={KC_N,KC_M, COMBO_END};
const uint16_t PROGMEM ga_067_combo[]={KC_K,KC_T, COMBO_END};
const uint16_t PROGMEM ga_068_combo[]={KC_K,KC_S, COMBO_END};
const uint16_t PROGMEM ga_069_combo[]={KC_K,KC_R, COMBO_END};
const uint16_t PROGMEM mo_070_combo[]={KC_M,KC_S, COMBO_END};
const uint16_t PROGMEM mo_071_combo[]={KC_M,KC_R, COMBO_END};
const uint16_t PROGMEM mo_072_combo[]={KC_M,KC_P, COMBO_END};
const uint16_t PROGMEM mo_073_combo[]={KC_M,KC_T, COMBO_END};
const uint16_t PROGMEM to_074_combo[]={KC_T,KC_D, COMBO_END};
const uint16_t PROGMEM to_075_combo[]={KC_T,KC_H, COMBO_END};
const uint16_t PROGMEM to_076_combo[]={KC_T,KC_X, COMBO_END};
const uint16_t PROGMEM to_077_combo[]={KC_T,KC_W, COMBO_END};
const uint16_t PROGMEM to_078_combo[]={KC_T,KC_R, COMBO_END};
const uint16_t PROGMEM de_079_combo[]={KC_S,KC_H, COMBO_END};
const uint16_t PROGMEM de_080_combo[]={KC_S,KC_X, COMBO_END};
const uint16_t PROGMEM de_081_combo[]={KC_S,KC_MINS, COMBO_END};
const uint16_t PROGMEM ne_082_combo[]={KC_N,KC_B, COMBO_END};
const uint16_t PROGMEM tsu_083_combo[]={KC_T,KC_G, COMBO_END};
const uint16_t PROGMEM ha_084_combo[]={KC_H,KC_MINS, COMBO_END};
const uint16_t PROGMEM ha_085_combo[]={KC_H,KC_LEFT, COMBO_END};
const uint16_t PROGMEM ha_086_combo[]={KC_H,KC_RGHT, COMBO_END};
const uint16_t PROGMEM ha_087_combo[]={KC_H,LT(_NUMBERS_US,KC_BSPC), COMBO_END};
const uint16_t PROGMEM ni_088_combo[]={KC_X,KC_W, COMBO_END};
const uint16_t PROGMEM ni_089_combo[]={KC_X,KC_RGHT, COMBO_END};
const uint16_t PROGMEM ni_090_combo[]={KC_X,LT(_NUMBERS_US,KC_BSPC), COMBO_END};
const uint16_t PROGMEM ni_091_combo[]={KC_X,LT(_SYMBOL_1_US,KC_ENT), COMBO_END};
const uint16_t PROGMEM ni_092_combo[]={KC_X,KC_D, COMBO_END};
const uint16_t PROGMEM ni_093_combo[]={KC_S,KC_D, COMBO_END};
const uint16_t PROGMEM he_094_combo[]={KC_H,KC_D, COMBO_END};
const uint16_t PROGMEM wo_095_combo[]={KC_W,KC_Z, COMBO_END};
const uint16_t PROGMEM wo_096_combo[]={KC_W,LT(_NUMBERS_US,KC_SPC), COMBO_END};
const uint16_t PROGMEM wo_097_combo[]={KC_W,KC_LEFT, COMBO_END};
const uint16_t PROGMEM wo_098_combo[]={KC_W,KC_RGHT, COMBO_END};
const uint16_t PROGMEM wo_099_combo[]={KC_W,KC_H, COMBO_END};
const uint16_t PROGMEM home_100_combo[]={KC_Q,KC_L, COMBO_END};
const uint16_t PROGMEM end_101_combo[]={KC_L,KC_J, COMBO_END};
const uint16_t PROGMEM pgup_102_combo[]={KC_C,KC_V, COMBO_END};
const uint16_t PROGMEM pgdown_103_combo[]={KC_V,KC_Z, COMBO_END};
const uint16_t PROGMEM home_104_combo[]={KC_UP,KC_RGHT, COMBO_END};
const uint16_t PROGMEM end_105_combo[]={KC_DOWN,KC_RGHT, COMBO_END};
const uint16_t PROGMEM pgup_106_combo[]={KC_UP,KC_LEFT, COMBO_END};
const uint16_t PROGMEM pgdown_107_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_ai_008] = COMBO_ACTION(ai_008_combo),
[C_ei_009] = COMBO_ACTION(ei_009_combo),
[C_ou_010] = COMBO_ACTION(ou_010_combo),
[C_you_011] = COMBO_ACTION(you_011_combo),
[C_yuu_012] = COMBO_ACTION(yuu_012_combo),
[C_yuu_013] = COMBO_ACTION(yuu_013_combo),
[C_yuu_014] = COMBO_ACTION(yuu_014_combo),
[C_oi_015] = COMBO_ACTION(oi_015_combo),
[C_ui_016] = COMBO_ACTION(ui_016_combo),
[C_ui_017] = COMBO_ACTION(ui_017_combo),
[C_uu_018] = COMBO_ACTION(uu_018_combo),
[C_uu_019] = COMBO_ACTION(uu_019_combo),
[C_ann_020] = COMBO_ACTION(ann_020_combo),
[C_ann_021] = COMBO_ACTION(ann_021_combo),
[C_ann_022] = COMBO_ACTION(ann_022_combo),
[C_ann_023] = COMBO_ACTION(ann_023_combo),
[C_ann_024] = COMBO_ACTION(ann_024_combo),
[C_inn_025] = COMBO_ACTION(inn_025_combo),
[C_inn_026] = COMBO_ACTION(inn_026_combo),
[C_inn_027] = COMBO_ACTION(inn_027_combo),
[C_inn_028] = COMBO_ACTION(inn_028_combo),
[C_inn_029] = COMBO_ACTION(inn_029_combo),
[C_unn_030] = COMBO_ACTION(unn_030_combo),
[C_unn_031] = COMBO_ACTION(unn_031_combo),
[C_unn_032] = COMBO_ACTION(unn_032_combo),
[C_unn_033] = COMBO_ACTION(unn_033_combo),
[C_enn_034] = COMBO_ACTION(enn_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_enn_038] = COMBO_ACTION(enn_038_combo),
[C_enn_039] = COMBO_ACTION(enn_039_combo),
[C_onn_040] = COMBO_ACTION(onn_040_combo),
[C_onn_041] = COMBO_ACTION(onn_041_combo),
[C_onn_042] = COMBO_ACTION(onn_042_combo),
[C_ya_043] = COMBO_ACTION(ya_043_combo),
[C_ya_044] = COMBO_ACTION(ya_044_combo),
[C_yu_045] = COMBO_ACTION(yu_045_combo),
[C_yu_046] = COMBO_ACTION(yu_046_combo),
[C_yu_047] = COMBO_ACTION(yu_047_combo),
[C_yu_048] = COMBO_ACTION(yu_048_combo),
[C_yo_049] = COMBO_ACTION(yo_049_combo),
[C_yo_050] = COMBO_ACTION(yo_050_combo),
[C_ye_051] = COMBO_ACTION(ye_051_combo),
[C_ye_052] = COMBO_ACTION(ye_052_combo),
[C_ye_053] = COMBO_ACTION(ye_053_combo),
[C_ye_054] = COMBO_ACTION(ye_054_combo),
[C_yann_055] = COMBO_ACTION(yann_055_combo),
[C_yonn_056] = COMBO_ACTION(yonn_056_combo),
[C_yonn_057] = COMBO_ACTION(yonn_057_combo),
[C_yunn_058] = COMBO_ACTION(yunn_058_combo),
[C_yunn_059] = COMBO_ACTION(yunn_059_combo),
[C_nn_060] = COMBO_ACTION(nn_060_combo),
[C_xtu_061] = COMBO_ACTION(xtu_061_combo),
[C_no_062] = COMBO_ACTION(no_062_combo),
[C_no_063] = COMBO_ACTION(no_063_combo),
[C_no_064] = COMBO_ACTION(no_064_combo),
[C_no_065] = COMBO_ACTION(no_065_combo),
[C_no_066] = COMBO_ACTION(no_066_combo),
[C_ga_067] = COMBO_ACTION(ga_067_combo),
[C_ga_068] = COMBO_ACTION(ga_068_combo),
[C_ga_069] = COMBO_ACTION(ga_069_combo),
[C_mo_070] = COMBO_ACTION(mo_070_combo),
[C_mo_071] = COMBO_ACTION(mo_071_combo),
[C_mo_072] = COMBO_ACTION(mo_072_combo),
[C_mo_073] = COMBO_ACTION(mo_073_combo),
[C_to_074] = COMBO_ACTION(to_074_combo),
[C_to_075] = COMBO_ACTION(to_075_combo),
[C_to_076] = COMBO_ACTION(to_076_combo),
[C_to_077] = COMBO_ACTION(to_077_combo),
[C_to_078] = COMBO_ACTION(to_078_combo),
[C_de_079] = COMBO_ACTION(de_079_combo),
[C_de_080] = COMBO_ACTION(de_080_combo),
[C_de_081] = COMBO_ACTION(de_081_combo),
[C_ne_082] = COMBO_ACTION(ne_082_combo),
[C_tsu_083] = COMBO_ACTION(tsu_083_combo),
[C_ha_084] = COMBO_ACTION(ha_084_combo),
[C_ha_085] = COMBO_ACTION(ha_085_combo),
[C_ha_086] = COMBO_ACTION(ha_086_combo),
[C_ha_087] = COMBO_ACTION(ha_087_combo),
[C_ni_088] = COMBO_ACTION(ni_088_combo),
[C_ni_089] = COMBO_ACTION(ni_089_combo),
[C_ni_090] = COMBO_ACTION(ni_090_combo),
[C_ni_091] = COMBO_ACTION(ni_091_combo),
[C_ni_092] = COMBO_ACTION(ni_092_combo),
[C_ni_093] = COMBO_ACTION(ni_093_combo),
[C_he_094] = COMBO_ACTION(he_094_combo),
[C_wo_095] = COMBO_ACTION(wo_095_combo),
[C_wo_096] = COMBO_ACTION(wo_096_combo),
[C_wo_097] = COMBO_ACTION(wo_097_combo),
[C_wo_098] = COMBO_ACTION(wo_098_combo),
[C_wo_099] = COMBO_ACTION(wo_099_combo),
[C_home_100] = COMBO_ACTION(home_100_combo),
[C_end_101] = COMBO_ACTION(end_101_combo),
[C_pgup_102] = COMBO_ACTION(pgup_102_combo),
[C_pgdown_103] = COMBO_ACTION(pgdown_103_combo),
[C_home_104] = COMBO_ACTION(home_104_combo),
[C_end_105] = COMBO_ACTION(end_105_combo),
[C_pgup_106] = COMBO_ACTION(pgup_106_combo),
[C_pgdown_107] = COMBO_ACTION(pgdown_107_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_W,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,US_DOT,1,"yunn"},
{KC_W,JP_DOT,1,"yunn"},
{KC_W,US_COMMA,1,"yonn"},
{KC_W,JP_COMMA,1,"yonn"},

	{0,0,0,""}
};

static uint16_t cons_on=1;  //2打鍵略語 on/off
static uint16_t jp_on=1;
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_ai_008: if (pressed) {SEND_STRING("ai");}break;
case C_ei_009: if (pressed) {SEND_STRING("ei");}break;
case C_ou_010: if (pressed) {SEND_STRING("ou");}break;
case C_you_011: if (pressed) {SEND_STRING("you");}break;
case C_yuu_012: if (pressed) {SEND_STRING("yuu");}break;
case C_yuu_013: if (pressed) {SEND_STRING("yuu");}break;
case C_yuu_014: if (pressed) {SEND_STRING("yuu");}break;
case C_oi_015: if (pressed) {SEND_STRING("oi");}break;
case C_ui_016: if (pressed) {SEND_STRING("ui");}break;
case C_ui_017: if (pressed) {SEND_STRING("ui");}break;
case C_uu_018: if (pressed) {SEND_STRING("uu");}break;
case C_uu_019: if (pressed) {SEND_STRING("uu");}break;
case C_ann_020: if (pressed) {SEND_STRING("ann");}break;
case C_ann_021: if (pressed) {SEND_STRING("ann");}break;
case C_ann_022: if (pressed) {SEND_STRING("ann");}break;
case C_ann_023: if (pressed) {SEND_STRING("ann");}break;
case C_ann_024: if (pressed) {SEND_STRING("ann");}break;
case C_inn_025: if (pressed) {SEND_STRING("inn");}break;
case C_inn_026: if (pressed) {SEND_STRING("inn");}break;
case C_inn_027: if (pressed) {SEND_STRING("inn");}break;
case C_inn_028: if (pressed) {SEND_STRING("inn");}break;
case C_inn_029: if (pressed) {SEND_STRING("inn");}break;
case C_unn_030: if (pressed) {SEND_STRING("unn");}break;
case C_unn_031: if (pressed) {SEND_STRING("unn");}break;
case C_unn_032: if (pressed) {SEND_STRING("unn");}break;
case C_unn_033: if (pressed) {SEND_STRING("unn");}break;
case C_enn_034: if (pressed) {SEND_STRING("enn");}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_enn_038: if (pressed) {SEND_STRING("enn");}break;
case C_enn_039: if (pressed) {SEND_STRING("enn");}break;
case C_onn_040: if (pressed) {SEND_STRING("onn");}break;
case C_onn_041: if (pressed) {SEND_STRING("onn");}break;
case C_onn_042: if (pressed) {SEND_STRING("onn");}break;
case C_ya_043: if (pressed) {SEND_STRING("ya");}break;
case C_ya_044: if (pressed) {SEND_STRING("ya");}break;
case C_yu_045: if (pressed) {SEND_STRING("yu");}break;
case C_yu_046: if (pressed) {SEND_STRING("yu");}break;
case C_yu_047: if (pressed) {SEND_STRING("yu");}break;
case C_yu_048: if (pressed) {SEND_STRING("yu");}break;
case C_yo_049: if (pressed) {SEND_STRING("yo");}break;
case C_yo_050: if (pressed) {SEND_STRING("yo");}break;
case C_ye_051: if (pressed) {SEND_STRING("ye");}break;
case C_ye_052: if (pressed) {SEND_STRING("ye");}break;
case C_ye_053: if (pressed) {SEND_STRING("ye");}break;
case C_ye_054: if (pressed) {SEND_STRING("ye");}break;
case C_yann_055: if (pressed) {SEND_STRING("yann");}break;
case C_yonn_056: if (pressed) {SEND_STRING("yonn");}break;
case C_yonn_057: if (pressed) {SEND_STRING("yonn");}break;
case C_yunn_058: if (pressed) {SEND_STRING("yunn");}break;
case C_yunn_059: if (pressed) {SEND_STRING("yunn");}break;
case C_nn_060: if (pressed) {SEND_STRING("nn");}break;
case C_xtu_061: if (pressed) {SEND_STRING("xtu");}break;
case C_no_062: if (pressed) {SEND_STRING("no");}break;
case C_no_063: if (pressed) {SEND_STRING("no");}break;
case C_no_064: if (pressed) {SEND_STRING("no");}break;
case C_no_065: if (pressed) {SEND_STRING("no");}break;
case C_no_066: if (pressed) {SEND_STRING("no");}break;
case C_ga_067: if (pressed) {SEND_STRING("ga");}break;
case C_ga_068: if (pressed) {SEND_STRING("ga");}break;
case C_ga_069: if (pressed) {SEND_STRING("ga");}break;
case C_mo_070: if (pressed) {SEND_STRING("mo");}break;
case C_mo_071: if (pressed) {SEND_STRING("mo");}break;
case C_mo_072: if (pressed) {SEND_STRING("mo");}break;
case C_mo_073: if (pressed) {SEND_STRING("mo");}break;
case C_to_074: if (pressed) {SEND_STRING("to");}break;
case C_to_075: if (pressed) {SEND_STRING("to");}break;
case C_to_076: if (pressed) {SEND_STRING("to");}break;
case C_to_077: if (pressed) {SEND_STRING("to");}break;
case C_to_078: if (pressed) {SEND_STRING("to");}break;
case C_de_079: if (pressed) {SEND_STRING("de");}break;
case C_de_080: if (pressed) {SEND_STRING("de");}break;
case C_de_081: if (pressed) {SEND_STRING("de");}break;
case C_ne_082: if (pressed) {SEND_STRING("ne");}break;
case C_tsu_083: if (pressed) {SEND_STRING("tsu");}break;
case C_ha_084: if (pressed) {SEND_STRING("ha");}break;
case C_ha_085: if (pressed) {SEND_STRING("ha");}break;
case C_ha_086: if (pressed) {SEND_STRING("ha");}break;
case C_ha_087: if (pressed) {SEND_STRING("ha");}break;
case C_ni_088: if (pressed) {SEND_STRING("ni");}break;
case C_ni_089: if (pressed) {SEND_STRING("ni");}break;
case C_ni_090: if (pressed) {SEND_STRING("ni");}break;
case C_ni_091: if (pressed) {SEND_STRING("ni");}break;
case C_ni_092: if (pressed) {SEND_STRING("ni");}break;
case C_ni_093: if (pressed) {SEND_STRING("ni");}break;
case C_he_094: if (pressed) {SEND_STRING("he");}break;
case C_wo_095: if (pressed) {SEND_STRING("wo");}break;
case C_wo_096: if (pressed) {SEND_STRING("wo");}break;
case C_wo_097: if (pressed) {SEND_STRING("wo");}break;
case C_wo_098: if (pressed) {SEND_STRING("wo");}break;
case C_wo_099: if (pressed) {SEND_STRING("wo");}break;
case C_home_100: if (pressed) {tap_code16(KC_HOME);}break;
case C_end_101: if (pressed) {tap_code16(KC_END);}break;
case C_pgup_102: if (pressed) {tap_code16(KC_PGUP);}break;
case C_pgdown_103: if (pressed) {tap_code16(KC_PGDN);}break;
case C_home_104: if (pressed) {tap_code16(KC_HOME);}break;
case C_end_105: if (pressed) {tap_code16(KC_END);}break;
case C_pgup_106: if (pressed) {tap_code16(KC_PGUP);}break;
case C_pgdown_107: 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]