aboutsummaryrefslogtreecommitdiff
path: root/docs/tap_hold.md
diff options
context:
space:
mode:
authorJames Young <18669334+noroadsleft@users.noreply.github.com>2020-05-30 13:14:59 -0700
committerGitHub <noreply@github.com>2020-05-30 13:14:59 -0700
commitfced377ac007d27f2650ccffbe0b18abcdcfe23d (patch)
treebd5b141987394a5a16cfc416bfe2b9efdb14d067 /docs/tap_hold.md
parent7b8a013826ad90714a05ea522de53adf964ab3b9 (diff)
downloadqmk_firmware-fced377ac007d27f2650ccffbe0b18abcdcfe23d.tar.gz
qmk_firmware-fced377ac007d27f2650ccffbe0b18abcdcfe23d.zip
2020 May 30 Breaking Changes Update (#9215)
* Branch point for 2020 May 30 Breaking Change * Migrate `ACTION_LAYER_TOGGLE` to `TG()` (#8954) * Migrate `ACTION_MODS_ONESHOT` to `OSM()` (#8957) * Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()` (#8958) * Migrate `ACTION_LAYER_MODS` to `LM()` (#8959) * Migrate `ACTION_MODS_TAP_KEY` to `MT()` (#8968) * Convert V-USB usbdrv to a submodule (#8321) * Unify Tap Hold functions and documentation (#8348) * Changing board names to prevent confusion (#8412) * Move the Keyboardio Model01 to a keyboardio/ subdir (#8499) * Move spaceman keyboards (#8830) * Migrate miscellaneous `fn_actions` entries (#8977) * Migrate `ACTION_MODS_KEY` to chained mod keycodes (#8979) * Organizing my keyboards (plaid, tartan, ergoinu) (#8537) * Refactor Lily58 to use split_common (#6260) * Refactor zinc to use split_common (#7114) * Add a message if bin/qmk doesn't work (#9000) * Fix conflicting types for 'tfp_printf' (#8269) * Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup (#6480) * Refactor and updates to TKC1800 code (#8472) * Switch to qmk forks for everything (#9019) * audio refactor: replace deprecated PLAY_NOTE_ARRAY (#8484) * Audio enable corrections (2/3) (#8903) * Split HHKB to ANSI and JP layouts and Add VIA support for each (#8582) * Audio enable corrections (Part 4) (#8974) * Fix typo from PR7114 (#9171) * Augment future branch Changelogs (#8978) * Revert "Branch point for 2020 May 30 Breaking Change"
Diffstat (limited to 'docs/tap_hold.md')
-rw-r--r--docs/tap_hold.md87
1 files changed, 74 insertions, 13 deletions
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index a0b648694..2dc57f03c 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -4,6 +4,38 @@ While Tap-Hold options are fantastic, they are not without their issues. We hav
4 4
5These options let you modify the behavior of the Tap-Hold keys. 5These options let you modify the behavior of the Tap-Hold keys.
6 6
7## Tapping Term
8
9The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
10
11You can set the global time for this by adding the following setting to your `config.h`:
12
13```c
14#define TAPPING_TERM 200
15```
16
17This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
18
19For more granular control of this feature, you can add the following to your `config.h`:
20```c
21#define TAPPING_TERM_PER_KEY
22```
23
24You can then add the following function to your keymap:
25
26```c
27uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
28 switch (keycode) {
29 case SFT_T(KC_SPC):
30 return TAPPING_TERM + 1250;
31 case LT(1, KC_GRV):
32 return 130;
33 default:
34 return TAPPING_TERM;
35}
36```
37
38
7## Permissive Hold 39## Permissive Hold
8 40
9As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option: 41As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
@@ -27,6 +59,25 @@ Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this wil
27 59
28?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`. 60?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
29 61
62For more granular control of this feature, you can add the following to your `config.h`:
63
64```c
65#define PERMISSIVE_HOLD_PER_KEY
66```
67
68You can then add the following function to your keymap:
69
70```c
71bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
72 switch (keycode) {
73 case LT(1, KC_BSPC):
74 return true;
75 default:
76 return false;
77 }
78}
79```
80
30## Ignore Mod Tap Interrupt 81## Ignore Mod Tap Interrupt
31 82
32To enable this setting, add this to your `config.h`: 83To enable this setting, add this to your `config.h`:
@@ -62,13 +113,13 @@ For more granular control of this feature, you can add the following to your `co
62You can then add the following function to your keymap: 113You can then add the following function to your keymap:
63 114
64```c 115```c
65bool get_ignore_mod_tap_interrupt(uint16_t keycode) { 116bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
66 switch (keycode) { 117 switch (keycode) {
67 case SFT_T(KC_SPC): 118 case SFT_T(KC_SPC):
68 return true; 119 return true;
69 default: 120 default:
70 return false; 121 return false;
71 } 122 }
72} 123}
73``` 124```
74 125
@@ -106,12 +157,12 @@ You can then add the following function to your keymap:
106 157
107```c 158```c
108bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) { 159bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
109 switch (keycode) { 160 switch (keycode) {
110 case LT(1, KC_BSPC): 161 case LT(1, KC_BSPC):
111 return true; 162 return true;
112 default: 163 default:
113 return false; 164 return false;
114 } 165 }
115} 166}
116``` 167```
117 168
@@ -126,3 +177,13 @@ To enable `retro tapping`, add the following to your `config.h`:
126Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term. 177Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
127 178
128For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead. 179For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
180
181## Why do we include the key record for the per key functions?
182
183One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
184
185Well, it's simply really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
186
187## Why is there no `*_kb` or `*_user` functions?!
188
189Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.