- Base layer is a magic modded graphite/gallium layout.
- Many common symbols and punctuation are accessible through combos.
- Home row mods on main layer.
- Achordion enabled with opposite hand triggers and typing streak detection for home row mod and
Repeat
/Magic
layer-tap safety. - Control key overrides for easier left-hand only use; overrides disabled on home row mods.
- Mouse emulation accessible on pinky key combo; movement keys in same position as arrow keys on navigation layer, scrolling underneath in vim layout.
- Numpad and Steno (GeminiPR) layers accessible through combos.
Repeat
and Magic
are dynamic keys that return different outputs depending on the previous key.
As the name suggests, the Repeat key repeats the last key pressed; while the Magic key swaps the first and second rows, along with various keys on the index columns (with some exceptions, listed below). This eliminates many SFBs and double-taps, turning them into alternations and rolls.
The most common use-case for the swapping-rows behaviour is for the vowel block on the right side, turning the OE
, EO
, IU
, and UI
SFBs into rolls and alternations; as well as eliminating various index finger SFBs on both sides (i.e., in the words T[YP]E
, [SC]IENCE
, [HYP]HEN
, etc.).
Letters that are not commonly repeated (i.e. I
, U
, A
) are overridden and instead return common n-grams. (Some letters uncommonly repeated in prose are still common in LaTeX commands and have not been overridden.)
Left hand keys:
Prev | Z |
L |
D |
C |
B |
N |
R |
T |
S |
G |
Q |
X |
M |
W |
V |
Magic | N |
R |
T |
S |
ECAUSE⎵ |
'T |
L |
ION |
C |
S |
U |
C |
ENT |
S |
S |
Right hand overrides:
Prev | J |
O |
U |
Y |
H |
E |
I |
A |
Magic | ECT |
E |
I |
P |
ERE |
O |
ON |
ND⎵ |
(Other right hand keys are repeated.)
Other:
Non-alpha |
⎵ |
, |
. |
' |
OSM Shift |
OSM Shift |
⎵AND⎵ |
COM |
VE⎵ |
Right hand keys:
Prev | J |
F |
O |
U |
Y |
H |
E |
I |
A |
K |
P |
Repeat | UST |
Y |
O |
I |
P |
Y |
E |
U |
A |
Y |
H |
Left hand overrides:
Prev | V |
W |
Repeat | ER |
ITH |
(Other left hand keys are repeated.)
Other:
Magic * |
Non-alpha |
⎵ |
, |
. |
' |
⎵ |
THE |
THE |
⎵BUT⎵ |
COM |
RE⎵ |
*Unless the previous magic output already ended with a space, in which case the repeat key will default to the Non-alpha
state.
Only the keys listed above are tracked (including those from combos). Pressing any other key resets the key to the default Non-alpha
state (i.e. OSM Shift
/THE
).
a 1 [Rep]
producesa 1 the
.
Modifiers are not tracked (but the dynamic keys may be modified):
[Shift] a [Release shift] [Magic]
producesA a
;
a [Shift] [Magic] [Release shift]
producesa A
.
Any keys pressed while the control modifier is active are not tracked. This does not reset key tracking:
a [CTRL] b [Release CTRL] [Magic]
producesa ^b a
.
Backspace
reverts the tracked key to the previous key:
a b c [Rep]
producesa b c c
(Rep
returnsc
);
a b c [BSPC] [Rep]
producesa b b
(Rep
returns previous tracked keyb
).
Note that this feature only tracks two keys into the past.
After a short duration (default 1000ms) of no keyboard input, both dynamic keys will reset to the Non-alpha
state.
In QWERTY and Basic modes, both dynamic keys are overridden to only have repeat functionality.
For longer dynamic key outputs (e.g. W -> WITH
), there is a short window (default 500ms) in which Backspace
will delete ("rollback") the entire magic output (i.e. WITH -> W
rather than WITH -> WIT
).
Pressing any other key will instantly close this window.
This feature is also reused to rollback various macro outputs in a single keypress.
ℹ️ You can hook into this feature with the
process_key_tracking
androllback_last_key
functions.
(128x64 OLEDs)
- Default layer and layer stack display;
- Menu key swaps layer stack to layout display;
- Clock — time is set manually using keys on utility layer and doesn't require software on host (persists through sleep events);
- Custom locking key, modifier, and mute state indicators.
- Cycles between text and logo with cyberpunk glich aesthetic animation (based on this code);
- Logo displays WPM and current session time.
Key on utility layer available to change both OLEDs to static images.
(Press Esc
, ;
, and #
to access Touhou layer and to see funky Cirno fumo on right OLED.)
- Common punctuation is accessible from combos on or near home row;
- Mouse emulation layer accessible on pinky key combos to allow mouse control without moving from home row.
- Uncommon locking layers (numpad/steno) also accessible from large combos;
New
combo pressesDOT
,SPC
, then sets a one shot shift (same asNewsent
key);Del
combo deletes the current word;<<
combo pressesM4
(Back
);>>
combo pressesM5
(Forward
);Join
combo joins current line to following line with space between; does not add space if shifted;Line
combos adds new lines above/below the current position.
Base layer alphas is a slightly modified graphite layout, with home row mods, and magic/repeat keys on middle thumb keys.
I find it difficult to press upper row keys with my pinkies and end up alt fingering them with my ring fingers, which introduces some SFBs (BL
, BR
) with the default Graphite layout. So, J
and B
have been moved off the outer top row; B
has also been placed next to C
to make the common B_C
string not a skipgram. Also, I don't like E
on the ring finger, so HEIA
is used over HAEI
.
ℹ️ Note that this keymap internally uses a QWERTY layer (specifically, the
_BASIC
layer) for combos, so this Base layer can be modified easily without needing any changes to combo code.
⚠️ However, per-key mod-tap settings and Achordion will still need to be handled separately if home row mods are changed.
Comma
, Dot
, Scln
, Colon
, Dash
, and Exlm
are compressed together or omitted, as they accessible from combos near or on the home row. (These combos are accessible on almost every layer.) Hash
is also included on base layer as I use it as a LaTeX snippet trigger/(reverse) leader key.
A copy of Tab
is placed on the right hand to reduce left hand contortions. The two Tab
keys also function as LShift
and RShift
when held. The shift modifiers are applied eagerly on keydown to improve interaction with pointing devices; these eager shift modifiers do not overwrite home row mods, so you can still shift-tab with one hand.
New Sentence
macro sends a dot, a space, then sets a one shot shift.
The LCTL
key also sets a weak one shot ctrl
modifier for the Backspace
key only to allow for faster usage while typing. The one shot modifier lingers for 500ms and is removed on any other keypress (without being applied).
Number grid with 1
, 2
, and 3
on right hand home row, along with common numerical separators on left hand, sharing similar layout to Symbol
and Program
layers.
Arithmetic symbols on right hand share positions with combos, -
not included as it is a home row combo; @
is also available on this layer as many email handles end with numbers, and also because I use it as a leader key for LaTeX commands.
The bracket macros {}
, ()
, []
sends the listed brackets, then taps Left
, placing the cursor between the two brackets. These macros also interact properly with the rollback feature.
Function keys also available for left hand only usage.
Navigation/editing keys on left hand and paired delimiters and common symbol combinations on right hand.
Many common strings are inward rolls on right hand, e.g.; []
, ()
, {}
, ^{}
, _{}
, !()
, ?()
; right hand also duplicated on Symbol and Program layers.
Select
macro by Getreuer selects the current word and extends selection by one word per subsequent press; holding shift selects/extends selection by lines instead.
Symbol layout optimised for (La)TeX editing with many common strings as inward rolls on left hand, e.g.; <-
, <=
, ->
, >=
, |->
, <-
, ~>
, |>
, :=
, :-
, &=
, etc. (Intended to be used with snippet extensions.) Brackets on right hand as above.
Program layer optimised for programming (mostly C and Python). Inward rolls include:
- comparison operators:
!=
,>=
,<=
on home row; - arithmetic assignment operators:
^=
,+=
,-=
,*=
,/=
above and below home row. Bitwise operator symbols are grouped on the inner index column. Holding shift while pressing&
or|
will send the respective symbol twice, i.e. as logical operators.
Brackets on right hand as above.
Utility layer containing media control, RGB controls, OLED controls, function keys, and debug functions. Layer is accessible using either outer thumb key (XOR).
The Mute
thumb keys only activate on the hand opposite to the one holding the layer key to avoid accidental activations.
Base
swaps default layer to QWERTY layout; Basic
swaps default layer to QWERTY layout with home row mods and Space
layer-tap disabled (useful for games).
Clock
keys set the OLED clock. OLED Static
disables animations and changes OLEDs to static images. OLED Menu
toggles between layer stack view and layout display on right OLED.
Alt Tab
key holds LAlt
and taps Tab
on first press; taps Tab
on subsequent presses; LAlt
is released when layer key is released.
Tap the Reboot
key to reboot keyboard; hold for one second to enter bootloader.
Mouse emulation accessible on pinky key combo to allow mouse movement without moving from home row. A mirrored left hand combo is also available, intended to be used with the layer lock feature.
Cursor/scroll speed may be overridden with right thumb keys for higher speed or finer control.
Control key overrides with QWERTY-esque layout for easier left-hand only use. (I usually don't remember which letter does what command, only which key position.)
Overrides activate only from left hand control key; home row mods are unaffected, so intentional letter controls can be used in two-hand usage.
Accessible with Base
key on Utility layer, or Basic
to also disable home row mods and Space
layer-tap (for games).
⚠️ Modifying the _BASIC layer will also require changing mod-tap and combo code.
-
Set up a local installation of QMK.
-
Clone this repository into
qmk_firmware\keyboards\crkbd\keymaps
.git clone https://github.com/DesyncTheThird/corne-keymap qmk_firmware\keyboards\crkbd\keymaps\desync
-
Install the
achordion
feature as per step 4 in these instructions.That is, in the cloned directory (i.e. the one containing
keymap.c
), add a new subdirectory calledfeatures
, and copy achordion.h and achordion.c there. -
Build the keymap from the QMK CLI with:
qmk compile -c -kb crkbd -km desync
Note, however:
⚠️ Unmodified, this keymap will not fit on most AVR MCUs (and in fact may fail to compile in some cases due to overflowing 8-bit integers).
For reference, my compiled uf2 file is 218kB (accurate as of commit 972be81
), though you should be able to save a significant amount of space by removing various OLED animations, deleting unused layers (along with the associated OLED layout PROGMEM
), and disabling additional RGB animations (the CS_RGBN
key will need to be updated in this case).
See here for more ways to save space. (Most space-saving rules.mk
and config.h
options have already been enabled; only modify those files if you have disabled additional features in keymap.c
.)
ℹ️ I recommend using an RP2040 or another ARM MCU with more space. (Plus, they're generally cheaper and faster than AVR pro-micros.)
-
To use a drop-in replacement controller, additionally use a converter flag:
-e CONVERT_TO=<converter>
.For instance, I use a (non-Sparkfun) RP2040 controller, so my full build command is:
qmk compile -c -kb crkbd -km desync -e CONVERT_TO=rp2040_ce