0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QMK firmwareでCtrl+hでbackspaceが入力される様にしたpart2

Posted at

#はじめに
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の通り。

最後に

アプリのショートカットに左右されず快適。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?