I enjoy the space cadet feature of QMK :
https://docs.qmk.fm/#/feature_space_cadet
The feature is simple but yet powerful, when you hit one press you send a parenthese open or close form the other side and if you hold it you have shift.
I am not sure what happened to my config, but I could not get it to work with
the default macros offered SC_LSPO
and SC_RSPO
.
I dug into the process_record_user()
function hook to replicate the feature and
add one other ’thing’ where if you press another shift at the same time of the
keypress it will do a right bracket.
For example, right shift held and left shift will print {
and left shift held
with right shift will print me }
.
At the same time i have a
combo setup when I
press both shifts quickly, it will print me both ()
.
The code to add in process_record_user
is this:
#define SC_LSFT OSM(MOD_LSFT)
#define SC_RSFT OSM(MOD_RSFT)
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
bool ls = (get_mods() | get_weak_mods()) & MOD_BIT(KC_LSFT);
bool rs = (get_mods() | get_weak_mods()) & MOD_BIT(KC_RSFT);
switch (keycode) {
case SC_LSFT:
if (record->tap.count && rs && record->event.pressed) {
unregister_code(KC_RSFT);
tap_code16(KC_LCBR);
return false;
} else if (record->tap.count && record->event.pressed) {
tap_code16(KC_LPRN);
return false; // Return false to ignore further processing of key
}
return true;
case SC_RSFT:
if (record->tap.count == 1 && ls) {
unregister_code(KC_LSFT);
tap_code16(KC_RCBR);
return false;
} else if (record->tap.count == 1 && record->event.pressed) {
tap_code16(KC_RPRN);
return false; // Return false to ignore further processing of key
}
return true;
}
}
now the hard part is to get used to it and effectively used it :)