Colejak
Colemak-DH variant for programming and keyboard-centric navigation. Compatible with ANSI, Lily58, and ZSA-Voyager
Install / Use
/learn @james-orcales/ColejakREADME
- Colejak
Colejak
Colemak-DH variant optimized for programming and keyboard-centric navigation. Compatible with ANSI, Lily58, and ZSA-Voyager. Colejak repositions symbols and numbers to accessible layers near the home row. This frees the top row for navigation and editing keys, placing arrows, Home, End, and Delete closer to the home position for efficiency across applications.
Software-Only Remap
Linux (XKB)
[!NOTE] These will overwrite existing destination files. Your original files such as evdev.xml will be saved as evdev.xml.bak
git clone --filter=blob:none --depth=1 https://github.com/james-orcales/colejak
cd colejak
mkdir --parents $HOME/.config/xkb/rules
mkdir --parents $HOME/.config/xkb/symbols
cp --suffix=.bak rules/* $HOME/.config/xkb/rules/
cp --suffix=.bak symbols/* $HOME/.config/xkb/symbols/
<details>
<summary>Sway</summary>
input type:keyboard {
xkb_layout colejak(default)
}
</details>
<details>
<summary>Gnome</summary>
Search for Colejak in gnome-control-center > Keyboard > Input Sources
MacOS (Karabiner-Elements)
TODO
Windows
TODO
QMK
Assumes RP2040 microcontroller.
#!/usr/bin/env dash
assert() {
eval "$*" > /dev/null || { echo "ASSERTION FAILED: $*"; exit 1; }
}
assert test "$(basename "$(pwd)")" = "colejak"
assert test -d ./.git
assert command -v curl
assert command -v git
qmk_version="1.1.8"
if ! command -v qmk > /dev/null; then
# Latest versions as of July 18, 2025
if ! command -v uv > /dev/null; then
curl --fail --silent --show-error --location https://astral.sh/uv/0.7.22/install.sh | UV_NO_MODIFY_PATH=1 sh || exit 1
assert command -v uv
fi
uv tool install qmk=="$qmk_version" || exit 1
assert command -v qmk
fi
# This does the same thing as `qmk clone <repo>` which is part of `qmk setup` but doesnt fetch the whole repo history.
export QMK_HOME="$HOME/.config/qmk"
if ! test -d "$QMK_HOME"; then
echo "qmk repository is not yet installed"
# Ideally, this should be pinned to a commit sha but recursive submodule cloning works best if everything is pointing at the branch tip
# https://stackoverflow.com/questions/2144406/how-to-make-shallow-git-submodules
git clone --depth=1 --recurse-submodules --shallow-submodules https://github.com/qmk/qmk_firmware "$QMK_HOME"
pushd "$QMK_HOME"
git remote rename origin upstream
popd
fi
if ! test -d "$QMK_HOME/keyboards/lily58/keymaps/colejak/"; then
assert test -d ./qmk/colejak
cp -R ./qmk/colejak "$QMK_HOME/keyboards/lily58/keymaps/"
fi
qmk setup || exit 1
qmk config user.keyboard=lily58/rev1 || exit 1
qmk config user.keymap=colejak || exit 1
assert test "$(qmk --version)" = "$qmk_version"
qmk compile || exit 1
assert test -f "$QMK_HOME/lily58_rev1_colejak.uf2"
echo
echo "Instructions from James:"
echo " At this point, enter bootloader mode while keyboard is plugged into your computer"
echo " A new removable storage device will appear. This is your keyboard in bootloader mode."
echo " Simply copy the file into the storage device and the firmware is automatically flashed."
echo " Refer to https://docs.qmk.fm/flashing#raspberry-pi-rp2040-uf2"
echo "Opening file explorer"
open "$QMK_HOME"
ZMK
TODO
Application Remaps (Optional)
<details> <summary>Neovim</summary>Neovim
local override = function(modes, new, default, desc, custom_behavior)
local behavior = default
if custom_behavior then
behavior = custom_behavior
end
vim.keymap.set(modes, default, "<nop>")
vim.keymap.set(modes, new, behavior, { desc = desc })
end
override({ "n", "v", "o" }, "<C-Left>", "b", "Jump previous word")
override({ "n", "v", "o" }, "<S-Left>", "B", "Jump previous whitespace")
override({ "n", "v", "o" }, "<C-Right>", "w", "Jump next word")
override({ "n", "v", "o" }, "<S-Right>", "W", "Jump next whitespace")
override({ "n", "v", "o" }, "<C-Home>", "gg", "Jump first line")
override({ "n", "v", "o" }, "<C-End>", "G", "Jump last line")
vim.keymap.set({ "n", "v", "o" }, "<Home>", "^", { desc = "Jump to first char of current line" })
vim.keymap.set({ "i" }, "<Home>", "<C-o>^", { desc = "Jump to first char of current line" })
override({ "i", "c" }, "<C-H>", "<C-W>", "Kill word before cursor")
vim.keymap.set({ "n" }, "<C-H>", "db", { desc = "Kill word before cursor" })
vim.keymap.set({ "n" }, "<C-BS>", "db", { desc = "Kill word before cursor" })
override({ "i", "c" }, "<C-BS>", "<C-W>", "Kill word before cursor")
vim.keymap.set({ "i" }, "<C-Del>", "<Esc><Right>dwi", { desc = "Kill next word from cursor" })
vim.keymap.set({ "n" }, "<C-Del>", "dw", { desc = "Kill next word from cursor" })
vim.keymap.set({ "n" }, "<S-Del>", "dW", { desc = "Kill to whitespace from cursor" })
override("n", "<BS>", "x", "Kill char before cursor", "<Left>x")
override("v", "<BS>", "x", "Remap x to Backspace")
https://github.com/james-orcales/init.lua
</details> <details> <summary>Alacritty</summary>Alacritty
[keyboard]
bindings = [
{ key = "Enter", mods = "Shift", chars = "\u001B[13;2u" },
{ key = "Enter", mods = "Control", chars = "\u001B[13;5u" },
{ key = "Delete", chars = "\u001B[3~" },
{ key = "Delete", mods = "Shift", chars = "\u001B[3;2u" },
{ key = "Home", mode = "AppCursor", chars = "\u001BOH" },
{ key = "Home", mode = "~AppCursor", chars = "\u001B[H" },
{ key = "End", mode = "AppCursor", chars = "\u001BOF" },
{ key = "End", mode = "~AppCursor", chars = "\u001B[F" },
{ key = "Left", mods = "Shift", chars = "\u001B[1;2D" },
{ key = "Left", mods = "Control", chars = "\u001B[1;5D" },
{ key = "Left", mods = "Alt", chars = "\u001B[1;3D" },
{ key = "Left", mode = "~AppCursor", chars = "\u001B[D" },
{ key = "Left", mode = "AppCursor", chars = "\u001BOD" },
{ key = "Right", mods = "Shift", chars = "\u001B[1;2C" },
{ key = "Right", mods = "Control", chars = "\u001B[1;5C" },
{ key = "Right", mods = "Alt", chars = "\u001B[1;3C" },
{ key = "Right", mode = "~AppCursor", chars = "\u001B[C" },
{ key = "Right", mode = "AppCursor", chars = "\u001BOC" },
{ key = "Up", mods = "Shift", chars = "\u001B[1;2A" },
{ key = "Up", mods = "Control", chars = "\u001B[1;5A" },
{ key = "Up", mods = "Alt", chars = "\u001B[1;3A" },
{ key = "Up", mode = "~AppCursor", chars = "\u001B[A" },
{ key = "Up", mode = "AppCursor", chars = "\u001BOA" },
{ key = "Down", mods = "Shift", chars = "\u001B[1;2B" },
{ key = "Down", mods = "Control", chars = "\u001B[1;5B" },
{ key = "Down", mods = "Alt", chars = "\u001B[1;3B" },
{ key = "Down", mode = "~AppCursor", chars = "\u001B[B" },
{ key = "Down", mode = "AppCursor", chars = "\u001BOB" },
{ key = "Tab", mods = "Shift", chars = "\u001B[Z" },
{ key = "Back", mods = "Alt", chars = "\u001B\u007F" },
{ key = "RBracket", mods = "Shift", chars = "\u0002n" },
{ key = "LBracket", mods = "Shift", chars = "\u0002p" },
{ key = "V", mods = "Control | Shift", action = "Paste" },
{ key = "C", mods = "Control | Shift", action = "Copy" },
{ key = "Equals", mods = "Control", action = "IncreaseFontSize" },
{ key = "Minus", mods = "Control", action = "DecreaseFontSize" },
{ key = "Minus", mods = "Control|Shift", action = "ResetFontSize" },
]
</details>
<details>
<summary>Vimium</summary>
Vimium
unmapAll
map h scrollLeft
map <down> scrollDown
map <up> scrollUp
map <s-right> scrollRight
map <s-left> scrollLeft
map <home> scrollToTop
map <end> scrollToBottom
map
