#はじめに
ctrl+h, shift+ctrl+h, ctrl+iをbackspace, delete, tabに変換するように設定しました。
以前も同様の設定をしましたが、こちらの方がしっかり動いてコードも少ないです。
qmkのdocを眺めていた時に似た様なことをしているコードを見つけたため、それを改修して実装しています。
方法
以前の記事も参考にしてください。
process_record_userの中とその前に書き込んでいきます。
keymap.c
// mod override用変数
uint8_t mod_state;
static bool bspckey_registered = false;
static bool delkey_registered = false;
static bool tabkey_registered = false;
static bool ctrl_pressed = false;
static bool sft_pressed = false;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
current_keycode = keycode;
mod_state = get_mods();
switch (keycode) {
case KC_H:
if (record->event.pressed) {
if (mod_state & MOD_MASK_CTRL) {
if (mod_state & MOD_MASK_SHIFT) {
unregister_code(KC_LCTL);
unregister_code(KC_LSFT);
register_code(KC_DEL);
delkey_registered = true;
return false;
} else {
unregister_code(KC_LCTL);
register_code(KC_BSPC);
bspckey_registered = true;
return false;
}
}
} else {
if (bspckey_registered) {
unregister_code(KC_BSPC);
unregister_code(KC_LCTL);
bspckey_registered = false;
}
if (delkey_registered) {
unregister_code(KC_DEL);
unregister_code(KC_LCTL);
unregister_code(KC_LSFT);
delkey_registered = false;
}
if (ctrl_pressed) {
register_code(KC_LCTL);
}
if (sft_pressed) {
register_code(KC_LSFT);
}
}
return true;
case KC_I:
if (record->event.pressed) {
if (mod_state & MOD_MASK_CTRL) {
unregister_code(KC_LCTL);
register_code(KC_TAB);
tabkey_registered = true;
return false;
}
} else { // on release of KC_BSPC
if (tabkey_registered) {
unregister_code(KC_TAB);
unregister_code(KC_LCTL);
tabkey_registered = false;
if (ctrl_pressed) {
register_code(KC_LCTL);
}
}
}
return true;
case KC_LCTL:
case KANA_C:
if (record->event.pressed) {
ctrl_pressed = true;
} else {
ctrl_pressed = false;
}
return true;
case KC_LSFT:
case EISU_S:
if (record->event.pressed) {
sft_pressed = true;
} else {
sft_pressed = false;
}
return true;
補足
ctrlとshiftの押下に、KC_LSFTやKC_LCRL以外のものを使用している場合にもctrl_pressedとsft_pressedの判定を入れる様にしてください。
上記の例であればKANA_CやEISU_Sの通り。
最後に
アプリのショートカットに左右されず快適。