mirror of
https://github.com/qmk/qmk_userspace.git
synced 2025-05-01 21:24:16 -04:00
Using this structure, only the keymap itself is bound to a specific board. Everything else (configuration, rules) can be shared across multiple boards.
134 lines
2.8 KiB
C
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;
|
|
}
|