Compare commits

..

14 Commits

Author SHA1 Message Date
bluepython508
5559ea50db Add REP/AREP keys; swap RALT and RCTL 2025-07-12 12:03:57 +01:00
bluepython508
8119741bbd Add Rcmd, Rctl, Rsft, Ralt as non-oneshots on RHS 2024-10-21 22:52:52 +01:00
bluepython508
57942ef8bb Remove game layer 2024-10-21 22:52:04 +01:00
bluepython508
a042a8266a Use esc as a lock-ending key 2024-05-19 21:12:32 +01:00
bluepython508
c8704dbe6b Move tab down; move = down; add semicolon on sym-home 2024-04-11 13:37:54 +01:00
bluepython508
9762887d45 Formatting 2024-03-14 10:44:18 +00:00
bluepython508
bae54f3cad Formatting, remove numbers from SYM layer, use KC_LSFT instead of OS_ 2024-03-14 10:13:38 +00:00
bluepython508
b6b33e0131 Formatting 2024-03-12 09:01:59 +00:00
bluepython508
9d6db95f0b Timer on oneshot mods: held for one second doesn't queue modifiers 2024-03-07 16:22:06 +00:00
bluepython508
373ccbec40 Further OSM improvements:
locking support (double-tap to lock, tap to unlock or use KC_NO)
 includes word-lock (shift-lock: ' ' -> _)
2024-03-05 22:05:50 +00:00
bluepython508
c65beba3bb Better OSM: callum mods
this removes the delay, and improves composition
2024-03-05 20:37:49 +00:00
bluepython508
a10d21773f Repeat and AltRepeat keys
C-Space, C-Return
Enter on right side for game layers
2024-02-27 20:48:19 +00:00
bluepython508
5d97a22236 Add colon to home row on symbol layer for helix
Adjust tapping to avoid shift-delay
2024-02-26 15:12:22 +00:00
bluepython508
03915a876f Numpad layer, game layer, use XXXXXX over _______ for all non-thumb keys 2024-02-26 10:59:34 +00:00
4 changed files with 175 additions and 110 deletions

View File

@@ -13,7 +13,7 @@ AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: 'false'
BinPackArguments: 'true'
BinPackParameters: 'true'
ColumnLimit: '1000'
ColumnLimit: '100'
IndentCaseLabels: 'true'
IndentPPDirectives: AfterHash
IndentWidth: '4'

View File

@@ -15,6 +15,3 @@
*/
#pragma once
#define TAPPING_TERM 500
#define RETRO_TAPPING
#define DOUBLE_TAP_SHIFT_TURNS_ON_CAPS_WORD

View File

