Last active
April 10, 2021 08:40
-
-
Save ypsilon-takai/c4a249087ea19eabd1deb3f9f273de52 to your computer and use it in GitHub Desktop.
QMKでマクロをリピートできるようにしてみた
This file contains 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
/* | |
* QMKでマクロをリピートできるようにしてみた | |
* ファイルは keymap.c | |
*/ | |
// 通常どおり マクロ用のキーコードを設定する。 | |
enum custom_keycodes { | |
M_REPEAT = SAFE_RANGE, | |
}; | |
//------------------------------------------------------------- | |
// | |
// ソースの先頭の方でフラグ/変数とマクロを定義 | |
// | |
// リピート中かどうかのフラグ | |
static bool is_m_repeat = false; | |
// リピート待ちカウンタ 経過時間を保持している | |
static int m_delay = 0; | |
// リピートまでの待ち時間 (実際の時間はキーボードに依存。適切な値は変えてみて探る) | |
#define M_REPEAT_TH 500 | |
//------------------------------------------------------------- | |
// | |
// 通常マクロを設定するタイミングでフラグを立てる | |
// | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
switch (keycode) { | |
case M_REPEAT: | |
if (record->event.pressed) { | |
// リピート開始のフラグを立てる | |
is_m_repeat = true; | |
} else { | |
// リピート開始のフラグを落す | |
is_m_repeat = false; | |
// カウンタをリセットする | |
m_delay = 0; | |
} | |
break; | |
} | |
return true; | |
}; | |
//------------------------------------------------------------- | |
// | |
// matrix_scan_user関数の中でフラグをチェックして必要なマクロを実行する。 | |
// この関数はQMKががキーの押下をチェックするたび実行される。 | |
// | |
// Runs constantly in the background, in a loop. | |
void matrix_scan_user(void) { | |
// この処理を追加する。 | |
if (is_m_repeat) { | |
// 0のとき=一発目の実行 | |
// しばらく経ってM_REPEAT_THを超えたら毎回実行 | |
if (m_delay == 0 || m_delay > M_REPEAT_TH) { | |
SEND_STRING(SS_TAP(X_LEFT)SS_TAP(X_LEFT)); | |
} | |
// カウンタをカウントアップ | |
m_delay++; | |
} | |
}; | |
This file contains 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
/* | |
* QMKでマクロをリピートできるようにしてみた | |
* ファイルは keymap.c | |
*/ | |
// 通常どおり マクロ用のキーコードを設定する。 | |
enum custom_keycodes { | |
M_LA_5 = SAFE_RANGE, // マクロの名前変更 SAFE_RANGEは開始値を設定しているのでここだけに必要。 | |
M_RA_5 // ★ マクロ追加、こうやって下に増やしていけばよい | |
}; | |
//------------------------------------------------------------- | |
// | |
// ソースの先頭の方でフラグ/変数とマクロを定義 | |
// | |
// M_LA_5 用 | |
static bool is_mla5 = false; | |
static int mla5_delay = 0; | |
// M_RA_5 用 | |
static bool is_mra5 = false; | |
static int mra5_delay = 0; | |
#define M_REPEAT_TH 500 | |
e | |
//------------------------------------------------------------- | |
// | |
// 通常マクロを設定するタイミングでフラグを立てる | |
// | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
switch (keycode) { | |
case M_LA_5: | |
if (record->event.pressed) { | |
// リピート開始のフラグを立てる | |
is_mla5 = true; | |
} else { | |
// リピート開始のフラグを落す | |
is_mla5 = false; | |
// カウンタをリセットする | |
mla5_delay = 0; | |
} | |
break; | |
case M_RA_5: | |
if (record->event.pressed) { | |
// リピート開始のフラグを立てる | |
is_mra5 = true; | |
} else { | |
// リピート開始のフラグを落す | |
is_mra5 = false; | |
// カウンタをリセットする | |
mra5_delay = 0; | |
} | |
break; | |
} | |
return true; | |
}; | |
//------------------------------------------------------------- | |
// | |
// matrix_scan_user関数の中でフラグをチェックして必要なマクロを実行する。 | |
// この関数はQMKががキーの押下をチェックするたび実行される。 | |
// | |
// Runs constantly in the background, in a loop. | |
void matrix_scan_user(void) { | |
// この処理を追加する。 | |
if (is_mla5) { | |
// 0のとき=一発目の実行 | |
// しばらく経ってM_REPEAT_THを超えたら毎回実行 | |
if (mla5_delay == 0 || mla5_delay > M_REPEAT_TH) { | |
SEND_STRING(SS_TAP(X_LEFT)SS_TAP(X_LEFT)); | |
} | |
// カウンタをカウントアップ | |
mla5_delay++; | |
} | |
if (is_mra5) { | |
// 0のとき=一発目の実行 | |
// しばらく経ってM_REPEAT_THを超えたら毎回実行 | |
if (mra5_delay == 0 || mra5_delay > M_REPEAT_TH) { | |
SEND_STRING(SS_TAP(X_RIGHT)SS_TAP(X_RIGHT)); | |
} | |
// カウンタをカウントアップ | |
mra5_delay++; | |
} | |
}; | |
This file contains 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
/* | |
* QMKでマクロをリピートできるようにしてみた | |
* その3:ちょっと書き易くしてみた。 | |
* その代り、マクロキーは1つしか押せません。 | |
* ファイルは keymap.c | |
*/ | |
// 通常どおり マクロ用のキーコードを設定する。 | |
// ★ マクロ追加 | |
enum custom_keycodes { | |
M_LA_5 = SAFE_RANGE, // マクロの名前変更 SAFE_RANGEは開始値を設定しているのでここだけに必要。 | |
M_RA_5, // ★ マクロ追加、こうやって下に増やしていけばよい | |
M_S_RA_5, | |
M_PD_3 | |
}; | |
// | |
// ソースの先頭の方でフラグ/変数とマクロを定義 | |
// | |
// リピート中かどうか | |
static bool is_m_repeat = false; | |
// リピート待ちカウンタ | |
static uint16_t m_delay = 0; | |
// 起動中のマクロの情報 | |
static enum custom_keycodes active_macro; // ★追加 押されているマクロ保存用 | |
// リピートまでの待ちループ回数 (実際の時間はキーボードに依存適当な値は設定しながら探る) | |
#define M_REPEAT_TH 500 | |
// | |
// 通常マクロを設定するタイミングでフラグを立てる | |
// | |
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |
switch (keycode) { | |
case M_LA_5: // 今回は処理を共通にするために、こんなふうにcaseを並べます。 | |
case M_RA_5: // breakが無いとそのまま下を読むので、定義が1つだけで済みます | |
case M_S_RA_5: | |
case M_PD_3: | |
if (record->event.pressed) { | |
is_m_repeat = true; | |
active_macro = keycode; // ★追加 ここで押されたマクロを保存 | |
} else { | |
is_m_repeat = false; | |
m_delay = 0; | |
} | |
break; | |
} | |
return true; | |
}; | |
// | |
// matrix_scan_user関数の中でフラグをチェックして必要なマクロを実行する。 | |
// この関数はQMKががキーの押下をチェックするたび実行される。 | |
// | |
// Runs constantly in the background, in a loop. | |
void matrix_scan_user(void) { | |
// リピート対象マクロの処理 | |
if (is_m_repeat) { | |
if (m_delay == 0 || m_delay > M_REPEAT_TH) { | |
switch (active_macro) { // ★ 押されたマクロによって動作を変更する。 全部2回しか押しませんが。 | |
case M_LA_5: | |
SEND_STRING(SS_TAP(X_LEFT)SS_TAP(X_LEFT)); | |
break; | |
case M_RA_5: | |
SEND_STRING(SS_TAP(X_RIGHT)SS_TAP(X_RIGHT)); | |
break; | |
case M_S_RA_5: | |
SEND_STRING(SS_LSFT(SS_TAP(X_RIGHT))SS_LSFT(SS_TAP(X_RIGHT))); | |
break; | |
case M_PD_3: | |
SEND_STRING(SS_TAP(X_PGDN)SS_TAP(X_PGDN)); | |
break; | |
} | |
} | |
m_delay++; | |
} | |
}; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment