diff --git a/users/kuchosauronad0/combo.c b/users/kuchosauronad0/combo.c new file mode 100644 index 0000000000..b4e8e84ae5 --- /dev/null +++ b/users/kuchosauronad0/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/kuchosauronad0/combo.h b/users/kuchosauronad0/combo.h new file mode 100644 index 0000000000..e2ff09ab5a --- /dev/null +++ b/users/kuchosauronad0/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/kuchosauronad0/config.h b/users/kuchosauronad0/config.h index f543a4fd25..b2c63c1e0c 100644 --- a/users/kuchosauronad0/config.h +++ b/users/kuchosauronad0/config.h @@ -1,16 +1,14 @@ #pragma once - #ifdef AUDIO_ENABLE #define AUDIO_CLICKY #define STARTUP_SONG SONG(RICK_ROLL) - #define GOODBYE_SONG SONG(SONIC_RING) + #define GOODBYE_SONG SONG(SONIC_RING) #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \ SONG(COLEMAK_SOUND), \ SONG(DVORAK_SOUND), \ SONG(OVERWATCH_THEME) \ } - #define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f // #ifdef RGBLIGHT_ENABLE // #define NO_MUSIC_MODE @@ -19,13 +17,11 @@ // #undef NOTE_REST // #define NOTE_REST 1.00f // #endif // !__arm__ - -#define UNICODE_SONG_OSX SONG(RICK_ROLL) -#define UNICODE_SONG_LNX SONG(RICK_ROLL) -#define UNICODE_SONG_WIN SONG(RICK_ROLL) -#define UNICODE_SONG_BSD SONG(RICK_ROLL) -#define UNICODE_SONG_WINC SONG(RICK_ROLL) - + #define UNICODE_SONG_OSX SONG(RICK_ROLL) + #define UNICODE_SONG_LNX SONG(RICK_ROLL) + #define UNICODE_SONG_WIN SONG(RICK_ROLL) + #define UNICODE_SONG_BSD SONG(RICK_ROLL) + #define UNICODE_SONG_WINC SONG(RICK_ROLL) #endif // !AUDIO_ENABLE #ifdef RGBLIGHT_ENABLE @@ -48,7 +44,19 @@ #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, @@ -59,8 +67,6 @@ //#define TAPPING_FORCE_HOLD //#define RETRO_TAPPING -#define FORCE_NKRO - #ifndef TAPPING_TOGGLE #define TAPPING_TOGGLE 1 #endif @@ -68,26 +74,17 @@ #ifdef TAPPING_TERM #undef TAPPING_TERM #endif // !TAPPING_TERM -#if defined(KEYBOARD_ergodox_ez) +#if defined(KEYBOARD_handwired_kuchosauronad0_planckenstein) #define TAPPING_TERM 185 -#elif defined(KEYBOARD_crkbd) +#elif defined(KEYBOARD_c39) #define TAPPING_TERM 200 #else - #define TAPPING_TERM 150 + #define TAPPING_TERM 180 #endif -// Disable action_get_macro and fn_actions, since we don't use these -// and it saves on space in the firmware. -#define NO_ACTION_MACRO -#define NO_ACTION_FUNCTION - #define TAP_CODE_DELAY 5 -// Enable Leader key -#if defined(LEADER_ENABLE) - #define LEADER_PER_KEY_TIMING - #define LEADER_TIMEOUT 250 -#endif // !LEADER_ENABLE +#define MACRO_TIMER 5 + -#define MACRO_TIMER 5 diff --git a/users/kuchosauronad0/encoder.c b/users/kuchosauronad0/encoder.c index 1b9b2cb12f..06b7b51233 100644 --- a/users/kuchosauronad0/encoder.c +++ b/users/kuchosauronad0/encoder.c @@ -1,10 +1,63 @@ #include "encoder.h" - void encoder_update_user(uint8_t index, bool clockwise) { - if (clockwise) { - tap_code(KC_1); - } else { - tap_code(KC_0); + static uint16_t kc; + uint8_t temp_mod = get_mods(); + if (index == 0) { /* first encoder */ + if (clockwise) { + //if (temp_mod & MOD_BIT(KC_HYPR)){ // TODO: not how this works, only registers CTRL + if ((temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) && (temp_mod & MOD_MASK_GUI)) { // HYPER + kc = encoder_actions[0][8]; + } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) ) { // ALT+SHIFT + kc = encoder_actions[0][7]; + } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_CTRL) ) { // CTRL+SHIFT + kc = encoder_actions[0][6]; + } else if ( (temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_ALT) ) { // CTRL+ALT + kc = encoder_actions[0][5]; + } else if (temp_mod & MOD_MASK_GUI) { // GUI + kc = encoder_actions[0][4]; + } else if (temp_mod & MOD_MASK_SHIFT) { // SHIFT + kc = encoder_actions[0][3]; + } else if (temp_mod & MOD_MASK_ALT) { // ALT + kc = encoder_actions[0][2]; + } else if (temp_mod & MOD_MASK_CTRL) { // CTRL + kc = encoder_actions[0][1]; + } else { // None + kc = encoder_actions[0][0]; + } + } else { // Counter Clockwise + if ((temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) && (temp_mod & MOD_MASK_GUI)) { // HYPER + kc = encoder_actions[1][8]; + } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_ALT) ) { // ALT+SHIFT + kc = encoder_actions[1][7]; + } else if ( (temp_mod & MOD_MASK_SHIFT) && (temp_mod & MOD_MASK_CTRL) ) { // CTRL+SHIFT + kc = encoder_actions[1][6]; + } else if ( (temp_mod & MOD_MASK_CTRL) && (temp_mod & MOD_MASK_ALT) ) { // CTRL+ALT + kc = encoder_actions[1][5]; + } else if (temp_mod & MOD_MASK_GUI) { // GUI + kc = encoder_actions[1][4]; + } else if (temp_mod & MOD_MASK_SHIFT) { // SHIFT + kc = encoder_actions[1][3]; + } else if (temp_mod & MOD_MASK_ALT) { // ALT + kc = encoder_actions[1][2]; + } else if (temp_mod & MOD_MASK_CTRL) { // CTRL + kc = encoder_actions[1][1]; + } else { // None + kc = encoder_actions[1][0]; + } + } + clear_mods(); + tap_code16(kc); + set_mods(temp_mod); + } else if (index == 1){ // second Encoder + if (clockwise) { + tap_code(KC_0); + } else{ + tap_code(KC_1); + } } } - +const uint16_t PROGMEM encoder_actions[][9] = { \ +// None CTRL ALT SHIFT GUI CTRL+ALT CTRL+SHFT ALT+SHFT HYPER + { KC_PGDN, KC_DOWN, KC_AUDIO_VOL_UP, KC_END, KC_WWW_FORWARD, KC_AUDIO_MUTE, KC_RIGHT, LSFT(KC_TAB), KC_MEDIA_NEXT_TRACK}, \ + { KC_PGUP, KC_UP, KC_AUDIO_VOL_DOWN, KC_HOME, KC_WWW_BACK, KC_MEDIA_PLAY_PAUSE, KC_LEFT, KC_TAB, KC_MEDIA_PREV_TRACK} +}; diff --git a/users/kuchosauronad0/encoder.h b/users/kuchosauronad0/encoder.h index 078989d52d..2610c9677a 100644 --- a/users/kuchosauronad0/encoder.h +++ b/users/kuchosauronad0/encoder.h @@ -1,3 +1,4 @@ #pragma once #include "quantum.h" +const uint16_t PROGMEM encoder_actions[][9]; void encoder_update_user(uint8_t index, bool clockwise); diff --git a/users/kuchosauronad0/leader.c b/users/kuchosauronad0/leader.c index 611b70074c..58935abb3c 100644 --- a/users/kuchosauronad0/leader.c +++ b/users/kuchosauronad0/leader.c @@ -20,12 +20,9 @@ void matrix_scan_user(void){ LEADER_DICTIONARY() { leading = false; leader_end(); - // Q is for TMUX - // Z is for OS related things - // other single key sequences are mostly for terminals and vim SEQ_ONE_KEY(KC_W) { - // Vim + Tmux Macro, when in command mode in vim: write to file, change to the other pane in the current session and repeat the last command + // vim/tmux: Use in command mode in vim: write to file, switch tmux pane in the current session window and repeat the last command SEND_STRING(":w" SS_TAP(X_ENTER)); tmux_pane_switch_repeat(); } @@ -36,42 +33,38 @@ void matrix_scan_user(void){ } SEQ_ONE_KEY(KC_A) { - // Send the Tmux Prefix and press 'right' arrow + // tmux: Send the prefix and press 'right' arrow tmux_prefix(); tap_code(KC_RIGHT); } SEQ_TWO_KEYS(KC_T, KC_T) { - // Send the Tmux Prefix to a nested session + // tmux: Send the prefix to a nested session tmux_prefix(); tmux_prefix(); } - SEQ_TWO_KEYS(KC_Q, KC_A) { - // Switch pane and repeat last action + SEQ_TWO_KEYS(KC_T, KC_R) { + // tmux: Switch pane and repeat last action tmux_pane_switch_repeat(); } - SEQ_TWO_KEYS(KC_Z, KC_P){ - // Press windows key, send string 'plex' and press enter - register_code(KC_LGUI); - register_code(KC_S); - unregister_code(KC_S); - - unregister_code(KC_LGUI); - SEND_STRING("plex"); - tap_code(KC_ENTER); + SEQ_TWO_KEYS(KC_V, KC_Z){ + // vim: Zoom pane + tap_code16(LCTL(KC_W)); + tap_code16(LSFT(KC_BSLS)); } - SEQ_TWO_KEYS(KC_Z, KC_F) { - // Open a search - register_code(KC_LGUI); - register_code(KC_S); - unregister_code(KC_S); - unregister_code(KC_LGUI); + 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_Z, KC_Z) { - SEND_STRING("https://start.duckduckgo.com"SS_TAP(X_ENTER)); + 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){ diff --git a/users/kuchosauronad0/readme.md b/users/kuchosauronad0/readme.md index 8211dc189a..b577eedb70 100644 --- a/users/kuchosauronad0/readme.md +++ b/users/kuchosauronad0/readme.md @@ -1,10 +1,19 @@ -# qmk userspace for kuchosauronad0 -Thanks to drashna and everyone else in the qmk_firmware/users/ directory :) - -# Overview - -## Keyboard Layout Templates -This borrows from @jola5's "Not quite neo" code. This allows me to maintain blocks of keymaps in the userspace, so that I can modify the userspace, and this is reflected in all of the keyboards that use it, at once. +# Table of Contents +1. [Overview](#overview)[[documentation](https://docs.qmk.fm/#/feature_userspace)] +2. [Keyboard Layout Templates](#keyboard-layout-templates) +3. [Custom Keycodes](#custom-keycodes) [[documentation](https://docs.qmk.fm/#/feature_macros?id=the-new-way-send_string-amp-process_record_user)] +4. [Tap Dances](#tap-dances) [[documentation](https://docs.qmk.fm/#/feature_tap_dance)] +5. [Encoders](#encoders) [[documentation](https://docs.qmk.fm/#/feature_encoders)] +6. [Leader Key](#leader-key) [[documentation](https://docs.qmk.fm/#/feature_leader_key)] +7. [Unicode](#unicode) [[documentation](https://docs.qmk.fm/#/feature_unicode)] +8. [Combo Keys](#combo-keys) [[documentation](https://docs.qmk.fm/#/feature_combo)] +9. [Secret Macros](#secret-macros) [[documentation](https://github.com/qmk/qmk_firmware/blob/master/users/drashna/readme_secrets.md)] + +# [Overview](#overview) +Thanks to [drashna](https://github.com/drashna) and the people of the discord server and everyone else in the qmk_firmware/users/ directory :) + +## [Keyboard Layout Templates](#keyboard-layout-temple) +This borrows from [jola5](https://github.com/jola5)'s "Not quite neo" code. The code of the userspace is shared between all keyboards, so that one can maintain functionality of all keyboards at once by modifying a few files in a central location. This makes adding tap/hold mods, or other special keycodes or functions to all keyboards super easy, as it's done to all of them at once. @@ -14,45 +23,107 @@ The caveat here is that the keymap needs a processor/wrapper, as it doesn't like Once that's been done and you've switched the keymaps to use the "wrapper", it will read the substitution blocks just fine. -Credit goes to @jola5 for first implementing this awesome idea. +Credit goes to [jola5](https://github.com/jola5) for first implementing this awesome idea. -## Custom Keycodes +## [Custom Keycodes](#custom-keycodes) Declared in `process_records.h` and `template.h` and defined in `process_record_user` in template.c -## Tap Dances -Set `TAP_DANCE_ENABLE = yes` in rules.mk. See file tap_dances.{c,h} +## [Tap Dances](#tap-dances) +To enable set `TAP_DANCE_ENABLE = yes` in *rules.mk*. See file *tap_dances.{c,h}* + +TODO: Command-line movement stuff is a pain when typing normally + +TODO: Make use of `TD_SPC` and `TD_QT{1..3}` + +## [Leader Key](#leader-key) +To enable set `LEADER_ENABLE = yes` in file *rules.mk* + +|LEADER_DICTIONARY()|program| description | +|---|---|---| +| W |vim/tmux| save file, switch pane and repeat last command | +| T |tmux| send default prefix | +| A |tmux| switch pane| +|T + T|tmux| send default prefix to a nested session | +|T + R|tmux| switch pane and repeat last command | +|V + Z|vim | zoom current split| +|V + R|vim | search and replace| +|V + T|vim | move current split to its own tab| +|3x Backspace|keyboard| Reset Keyboard | + +`LEADER_DICTIONARY()` is defined in *leader.c* + +## [Combo Keys](#combo-keys) +To enable set `COMBO_ENABLE = yes` in file *rules.mk*. +Number of combos and timeout are defined in *config.h* + +Press key chord to use. + +|Combo|description | +|---|---| +| CV | Paste | +| XC | Cut | +| ZV | Copy | +| QP | KC_SLEEP | -## Leader Key -Set `LEADER_ENABLE = yes` in rules.mk. -TODO: document tmux / vim / os +Combos are defined in *combo.h* and *combo.c* + +## [Unicode](#unicode) +To enable set `UNICODE_ENABLE = yes` or `UNICODEMAP_ENABLE = yes` in file *rules.mk* + +## [Encoders](#encoders) +To enable set `ENCODER_ENABLE = yes` in *rules.mk*. + +In the keyboard's *config.h* adjust according to your keyboard: + +```c +// Example ProMicro +#define ENCODERS_PAD_A { F4 } //PIN A3 +#define ENCODERS_PAD_B { F5 } //PIN A2 +``` + +Check the [documentation](https://docs.qmk.fm/#/feature_encoders) for more information +The first rotary encoder is configured such as: + +|Modifier|description| +|---|---| +| None | General navigation. Page up/down | +| SHIFT | Fast navigation. Home/end | +| CTRL | Vertical navigation. Up/down | +| CTRL+SHIFT | Horizontal navigation. Left/right | +| ALT | Audio volume control. | +| GUI | Browser navigation(windows). Forward/backward | +| ALT+SHIFT | Form navigation. Tab up/down | +| ALT+CTRL | Media control. (Play|pause)/mute | +| HYPER | Media navigation. Next/prev track | + +Key codes are stored as `uint16_t encoder_actions[2][9]` in *encoder.c* -## Unicode -TODO: Set `idk` in `idc` ## Diablo Layer Currently not in use. +[Back to Top](#table-of-contents) -# Secret Macros -Set `NO_SECRETS = yes` in rules.mk. +# [Secret Macros](#secret-macros) +To enable set `NO_SECRETS = yes` in *rules.mk*. With help from gitter and Colinta, this adds the ability to add hidden macros from other users. -First, I have several files that are hidden/excluded from Git/GitHub. These contain everything needed for the macros. To hide these files, open `.git/info/exclude` and add `secrets.c` and `secrets.h` to that file, below the comments. +First, I have several files that are hidden/excluded from Git/GitHub. These contain everything needed for the macros. To hide these files, open *.git/info/exclude* and add `secrets.c` and `secrets.h` to that file, below the comments. -And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your `.h` file to define the keycodes for the new macros. +And this requires `KC_SECRET_1` through `KC_SECRET_5` to be defined in your *.h* file to define the keycodes for the new macros. ### .git/info/exclude -``` +```console # git ls-files --others --exclude-from=.git/info/exclude # Lines that start with '#' are comments. # For a project mostly in C, the following would be a good set of # exclude patterns (uncomment them if you want to use them): # *.[oa] # *~ -/users/kuchosauronad0/secrets.c -/users/kuchosauronad0/secrets.h +/users//secrets.c +/users//secrets.h ``` Then you can create these files: @@ -60,7 +131,7 @@ Then you can create these files: ### secrets.c ```c -#include "kuchosauronad0.h" // replace with your keymap's "h" file, or whatever file stores the keycodes +#include ".h" // replace with your keymap's "h" file, or whatever file stores the keycodes #if (__has_include("secrets.h") && !defined(NO_SECRETS)) #include "secrets.h" @@ -106,7 +177,7 @@ Replacing the strings with the codes that you need. ### name.c -In the `.c` file, you will want to add this to the top: +In the *.c* file, you will want to add this to the top: ```c __attribute__ ((weak)) @@ -126,7 +197,7 @@ And then, in the `process_record_user` function, assuming you have `return proce ### rules.mk -Here, you want your `/users//rules.mk` file to "detect" the existence of the `secrets.c` file, and only add it if the file exists. To do so, add this block: +Here, you want your */users//rules.mk* file to "detect" the existence of the *secrets.c* file, and only add it if the file exists. To do so, add this block: ```make ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") @@ -134,7 +205,7 @@ ifneq ("$(wildcard $(USER_PATH)/secrets.c)","") endif ``` -Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your `/users//rules.mk`, so that it catches the flag: +Additionally, if you want to make sure that you can disable the function without messing with the file, you need to add this to your */users//rules.mk*, so that it catches the flag: ```make ifeq ($(strip $(NO_SECRETS)), yes) @@ -142,4 +213,5 @@ ifeq ($(strip $(NO_SECRETS)), yes) endif ``` -Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your `.c` file, rather than reading from your file. +Then, if you run `make keyboard:name NO_SECRETS=yes`, it will default to the test strings in your *.c* file, rather than reading from your file. +[Back to Top](#table-of-contents) diff --git a/users/kuchosauronad0/rules.mk b/users/kuchosauronad0/rules.mk index 8610a9b7a1..ad13083732 100644 --- a/users/kuchosauronad0/rules.mk +++ b/users/kuchosauronad0/rules.mk @@ -14,6 +14,9 @@ endif ifeq ($(strip $(ENCODER_ENABLE)), yes) SRC += encoder.c endif +ifeq ($(strip $(COMBO_ENABLE)), yes) + SRC += combo.c +endif ifeq ($(strip $(LEADER_ENABLE)), yes) SRC += leader.c diff --git a/users/kuchosauronad0/tap_dances.c b/users/kuchosauronad0/tap_dances.c index 4ebb5dc739..7bdd3d3375 100644 --- a/users/kuchosauronad0/tap_dances.c +++ b/users/kuchosauronad0/tap_dances.c @@ -1,14 +1,12 @@ #include "tap_dances.h" void td_parenthesis (qk_tap_dance_state_t *state, void *user_data) { if (state->count == 1) { - SEND_STRING ("\("); +// SEND_STRING ("\("); + tap_code(KC_QUOT); reset_tap_dance (state); } else if (state->count == 2) { SEND_STRING("()" SS_TAP(X_LEFT)); - //tap_code(KC_2); - //tap_code(KC_3); - //tap_code(KC_LEFT); reset_tap_dance (state); } else if (state->count == 3) {