Skip to content

Instantly share code, notes, and snippets.

@ypsilon-takai
Last active April 10, 2021 08:40
Show Gist options
  • Save ypsilon-takai/c4a249087ea19eabd1deb3f9f273de52 to your computer and use it in GitHub Desktop.
Save ypsilon-takai/c4a249087ea19eabd1deb3f9f273de52 to your computer and use it in GitHub Desktop.
QMKでマクロをリピートできるようにしてみた
/*
* 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++;
}
};
/*
* 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++;
}
};
/*
* 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