TapDanceの設定(その3・時間差の無い入力)
TapDanceの設定(その2・Shiftキーを組み合わせる)の終わりで紹介したように、TapDanceはタップ or 2連打したタイミングと実際に文字が入力されるタイミングに時間差が生じてしまう。これは仕様なので、完全に避ける方法は無い(はず)だが、見た目だけ時間差無しに入力できるようにすることなら可能である。 その方法は、ACTION_TAP_DANCE_FN_ADVANCED関数の1番目の引数に指定した関数が、TapDanceを設定したキーを押す度に実行されることを利用するものである。
簡単に言うと、「1回タイプした時点ですぐに[を入力し、2連打したら入力済みの[をBackSpaceで削除してから(を入力する」という動作を行うことで、見た目だけ時間差の無い入力を行うという方法である。
具体的なコードで設定方法を解説する。
code:keymap.c
void dance_each_tap (qk_tap_dance_state_t *state, void *user_data) { // キーが押下される都度実行される
switch (state->keycode) {
case TD(TD_LBRC_LPRN):
if (state->count == 1) {
register_code (KC_LBRC);
unregister_code (KC_LBRC);
}
break;
case TD(TD_SCLN_COLN):
if (state->count == 1) {
register_code (KC_SCLN);
unregister_code (KC_SCLN);
}
break;
}
}
void dance_withBS_cln_finished (qk_tap_dance_state_t *state, void *user_data) {
if (!state->interrupted) {
switch (state->keycode) {
case TD(TD_LBRC_LPRN):
if (state->count == 2) {
register_code (KC_BSPC);
unregister_code (KC_BSPC);
register_code (KC_LSFT);
register_code (KC_9);
}
break;
case TD(TD_SCLN_COLN):
if (state->count == 2) {
register_code (KC_BSPC);
unregister_code (KC_BSPC);
register_code (KC_LSFT);
register_code (KC_SCLN);
}
break;
}
}
}
void dance_withBS_cln_reset (qk_tap_dance_state_t *state, void *user_data) {
if (!state->interrupted) {
switch (state->keycode) {
case TD(TD_LBRC_LPRN):
if (state->count == 2) {
unregister_code (KC_LSFT);
unregister_code (KC_9);
}
break;
case TD(TD_SCLN_COLN):
if (state->count == 2) {
unregister_code (KC_LSFT);
unregister_code (KC_SCLN);
}
break;
}
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
TD_LBRC_LPRN = ACTION_TAP_DANCE_FN_ADVANCED(dance_each_tap, dance_withBS_cln_finished, dance_withBS_cln_reset), TD_SCLN_COLN = ACTION_TAP_DANCE_FN_ADVANCED(dance_each_tap, dance_withBS_cln_finished, dance_withBS_cln_reset) };
先に説明した方法との違いは、ACTION_TAP_DANCE_FN_ADVANCED関数の1番目の引数にdance_each_tap関数を指定していることである。先に説明した通り、ACTION_TAP_DANCE_FN_ADVANCED関数の1番目の引数はタイプする都度実行されるので、最初のタイプ(if (state->count == 1))の時点で以下のコードを実行して[を入力しているのである。
code:keymap.c
register_code (KC_LBRC);
unregister_code (KC_LBRC);
そして、TAPPING_TERMで指定した時間が過ぎるか、途中で別のキーが押されたときに実行されるdance_withBS_cln_finished関数において、キーが2連打されていた(if (state->count == 2))場合、以下のコードを実行して、直前に入力された[をBackSpaceで削除して(を入力しているのである。
code:keymap.c
register_code (KC_BSPC);
unregister_code (KC_BSPC);
register_code (KC_LSFT);
register_code (KC_9);
ここでunregister_code (KC_BSPC);を省略すると、BackSpaceを押しつつShiftと9を合わせて押すという処理になってしまうので、そうした事態を避けるため、unregister_code (KC_BSPC);を記述している。
この方法なら時間差無しで入力ができるので、時間差が気になる人は試してみてはどうかと思う。