QMKでタップでIME切り替え/ホールドで装飾キーを設定する

レイヤーキーと英数・かなを同居させる方法は色々みつかったのですが、装飾キーと英数・かなを設定するのは需要がないのか難しすぎるのか、全然情報がなかったんですよね。

で、最終的にこちらの記事を参考にして、QMKのタップダンス機能を使うことで実現できました。

leopardgeckoのブログ
Planckキーボード:Lowerキーのダブルタップでレイヤーをロック(トグル)する。 - leopardgeckoのブログ
Planckキーボード:Lowerキーのダブルタップでレイヤーをロック(トグル)する。 - leopardgeckoのブログ今回はPlanckキーボードというよりはQMK Firmwareの話です。 はじめに 小型キーボードで面倒なことの一つに数値の入力があります。フルサイズのキーボードならテンキーがあ...

基本的には参考記事のまま、まずはタップダンスの設定などをしてください。

今回はタップダンスを適用するキーが2つなので、それぞれにキーコードを割り当てておきます。

// Tap Danceのキーコード設定
enum {
 X_TAP_DANCE_1 = 0,
 X_TAP_DANCE_2
};
#define TAP_L TD(X_TAP_DANCE_1)     // タップで英数、ホールドでCtrl/Command
#define TAP_R TD(X_TAP_DANCE_2)     // タップでかな、ホールドでAlt/Option

次に、これは私の環境が特殊なのかもしれませんが、私用がmacで仕事用がWindowsなので、モードによってキーを変化させるための関数を作っておきます。

判定に使っているis_mac_modeはHelixのファームウェアで用意されている関数です。

// mac/Windows切り替え用の関数

void register_mw(uint16_t keycode_mac, uint16_t keycode_win) {
    if (is_mac_mode()){
    register_code (keycode_mac);
  } else {
    register_code (keycode_win);
  }
};

void unregister_mw(uint16_t keycode_mac, uint16_t keycode_win) {
    if (is_mac_mode()){
    unregister_code (keycode_mac);
  } else {
    unregister_code (keycode_win);
  }
};

で、実際のタップダンスの処理がこちら。

元記事ではタップでIME切り替え、ホールドでレイヤ一時切り替え、ダブルタップでレイヤー切り替えの設定ですが、ダブルタップは使わないので削除してます。

// TAP DANCEの処理

enum {
  SINGLE_TAP = 1,
  SINGLE_HOLD = 2
};

typedef struct {
  bool is_press_action;
  int state;
} tap;

int cur_dance (qk_tap_dance_state_t *state) {
  if (state->count == 1) {
    if (!state->pressed) return SINGLE_TAP;
    else return SINGLE_HOLD;
  }
  else return 6;
}

//instanalize an instance of 'tap' for the 'x' tap dance.
static tap xtap_state = {
  .is_press_action = true,
  .state = 0
};

void x_finished_1 (qk_tap_dance_state_t *state, void *user_data) {
  xtap_state.state = cur_dance(state);
  switch (xtap_state.state) {
    case SINGLE_TAP:                    
        register_mw(KC_LANG2, KC_F13);    // macならLANG2、WindowsならF13を押下
        break;
    case SINGLE_HOLD:                   
        register_mw(KC_LGUI, KC_LCTL);    // macならGUI、WindowsならCtrlを押下
        break;
  }
}

void x_reset_1 (qk_tap_dance_state_t *state, void *user_data) {
  switch (xtap_state.state) {
    case SINGLE_TAP:  
        unregister_mw(KC_LANG2, KC_F13);
        break;
    case SINGLE_HOLD: 
        unregister_mw(KC_LGUI, KC_LCTL);
        clear_mods();    // 同時押し対策。キーを離したときにすべての装飾キーをクリアする
        break;
  }
  xtap_state.state = 0;
}


void x_finished_2 (qk_tap_dance_state_t *state, void *user_data) {
  xtap_state.state = cur_dance(state);
  switch (xtap_state.state) {
    case SINGLE_TAP:                     
        register_mw(KC_LANG1, KC_F14);
        break;
    case SINGLE_HOLD:                   
        register_code(KC_LALT);
        break;
  }
}

void x_reset_2 (qk_tap_dance_state_t *state, void *user_data) {
  switch (xtap_state.state) {
    case SINGLE_TAP:  
        unregister_mw(KC_LANG1, KC_F14); 
        break;
    case SINGLE_HOLD: 
        unregister_code(KC_LALT);
        clear_mods();
        break;
  }
  xtap_state.state = 0;
}

qk_tap_dance_action_t tap_dance_actions[] = {
 [X_TAP_DANCE_1] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished_1, x_reset_1),
 [X_TAP_DANCE_2] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, x_finished_2, x_reset_2),
};

ホールドでレイヤ切り替えの部分を装飾キーの送信に変更すれば動きました。あと、IME切り替えの際に余計なキーコードを送信したくないので、前段で作った関数で出し分けています。

これで、タップで英数・かな、ホールドすると装飾キーになるキーを実装することができました。

このタップダンスを設定したキーは同時押しも可能で、macなら⌘+Optionになります。その場合、同時押し対策とコメントした1行がないと、あとで離したほうの装飾キーが残ってしまうので、タップダンスが発動したら必ず最後にすべての装飾キーをクリアするようにしてあります。

よかったらシェアしてね!

この記事を書いた人

コメント

コメントする

目次
閉じる