summaryrefslogtreecommitdiffstats
path: root/users
diff options
context:
space:
mode:
authorYet Another Developer <50936645+yet-another-developer@users.noreply.github.com>2019-10-21 02:07:57 +0800
committerDrashna Jaelre <drashna@live.com>2019-10-20 11:07:56 -0700
commit3d53ea439c277e49cd4149a6caea727304f41ace (patch)
tree1d782a97be651ff911342cbec19cdb18ceeeda62 /users
parentf64d9b06215bb08d7f77aeba126c0804fffd0064 (diff)
[Keymap] Ergodash keymap for yet-another-developer (#7046)
* Initialize ergodash rev 1 keymap ./util/new_keymap.sh ergodash/rev1 yet-another-developer * Add user space configurations referenced from drashna * Start community layout for ergodash in ortho_5x14 * Remove unused layers * Add userspace layers * Add Userspace gitignore Hide Secrets * Remove userspace unused drashna features * Scrap default keymap and follow drashna's template * Add code referenced from kuchosauronad0 * Make sure that the author is named Developer * Replace middle keys del and bksp with curly brace * Reduce ONESHOT_TIMEOUT from 3sec to 2sec * Remove adjust key AG_SWAP * Disable UNICODEMAP_ENABLE, remove code causing build fail * Increase TAPPING_TERM to 240 Reason: Because Space is also LOWER, space sometimes not registering. PS: I dont want to #define RETRO_TAPPING yet * Update KC_MAKE to use :flash * Remove TAP_ONCE, use tap_code Signed-off-by: Developer <anotherdeveloper@icloud.com> * Remove redundant code implementation of keyboard_post_init_user https://github.com/qmk/qmk_firmware/pull/7046 users/yet-another-developer/leader.c ``` static bool has_ran_yet; if (!has_ran_yet) { has_ran_yet = true; startup_user(); ``` Comment for lines +11 – +14 @drashna: Not needed anymore. You can use keyboard_post_init_user now. Signed-off-by: Developer <anotherdeveloper@icloud.com>
Diffstat (limited to 'users')
-rw-r--r--users/yet-another-developer/.gitignore2
-rw-r--r--users/yet-another-developer/README.md7
-rw-r--r--users/yet-another-developer/combo.c27
-rw-r--r--users/yet-another-developer/combo.h21
-rw-r--r--users/yet-another-developer/config.h56
-rw-r--r--users/yet-another-developer/leader.c46
-rw-r--r--users/yet-another-developer/leader.h6
-rw-r--r--users/yet-another-developer/process_records.c193
-rw-r--r--users/yet-another-developer/process_records.h109
-rw-r--r--users/yet-another-developer/rules.mk50
-rw-r--r--users/yet-another-developer/tap_dances.c55
-rw-r--r--users/yet-another-developer/tap_dances.h26
-rw-r--r--users/yet-another-developer/unicode.c62
-rw-r--r--users/yet-another-developer/unicode.h67
-rw-r--r--users/yet-another-developer/wrappers.h166
-rw-r--r--users/yet-another-developer/yet-another-developer.c160
-rw-r--r--users/yet-another-developer/yet-another-developer.h87
17 files changed, 1140 insertions, 0 deletions
diff --git a/users/yet-another-developer/.gitignore b/users/yet-another-developer/.gitignore
new file mode 100644
index 0000000000..d815569141
--- /dev/null
+++ b/users/yet-another-developer/.gitignore
@@ -0,0 +1,2 @@
+secrets.c
+secrets.h \ No newline at end of file
diff --git a/users/yet-another-developer/README.md b/users/yet-another-developer/README.md
new file mode 100644
index 0000000000..3e528bcf5d
--- /dev/null
+++ b/users/yet-another-developer/README.md
@@ -0,0 +1,7 @@
+# User Space for yet-another-developer
+
+
+## Reference / Inspiration
+ - /u/kuchosauronad0
+ - /u/drashna
+ - /u/not-quite-neo \ No newline at end of file
diff --git a/users/yet-another-developer/combo.c b/users/yet-another-developer/combo.c
new file mode 100644
index 0000000000..b4e8e84ae5
--- /dev/null
+++ b/users/yet-another-developer/combo.c
@@ -0,0 +1,27 @@
+#include "combo.h"
+
+void process_combo_event(uint8_t combo_index, bool pressed){
+ switch(combo_index) {
+ case ZV_COPY:
+ if (pressed) {
+ tap_code16(LCTL(KC_C));
+ }
+ break;
+ case XV_CUT:
+ if (pressed) {
+ tap_code16(LCTL(KC_X));
+ }
+ break;
+
+ case CV_PASTE:
+ if (pressed) {
+ tap_code16(LCTL(KC_V));
+ }
+ break;
+ case QP_SLEEP:
+ if (pressed) {
+ tap_code16(KC_SYSTEM_SLEEP);
+ }
+ break;
+ }
+}
diff --git a/users/yet-another-developer/combo.h b/users/yet-another-developer/combo.h
new file mode 100644
index 0000000000..e2ff09ab5a
--- /dev/null
+++ b/users/yet-another-developer/combo.h
@@ -0,0 +1,21 @@
+#pragma once
+#include "quantum.h"
+enum combo_events {
+ ZV_COPY,
+ XV_CUT,
+ CV_PASTE,
+ QP_SLEEP
+};
+
+const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_V, COMBO_END};
+const uint16_t PROGMEM cut_combo[] = {KC_X, KC_V, COMBO_END};
+const uint16_t PROGMEM paste_combo[] = {KC_C, KC_V, COMBO_END};
+const uint16_t PROGMEM sleep_combo[] = {KC_Q, KC_P, COMBO_END};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [ZV_COPY] = COMBO_ACTION(copy_combo),
+ [XV_CUT] = COMBO_ACTION(cut_combo),
+ [CV_PASTE] = COMBO_ACTION(paste_combo),
+ [QP_SLEEP] = COMBO_ACTION(sleep_combo),
+};
+
diff --git a/users/yet-another-developer/config.h b/users/yet-another-developer/config.h
new file mode 100644
index 0000000000..d46d487fe3
--- /dev/null
+++ b/users/yet-another-developer/config.h
@@ -0,0 +1,56 @@
+#pragma once
+
+/* Set Polling rate to 1000Hz */
+#define USB_POLLING_INTERVAL_MS 1
+
+#ifndef ONESHOT_TAP_TOGGLE
+ #define ONESHOT_TAP_TOGGLE 2
+#endif // !ONESHOT_TAP_TOGGLE
+
+#ifndef ONESHOT_TIMEOUT
+ #define ONESHOT_TIMEOUT 2000
+#endif // !ONESHOT_TIMEOUT
+
+#ifndef QMK_KEYS_PER_SCAN
+ #define QMK_KEYS_PER_SCAN 4
+#endif // !QMK_KEYS_PER_SCAN
+
+#if defined(LEADER_ENABLE)
+ #define LEADER_PER_KEY_TIMING
+ #define LEADER_TIMEOUT 250
+#endif // !LEADER_ENABLE
+
+#if defined(COMBO_ENABLE)
+ #define COMBO_COUNT 4
+ #define COMBO_TERM 150
+#endif // !COMBO_ENABLE
+
+#if defined(NKRO_ENABLE)
+ #define FORCE_NKRO
+#endif // !NKRO_ENABLE
+
+// this makes it possible to do rolling combos (zx) with keys that
+// convert to other keys on hold (z becomes ctrl when you hold it,
+// and when this option isn't enabled, z rapidly followed by x
+// actually sends Ctrl-x. That's bad.)
+#define IGNORE_MOD_TAP_INTERRUPT
+#undef PERMISSIVE_HOLD
+//#define TAPPING_FORCE_HOLD
+//#define RETRO_TAPPING
+
+#ifndef TAPPING_TOGGLE
+ #define TAPPING_TOGGLE 1
+#endif
+
+#ifdef TAPPING_TERM
+# undef TAPPING_TERM
+#endif // !TAPPING_TERM
+#if defined(KEYBOARD_ergodash)
+ #define TAPPING_TERM 240
+#else
+ #define TAPPING_TERM 200
+#endif
+
+#define TAP_CODE_DELAY 5 //DEFAULT: 100
+
+#define MACRO_TIMER 5
diff --git a/users/yet-another-developer/leader.c b/users/yet-another-developer/leader.c
new file mode 100644
index 0000000000..3cbbf8d70e
--- /dev/null
+++ b/users/yet-another-developer/leader.c
@@ -0,0 +1,46 @@
+#include "leader.h"
+
+LEADER_EXTERNS();
+
+// Runs constantly in the background, in a loop.
+void matrix_scan_user(void){
+
+#ifdef TAP_DANCE_ENABLE // Run Diablo 3 macro checking code.
+// run_diablo_macro_check();
+#endif // TAP_DANCE_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+ matrix_scan_rgb();
+#endif // RGBLIGHT_ENABLE
+
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ SEQ_TWO_KEYS(KC_V, KC_Z){
+ // vim: Zoom pane
+ tap_code16(LCTL(KC_W));
+ tap_code16(LSFT(KC_BSLS));
+ }
+
+ SEQ_TWO_KEYS(KC_V, KC_R) {
+ // vim: Substitute and place cursor
+ SEND_STRING(":%s///g" SS_TAP(X_LEFT));
+ tap_code(KC_LEFT);
+ tap_code(KC_LEFT);
+ }
+
+ SEQ_TWO_KEYS(KC_V, KC_T) {
+ // vim: move current pane to new tab
+ tap_code16(LCTL(KC_W));
+ tap_code16(LSFT(KC_T));
+ }
+
+ SEQ_THREE_KEYS(KC_BSPC, KC_BSPC, KC_BSPC){
+ // Reset the keyboard
+ reset_keyboard();
+ }
+ }
+
+ matrix_scan_keymap();
+}
diff --git a/users/yet-another-developer/leader.h b/users/yet-another-developer/leader.h
new file mode 100644
index 0000000000..7ed6c8a82c
--- /dev/null
+++ b/users/yet-another-developer/leader.h
@@ -0,0 +1,6 @@
+#pragma once
+#include "yet-another-developer.h"
+
+#include "leader.h"
+
+void matrix_scan_user(void);
diff --git a/users/yet-another-developer/process_records.c b/users/yet-another-developer/process_records.c
new file mode 100644
index 0000000000..c7dbd704a0
--- /dev/null
+++ b/users/yet-another-developer/process_records.c
@@ -0,0 +1,193 @@
+#include "yet-another-developer.h"
+
+uint16_t copy_paste_timer;
+
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+__attribute__ ((weak))
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+// Defines actions for my global custom keycodes. Defined in yet-another-developer.h file
+// Then runs the _keymap's record handier if not processed here
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ // If console is enabled, it will print the matrix position and status of each key pressed
+#ifdef KEYLOGGER_ENABLE
+ #if defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_keebio_iris_rev2)
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.row, record->event.key.col, record->event.pressed);
+ #else
+ xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+ #endif
+#endif //KEYLOGGER_ENABLE
+
+ switch (keycode) {
+ case KC_QWERTY ... KC_UNICODE:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY);
+ }
+ break;
+
+ case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
+ if (!record->event.pressed) {
+ clear_mods();
+ clear_oneshot_mods();
+ send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
+ {
+ send_string_with_delay_P(PSTR(":flash"), TAP_CODE_DELAY);
+ }
+ }
+ break;
+
+ /* Tap Dance */
+ case MC_QT1: // ""
+ if(record->event.pressed){
+ SEND_STRING("\"\"");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_QT2: // ''
+ if(record->event.pressed){
+ SEND_STRING("''");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_QT3: // `'
+ if(record->event.pressed){
+ SEND_STRING("`'");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_PAR: // Parenthesis
+ if(record->event.pressed){
+ SEND_STRING("()");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_CUR: // Curly bracket
+ if(record->event.pressed){
+ SEND_STRING("{}");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_SQR: // Square bracket
+ if(record->event.pressed){
+ SEND_STRING("[]");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MC_ABR: // Angle bracket
+ if(record->event.pressed){
+ SEND_STRING("<>");
+ tap_code(KC_LEFT);
+ }
+ break;
+ case MCT_NEW: // New Tmux Session
+ if(record->event.pressed){
+ SEND_STRING(":neww");
+ tap_code(KC_ENT);
+ }
+ break;
+ case MCT_SH: // Tmux horizontal split
+ if(record->event.pressed){
+ SEND_STRING("%");
+ }
+ break;
+ case MCT_SV: // Tmux vertical split
+ if(record->event.pressed){
+ SEND_STRING("\"");
+ }
+ break;
+ case MCT_ZM: // Tmux zoom
+ if(record->event.pressed){
+ tap_code(KC_Z);
+ }
+ break;
+ case MCT_SCR: // Tmux scroll mode
+ if(record->event.pressed){
+ tap_code(KC_PGUP);
+ }
+ break;
+ case MCT_UP: // Tmux up
+ break;
+ case MCT_DW: // Tmux down
+ break;
+ case MCT_LFT: // Tmux left
+ break;
+ case MCT_RGT: // Tmux right
+ tap_code(KC_RIGHT);
+ break;
+ case MCV_B: // Vim begin of line
+ if(record->event.pressed){
+ tap_code(KC_0);
+ }
+ break;
+ case MCV_E: // Vim end of line
+ if(record->event.pressed){
+ SEND_STRING(":vsplit");
+ tap_code(KC_ENT);
+ }
+ break;
+ case MCT_F: // Vim for loop
+ if(record->event.pressed){
+ SEND_STRING(":help");
+ tap_code(KC_ENT);
+ }
+ break;
+
+ case VRSN: // Prints firmware version
+ if (record->event.pressed) {
+ send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY);
+ }
+ break;
+
+
+ case KC_CCCV: // One key copy/paste
+ if (record->event.pressed) {
+ copy_paste_timer = timer_read();
+ } else {
+ if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
+ register_code(KC_LCTL);
+ tap_code(KC_C);
+ unregister_code(KC_LCTL);
+ } else { // Tap, paste
+ register_code(KC_LCTL);
+ tap_code(KC_V);
+ unregister_code(KC_LCTL);
+ }
+ }
+ break;
+#ifdef UNICODE_ENABLE
+ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
+ if (record->event.pressed) {
+ send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
+ }
+ break;
+ case UC_TABL: // ┬─┬ノ( º _ ºノ)
+ if (record->event.pressed) {
+ send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
+ }
+ break;
+ case UC_SHRG: // ¯\_(ツ)_/¯
+ if (record->event.pressed) {
+ send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
+ }
+ break;
+ case UC_DISA: // ಠ_ಠ
+ if (record->event.pressed) {
+ send_unicode_hex_string("0CA0 005F 0CA0");
+ }
+ break;
+#endif // UNICODE_ENABLE
+ }
+
+ return process_record_keymap(keycode, record) &&
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+ process_record_user_rgb(keycode, record) &&
+#endif // RGBLIGHT_ENABLE
+ process_record_secrets(keycode, record);
+}
diff --git a/users/yet-another-developer/process_records.h b/users/yet-another-developer/process_records.h
new file mode 100644
index 0000000000..d4576f541e
--- /dev/null
+++ b/users/yet-another-developer/process_records.h
@@ -0,0 +1,109 @@
+#pragma once
+#include "yet-another-developer.h"
+
+#if defined(KEYMAP_SAFE_RANGE)
+# define PLACEHOLDER_SAFE_RANGE KEYMAP_SAFE_RANGE
+#else
+# define PLACEHOLDER_SAFE_RANGE SAFE_RANGE
+#endif
+
+enum userspace_custom_keycodes {
+ VRSN = PLACEHOLDER_SAFE_RANGE, // Prints QMK Firmware and board info
+ KC_QWERTY, // Sets default layer to QWERTY
+ KC_COLEMAK, // Sets default layer to COLEMAK
+ KC_DVORAK, // Sets default layer to DVORAK
+ KC_WORKMAN, // Sets default layer to WORKMAN
+ KC_UNICODE, // Sets default layer to UNICOD
+
+ KC_MAKE, // Run keyboard's customized make command
+ KC_SECRET_1, // test1
+ KC_SECRET_2, // test2
+ KC_SECRET_3, // test3
+ KC_SECRET_4, // test4
+ KC_SECRET_5, // test5
+ KC_CCCV, // Hold to copy, tap to paste
+ KC_NUKE, // NUCLEAR LAUNCH DETECTED!!!
+ UC_FLIP, // (ಠ痊ಠ)┻━┻
+ UC_TABL, // ┬─┬ノ( º _ ºノ)
+ UC_SHRG, // ¯\_(ツ)_/¯
+ UC_DISA, // ಠ_ಠ
+
+ MC_QT1, // ""
+ MC_QT2, // ''
+ MC_QT3, // `'
+ MC_PAR, // Parenthesis
+ MC_CUR, // Curly bracket
+ MC_SQR, // Square bracket
+ MC_ABR, // Angle bracket
+ MCT_NEW, // New Tmux Session
+ MCT_SH, // Tmux horizontal split
+ MCT_SV, // Tmux vertical split
+ MCT_ZM, // Tmux zoom
+ MCT_SCR, // Tmux scroll mode
+ MCT_UP, // Tmux up
+ MCT_DW, // Tmux down
+ MCT_LFT, // Tmux left
+ MCT_RGT, // Tmux right
+ MCV_B, // Vim begin of line
+ MCV_E, // Vim end of line
+ MCT_F, // Vim for loop
+ MCG_A, // Git add
+ MCG_C, // Git commit
+ MCG_P, // Git push
+ MCG_R, // Git revert
+ MCG_L, // Git log
+ MCG_S, // Git status
+
+ NEW_SAFE_RANGE // use "NEWPLACEHOLDER for keymap specific codes
+};
+
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+bool process_record_keymap( uint16_t keycode, keyrecord_t *record);
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+#define TG_MODS TG(_MODS)
+#define OS_LWR OSL(_LOWER)
+#define OS_RSE OSL(_RAISE)
+#define OS_UNI OSL(_UNICODE)
+
+#define KC_SEC1 KC_SECRET_1
+#define KC_SEC2 KC_SECRET_2
+#define KC_SEC3 KC_SECRET_3
+#define KC_SEC4 KC_SECRET_4
+#define KC_SEC5 KC_SECRET_5
+
+#define QWERTY KC_QWERTY
+#define DVORAK KC_DVORAK
+#define COLEMAK KC_COLEMAK
+#define WORKMAN KC_WORKMAN
+#define UNICODE KC_UNICODE
+
+#define KC_RESET RESET
+#define KC_RST KC_RESET
+
+#define BK_LWER LT(_LOWER, KC_BSPC)
+#define SP_LWER LT(_LOWER, KC_SPC)
+#define DL_RAIS LT(_RAISE, KC_DEL)
+#define ET_RAIS LT(_RAISE, KC_ENTER)
+
+/* OSM keycodes, to keep things clean and easy to change */
+#define KC_MLSF OSM(MOD_LSFT)
+#define KC_MRSF OSM(MOD_RSFT)
+
+#define OS_LGUI OSM(MOD_LGUI)
+#define OS_RGUI OSM(MOD_RGUI)
+#define OS_LSFT OSM(MOD_LSFT)
+#define OS_RSFT OSM(MOD_RSFT)
+#define OS_LCTL OSM(MOD_LCTL)
+#define OS_RCTL OSM(MOD_RCTL)
+#define OS_LALT OSM(MOD_LALT)
+#define OS_RALT OSM(MOD_RALT)
+#define OS_MEH OSM(MOD_MEH)
+#define OS_HYPR OSM(MOD_HYPR)
+
+#define ALT_APP ALT_T(KC_APP)
+
+#define UC_IRNY UC(0x2E2E)
+#define UC_CLUE UC(0x203D)
diff --git a/users/yet-another-developer/rules.mk b/users/yet-another-developer/rules.mk
new file mode 100644
index 0000000000..597df6d0b9
--- /dev/null
+++ b/users/yet-another-developer/rules.mk
@@ -0,0 +1,50 @@
+SRC += yet-another-developer.c \
+ process_records.c
+
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+SPACE_CADET_ENABLE = no
+
+ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
+ SRC += tap_dances.c
+endif
+
+ifeq ($(strip $(COMBO_ENABLE)), yes)
+ SRC += combo.c
+endif
+
+
+ifeq ($(strip $(LEADER_ENABLE)), yes)
+ SRC += leader.c
+endif
+
+
+ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+endif
+
+
+ifeq ($(strip $(NO_SECRETS)), yes)
+ OPT_DEFS += -DNO_SECRETS
+endif
+
+
+ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
+ SRC += unicode.c
+endif
+
+
+ifeq ($(strip $(MACROS_ENABLED)), yes)
+ OPT_DEFS += -DMACROS_ENABLED
+endif
+
+
+ifdef CONSOLE_ENABLE
+ ifeq ($(strip $(KEYLOGGER_ENABLE)), yes)
+ OPT_DEFS += -DKEYLOGGER_ENABLE
+ endif
+endif
+
+
+ifeq ($(strip $(MAKE_BOOTLOADER)), yes)
+ OPT_DEFS += -DMAKE_BOOTLOADER
+endif
diff --git a/users/yet-another-developer/tap_dances.c b/users/yet-another-developer/tap_dances.c
new file mode 100644
index 0000000000..66dcc60fa5
--- /dev/null
+++ b/users/yet-another-developer/tap_dances.c
@@ -0,0 +1,55 @@
+#include "tap_dances.h"
+
+void td_parenthesis (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count == 1) {
+// SEND_STRING ("\(");
+ tap_code(KC_QUOT);
+ reset_tap_dance (state);
+ }
+ else if (state->count == 2) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count == 3) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count == 4) {
+ SEND_STRING("{}" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+ else if (state->count >= 5) {
+ SEND_STRING("<>" SS_TAP(X_LEFT));
+ reset_tap_dance (state);
+ }
+}
+
+void safe_reset(qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count >= 3) {
+ // Reset the keyboard if you tap the key more than three times
+ reset_keyboard();
+ reset_tap_dance(state);
+ }
+}
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_RESET] = ACTION_TAP_DANCE_FN(safe_reset),
+ [TD_NUM1] = ACTION_TAP_DANCE_DOUBLE(KC_1, KC_4),
+ [TD_NUM2] = ACTION_TAP_DANCE_DOUBLE(KC_2, KC_5),
+ [TD_NUM3] = ACTION_TAP_DANCE_DOUBLE(KC_3, KC_6),
+ [TD_QT1] = ACTION_TAP_DANCE_DOUBLE(KC_QUOT, MC_QT1),
+ [TD_QT2] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_QUOT), MC_QT2),
+ [TD_QT3] = ACTION_TAP_DANCE_DOUBLE(KC_GRV, MC_QT3),
+
+ [TD_EOL] = ACTION_TAP_DANCE_DOUBLE(KC_E, MC_EOL), // end of line
+ [TD_BOL] = ACTION_TAP_DANCE_DOUBLE(KC_A, MC_BOL), // beginning of line
+ [TD_NW] = ACTION_TAP_DANCE_DOUBLE(KC_F, MC_NW), // next word
+ [TD_PW] = ACTION_TAP_DANCE_DOUBLE(KC_B, MC_PW), // pevious word
+ [TD_DW] = ACTION_TAP_DANCE_DOUBLE(KC_W, MC_DW), // pevious word
+
+ [TD_SPC] = ACTION_TAP_DANCE_FN(td_parenthesis), // \(, (), [], {}, <>
+ [TD_PAR] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN, MC_PAR), // ()
+ [TD_SQR] = ACTION_TAP_DANCE_DOUBLE(KC_LBRC, MC_SQR), // []
+ [TD_CUR] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_LCBR), MC_CUR),// {}
+ [TD_ABR] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_COMM), MC_ABR),//
+};
diff --git a/users/yet-another-developer/tap_dances.h b/users/yet-another-developer/tap_dances.h
new file mode 100644
index 0000000000..8afda817cb
--- /dev/null
+++ b/users/yet-another-developer/tap_dances.h
@@ -0,0 +1,26 @@
+#pragma once
+#include "yet-another-developer.h"
+
+#ifdef TAP_DANCE_ENABLE
+enum {
+ TD_RESET = 0,
+ TD_SPC, // for special function td_parenthesis testing
+ TD_NUM1, // compact gaming numpad
+ TD_NUM2, //
+ TD_NUM3, //
+ TD_TMX, // tmux control sequence
+ TD_EOL, // end of line
+ TD_BOL, // beginning of line
+ TD_NW, // next word
+ TD_PW, // pevious word
+ TD_DW, // delete word
+ TD_QT1, // single double quote for '
+ TD_QT2, // single double quote for "
+ TD_QT3, // single double quote for `
+ TD_PAR, // single double parenthesis
+ TD_CUR, // single double curly braces
+ TD_SQR, // single double square brackets
+ TD_ABR // single double angle brackets
+};
+#endif // TAP_DANCE_ENABLE
+void td_parenthesis (qk_tap_dance_state_t *state, void *user_data);
diff --git a/users/yet-another-developer/unicode.c b/users/yet-another-developer/unicode.c
new file mode 100644
index 0000000000..8b312deb66
--- /dev/null
+++ b/users/yet-another-developer/unicode.c
@@ -0,0 +1,62 @@
+#include "unicode.h"
+
+//#ifdef UNICODEMAP_ENABLE
+const uint32_t PROGMEM unicode_map[] = {
+ [BANG] = 0x0203D,// ‽
+ [IRONY] = 0x02E2E,// ⸮
+ [DEGREE] = 0x000B0,// °
+ [THINK] = 0x1F914,// 🤔
+ [GRIN] = 0x1F600,// �
+ [MONOCL] = 0x1F9D0,// 🧐
+ [DRUG0] = 0x1F92A,// 🤪
+ [DRUG1] = 0x1F974,// 🥴
+ [CLOWN] = 0x1F921,// 🤡
+ [MNDBLWN] = 0x1F92F,// 🤯
+ [MONEY] = 0x1F911,// 🤑
+ [SHTUP] = 0x1F910,// 🤐
+ [PARTY] = 0x1F973,// 🥳
+ [SMRK] = 0x1F60F,// 😏
+ [WEARY] = 0x1F629,// 😩
+ [UNAMU] = 0x1F612,// 😒
+ [SPY] = 0x1F575,//🕵
+ [DAFUQ] = 0x1F47A,// 👺
+ [FIST0] = 0x1F91B,// 🤛
+ [FIST1] = 0x1F91C,// 🤜
+ [FIST2] = 0x270A, // ✊
+ [FIST3] = 0x1F44A,// 👊
+ [WIFIHAND] = 0x1F44B,// 👋
+ [OKOK] = 0x1F44C,// 👌
+ [EFFU] = 0x1F595,// 🖕
+ [SPOCK] = 0x1F596,// 🖖
+ [INUP] = 0x1F446,// 👆
+ [THDN] = 0x1F44E,// 👎
+ [THUP] = 0x1F44D,// 👍
+ [TUMBLER] = 0x1F943,// 🥃
+ [DRAGON0] = 0x1F409,// 🐉
+ [DRAGON1] = 0x1F432,// 🐲
+ [TIGER0] = 0x1F405,// 🐅
+ [TIGER1] = 0x1F42F,// 🐯
+ [COOL] = 0x1F192,// 🆒
+ [UCHART] = 0x1F4C8,// 📈
+ [DCHART] = 0x1F4C9,// 📉
+ [BCHART] = 0x1F4CA,// 📊
+ [NOPRCY] = 0x1F572,// 🕲
+ [PRCY] = 0x1F571,// 🕱
+ [BBB] = 0x1F171,// 🅱
+ [POO] = 0x1F4A9,// 💩
+ [HUNDR] = 0x1F4AF,// 💯
+ [EGGPL] = 0x1F346,// 🍆
+ [WATER] = 0x1F4A6,// 💦
+ [LIT] = 0x1F525,// 🔥
+ [SNEK] = 0x1F40D,// 🐍
+ [PENGUIN] = 0x1F427,// 🐧
+ [BOAR] = 0x1F417,// 🐗
+ [MONKEY] = 0x1F412,// 🐒
+ [CHICK] = 0x1F425,// 🐥
+ [DASH] = 0x1F4A8,// 💨
+ [DIZZY] = 0x1F4AB,// 💫
+ [KEEB] = 0x1F5AE,// 🖮
+ [HOLE] = 0x1F573,// 🕳
+ [SAUCER] = 0x1F6F8// 🛸
+ };
+//#endif // UNICODEMAP_ENABLE
diff --git a/users/yet-another-developer/unicode.h b/users/yet-another-developer/unicode.h
new file mode 100644
index 0000000000..cb550243ee
--- /dev/null
+++ b/users/yet-another-developer/unicode.h
@@ -0,0 +1,67 @@
+#pragma once
+
+#include "quantum.h"
+
+void send_unicode_hex_string(const char* str);
+
+/* use X(n) to call the */
+#ifdef UNICODEMAP_ENABLE
+enum unicode_name {
+OKOK, //
+BANG, // ‽
+IRONY, // ⸮
+DEGREE, // °
+THINK, // 🤔
+GRIN, // �
+MONOCL, // 🧐
+DRUG0, // 🤪
+DRUG1, // 🥴
+CLOWN, // 🤡
+MNDBLWN, // 🤯
+MONEY, // 🤑
+SHTUP, // 🤐
+PARTY, // 🥳
+SMRK, // 😏
+WEARY, // 😩
+UNAMU, // 😒
+SPY, // 🕵
+DAFUQ, // 👺
+FIST0, // 🤛
+FIST1, // 🤜
+FIST2, // ✊
+FIST3, // 👊
+WIFIHAND, // 👌
+EFFU, // 🖕
+SPOCK, // 🖖
+INUP, // 👆
+THDN, // 👎
+THUP, // 👍
+TUMBLER, // 🥃
+DRAGON0, // 🐉
+DRAGON1, // 🐅
+TIGER0, // 🐅
+TIGER1, // 🐯
+COOL, // 🆒
+UCHART, // 📈
+DCHART, // 📉
+BCHART, // 📊
+NOPRCY, // 🕲
+PRCY, // 🕱
+BBB, // 🅱
+POO, // 💩
+HUNDR, // 💯
+EGGPL, // 🍆
+WATER, // 💦
+LIT, // 🔥
+SNEK, // 🐍
+PENGUIN, // 🐧
+BOAR, // 🐗
+MONKEY, // 🐒
+CHICK, // 🐥
+DASH, // 💨
+DIZZY, // 💫
+KEEB, // 🖮
+HOLE, // 🕳
+SAUCER // 🛸
+};
+#endif
diff --git a/users/yet-another-developer/wrappers.h b/users/yet-another-developer/wrappers.h
new file mode 100644
index 0000000000..cd21032a4e
--- /dev/null
+++ b/users/yet-another-developer/wrappers.h
@@ -0,0 +1,166 @@
+#pragma once
+#include "yet-another-developer.h"
+
+/*
+Since our quirky block definitions are basically a list of comma separated
+arguments, we need a wrapper in order for these definitions to be
+expanded before being used as arguments to the LAYOUT_xxx macro.
+*/
+#if (!defined(LAYOUT) && defined(KEYMAP))
+# define LAYOUT KEYMAP
+#endif
+
+// clang-format off
+
+#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_ortho_5x14_wrapper(...) LAYOUT_ortho_5x14(__VA_ARGS__)
+
+/* ---------- LEFT HAND ----------- ---------- RIGHT HAND ---------- */
+#define LAYOUT_ergodash_pretty( \
+ L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \
+ L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \
+ L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \
+ L30, L31, L32, L33, L34, L35, R31, R32, R33, R34, R35, R36, \
+ L40, L41, L42, L43, R43, R44, R45, R46, \
+ L36, R30, \
+ L44, L45, L46, R40, R41, R42 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, L06 }, \
+ { L10, L11, L12, L13, L14, L15, L16 }, \
+ { L20, L21, L22, L23, L24, L25, L26 }, \
+ { L30, L31, L32, L33, L34, L35, L36 }, \
+ { L40, L41, L42, L43, L44, L45, L46 }, \
+ { R06, R05, R04, R03, R02, R01, R00 }, \
+ { R16, R15, R14, R13, R12, R11, R10 }, \
+ { R26, R25, R24, R23, R22, R21, R20 }, \
+ { R36, R35, R34, R33, R32, R31, R30 }, \
+ { R46, R45, R44, R43, R42, R41, R40 } \
+ }
+
+/*
+Blocks for each of the four major keyboard layouts
+Organized so we can quickly adapt and modify all of them
+at once, rather than for each keyboard, one at a time.
+And this allows for much cleaner blocks in the keymaps.
+For instance Tap/Hold for Control on all of the layouts
+
+NOTE: These are all the same length. If you do a search/replace
+ then you need to add/remove underscores to keep the
+ lengths consistent.
+*/
+
+#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
+#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
+#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
+#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
+#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+
+#ifdef TAP_DANCE_ENABLE
+ #define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
+ #define _________________COLEMAK_L2________________ KC_BOL, KC_R, KC_S, KC_T, KC_D
+ #define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+ #define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
+ #define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O
+ #define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
+#else
+ #define _________________COLEMAK_L1________________ KC_Q, KC_W, KC_F, KC_P, KC_G
+ #define _________________COLEMAK_L2________________ KC_A, KC_R, KC_S, KC_T, KC_D
+ #define _________________COLEMAK_L3________________ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+ #define _________________COLEMAK_R1________________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
+ #define _________________COLEMAK_R2________________ KC_H, KC_N, KC_E, KC_I, KC_O
+ #define _________________COLEMAK_R3________________ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
+#endif
+
+
+
+
+#define _________________DVORAK_L1_________________ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
+#define _________________DVORAK_L2_________________ KC_A, KC_O, KC_E, KC_U, KC_I
+#define _________________DVORAK_L3_________________ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
+
+#define _________________DVORAK_R1_________________ KC_F, KC_G, KC_C, KC_R, KC_L
+#define _________________DVORAK_R2_________________ KC_D, KC_H, KC_T, KC_N, KC_S
+#define _________________DVORAK_R3_________________ KC_B, KC_M, KC_W, KC_V, KC_Z
+
+
+#define _________________WORKMAN_L1________________ KC_Q, KC_D, KC_R, KC_W, KC_B
+#define _________________WORKMAN_L2________________ KC_A, KC_S, KC_H, KC_T, KC_G
+#define _________________WORKMAN_L3________________ KC_Z, KC_X, KC_M, KC_C, KC_V
+
+#define _________________WORKMAN_R1________________ KC_J, KC_F, KC_U, KC_P, KC_SCLN
+#define _________________WORKMAN_R2________________ KC_Y, KC_N, KC_E, KC_O, KC_I
+#define _________________WORKMAN_R3________________ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
+
+// #define _________________WHITE_R1__________________ KC_V, KC_Y, KC_D, KC_COMM, KC_QUOT
+// #define _________________WHITE_R2__________________ KC_A, KC_T, KC_H, KC_E, KC_B
+// #define _________________WHITE_R3__________________ KC_P, KC_K, KC_G, KC_W, KC_Q
+
+// #define _________________WHITE_L1__________________ KC_INT1, KC_J, KC_M, KC_L, KC_U
+// #define _________________WHITE_L2__________________ KC_MINS, KC_C, KC_S, KC_N, KC_O // KC_I
+// #define _________________WHITE_L3________________