summary refs log tree commit diff
path: root/users
diff options
context:
space:
mode:
authorJoe Wasson <jwasson+github@gmail.com>2018-09-19 16:13:58 -0700
committerDrashna Jaelre <drashna@live.com>2018-09-19 16:13:58 -0700
commitc23233f41ab9221577fc83bbae0a230452a38231 (patch)
tree659d89fab1b5d8e27642a3de50ac66e33205df83 /users
parent71fe973190610bf155d864c71b8b326bc1b74eab (diff)
Keymap: Talljoe's keymap for oddball keyboards (#3910)
* Create layout for JD45

* Tweak layout to better support JD45 and add more tap dancing.

* Add Maltron and tweak layout for 40% enter compatibility.

* Switch back to `BL_TOGGLE` for backlight.

* More tweaks

* Rename talljoe_gherkin to talljoe-gherkin

* Make NAV layer tab C_S_T also.

* Add missing RESET key.

* Add Talljoe layout for minivan.

* MTI is not for me

* Tweak keymap.

* Add talljoe keymap to Atreus.

* Minor tweaks.

* Fix talljoe keymaps to work with new Zeal60 commit.
Diffstat (limited to 'users')
-rw-r--r--users/talljoe/config.h2
-rw-r--r--users/talljoe/talljoe.c53
-rw-r--r--users/talljoe/talljoe.h76
-rw-r--r--users/talljoe/tapdance.c148
4 files changed, 225 insertions, 54 deletions
diff --git a/users/talljoe/config.h b/users/talljoe/config.h
index 1cdbb5a412..0d06a0b12d 100644
--- a/users/talljoe/config.h
+++ b/users/talljoe/config.h
@@ -1,7 +1,7 @@
 #ifndef USERSPACE_CONFIG_H
 #define USERSPACE_CONFIG_H
 
-#define IGNORE_MOD_TAP_INTERRUPT
+#define PERMISSIVE_HOLD
 
 #define RESET_LAYER 15
 
diff --git a/users/talljoe/talljoe.c b/users/talljoe/talljoe.c
index e9c69b016a..7a343e7768 100644
--- a/users/talljoe/talljoe.c
+++ b/users/talljoe/talljoe.c
@@ -5,10 +5,10 @@
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   [_BASE] = TEMPLATE_TKL(
       KC_ESC,  KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_F9  , KC_F10 , KC_F11 , KC_F12 ,          KC_PSCR, KC_SLCK, MO_ADJ ,
-      KC_GRV , KC_1   , KC_2   , KC_3   , KC_4   , KC_5   , KC_6   , KC_7   , KC_8   , KC_9   , KC_0   , KC_MINS, KC_EQL , KC_BSLS, KC_INS , KC_HOME, KC_PGUP,
-      KC_TAB , KC_Q,    KC_W,    KC_E,    KC_R,    KC_T   , KC_Y,    KC_U,    KC_I,    KC_O,    KC_P   , KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL , KC_END , KC_PGDN,
-      US_CAPS, KC_A,    KC_S,    KC_D,    KC_F,    KC_G   , KC_H,    KC_J,    KC_K,    KC_L,    US_SCLN, US_QUOT,          US_ENT ,
-      KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B   , KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,                   KC_RSFT,          KC_UP  ,
+      US_GRV , KC_1   , KC_2   , KC_3   , KC_4   , KC_5   , KC_6   , KC_7   , KC_8   , KC_9   , KC_0   , KC_MINS, KC_EQL , US_BSLS, KC_INS , KC_HOME, KC_PGUP,
+      US_TAB , KC_Q,    KC_W,    KC_E,    KC_R,    KC_T   , KC_Y,    KC_U,    KC_I,    KC_O,    KC_P   , KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL , KC_END , KC_PGDN,
+      CTL_ESC, KC_A,    KC_S,    KC_D,    KC_F,    KC_G   , KC_H,    KC_J,    KC_K,    KC_L,    US_SCLN, US_QUOT,          US_ENT ,
+      SH_LBRC, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B   , KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,                   SH_RBRC,          KC_UP  ,
       KC_LCTL, KC_LGUI, KC_LALT,                   KC_SPC2, KC_SPC1, KC_SPC3,                   KC_RALT, KC_RGUI, KC_RCTL, KC_PTT , KC_LEFT, KC_DOWN, KC_RGHT),
   [_WORKMAN] = TEMPLATE(
       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
@@ -34,41 +34,44 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
       _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D   , KC_H,    KC_N,    KC_E,    KC_I,    KC_O   , _______,          _______,
       _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B   , KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH,          _______, _______,
       _______, _______, _______,                   _______, _______, _______,                   _______, _______, _______, _______),
