Skip to content
This repository was archived by the owner on Jan 6, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions keyboards/Kazhan_split/keyboard.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
let { RowToColKey, ColToRowKey, PeripheralSideKey, .. } = import "fak/keyboard.ncl" in
let { CH552T, .. } = import "fak/mcus.ncl" in

let side_central = {
mcu = CH552T,
matrix = {
rows = [32, 15, 12, 13],
cols = [16, 17]
},
split.channel = CH552T.features.uart_30_31,
} in

let side_periph = {
mcu = CH552T,
matrix = {
rows = [32, 15, 12, 13],
cols = [16, 17]
},
split.channel = CH552T.features.uart_30_31,
keys =
let C = ColToRowKey in
let R = RowToColKey in
[
C 0 0, R 0 0, C 1 0, R 1 0, R 1 3,
C 0 1, R 0 1, C 1 1, R 1 1, R 1 2,
C 0 2, R 0 2, C 1 2, C 1 3,
C 0 3, R 0 3,
],
} in

side_central & {
usb_dev = {
vendor_id = 21681, #0x54B1
product_id = 2,
product_ver = 46193, #0xB471 kazhan means bat ^^
},
split.peripheral = side_periph,
keys =
let C = ColToRowKey in
let R = RowToColKey in
let S = PeripheralSideKey in
[
C 0 3, C 0 0, R 0 0, C 1 0, R 1 0, S 0, S 1, S 2, S 3, S 4,
C 0 2, C 0 1, R 0 1, C 1 1, R 1 1, S 5, S 6, S 7, S 8, S 9,
R 0 3, R 0 2, C 1 2, R 1 2, S 10, S 11, S 12, S 13,
C 1 3, R 1 3, S 14, S 15,
],
}
1 change: 1 addition & 0 deletions keyboards/Kazhan_split/keymaps/aptmak.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(import "shared/keymap.ncl") "aptmak"
1 change: 1 addition & 0 deletions keyboards/Kazhan_split/keymaps/colemak.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(import "shared/keymap.ncl") "colemak"
1 change: 1 addition & 0 deletions keyboards/Kazhan_split/keymaps/default.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import "qwerty.ncl"
1 change: 1 addition & 0 deletions keyboards/Kazhan_split/keymaps/qwerty.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
(import "shared/keymap.ncl") "qwerty"
5 changes: 5 additions & 0 deletions keyboards/Kazhan_split/keymaps/shared/config.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
let { zilpzalp_combo_timeout_ms, .. } = import "lib/example.ncl" in

{
combo_timeout_ms = zilpzalp_combo_timeout_ms,
}
134 changes: 134 additions & 0 deletions keyboards/Kazhan_split/keymaps/shared/keymap.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
fun layout_name =>

let { tap, hold, td, combo, .. } = import "fak/keycode.ncl" in
let util = import "fak/util_functions.ncl" in

let config = import "config.ncl" in
let layout = (import "layouts.ncl")."%{layout_name}" in
let kustom_keys = layout.kustom_keys in

