qmk_userspace/chzerv.c
Chris Zervakis 0aa6911beb refactor: Rework repository structure
Using this structure, only the keymap itself is bound to a specific
board. Everything else (configuration, rules) can be shared across
multiple boards.
2024-10-21 22:16:20 +03:00

134 lines
2.8 KiB
C

// vim: tabstop=2:softtabstop=2:shiftwidth=2
/**
* Feature libraries
*/
#include "features/layer_lock.h"
/**
* Layers
*/
enum custom_layers {
_BASE,
_NAV,
_SYM,
_FUN,
};
/**
* Custom keys
*/
enum custom_keycodes {
LLOCK = SAFE_RANGE,
SELLINE,
UPDIR,
USRNAME,
LITERAL,
ARROW,
ARROW_RE,
};
/**
* Key aliases to improve readability
*/
#define CTL_ESC LCTL_T(KC_ESC) // 'Escape' when tapped, 'Control' when held
#define CTL_ENT LCTL_T(KC_ENT) // 'Enter' when tapped, 'Control' when held
#define ENT_SFT LSFT_T(KC_ENT) // 'Space' when tapped, 'Shift' when held
#define BS_NAV LT(_NAV, KC_BSPC) // 'Backspace' when tapped, 'MO(_NAV)' when held
#define MO_SYM MO(_SYM)
#define REDO C(S(KC_Z))
// One Shot Modifiers
#define OSM_LS OSM(MOD_LSFT)
#define OSM_RS OSM(MOD_RSFT)
#define OSM_A OSM(MOD_LALT)
#define OSM_G OSM(MOD_LGUI)
#define OSM_C OSM(MOD_LCTL)
#define OSM_CS OSM(MOD_LCTL | MOD_LSFT)
// Selecting/extending words
#define WORD_PR C(KC_LEFT)
#define WORD_NX C(KC_RGHT)
#define SELALL C(KC_A)
// Navigating browser tabs
#define TAB_PR C(KC_PGUP)
#define TAB_NX C(KC_PGDN)
#define TAB_CL C(KC_W)
#define TAB_RE C(S(KC_T))
/**
* Caps Word (https://docs.qmk.fm/features/caps_word)
*/
#ifdef CAPS_WORD_ENABLE
bool caps_word_press_user(uint16_t keycode) {
switch (keycode) {
// Keycodes that continue Caps Word, with shift applied
case KC_A ... KC_Z:
add_weak_mods(MOD_BIT(KC_LSFT));
return true;
// Keycodes that continue Caps Word, without shifting
case KC_1 ... KC_0:
case KC_BSPC:
case KC_DEL:
case KC_UNDS:
return true;
default:
return false; // Deactivate Caps Word
}
}
#endif
layer_state_t layer_state_set_user(layer_state_t state) {
return update_tri_layer_state(state, _SYM, _NAV, _FUN);
}
bool process_record_user(uint16_t keycode, keyrecord_t* record) {
if (!process_layer_lock(keycode, record, LLOCK)) { return false; }
// Macros
if (record->event.pressed) {
const uint8_t mods = get_mods();
const uint8_t oneshot_mods = get_oneshot_mods();
switch (keycode) {
case UPDIR:
SEND_STRING("../");
return false;
case USRNAME:
SEND_STRING("chzerv");
return false;
case LITERAL:
SEND_STRING("\"${}\""SS_TAP(X_LEFT)SS_TAP(X_LEFT));
return false;
case SELLINE:
SEND_STRING(SS_TAP(X_HOME) SS_LSFT(SS_TAP(X_END)));
return false;
case ARROW:
if ((mods | oneshot_mods) & MOD_MASK_SHIFT) {
del_oneshot_mods(MOD_MASK_SHIFT);
unregister_mods(MOD_MASK_SHIFT);
SEND_STRING("=>");
register_mods(mods);
} else {
SEND_STRING("->");
}
return false;
case ARROW_RE:
SEND_STRING("<-");
return false;
}
}
return true;
}