diff options
author | Balz Guenat <balz.guenat@gmail.com> | 2017-11-16 03:23:55 +0100 |
---|---|---|
committer | Jack Humbert <jack.humb@gmail.com> | 2017-11-16 09:39:00 -0500 |
commit | 179d64d33c5b2f881bbced97cc046949691f3757 (patch) | |
tree | ff2159dca730c2eb5fb111c9de07dd394a445659 /docs/feature_macros.md | |
parent | eac4bab342e8cb95248985eb134887d898f2b49e (diff) | |
download | qmk_firmware-179d64d33c5b2f881bbced97cc046949691f3757.tar.gz qmk_firmware-179d64d33c5b2f881bbced97cc046949691f3757.zip |
extend macro docs a bit
Diffstat (limited to 'docs/feature_macros.md')
-rw-r--r-- | docs/feature_macros.md | 54 |
1 files changed, 44 insertions, 10 deletions
diff --git a/docs/feature_macros.md b/docs/feature_macros.md index 66d2bc090..050fb45aa 100644 --- a/docs/feature_macros.md +++ b/docs/feature_macros.md | |||
@@ -8,34 +8,67 @@ Macros allow you to send multiple keystrokes when pressing just one key. QMK has | |||
8 | 8 | ||
9 | ## The new way: `SEND_STRING()` & `process_record_user` | 9 | ## The new way: `SEND_STRING()` & `process_record_user` |
10 | 10 | ||
11 | Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string for you. All ascii that is easily translated to a keycode is supported (eg `\n\t`). | 11 | Sometimes you just want a key to type out words or phrases. For the most common situations we've provided `SEND_STRING()`, which will type out your string (i.e. a sequence of characters) for you. All ASCII characters that are easily translated to a keycode are supported (e.g. `\n\t`). |
12 | 12 | ||
13 | For example: | 13 | For example, you could write in your `keymap.c`: |
14 | |||
15 | ```c | ||
16 | enum custom_keycodes { | ||
17 | MY_CUSTOM_MACRO = SAFE_RANGE | ||
18 | }; | ||
19 | |||
20 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||
21 | if (record->event.pressed) { | ||
22 | switch(keycode) { | ||
23 | case MY_CUSTOM_MACRO: | ||
24 | SEND_STRING("QMK is the best thing ever!"); | ||
25 | return false; break; | ||
26 | } | ||
27 | } | ||
28 | return true; | ||
29 | }; | ||
30 | ``` | ||
31 | |||
32 | To activate this macro, assign the keycode `MY_CUSTOM_MACRO` to one of your keys in your keymap. | ||
33 | |||
34 | What happens here is this: | ||
35 | We first define a new custom keycode in the range not occupied by any other keycodes. | ||
36 | Then we use the `process_record_user` function, which is called whenever a key is pressed or released, to check if our custom keycode has been activated. | ||
37 | If yes, we send the string `"QMK is the best thing ever!"` to the computer via the `SEND_STRING` macro (this is a C preprocessor macro, not to be confused with QMK macros). | ||
38 | We return `false` to indicate to the caller that the key press we just processed need not be processed any further. | ||
39 | |||
40 | You might want to add more than one macro. | ||
41 | You can do that by adding another keycode and adding another case to the switch statement, like so: | ||
14 | 42 | ||
15 | ```c | 43 | ```c |
16 | enum custom_keycodes { | 44 | enum custom_keycodes { |
17 | PRINT_TRUTH = SAFE_RANGE | 45 | MY_CUSTOM_MACRO = SAFE_RANGE, |
46 | MY_OTHER_MACRO | ||
18 | }; | 47 | }; |
19 | 48 | ||
20 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { | 49 | bool process_record_user(uint16_t keycode, keyrecord_t *record) { |
21 | if (record->event.pressed) { | 50 | if (record->event.pressed) { |
22 | switch(keycode) { | 51 | switch(keycode) { |
23 | case PRINT_TRUTH: | 52 | case MY_CUSTOM_MACRO: |
24 | SEND_STRING("QMK is the best thing ever!"); | 53 | SEND_STRING("QMK is the best thing ever!"); |
25 | return false; break; | 54 | return false; break; |
55 | case MY_OTHER_MACRO: | ||
56 | SEND_STRING(SS_LCTRL("ac")); // selects all and copies | ||
57 | return false; break; | ||
26 | } | 58 | } |
27 | } | 59 | } |
28 | return true; | 60 | return true; |
29 | }; | 61 | }; |
30 | ``` | 62 | ``` |
31 | 63 | ||
32 | ### Tap/down/up | 64 | ### TAP, DOWN and UP |
33 | 65 | ||
66 | You may want to use keys in your macros that you can't write down, such as `Ctrl` or `Home`. | ||
34 | You can send arbitary keycodes by wrapping them in: | 67 | You can send arbitary keycodes by wrapping them in: |
35 | 68 | ||
36 | * `SS_TAP()` | 69 | * `SS_TAP()` presses and releases a key. |
37 | * `SS_DOWN()` | 70 | * `SS_DOWN()` presses (but does not release) a key. |
38 | * `SS_UP()` | 71 | * `SS_UP()` releases a key. |
39 | 72 | ||
40 | For example: | 73 | For example: |
41 | 74 | ||
@@ -53,11 +86,12 @@ There's also a couple of mod shortcuts you can use: | |||
53 | * `SS_LGUI(string)` | 86 | * `SS_LGUI(string)` |
54 | * `SS_LALT(string)` | 87 | * `SS_LALT(string)` |
55 | 88 | ||
56 | That can be used like this: | 89 | These press the respective modifier, send the supplied string and then release the modifier. |
90 | They can be used like this: | ||
57 | 91 | ||
58 | SEND_STRING(SS_LCTRL("a")); | 92 | SEND_STRING(SS_LCTRL("a")); |
59 | 93 | ||
60 | Which would send LCTRL+a (LTRL down, a, LTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes. | 94 | Which would send LCTRL+a (LCTRL down, a, LCTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes. |
61 | 95 | ||
62 | ### Alternative keymaps | 96 | ### Alternative keymaps |
63 | 97 | ||