let ki = {
hp = { decision = 'hold, trigger_on = 'press },
tp = { decision = 'tap, trigger_on = 'press },
hr = { decision = 'hold, trigger_on = 'release },
tr = { decision = 'tap, trigger_on = 'release },
xx = { decision = 'none },
} in

let combos = layout.combos in

let virtual_keys' =
combos |> std.array.map (fun c =>
combo.make config.combo_timeout_ms (std.array.split_at 1 c).right)
in

let physical_key_count = 32 in
let virtual_key_count = std.array.length virtual_keys' in
let key_count = physical_key_count + virtual_key_count in

let rec get_side_of_key_idx = fun key_idx =>
if key_idx < physical_key_count then
let right_indices = [4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 28, 29, 30, 31] in
if std.array.elem key_idx right_indices then 'right else 'left
else
let c = std.array.at (key_idx - physical_key_count) combos in
let unique_sides = (std.array.split_at 1 c).right
|> std.array.map get_side_of_key_idx
|> util.array.unique in
if std.array.length unique_sides > 1 then
'both
else
std.array.first unique_sides
in

let make_hrm = fun key_idx =>
let hrm_mods =
let md = hold.reg.mod
in [
md.lctl, md.lalt, md.lgui, md.lsft, md.ralt,
md.ralt, md.rsft, md.rgui, md.lalt, md.rctl,
] in

let hrm_key_indices = [
25, 8, 9, 10, 11,
30, 13, 14, 15, 12,
] in

let htb_hrm_base = {
timeout_ms = 200,
quick_tap_ms = 150,
quick_tap_interrupt_ms = 500,
global_quick_tap_ms = 100,
} in

let htb_hrm = fun side => htb_hrm_base & {
key_interrupts =
let hrm_key_indices_on_side = hrm_key_indices |>
std.array.filter (fun i => get_side_of_key_idx i == side) in

std.array.generate (fun key_idx =>
let side_of_key_idx = get_side_of_key_idx key_idx in
if side_of_key_idx == 'both then
ki.xx
else if side_of_key_idx != side then
ki.hr
else if std.array.elem key_idx hrm_key_indices_on_side then
ki.tr
else
ki.tp
) key_count
} in

if std.array.elem key_idx hrm_key_indices then
let mod_idx = util.array.index_of key_idx hrm_key_indices in
let mod = std.array.at mod_idx hrm_mods in
let side = get_side_of_key_idx key_idx in
mod & hold.reg.behavior (htb_hrm side)
else
{}
in

let XXXX = tap.none & hold.none in
let virtual_base = combos |> std.array.map std.array.first in
let virtual_filler = combos |> std.array.map (fun c => XXXX) in
let excluded_indexes = [0, 9, 10, 19] in



let layer_default =
let base_keycodes = layout.base_layout
|> std.string.characters
|> util.array.enumerate

|> std.array.map (fun { index, value } => tap.reg.kc."%{value}" & make_hrm index)
in



let thumb_keycodes =
let htb_thumb = {
timeout_ms = 200,
quick_tap_ms = 150,
quick_tap_interrupt_ms = 500,
key_interrupts = std.array.replicate key_count ki.hr,
} in

layout.thumbs
|> util.array.enumerate
|> std.array.map (fun { index, value } =>
value
& hold.reg.layer (index + 1)
& hold.reg.behavior htb_thumb)
in

base_keycodes @ thumb_keycodes @ virtual_base
in

{
virtual_keys = virtual_keys',
layers = [layer_default] @ (
["NUM", "NAV", "SYM", "FUN"]
|> std.array.map (fun name => layout.layers."%{name}")
|> std.array.map (fun layer => layer @ virtual_filler)
)
}
118 changes: 118 additions & 0 deletions keyboards/Kazhan_split/keymaps/shared/layouts.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
let { tap, hold, .. } = import "fak/keycode.ncl" in
let util = import "fak/util_functions.ncl" in

let kc = tap.reg.kc in
let ks = tap.reg.ks in
let md = hold.reg.mod in
let tm = tap.reg.mod in
let me = tap.custom.media in
let mou = tap.custom.mouse in
let XXXX = tap.none & hold.none in

let shared_layers = {
NUM0 = [
XXXX, XXXX, XXXX, XXXX, XXXX, ks.PLUS, kc.N7, kc.N8, kc.N9, XXXX,
XXXX, md.lalt, md.lgui, md.lsft, XXXX, kc.MINS, kc.N4, kc.N5, kc.N6, XXXX,
md.lctl, XXXX, XXXX, XXXX, kc.N1, kc.N2, kc.N3, kc.SLSH,
XXXX, XXXX, kc.E, kc.N0,
],
NAV0 = [
mou.WH_U, XXXX, XXXX, XXXX, me.MUTE, XXXX, kc.BSPC, kc.DEL, kc.INS, me.VOLU,
mou.WH_D, md.lalt, md.lgui, md.lsft, XXXX, kc.LEFT, kc.DOWN, kc.UP, kc.RGHT, me.VOLD,
md.lctl, XXXX, XXXX, XXXX, kc.HOME, XXXX, kc.END, kc.TAB,
XXXX, XXXX, XXXX, XXXX,
],
NUM1 = [
XXXX, kc.N9, kc.N8, kc.N7, ks.ASTR, ks.PLUS, kc.N7, kc.N8, kc.N9, XXXX,
XXXX, kc.N6, kc.N5, kc.N4, kc.SLSH, kc.MINS, kc.N4, kc.N5, kc.N6, XXXX,
kc.N0, kc.N3, kc.N2, kc.N1, kc.N1, kc.N2, kc.N3, kc.DOT,
XXXX, XXXX, kc.E, kc.N0,
],
NAV1 = [
mou.WH_U, kc.INS, kc.UP, kc.BSPC, me.MUTE, XXXX, kc.BSPC, kc.DEL, kc.INS, me.VOLU,
mou.WH_D, kc.LEFT, kc.DOWN, kc.RGHT, XXXX, kc.LEFT, kc.DOWN, kc.UP, kc.RGHT, me.VOLD,
md.lctl, kc.HOME, kc.PGDN, kc.END, kc.HOME, kc.PGUP, kc.END, kc.TAB,
XXXX, XXXX, XXXX, XXXX,
],
SYM = [
XXXX, kc.GRV, ks.DQUO, kc.DOT, kc.LBRC, kc.RBRC, kc.BSLS, ks.PIPE, kc.SLSH, XXXX,
XXXX, ks.AT, ks.HASH, ks.DLR, ks.LPRN, ks.RPRN, ks.AMPR, ks.ASTR, ks.PERC, XXXX,
ks.EXLM, ks.TILD, kc.QUOT, ks.UNDS, kc.MINS, ks.PLUS, kc.EQL, kc.TAB,
ks.LCBR, ks.RCBR, XXXX, XXXX,
],
FUN = [
XXXX, XXXX, XXXX, XXXX, XXXX, kc.F12, kc.F7, kc.F8, kc.F9, XXXX,
XXXX, XXXX, XXXX, XXXX, XXXX, kc.F11, kc.F4, kc.F5, kc.F6, XXXX,
XXXX, XXXX, XXXX, XXXX, kc.F1, kc.F2, kc.F3, kc.F10,
XXXX, XXXX, XXXX, XXXX,
],
} in

let both_side_combos = [
[kc.CAPS, 1, 7],
# Caps word combo here once supported
#[CW, 10, 13],
] in

{
qwerty = {
base_layout = "QWERTYUIOQQSDFGHJKLAQXCVM,.P",
thumbs = [kc.ESC, kc.SPC, kc.N, kc.ENT],

combos = [
# Left
[kc.Q, 1, 2],
[kc.Z, 17, 18], [kc.B, 18, 19],
# Right
[kc.QUOT, 5, 6], [kc.SCLN, 6, 7],
[kc.MINS, 20, 21], [kc.SLSH, 21, 22],
] @ both_side_combos,
layers = {
NUM = shared_layers.NUM0,
NAV = shared_layers.NAV0,
SYM = shared_layers.SYM,
FUN = shared_layers.FUN,
}
},

colemak = {
base_layout = "WFPKJLUYRSTGMNEIAXCDH,.O",
thumbs = [kc.ESC, kc.SPC, kc.ENT, kc.BSPC],
combos = [
# Left
[kc.Q, 0, 1], [kc.B, 1, 2],
[kc.Z, 17, 18], [kc.V, 18, 19],
# Right
[kc.QUOT, 5, 6], [kc.SCLN, 6, 7],
[kc.MINS, 20, 21], [kc.SLSH, 21, 22],
] @ both_side_combos,
layers = {
NUM = shared_layers.NUM0,
NAV = shared_layers.NAV0,
SYM = shared_layers.SYM,
FUN = shared_layers.FUN,
}
},

aptmak = {
base_layout = "WFPBJLUYSTHKXNAIRCGDM,.O",
thumbs = [kc.QUOT, kc.SPC, kc.E, kc.ENT],
combos = [
# Left
[kc.V, 0, 1], [kc.Q, 1, 2],
[ks.LCBR, 0, 8], [kc.LBRC, 1, 9], [ks.LPRN, 2, 10], [ks.LABK, 3, 11],
[kc.Z, 17, 18], [kc.ESC, 18, 19],
# Right
[tm.lctl & kc.BSPC, 5, 7],
[kc.BSPC, 5, 6], [kc.DEL, 6, 7],
[ks.RABK, 4, 12], [ks.RPRN, 5, 13], [kc.RBRC, 6, 14], [ks.RCBR, 7, 15],
[kc.MINS, 20, 21], [kc.SLSH, 21, 22],
] @ both_side_combos,
layers = {
NUM = shared_layers.NUM1,
NAV = shared_layers.NAV1,
SYM = shared_layers.SYM,
FUN = shared_layers.FUN,
},
},
}
48 changes: 48 additions & 0 deletions keyboards/Kazhan_split_simple/keyboard.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
let { RowToColKey, ColToRowKey, PeripheralSideKey, .. } = import "fak/keyboard.ncl" in
let { CH552T, .. } = import "fak/mcus.ncl" in

let side_central = {
mcu = CH552T,
matrix = {
rows = [32, 15, 12, 13],
cols = [16, 17]
},
split.channel = CH552T.features.uart_30_31,
} in

let side_periph = {
mcu = CH552T,
matrix = {
rows = [32, 15, 12, 13],
cols = [16, 17]
},
split.channel = CH552T.features.uart_30_31,
keys =
let C = ColToRowKey in
let R = RowToColKey in
[
C 0 0, R 0 0, C 1 0, R 1 0, R 1 3,
C 0 1, R 0 1, C 1 1, R 1 1, R 1 2,
C 0 2, R 0 2, C 1 2, C 1 3,
C 0 3, R 0 3,
],
} in

side_central & {
usb_dev = {
vendor_id = 21681, #0x54B1
product_id = 2,
product_ver = 46193, #0xB471 kazhan means bat ^^
},
split.peripheral = side_periph,
keys =
let C = ColToRowKey in
let R = RowToColKey in
let S = PeripheralSideKey in
[
C 0 3, C 0 0, R 0 0, C 1 0, R 1 0, S 0, S 1, S 2, S 3, S 4,
C 0 2, C 0 1, R 0 1, C 1 1, R 1 1, S 5, S 6, S 7, S 8, S 9,
R 0 3, R 0 2, C 1 2, R 1 2, S 10, S 11, S 12, S 13,
C 1 3, R 1 3, S 14, S 15,
],
}
5 changes: 5 additions & 0 deletions keyboards/Kazhan_split_simple/keymaps/config.ncl
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
let { zilpzalp_combo_timeout_ms, .. } = import "lib/example.ncl" in

{
combo_timeout_ms = zilpzalp_combo_timeout_ms,
}
Loading