From c50009d5d4909d55f5511378ba5bf0b4623a0a1c Mon Sep 17 00:00:00 2001 From: Callum Oakley Date: Fri, 10 Jul 2020 02:31:18 +0100 Subject: [PATCH] [keymap] curly quotes (#9662) Co-authored-by: Erovia --- keyboards/planck/keymaps/callum/config.h | 0 keyboards/planck/keymaps/callum/keymap.c | 127 ++++++++++++++-------- keyboards/planck/keymaps/callum/readme.md | 8 +- keyboards/planck/keymaps/callum/rules.mk | 26 ++--- 4 files changed, 94 insertions(+), 67 deletions(-) delete mode 100644 keyboards/planck/keymaps/callum/config.h diff --git a/keyboards/planck/keymaps/callum/config.h b/keyboards/planck/keymaps/callum/config.h deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/keyboards/planck/keymaps/callum/keymap.c b/keyboards/planck/keymaps/callum/keymap.c index 4db54577b0..d9fe43f003 100644 --- a/keyboards/planck/keymaps/callum/keymap.c +++ b/keyboards/planck/keymaps/callum/keymap.c @@ -49,7 +49,7 @@ #define bspc KC_BSPC #define caps KC_CAPS #define comm KC_COMM -#define dash A(KC_MINS) +#define dash A(KC_MINS) // en-dash (–); or with shift: em-dash (—) #define scln KC_SCLN #define slsh KC_SLSH #define spc KC_SPC @@ -60,7 +60,6 @@ #define mins KC_MINS #define quot KC_QUOT #define esc KC_ESC -#define gbp A(KC_3) #define down KC_DOWN #define home G(KC_LEFT) @@ -75,8 +74,8 @@ #define tabr G(S(KC_RBRC)) #define fwd G(KC_RBRC) #define back G(KC_LBRC) -#define slup S(A(KC_UP)) -#define sldn S(A(KC_DOWN)) +#define slup S(A(KC_UP)) // Previous unread in Slack +#define sldn S(A(KC_DOWN)) // Next unread in Slack #define ctl1 C(KC_1) #define ctl2 C(KC_2) @@ -137,6 +136,7 @@ enum planck_layers { }; enum planck_keycodes { + // ASCII ampr = SAFE_RANGE, astr, at, @@ -158,6 +158,11 @@ enum planck_keycodes { rprn, tild, + // Curly quotes + lcqt, + rcqt, + + // "Smart" mods cmd, }; @@ -171,7 +176,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [SYMB] = LAYOUT_planck_grid( esc, n7, n5, n3, n1, n9, n8, n0, n2, n4, n6, dash, - del, at, dlr, eql, lprn, lbrc, rbrc, rprn, astr, hash, plus, gbp, + lcqt, at, dlr, eql, lprn, lbrc, rbrc, rprn, astr, hash, plus, rcqt, ____, grv, pipe, bsls, lcbr, tild, circ, rcbr, ampr, exlm, perc, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____ ), @@ -191,78 +196,112 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { ), }; -bool send_string_if_keydown(keyrecord_t *record, const char *s) { +bool send_string_if_keydown( + keyrecord_t *record, + const char *unshifted, + const char *shifted) { if (record->event.pressed) { - send_string(s); + if (shifted) { + uint8_t shifts = get_mods() & MOD_MASK_SHIFT; + if (shifts) { + del_mods(shifts); + SEND_STRING(shifted); + add_mods(shifts); + } else { + SEND_STRING(unshifted); + } + } else { + SEND_STRING(unshifted); + } } return true; } -int cmd_keys_down = 0; +// Holding both cmd keys will instead register as cmd + ctl +bool smart_cmd(keyrecord_t *record) { + static int cmd_keys_down = 0; + + if (record->event.pressed) { + if (cmd_keys_down == 0) { + register_code(KC_LCMD); + } else { + register_code(KC_LCTL); + } + cmd_keys_down++; + } else { + if (cmd_keys_down == 1) { + unregister_code(KC_LCMD); + } else { + unregister_code(KC_LCTL); + } + cmd_keys_down--; + } + return true; +} bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch (keycode) { // Override the defualt auto shifted symbols to use SEND_STRING See // https://github.com/qmk/qmk_firmware/issues/4072 case ampr: - return send_string_if_keydown(record, "&"); + return send_string_if_keydown(record, "&", NULL); case astr: - return send_string_if_keydown(record, "*"); + return send_string_if_keydown(record, "*", NULL); case at: - return send_string_if_keydown(record, "@"); + return send_string_if_keydown(record, "@", NULL); case bsls: - return send_string_if_keydown(record, "\\"); + return send_string_if_keydown(record, "\\", NULL); case circ: - return send_string_if_keydown(record, "^"); + return send_string_if_keydown(record, "^", NULL); case dlr: - return send_string_if_keydown(record, "$"); + return send_string_if_keydown(record, "$", NULL); case eql: - return send_string_if_keydown(record, "="); + return send_string_if_keydown(record, "=", NULL); case exlm: - return send_string_if_keydown(record, "!"); + return send_string_if_keydown(record, "!", NULL); case grv: - return send_string_if_keydown(record, "`"); + return send_string_if_keydown(record, "`", NULL); case hash: - return send_string_if_keydown(record, "#"); + return send_string_if_keydown(record, "#", NULL); case lbrc: - return send_string_if_keydown(record, "["); + return send_string_if_keydown(record, "[", NULL); case lcbr: - return send_string_if_keydown(record, "{"); + return send_string_if_keydown(record, "{", NULL); case lprn: - return send_string_if_keydown(record, "("); + return send_string_if_keydown(record, "(", NULL); case perc: - return send_string_if_keydown(record, "%"); + return send_string_if_keydown(record, "%", NULL); case pipe: - return send_string_if_keydown(record, "|"); + return send_string_if_keydown(record, "|", NULL); case plus: - return send_string_if_keydown(record, "+"); + return send_string_if_keydown(record, "+", NULL); case rbrc: - return send_string_if_keydown(record, "]"); + return send_string_if_keydown(record, "]", NULL); case rcbr: - return send_string_if_keydown(record, "}"); + return send_string_if_keydown(record, "}", NULL); case rprn: - return send_string_if_keydown(record, ")"); + return send_string_if_keydown(record, ")", NULL); case tild: - return send_string_if_keydown(record, "~"); + return send_string_if_keydown(record, "~", NULL); + + // The macOS shortcuts for curly quotes are horrible, so this rebinds + // them so that shift toggles single–double instead of left–right, and + // then both varieties of left quote can share one key, and both + // varieties of right quote share another. + case lcqt: + return send_string_if_keydown( + record, + SS_LALT("]"), // left single quote (‘) + SS_LALT("[")); // left double quote (“) + case rcqt: + return send_string_if_keydown( + record, + SS_LALT(SS_LSFT("]")), // right single quote (’) + SS_LALT(SS_LSFT("["))); // right double quote (”) // cmd + cmd -> cmd + ctl case cmd: - if (record->event.pressed) { - if (cmd_keys_down == 0) { - register_code(KC_LCMD); - } else { - register_code(KC_LCTL); - } - cmd_keys_down++; - } else { - if (cmd_keys_down == 1) { - unregister_code(KC_LCMD); - } else { - unregister_code(KC_LCTL); - } - cmd_keys_down--; - } - return true; + return smart_cmd(record); } return true; } diff --git a/keyboards/planck/keymaps/callum/readme.md b/keyboards/planck/keymaps/callum/readme.md index 561901b48e..471de2b741 100644 --- a/keyboards/planck/keymaps/callum/readme.md +++ b/keyboards/planck/keymaps/callum/readme.md @@ -1,4 +1,4 @@ -# callum's planck layout +# callum’s planck layout This is a layout for the grid planck, built with a few ideals in mind: @@ -23,8 +23,8 @@ This is a layout for the grid planck, built with a few ideals in mind: - Symbols should be arranged so that the most frequently used are easiest to reach. This includes numbers, and lower numbers are more commonly used than - higher ones. (number arrangement borrowed from [dustypomeleau's minidox - layout][]. + higher ones. (number arrangement borrowed from [dustypomeleau’s minidox + layout][]). -[dustypomeleau's minidox layout]: https://github.com/qmk/qmk_firmware/tree/master/keyboards/minidox/keymaps/dustypomerleau +[dustypomeleau’s minidox layout]: https://github.com/qmk/qmk_firmware/tree/master/keyboards/minidox/keymaps/dustypomerleau [keymap.c]: keymap.c diff --git a/keyboards/planck/keymaps/callum/rules.mk b/keyboards/planck/keymaps/callum/rules.mk index db87d5ecec..9615222d1b 100644 --- a/keyboards/planck/keymaps/callum/rules.mk +++ b/keyboards/planck/keymaps/callum/rules.mk @@ -1,19 +1,7 @@ -# Build Options -# change to "no" to disable the options, or define them in the Makefile in -# the appropriate keymap folder that will get included automatically -# -BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) -MOUSEKEY_ENABLE = no # Mouse keys(+4700) -EXTRAKEY_ENABLE = yes # Audio control and System control(+450) -CONSOLE_ENABLE = no # Console for debug(+400) -COMMAND_ENABLE = yes # Commands for debug and configuration -NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work -BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality -MIDI_ENABLE = no # MIDI controls -AUDIO_ENABLE = yes # Audio output on port C6 -UNICODE_ENABLE = no # Unicode -BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID -RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - -# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE -SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend +BOOTMAGIC_ENABLE = no +MOUSEKEY_ENABLE = no +CONSOLE_ENABLE = no +COMMAND_ENABLE = yes +MIDI_ENABLE = no +AUDIO_ENABLE = yes +RGBLIGHT_ENABLE = no