-
+#if (SPACE_COUNT > 1)
+  // A tweaked version of the Maltron layout
+  [_MALTROFF] = TEMPLATE(
+      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+      _______, KC_Q,    KC_P,    KC_Y,    KC_G,    KC_B   , KC_J,    KC_M,    KC_U,    KC_K,    KC_L,    _______, _______, _______,
+      _______, KC_A,    KC_N,    KC_I,    KC_S,    KC_F   , KC_D,    KC_T,    KC_H,    KC_O,    KC_R   , US_ENT ,          KC_BSPC,
+      _______, KC_Z,    KC_X,    KC_C,    KC_V,    US_QUOT, KC_SCLN, KC_W,    KC_COMM, KC_DOT,  KC_SLSH,          _______, _______,
+      _______, _______, _______,                   MLT_E  , _______, _______,                   _______, _______, _______, _______),
+#endif
 #ifdef ENABLE_GAME_LAYER
   [_GAME] = TEMPLATE(
       KC_ESC , KC_1   , KC_2   , KC_3   , KC_4   , KC_5   , KC_6   , KC_7   , KC_8   , KC_9   , KC_0   , KC_MINS, KC_EQL , KC_BSLS, KC_GRV,
       KC_TAB , KC_Q   , KC_W   , KC_E   , KC_R   , KC_T   , KC_Y   , KC_U   , KC_I   , KC_O   , KC_P   , KC_LBRC, KC_RBRC, KC_BSPC,
       MO_NAV , KC_A   , KC_S   , KC_D   , KC_F   , KC_G   , KC_H   , KC_J   , KC_K   , KC_L   , KC_SCLN, KC_QUOT,          KC_ENT ,
       KC_LSFT, KC_Z   , KC_X   , KC_C   , KC_V   , KC_B   , KC_N   , KC_M   , KC_COMM, KC_DOT , KC_SLSH,          KC_RSFT, MO_ADJ ,
-      KC_LCTL, KC_PTT , KC_PGDN,                   KC_SPC , KC_SPC , KC_SPC ,                    KC_RALT, KC_APP , KC_RCTL, KC_PTT ),
+      KC_LCTL, KC_PTT , KC_PGDN,                   KC_SPC , KC_SPC , KC_SPC ,                   KC_RALT, KC_APP , KC_RCTL, KC_PTT ),
 #endif
