Browse Source

[keymap] curly quotes (#9662)

Co-authored-by: Erovia <Erovia@users.noreply.github.com>
Callum Oakley 5 years ago
parent
commit
c50009d5d4

+ 0 - 0
keyboards/planck/keymaps/callum/config.h


+ 83 - 44
keyboards/planck/keymaps/callum/keymap.c

@@ -49,7 +49,7 @@
 #define bspc KC_BSPC
 #define bspc KC_BSPC
 #define caps KC_CAPS
 #define caps KC_CAPS
 #define comm KC_COMM
 #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 scln KC_SCLN
 #define slsh KC_SLSH
 #define slsh KC_SLSH
 #define spc KC_SPC
 #define spc KC_SPC
@@ -60,7 +60,6 @@
 #define mins KC_MINS
 #define mins KC_MINS
 #define quot KC_QUOT
 #define quot KC_QUOT
 #define esc KC_ESC
 #define esc KC_ESC
-#define gbp A(KC_3)
 
 
 #define down KC_DOWN
 #define down KC_DOWN
 #define home G(KC_LEFT)
 #define home G(KC_LEFT)
@@ -75,8 +74,8 @@
 #define tabr G(S(KC_RBRC))
 #define tabr G(S(KC_RBRC))
 #define fwd G(KC_RBRC)
 #define fwd G(KC_RBRC)
 #define back G(KC_LBRC)
 #define back G(KC_LBRC)
-#define slup S(A(KC_UP))
+#define slup S(A(KC_UP))   // Previous unread in Slack
-#define sldn S(A(KC_DOWN))
+#define sldn S(A(KC_DOWN)) // Next unread in Slack
 
 
 #define ctl1 C(KC_1)
 #define ctl1 C(KC_1)
 #define ctl2 C(KC_2)
 #define ctl2 C(KC_2)
@@ -137,6 +136,7 @@ enum planck_layers {
 };
 };
 
 
 enum planck_keycodes {
 enum planck_keycodes {
+    // ASCII
     ampr = SAFE_RANGE,
     ampr = SAFE_RANGE,
     astr,
     astr,
     at,
     at,
@@ -158,6 +158,11 @@ enum planck_keycodes {
     rprn,
     rprn,
     tild,
     tild,
 
 
+    // Curly quotes
+    lcqt,
+    rcqt,
+
+    // "Smart" mods
     cmd,
     cmd,
 };
 };
 
 
@@ -171,7 +176,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 
 
     [SYMB] = LAYOUT_planck_grid(
     [SYMB] = LAYOUT_planck_grid(
          esc,   n7,   n5,   n3,   n1,   n9,   n8,   n0,   n2,   n4,   n6, dash,
          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, ____,
         ____,  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) {
     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;
     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) {
 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
     switch (keycode) {
     switch (keycode) {
         // Override the defualt auto shifted symbols to use SEND_STRING See
         // Override the defualt auto shifted symbols to use SEND_STRING See
         // https://github.com/qmk/qmk_firmware/issues/4072
         // https://github.com/qmk/qmk_firmware/issues/4072
         case ampr:
         case ampr:
-            return send_string_if_keydown(record, "&");
+            return send_string_if_keydown(record, "&", NULL);
         case astr:
         case astr:
-            return send_string_if_keydown(record, "*");
+            return send_string_if_keydown(record, "*", NULL);
         case at:
         case at:
-            return send_string_if_keydown(record, "@");
+            return send_string_if_keydown(record, "@", NULL);
         case bsls:
         case bsls:
-            return send_string_if_keydown(record, "\\");
+            return send_string_if_keydown(record, "\\", NULL);
         case circ:
         case circ:
-            return send_string_if_keydown(record, "^");
+            return send_string_if_keydown(record, "^", NULL);
         case dlr:
         case dlr:
-            return send_string_if_keydown(record, "$");
+            return send_string_if_keydown(record, "$", NULL);
         case eql:
         case eql:
-            return send_string_if_keydown(record, "=");
+            return send_string_if_keydown(record, "=", NULL);
         case exlm:
         case exlm:
-            return send_string_if_keydown(record, "!");
+            return send_string_if_keydown(record, "!", NULL);
         case grv:
         case grv:
-            return send_string_if_keydown(record, "`");
+            return send_string_if_keydown(record, "`", NULL);
         case hash:
         case hash:
-            return send_string_if_keydown(record, "#");
+            return send_string_if_keydown(record, "#", NULL);
         case lbrc:
         case lbrc:
-            return send_string_if_keydown(record, "[");
+            return send_string_if_keydown(record, "[", NULL);
         case lcbr:
         case lcbr:
-            return send_string_if_keydown(record, "{");
+            return send_string_if_keydown(record, "{", NULL);
         case lprn:
         case lprn:
-            return send_string_if_keydown(record, "(");
+            return send_string_if_keydown(record, "(", NULL);
         case perc:
         case perc:
-            return send_string_if_keydown(record, "%");
+            return send_string_if_keydown(record, "%", NULL);
         case pipe:
         case pipe:
-            return send_string_if_keydown(record, "|");
+            return send_string_if_keydown(record, "|", NULL);
         case plus:
         case plus:
-            return send_string_if_keydown(record, "+");
+            return send_string_if_keydown(record, "+", NULL);
         case rbrc:
         case rbrc:
-            return send_string_if_keydown(record, "]");
+            return send_string_if_keydown(record, "]", NULL);
         case rcbr:
         case rcbr:
-            return send_string_if_keydown(record, "}");
+            return send_string_if_keydown(record, "}", NULL);
         case rprn:
         case rprn:
-            return send_string_if_keydown(record, ")");
+            return send_string_if_keydown(record, ")", NULL);
         case tild:
         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
         // cmd + cmd -> cmd + ctl
         case cmd:
         case cmd:
-            if (record->event.pressed) {
+            return smart_cmd(record);
-                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 true;
     return true;
 }
 }

+ 4 - 4
keyboards/planck/keymaps/callum/readme.md

@@ -1,4 +1,4 @@
-# callum's planck layout
+# callums planck layout
 
 
 This is a layout for the grid planck, built with a few ideals in mind:
 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
 - 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
   reach. This includes numbers, and lower numbers are more commonly used than
-  higher ones. (number arrangement borrowed from [dustypomeleau's minidox
+  higher ones. (number arrangement borrowed from [dustypomeleaus minidox
-  layout][].
+  layout][]).
 
 
-[dustypomeleau's minidox layout]: https://github.com/qmk/qmk_firmware/tree/master/keyboards/minidox/keymaps/dustypomerleau
+[dustypomeleaus minidox layout]: https://github.com/qmk/qmk_firmware/tree/master/keyboards/minidox/keymaps/dustypomerleau
 [keymap.c]: keymap.c
 [keymap.c]: keymap.c

+ 7 - 19
keyboards/planck/keymaps/callum/rules.mk

@@ -1,19 +1,7 @@
-# Build Options
+BOOTMAGIC_ENABLE = no
-#   change to "no" to disable the options, or define them in the Makefile in
+MOUSEKEY_ENABLE = no
-#   the appropriate keymap folder that will get included automatically
+CONSOLE_ENABLE = no
-#
+COMMAND_ENABLE = yes
-BOOTMAGIC_ENABLE = no       # Virtual DIP switch configuration(+1000)
+MIDI_ENABLE = no
-MOUSEKEY_ENABLE = no       # Mouse keys(+4700)
+AUDIO_ENABLE = yes
-EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+RGBLIGHT_ENABLE = no
-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