レイヤーキーと英数・かなを同居させる方法は色々みつかったのですが、装飾キーと英数・かなを設定するのは需要がないのか難しすぎるのか、全然情報がなかったんですよね。
で、最終的にこちらの記事を参考にして、QMKのタップダンス機能を使うことで実現できました。
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行がないと、あとで離したほうの装飾キーが残ってしまうので、タップダンスが発動したら必ず最後にすべての装飾キーをクリアするようにしてあります。
コメント