-  [_NAV] = TEMPLATE(
+  [_NAV] = TEMPLATE_NAV(
       KC_GRV , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
-      KC_TAB , KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_VOLU, KC_INS , KC_PGUP, KC_UP  , KC_PGDN, KC_BTN1, KC_BTN2, KC_BTN3, KC_DEL ,
-      US_CAPS, KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_MUTE, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , KC_RCTL,          TG_ADJ ,
-      KC_LSFT, KC_F9  , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_END , KC_PGDN, KC_WBAK, KC_WFWD, KC_WREF,          KC_RSFT, KC_APP ,
+      US_TAB , KC_EXLM, KC_AT  , KC_HASH, KC_DLR , KC_PERC, KC_INS , KC_PGUP, KC_UP  , KC_PGDN, KC_BTN1, KC_BTN3, KC_BTN2, KC_DEL ,
+      CTL_ESC, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_AMPR, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END , US_QUOT,          TG_ADJ ,
+      KC_LSFT, KC_EQL,  KC_PLUS, KC_MINS, KC_UNDS, KC_ASTR, KC_CALC, US_GRV , KC_WBAK, KC_WFWD, KC_WREF,          KC_RSFT, KC_APP ,
       KC_LCTL, KC_LGUI, KC_LALT,                   NV_SPC2, NV_SPC1, NV_SPC3,                   KC_RALT, KC_RGUI, KC_RCTL, KC_PTT ),
-  [_NUM] = TEMPLATE(
+  [_NUM] = TEMPLATE_NUM(
       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
-      KC_GRV , KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, XXXXXXX, KC_DEL ,
-      US_CAPS, KC_LCBR, KC_RCBR, KC_LPRN, KC_RPRN, KC_LBRC, KC_RBRC, KC_4,    KC_5,    KC_6,    KC_PPLS, KC_PENT,          XXXXXXX,
-      KC_LSFT, KC_EQL,  KC_PLUS, KC_BSLS, KC_PIPE, KC_SCLN, XXXXXXX, KC_1,    KC_2,    KC_3,    KC_PAST,          KC_PSLS, XXXXXXX,
+      KC_GRV , KC_F1  , KC_F2  , KC_F3  , KC_F4  , KC_VOLU, KC_CIRC, KC_7,    KC_8,    KC_9,    KC_PMNS, XXXXXXX, XXXXXXX, KC_DEL ,
+      CTL_ESC, KC_F5  , KC_F6  , KC_F7  , KC_F8  , KC_MUTE, KC_PENT, KC_4,    KC_5,    KC_6,    KC_PPLS, XXXXXXX,          KC_ENT ,
+      KC_LSFT, KC_F9  , KC_F10 , KC_F11 , KC_F12 , KC_VOLD, KC_PIPE, KC_1,    KC_2,    KC_3,    KC_PAST,          KC_PSLS, TG_NUM ,
       KC_LCTL, KC_LGUI, KC_LALT,                   NM_SPC2, NM_SPC1, NM_SPC3,                   KC_PDOT, KC_PCMM, KC_RCTL, KC_PTT ),
  // Adjust layer is on the split-shift key; or NAV+Enter (for non-split keyboards)
-  [_ADJUST] = TEMPLATE(
-      MO_RST , FX(1)  , FX(2)  , FX(3)  , FX(4)  , FX(5)  , FX(6)  , FX(7)  , FX(8)  , FX(9)  , FX(10) , BR_DEC , BR_INC , XXXXXXX, MO_RST ,
-      XXXXXXX, H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, KC_DEL ,
+  [_ADJUST] = TEMPLATE_ADJUST(
+      MO_RST , FX(1)  , FX(2)  , FX(3)  , FX(4)  , FX(5)  , FX(8)  , FX(9)  , FX(10) , FX(20) , FX(0)  , BR_DEC , BR_INC , XXXXXXX, MO_RST ,
+      MO_RST , H1_INC , S1_INC , H2_INC , S2_INC , EF_INC , RGB_HUI, RGB_SAI, RGB_MOD, RGB_M_P, DFAULTS, RGB_VAD, RGB_VAI, MO_RST ,
       XXXXXXX, H1_DEC , S1_DEC , H2_DEC , S2_DEC , EF_DEC , RGB_HUD, RGB_SAD, RGB_RMOD,RGB_M_K, RGB_M_B, RGB_M_G,          TG_ADJ ,
-      TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MAKE,          KC_CAPS, XXXXXXX,
-      MO_RST , AG_NORM, AG_SWAP,                   XXXXXXX, BL_STEP, XXXXXXX,                   RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME),
+      TG_NKRO, LY_QWER, LY_WORK, LY_NRMN, LY_DVRK, LY_CLMK, XXXXXXX, LY_MALT, XXXXXXX, XXXXXXX, KC_MAKE,          KC_CAPS, XXXXXXX,
+      MO_RST , AG_SWAP, AG_NORM,                   XXXXXXX, BL_TOGG, XXXXXXX,                   RGB_TOG, XXXXXXX, XXXXXXX, TG_GAME),
   // To Reset hit FN + ` + Esc
-  [_RESET] = TEMPLATE(
-      RESET  , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET  ,
-      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
-      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX,
-      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX,
-      RESET  , XXXXXXX, XXXXXXX,                   XXXXXXX, KC_SLEP, XXXXXXX,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX),
+  [_RESET] = TEMPLATE_RESET,
 };
 
 void matrix_scan_user(void) {
diff --git a/users/talljoe/talljoe.h b/users/talljoe/talljoe.h
index 7c34cd41ff..4436c0a044 100644
--- a/users/talljoe/talljoe.h
+++ b/users/talljoe/talljoe.h
@@ -8,7 +8,7 @@ enum userspace_custom_keycodes {
   DFAULTS,
   TOGGLE_BACKLIGHT,
   EFFECT,
-  EFFECT_END = EFFECT + 10
+  EFFECT_END = EFFECT + 20
 };
 
 #ifndef RESET_LAYER
@@ -21,6 +21,7 @@ enum layers {
     _NORMAN,
     _DVORAK,
     _COLMAK,
+    _MALTROFF,
     _GAME,
     _NAV,
     _NUM,
@@ -29,7 +30,9 @@ enum layers {
 };
 
 enum tap_dancers {
-  TD_SEMICOLON
+  TD_SEMICOLON,
+  TD_GRAVE,
+  TD_QUOTE,
 };
 
 #define _______ KC_TRNS
@@ -39,6 +42,7 @@ enum tap_dancers {
 #define MO_ADJ    MO(_ADJUST)
 #define MO_RST    MO(_RESET)
 #define TG_ADJ    TG(_ADJUST)
+#define TG_NUM    TG(_NUM)
 #ifdef ENABLE_GAME_LAYER
   #define TG_GAME TG(_GAME)
 #else
@@ -49,16 +53,28 @@ enum tap_dancers {
 #define LY_NRMN   DF(_NORMAN)
 #define LY_DVRK   DF(_DVORAK)
 #define LY_CLMK   DF(_COLMAK)
+#if SPACE_COUNT >= 2
+  #define LY_MALT DF(_MALTROFF)
+#else
+  #define LY_MALT KC_NO
+#endif
 #define TG_NKRO   MAGIC_TOGGLE_NKRO
 #define KC_PTT    KC_F24
 #define MS_MID    KC_MS_BTN3
 #define FX(x)     (EFFECT + x)
 
-#define US_CAPS   CTL_T(KC_ESC)
-#define US_QUOT   RCTL_T(KC_QUOT)
+#define CTL_ESC   CTL_T(KC_ESC)
+#define US_ENT    RCTL_T(KC_ENT)
 #define US_MINS   RCTL_T(KC_QUOT)
+#define US_BSLS   LCA_T(KC_BSLS)
 #define US_SCLN   TD(TD_SEMICOLON)
-#define US_ENT    LT(_NUM, KC_ENT)
+#define US_GRV    TD(TD_GRAVE)
+#define US_QUOT   TD(TD_QUOTE)
+#define US_TAB    C_S_T(KC_TAB)
+#define SH_LBRC   LSFT_T(KC_LBRC)
+#define SH_RBRC   RSFT_T(KC_RBRC)
+
+#define MLT_E     LT(_NUM, KC_E)
 
 #ifndef SPACE_COUNT
   #define SPACE_COUNT 1
@@ -75,17 +91,34 @@ enum tap_dancers {
   #define NM_SPC1   _______
   #define NM_SPC2   _______
   #define NM_SPC3   _______
+#elif (SPACE_COUNT == 2)
+  #define KC_SPC1   LT(_NAV,KC_SPC)
+  #define KC_SPC2   LT(_NUM,KC_ENT)
+
+  #define NV_SPC1   KC_SPC
+  #define NV_SPC2   KC_ENT
+
+  #define NM_SPC1   KC_0
+  #define NM_SPC2   KC_SPC
+
+  #define KC_SPC3   XXXXXXX
+  #define NV_SPC3   XXXXXXX
+  #define NM_SPC3   XXXXXXX
 #elif (SPACE_COUNT == 3)
-  #define KC_SPC1   KC_BSPC
+  #ifdef SWAP_HANDS_ENABLE
+    #define KC_SPC1 SH_T(KC_BSPC)
+  #else
+    #define KC_SPC1 KC_BSPC
+  #endif
   #define KC_SPC2   LT(_NUM,KC_ENT)
   #define KC_SPC3   LT(_NAV,KC_SPC)
 
   #define NV_SPC1   KC_SPC
-  #define NV_SPC2   C_S_T(KC_ENT)
+  #define NV_SPC2   KC_ENT
   #define NV_SPC3   KC_SPC
 
-  #define NM_SPC2   XXXXXXX
   #define NM_SPC1   KC_SPC
+  #define NM_SPC2   XXXXXXX
   #define NM_SPC3   KC_0
 #else
   #error "Unsupported space count:" SPACE_COUNT
@@ -110,7 +143,7 @@ enum tap_dancers {
   #define FN_MO2 KC_NO
 #endif
 
-#ifdef TEMPLATE_TKL
+#ifndef TEMPLATE
   #define _X_ KC_NO
   #define TEMPLATE( \
     KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2, KJ6,      \
@@ -126,7 +159,8 @@ enum tap_dancers {
     KN2,      KJ1, KI1, KH1, KG1, KG0, KF0, KF1, KE1, KD1, KR0,      KN3,        _X_,      \
     KA4, KP2, KC6,           KX1, KK6, KX2,           KC0, KM3, KD0, KA1,   _X_, _X_, _X_  \
   )
-#else
+#endif
+#ifndef TEMPLATE_TKL
   #define TEMPLATE_TKL( \
     KJ6,      KI4, KH4, KH2, KH6, KA7, KE6, KD2, KD4, KB4, KB7, KB6, KB0,   KC7, KC5, KA5, \
     KJ4, KJ7, KI7, KH7, KG7, KG4, KF4, KF7, KE7, KD7, KR7, KR4, KE4, KB2,   KL4, KO4, KQ4, \
@@ -143,4 +177,26 @@ enum tap_dancers {
   )
 #endif
 
+#ifndef TEMPLATE_ALT
+  #define TEMPLATE_ALT TEMPLATE
+#endif
+#ifndef TEMPLATE_NUM
+  #define TEMPLATE_NUM TEMPLATE_ALT
+#endif
+#ifndef TEMPLATE_NAV
+  #define TEMPLATE_NAV TEMPLATE_ALT
+#endif
+#ifndef TEMPLATE_ADJUST
+  #define TEMPLATE_ADJUST TEMPLATE_ALT
+#endif
+
+#ifndef TEMPLATE_RESET
+  #define TEMPLATE_RESET TEMPLATE_ALT( \
+      RESET  , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET  ,  \
+      RESET  , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET  ,           \
+      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX,           \
+      XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,          XXXXXXX, XXXXXXX,           \
+      RESET  , XXXXXXX, XXXXXXX,                   XXXXXXX, RESET  , XXXXXXX,                   XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX)
+#endif
+
 #endif
diff --git a/users/talljoe/tapdance.c b/users/talljoe/tapdance.c
index 3198fc67f0..c4d6025f0f 100644
--- a/users/talljoe/tapdance.c
+++ b/users/talljoe/tapdance.c
@@ -1,34 +1,146 @@
 //Tap Dance
 #include "talljoe.h"
 
-// Send semin-colon + enter on two taps
-void tap_dance_semicolon(qk_tap_dance_state_t *state, void *user_data) {
+enum {
+  SINGLE_TAP = 1,
+  SINGLE_HOLD = 2,
+  DOUBLE_TAP = 3,
+  DOUBLE_HOLD = 4,
+  DOUBLE_SINGLE_TAP = 5, //send two single taps
+  TRIPLE_TAP = 6,
+  TRIPLE_HOLD = 7,
+  SPECIAL = 8
+};
+
+static struct {
+  int quote;
+  int semicolon;
+} tap_state = {0};
+
+int cur_dance (qk_tap_dance_state_t *state) {
+  if (state->count == 1) {
+    //If count = 1, and it has been interrupted - it doesn't matter if it is pressed or not: Send SINGLE_TAP
+    if (state->interrupted) {
+      //     if (!state->pressed) return SINGLE_TAP;
+      //need "permissive hold" here.
+      //     else return SINGLE_HOLD;
+      //If the interrupting key is released before the tap-dance key, then it is a single HOLD
+      //However, if the tap-dance key is released first, then it is a single TAP
+      //But how to get access to the state of the interrupting key????
+      return SINGLE_TAP;
+    }
+    else {
+      if (!state->pressed) return SINGLE_TAP;
+      else return SINGLE_HOLD;
+    }
+  }
+  //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
+  //with single tap.
+  else if (state->count == 2) {
+    if (state->interrupted) return DOUBLE_SINGLE_TAP;
+    else if (state->pressed) return DOUBLE_HOLD;
+    else return DOUBLE_TAP;
+  }
+  else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
+  else if (state->count == 3) return TRIPLE_HOLD;
+  else return SPECIAL;
+}
+
+int hold_cur_dance (qk_tap_dance_state_t *state) {
+  if (state->count == 1) {
+    if (state->interrupted) {
+      if (!state->pressed) return SINGLE_TAP;
+      else return SINGLE_HOLD;
+    }
+    else {
+      if (!state->pressed) return SINGLE_TAP;
+      else return SINGLE_HOLD;
+    }
+  }
+  //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
+  //with single tap.
+  else if (state->count == 2) {
+    if (state->pressed) return DOUBLE_HOLD;
+    else return DOUBLE_TAP;
+  }
+  else if (state->count == 3) {
+    if (!state->pressed) return TRIPLE_TAP;
+    else return TRIPLE_HOLD;
+  }
+  else return SPECIAL;
+}
+
+// Send semi-colon + enter on two taps
+void tap_dance_semicolon_finished(qk_tap_dance_state_t *state, void *user_data) {
+  tap_state.semicolon = hold_cur_dance(state);
+  switch (tap_state.semicolon) {
+    case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_SCLN); break;
+    case SINGLE_HOLD: layer_on(_NUM); break;
+  }
+}
+
+void tap_dance_semicolon_reset(qk_tap_dance_state_t *state, void *user_data) {
+  switch (tap_state.semicolon) {
+    case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_SCLN); break;
+    case DOUBLE_TAP: {
+      if (get_mods()) {
+        SEND_STRING(";;"); // send normal when mods are pressed
+      }
+      else {
+        SEND_STRING(";\n");
+      }
+      break;
+    }
+    case TRIPLE_TAP: {
+      SEND_STRING(";\n\n");
+    }
+    case SPECIAL: layer_invert(_NUM); break;
+    case SINGLE_HOLD: layer_off(_NUM); break;
+  }
+  tap_state.semicolon = 0;
+}
+
+// Send `. ~. ```
+void tap_dance_grave_finished(qk_tap_dance_state_t *state, void *user_data) {
   switch(state->count) {
     case 1:
-      register_code(KC_SCLN);
-      unregister_code(KC_SCLN);
+      SEND_STRING("`");
       break;
     case 2:
-      register_code(KC_SCLN);
-      unregister_code(KC_SCLN);
+      SEND_STRING("~");
+      break;
+  }
+}
 
-      uint8_t mods = get_mods();
-      if (mods) {
-        clear_mods();
-      }
+void tap_dance_grave_each(qk_tap_dance_state_t *state, void *user_data) {
+  if(state->count == 3) {
+    SEND_STRING("```");
+  } else if (state->count > 3) {
+    SEND_STRING("`");
+  }
+}
 
-      register_code(KC_ENT);
-      unregister_code(KC_ENT);
 
-      if (mods) {
-        set_mods(mods);
-      }
+void tap_dance_quote_finished(qk_tap_dance_state_t *state, void *user_data) {
+  tap_state.quote = hold_cur_dance(state);
+  switch (tap_state.quote) {
+    case SINGLE_TAP: case DOUBLE_HOLD: register_code(KC_QUOT); break;
+    case SINGLE_HOLD: layer_on(_NAV); break;
+  }
+}
 
-      reset_tap_dance(state);
-      break;
+void tap_dance_quote_reset(qk_tap_dance_state_t *state, void *user_data) {
+  switch (tap_state.quote) {
+    case SINGLE_TAP: case DOUBLE_HOLD: unregister_code(KC_QUOTE); break;
+    case DOUBLE_TAP: SEND_STRING("\""); break;
+    case TRIPLE_TAP: layer_invert(_NAV); break;
+    case SINGLE_HOLD: layer_off(_NAV); break;
   }
+  tap_state.quote = 0;
 }
 
 qk_tap_dance_action_t tap_dance_actions[] = {
-  [TD_SEMICOLON]  = ACTION_TAP_DANCE_FN(tap_dance_semicolon),
+  [TD_SEMICOLON] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_semicolon_finished, tap_dance_semicolon_reset),
+  [TD_GRAVE]     = ACTION_TAP_DANCE_FN_ADVANCED(tap_dance_grave_each, tap_dance_grave_finished, NULL),
+  [TD_QUOTE]     = ACTION_TAP_DANCE_FN_ADVANCED(NULL, tap_dance_quote_finished, tap_dance_quote_reset),
 };