@@ -15,137 +15,205 @@
*/
#include QMK_KEYBOARD_H
enum keycodes {
OS_LSFT = SAFE_RANGE,
OS_LCTL,
OS_LALT,
OS_LGUI,
};
enum layers {
_COLEMAK_DH = 0,
_TYPE = 0,
_GAME,
_SYM,
_NUM,
_NAV,
_FUN,
};
// Aliases for readability
#define SYM MO(_SYM)
#define NUM MO(_NUM)
#define NAV MO(_NAV)
#define FUN MO(_FUN)
#define TYPE DF(_TYPE)
#define OS_LGUI OSM(MOD_LGUI)
#define OS_LALT OSM(MOD_LALT)
#define OS_LCTL OSM(MOD_LCTL)
#define OS_LSFT OSM(MOD_LSFT)
#define C_SPC C(KC_SPACE)
#define C_RET C(KC_ENTER)
/* TODO:
- Symbols layer
- colon elsewere for :w as non-SFB?
- Control on base layer?
- repeat key?
*/
* - Mouse Keys?
* - Swap hand keys?
*/
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* Base Layer: Colemak DH
*
* ,-------------------------------------------. ,-------------------------------------------.
* | Tab | Q | W | F | P | B | | J | L | U | Y | ; : | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | A | R | S | T | G | | M | N | E | I | O | ' " |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | Z | X | C | D | V | | | |F-keys| | K | H | , < | . > | / ? | |
* `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
* | | GUI |Shift | Enter| Sym | | Nav | Space| Esc | | Menu |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_COLEMAK_DH] = LAYOUT(
KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_B , KC_J, KC_L, KC_U , KC_Y, KC_SCLN, XXXXXXX,
XXXXXXX , KC_A , KC_R , KC_S , KC_T , KC_G , KC_M, KC_N, KC_E , KC_I, KC_O, KC_QUOT,
XXXXXXX , KC_Z , KC_X , KC_C , KC_D , KC_V , XXXXXXX,XXXXXXX, FUN , XXXXXXX, KC_K, KC_H,KC_COMM, KC_DOT, KC_SLSH, XXXXXXX,
XXXXXXX, OS_LGUI, OS_LSFT, KC_ENT , SYM , NAV , KC_SPC , KC_ESC,XXXXXXX, KC_APP
[_TYPE] = LAYOUT(
XXXXXXX, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_RCTL,
KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
XXXXXXX, KC_Z, KC_X, KC_C, KC_D, KC_V, QK_REP, NUM, FUN, QK_AREP, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
XXXXXXX, XXXXXXX, OS_LSFT, KC_ENT, SYM, NAV, KC_SPC, KC_ESC, KC_RGUI, KC_RALT
),
/*
* Nav Layer: navigation
*
* ,-------------------------------------------. ,-------------------------------------------.
* | | | | | | | | PgUp | Home | ↑ | End | Del | |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | GUI | Alt | Ctrl | Shift| | | PgDn | ← | ↓ | → | Bspc | |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | | | | | |
* `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_NAV] = LAYOUT(
_______, _______, _______, _______, _______, _______, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, _______,
_______, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, _______, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_DEL, XXXXXXX,
XXXXXXX, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, XXXXXXX, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_BSPC, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, C_SPC, C_RET, XXXXXXX, XXXXXXX, XXXXXXX,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/*
* Sym Layer: Numbers and symbols
* ,-------------------------------------------. ,-------------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | ~ | GUI | Alt | Ctrl | Shift| ( | | ) | | | | | + |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | | \ | : | ; | - | [ { | | | | | | } ] | _ | , | . | / | ? |
* `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_SYM] = LAYOUT(
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_EQL ,
KC_TILD , OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, KC_LPRN, KC_RPRN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PLUS,
KC_PIPE , KC_BSLS, KC_COLN, KC_SCLN, KC_MINS, KC_LBRC, _______, _______, _______, _______, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, KC_QUES,
KC_GRV, KC_PIPE, XXXXXXX, XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
KC_TILD, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, KC_LPRN, KC_RPRN, KC_COLN, XXXXXXX, XXXXXXX, KC_SCLN, KC_EQL,
XXXXXXX, KC_BSLS, XXXXXXX, XXXXXXX, KC_MINS, KC_LBRC, _______, _______, _______, _______, KC_RBRC, KC_UNDS, KC_COMM, KC_DOT, KC_SLSH, XXXXXXX,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/*
* Function Layer: Function keys
* ,-------------------------------------------. ,-------------------------------------------.
* | | | | | | | |Pause | F9 | F10 | F11 | F12 | VolUp |
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
* | | GUI | Alt | Ctrl | Shift| | | | F5 | F6 | F7 | F8 | VolDn |
* |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
* | | | | | | | | | | | | | F1 | F2 | F3 | F4 | Mute |
* `--------+------+------+--------------------+------+------| |------+------+--------------------+------+------+--------'
* | | | | | | | | | | | |
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
*/
[_FUN] = LAYOUT(
_______, _______, _______, _______, _______, _______, KC_PAUSE,KC_F9 , KC_F10, KC_F11, KC_F12, KC_VOLU,
_______, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, _______, _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_VOLD,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_MUTE,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PAUS, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLU,
XXXXXXX, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, XXXXXXX, XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_VOLD,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_MUTE,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
// /*
// * Layer template
// *
// * ,-------------------------------------------. ,-------------------------------------------.
// * | | | | | | | | | | | | | |
// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
// * | | | | | | | | | | | | | |
// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
// * | | | | | | | | | | | | | | | | | |
// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
// * | | | | | | | | | | | |
// * | | | | | | | | | | | |
// * `----------------------------------' `----------------------------------'
// */
// [_LAYERINDEX] = LAYOUT(
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
// ),
[_NUM] = LAYOUT(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_PLUS, XXXXXXX,
XXXXXXX, OS_LGUI, OS_LALT, OS_LCTL, OS_LSFT, XXXXXXX, KC_0, KC_4, KC_5, KC_6, KC_DOT, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, KC_7, KC_8, KC_9, KC_SLSH, XXXXXXX,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
// [_LAYERINDEX] = LAYOUT(
// XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
// ),
};
// clang-format on
void keyboard_pre_init_user(void) {
setPinOutput(24);
writePinHigh(24);
setPinOutput(24);
writePinHigh(24);
}
typedef enum {
os_up_unqueued = 0,
os_up_queued,
os_down_unused,
os_down_used,
os_locked
} oneshot_mode_t;
typedef struct {
uint16_t time;
uint16_t mod;
uint16_t trigger;
oneshot_mode_t mode;
} oneshot_state_t;
oneshot_state_t oneshot_state[4] = {{0, KC_LSFT, OS_LSFT, os_up_unqueued},
{0, KC_LCTL, OS_LCTL, os_up_unqueued},
{0, KC_LALT, OS_LALT, os_up_unqueued},
{0, KC_LGUI, OS_LGUI, os_up_unqueued}};
bool is_oneshot_ignored_key(uint16_t keycode) {
switch (keycode) {
case OS_LSFT:
case OS_LCTL:
case OS_LALT:
case OS_LGUI:
case NAV:
case SYM:
case NUM:
case FUN:
return true;
default:
return false;
}
}
bool is_oneshot_cancel_key(uint16_t keycode, oneshot_mode_t mode) {
return keycode == KC_NO || (keycode == KC_ESCAPE && mode == os_locked);
}
// Based on
// https://github.com/qmk/qmk_firmware/blob/user-keymaps-still-present/users/callum/oneshot.c
void update_oneshot(oneshot_state_t *state, uint16_t keycode, keyrecord_t *record) {
if (keycode == state->trigger) {
if (record->event.pressed) {
// Trigger keydown
switch (state->mode) {
case os_up_queued:
state->mode = os_locked;
break;
case os_up_unqueued:
register_code(state->mod);
state->time = timer_read();
state->mode = os_down_unused;
break;
case os_locked:
state->mode = os_down_used;
break;
default:
state->mode = os_down_unused;
break;
}
} else {
// Trigger keyup
switch (state->mode) {
case os_down_unused:
// If we didn't use the mod while trigger was held, queue it.
if (timer_elapsed(state->time) < 1000) {
state->mode = os_up_queued;
} else {
state->mode = os_up_unqueued;
unregister_code(state->mod);
}
break;
case os_down_used:
// If we did use the mod while trigger was held, unregister it.
state->mode = os_up_unqueued;
unregister_code(state->mod);
break;
default:
break;
}
}
} else {
if (record->event.pressed) {
if (is_oneshot_cancel_key(keycode, state->mode) && state->mode != os_up_unqueued) {
// Cancel oneshot on designated cancel keydown.
state->mode = os_up_unqueued;
unregister_code(state->mod);
}
} else {
if (!is_oneshot_ignored_key(keycode)) {
// On non-ignored keyup, consider the oneshot used.
switch (state->mode) {
case os_down_unused:
state->mode = os_down_used;
break;
case os_up_queued:
state->mode = os_up_unqueued;
unregister_code(state->mod);
break;
default:
break;
}
}
}
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
update_oneshot(&oneshot_state[0], keycode, record);
update_oneshot(&oneshot_state[1], keycode, record);
update_oneshot(&oneshot_state[2], keycode, record);
update_oneshot(&oneshot_state[3], keycode, record);
if (oneshot_state[0].mode == os_locked && keycode == KC_SPACE) {
if (record->event.pressed) {
register_code(KC_MINUS);
} else {
unregister_code(KC_MINUS);
}
return false;
}
return true;
}

View File

@@ -1,2 +1,2 @@
CONVERT_TO = liatris
CAPS_WORD_ENABLE = yes
REPEAT_KEY_ENABLE = yes