From 6274a216f87bad7d6fe9c9a1a4328dbf444fc364 Mon Sep 17 00:00:00 2001 From: Erez Zukerman Date: Tue, 26 Apr 2016 05:25:31 +0300 Subject: [PATCH] [Erez & Jack] Examples for advanced macro stuff --- README.md | 99 +++++++++++++++++- .../erez_experimental/erez_experimental.hex | Bin 50365 -> 52095 bytes .../keymaps/erez_experimental/keymap.c | 45 ++++++-- 3 files changed, 133 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index f5c271f165..749c97c8f1 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,23 @@ This will clear all keys besides the mods currently pressed. If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0). +#### Naming your macros + +If you have a bunch of macros you want to refer to from your keymap, while keeping the keymap easily readable, you can just name them like so: + +``` +#define AUD_OFF M(6) +#define AUD_ON M(7) +#define MUS_OFF M(8) +#define MUS_ON M(9) +#define VC_IN M(10) +#define VC_DE M(11) +#define PLOVER M(12) +#define EXT_PLV M(13) +``` + +As was done on the [Planck default keymap](/keyboard/planck/keymaps/default/keymap.c#L33-L40) + #### Timer functionality It's possible to start timers and read values for time-specific events - here's an example: @@ -227,11 +244,91 @@ if (timer_elapsed(key_timer) < 100) { It's best to declare the `static uint16_t key_timer;` outside of the macro block (top of file, etc). +#### Example 1: Single-key copy/paste (hold to copy, tap to paste) + +With QMK, it's easy to make one key do two things, as long as one of those things is being a modifier. :) So if you want a key to act as Ctrl when held and send the letter R when tapped, that's easy: `CTL_T(KC_R)`. But what do you do when you want that key to send Ctrl-V (paste) when tapped, and Ctrl-C (copy) when held? + +Here's what you do: + + +``` +static uint16_t key_timer; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + } + else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) > 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. + return MACRO( D(LCTL), T(C), U(LCTL), END ); + } + else { + return MACRO( D(LCTL), T(V), U(LCTL), END ); + } + } + break; + } + } + return MACRO_NONE; +}; +``` + +And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for copy/paste. + +#### Example 2: Space Cadet Shift (making it easy to send opening and closing parentheses) + +In the [Modern Space Cadet Keyboard](http://stevelosh.com/blog/2012/10/a-modern-space-cadet/#shift-parentheses), one of cooler features is the Shift Parentheses. To quote Steve Losh: + + > When held while pressing other keys, act like Shift. + > When pressed and released on their own, type an opening or closing parenthesis (left and right shift respectively). + +``` +static uint16_t key_timer; + +const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) +{ + switch(id) { + case 0: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSFT); // we're now holding down Shift. + } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) < 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. + register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren + unregister_code(KC_9); // now let's let go of that key + } + unregister_code(KC_LSFT); // let's release the Shift key now. + } + break; + } + case 1: { + if (record->event.pressed) { + key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key + register_code(KC_RSFT); + } else { + if (timer_elapsed(key_timer) < 150) { + register_code(KC_0); + unregister_code(KC_0); + } + unregister_code(KC_RSFT); + } + break; + } + } + return MACRO_NONE; +}; +``` + +And then, to assign this macro to a key on your keyboard layout, you just use `M(0)` on the key you want to press for left shift/opening parens, and `M(1)` for right shift/closing parens. + ## Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc) Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap: - #include + #include If you use Dvorak, use `keymap_dvorak.h` instead of `keymap_colemak.h` for this line. After including this line, you will get access to: diff --git a/keyboard/ergodox_ez/keymaps/erez_experimental/erez_experimental.hex b/keyboard/ergodox_ez/keymaps/erez_experimental/erez_experimental.hex index aa088456584c85a0efa1e31ad48f6227ee6eff57..3af7ddbb8ee0aad0667f02f1827e632bcbf4868b 100644 GIT binary patch literal 52095 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 diff --git a/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c b/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c index 24ff1c6884..18bace4ebc 100644 --- a/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c +++ b/keyboard/ergodox_ez/keymaps/erez_experimental/keymap.c @@ -7,6 +7,9 @@ #define SYMB 1 // symbols #define MDIA 2 // media keys +#define LSFTO M(0) // Left shift, open parens when tapped +#define RSFTC M(1) // Right shift, close parens when tapped + const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { /* Keymap 0: Basic layer * @@ -17,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------| * | BkSp | A | S | D | F | G |------| |------| H | Alt/J| K | L |; / L2| LGui/' | * |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------| - * | LShift |Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl| RShift | + * |LShift/(|Z/Ctrl| X | C | V | B | | | | N | M | , | . |//Ctrl|RShift/)| * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------' * |Grv/L1| '" |AltShf| Left | Right| | Up | Down | [ | ] | ~L1 | * `----------------------------------' `----------------------------------' @@ -36,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, - KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), + LSFTO, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), LT(SYMB,KC_GRV),KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, ALT_T(KC_APP), KC_LGUI, KC_HOME, @@ -45,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { KC_RGHT, KC_6,KC_7, KC_8, KC_9, KC_0, KC_MINS, TG(SYMB), KC_Y,KC_U, KC_I, KC_O, KC_P, KC_BSLS, KC_H,ALT_T(KC_J),KC_K, KC_L, LT(MDIA,KC_SCLN),GUI_T(KC_QUOT), - MEH_T(KC_NO),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), KC_RSFT, + MEH_T(KC_NO),KC_N,KC_M, KC_COMM,KC_DOT, CTL_T(KC_SLSH), RSFTC, KC_UP, KC_DOWN,KC_LBRC,KC_RBRC, KC_FN1, KC_LALT, CTL_T(KC_ESC), KC_PGUP, @@ -140,17 +143,37 @@ const uint16_t PROGMEM fn_actions[] = { [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols) }; +static uint16_t key_timer; + const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) { - // MACRODOWN only works in this function switch(id) { - case 0: - if (record->event.pressed) { - register_code(KC_RSFT); - } else { - unregister_code(KC_RSFT); + case 0: { + if (record->event.pressed) { + key_timer = timer_read(); // if the key is being pressed, we start the timer. + register_code(KC_LSFT); // we're now holding down Shift. + } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down"). + if (timer_elapsed(key_timer) < 150) { // 150 being 150ms, the threshhold we pick for counting something as a tap. + register_code(KC_9); // sending 9 while Shift is held down gives us an opening paren + unregister_code(KC_9); // now let's let go of that key + } + unregister_code(KC_LSFT); // let's release the Shift key now. + } + break; + } + case 1: { + if (record->event.pressed) { + key_timer = timer_read(); // Now we're doing the same thing, only for the right shift/close paren key + register_code(KC_RSFT); + } else { + if (timer_elapsed(key_timer) < 150) { + register_code(KC_0); + unregister_code(KC_0); + } + unregister_code(KC_RSFT); + } + break; } - break; } return MACRO_NONE; }; @@ -183,3 +206,5 @@ void matrix_scan_user(void) { } }; + +