From 607143e9ed854b055f74c7b49036f4424fa3471a Mon Sep 17 00:00:00 2001 From: Benson Chu Date: Mon, 17 Feb 2025 16:31:39 +0800 Subject: [PATCH] YES, I never have to know how xkb works ever again --- common/laptop-things.nix | 12 +++++-- xkb/set.sh | 1 + xkb/symbols/neo_dvorak | 67 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 xkb/set.sh create mode 100644 xkb/symbols/neo_dvorak diff --git a/common/laptop-things.nix b/common/laptop-things.nix index 9659d41..534e8c4 100644 --- a/common/laptop-things.nix +++ b/common/laptop-things.nix @@ -16,9 +16,15 @@ # Configure keymap in X11 xserver = { xkb = { - layout = lib.mkForce "us,us"; - variant = lib.mkForce "dvorak,"; - options = "grp:win_space_toggle"; + layout = lib.mkForce "neo_dvorak"; + + extraLayouts = { + neo_dvorak = { + description = "Dvorak with Neo2 Extensions"; + symbolsFile = ../xkb/symbols/neo_dvorak; + languages = [ "eng" ]; + }; + }; }; }; }; diff --git a/xkb/set.sh b/xkb/set.sh new file mode 100644 index 0000000..6cf1cd7 --- /dev/null +++ b/xkb/set.sh @@ -0,0 +1 @@ +setxkbmap -I. neo_dvorak -print | xkbcomp -I. - $DISPLAY diff --git a/xkb/symbols/neo_dvorak b/xkb/symbols/neo_dvorak new file mode 100644 index 0000000..ffb3532 --- /dev/null +++ b/xkb/symbols/neo_dvorak @@ -0,0 +1,67 @@ +partial alphanumeric_keys +xkb_symbols "neo_dvorak_base" { + include "de(neo_base)" + + key.type[Group1] = "EIGHT_LEVEL_WITH_LEVEL5_LOCK"; + key { [ apostrophe, quotedbl, NoSymbol, Greek_eta, NoSymbol, NoSymbol, U2135, NoSymbol ] }; + key { [ comma, less, NoSymbol, U03F1, NoSymbol, NoSymbol, U21D2, NoSymbol ] }; + key { [ period, greater, NoSymbol, U03D1, NoSymbol, NoSymbol, U21A6, NoSymbol ] }; + key { [ slash, question, NoSymbol, NoSymbol, NoSymbol, NoSymbol, union, NoSymbol ] }; + key { [ equal, plus, dead_stroke, dead_psili, dead_doubleacute, NoSymbol, dead_breve, NoSymbol] }; + key { [ minus, underscore, NoSymbol, U2011, NoSymbol, NoSymbol, hyphen, NoSymbol ] }; + key { [ semicolon, colon, NoSymbol, U03F5, NoSymbol, NoSymbol, intersection, NoSymbol ] }; + + key.type[Group1] = "EIGHT_LEVEL_ALPHABETIC_WITH_LEVEL5_LOCK"; + key { [ sharp, U1E9E, NoSymbol, Greek_finalsmallsigma, NoSymbol, NoSymbol, jot, NoSymbol ] }; + key { [ p, P, NoSymbol, Greek_pi, NoSymbol, NoSymbol, Greek_PI, NoSymbol ] }; + key { [ y, Y, NoSymbol, Greek_upsilon, NoSymbol, NoSymbol, nabla, NoSymbol ] }; + key { [ f, F, NoSymbol, Greek_phi, NoSymbol, NoSymbol, Greek_PHI, NoSymbol ] }; + key { [ g, G, NoSymbol, Greek_gamma, NoSymbol, NoSymbol, Greek_GAMMA, NoSymbol ] }; + key { [ c, C, NoSymbol, Greek_chi, NoSymbol, NoSymbol, U2102, NoSymbol ] }; + key { [ r, R, NoSymbol, Greek_rho, NoSymbol, NoSymbol, U211D, NoSymbol ] }; + key { [ l, L, NoSymbol, Greek_lambda, NoSymbol, NoSymbol, Greek_LAMBDA, NoSymbol ] }; + key { [ a, A, NoSymbol, Greek_alpha, NoSymbol, NoSymbol, U2200, NoSymbol ] }; + key { [ o, O, NoSymbol, Greek_omicron, NoSymbol, NoSymbol, elementof, NoSymbol ] }; + key { [ e, E, NoSymbol, Greek_epsilon, NoSymbol, NoSymbol, U2203, NoSymbol ] }; + key { [ u, U, NoSymbol, NoSymbol, NoSymbol, NoSymbol, includedin, NoSymbol ] }; + key { [ i, I, NoSymbol, Greek_iota, NoSymbol, NoSymbol, integral, NoSymbol ] }; + key { [ d, D, NoSymbol, Greek_delta, NoSymbol, NoSymbol, Greek_DELTA, NoSymbol ] }; + key { [ h, H, NoSymbol, Greek_psi, NoSymbol, NoSymbol, Greek_PSI, NoSymbol ] }; + key { [ t, T, NoSymbol, Greek_tau, NoSymbol, NoSymbol, partialderivative, NoSymbol ] }; + key { [ n, N, NoSymbol, Greek_nu, NoSymbol, NoSymbol, U2115, NoSymbol ] }; + key { [ s, S, NoSymbol, Greek_sigma, NoSymbol, NoSymbol, Greek_SIGMA, NoSymbol ] }; + key { [ q, Q, NoSymbol, U03D5, NoSymbol, NoSymbol, U211A, NoSymbol ] }; + key { [ j, J, NoSymbol, Greek_theta, NoSymbol, NoSymbol, Greek_THETA, NoSymbol ] }; + key { [ k, K, NoSymbol, Greek_kappa, NoSymbol, NoSymbol, multiply, NoSymbol ] }; + key { [ x, X, NoSymbol, Greek_xi, NoSymbol, NoSymbol, Greek_XI, NoSymbol ] }; + key { [ b, B, NoSymbol, Greek_beta, NoSymbol, NoSymbol, U21D0, NoSymbol ] }; + key { [ m, M, NoSymbol, Greek_mu, NoSymbol, NoSymbol, ifonlyif, NoSymbol ] }; + key { [ w, W, NoSymbol, Greek_omega, NoSymbol, NoSymbol, Greek_OMEGA, NoSymbol ] }; + key { [ v, V, NoSymbol, NoSymbol, NoSymbol, NoSymbol, radical, NoSymbol ] }; + key { [ z, Z, NoSymbol, Greek_zeta, NoSymbol, NoSymbol, U2124, NoSymbol ] }; + + key { [ 1, exclam, onesuperior, onesubscript, ordfeminine, NoSymbol, notsign, NoSymbol ] }; + key { [ 2, at, twosuperior, twosubscript, masculine, NoSymbol, logicalor, NoSymbol ] }; + key { [ 3, numbersign, threesuperior, threesubscript, numerosign, NoSymbol, logicaland, NoSymbol ] }; + key { [ 4, dollar, U203A, femalesymbol, NoSymbol, NoSymbol, U22A5, NoSymbol ] }; + key { [ 5, percent, U2039, malesymbol, periodcentered, NoSymbol, U2221, NoSymbol ] }; + key { [ 6, asciicircum, cent, U26A5, sterling, NoSymbol, U2225, NoSymbol ] }; + key { [ 7, ampersand, yen, U03F0, currency, NoSymbol, rightarrow, NoSymbol ] }; + key { [ 8, asterisk, singlelowquotemark, U27E8, Tab, ISO_Left_Tab, U221E, NoSymbol ] }; + key { [ 9, parenleft, leftsinglequotemark, U27E9, KP_Divide, KP_Divide, variation, NoSymbol ] }; + key { [ 0, parenright, rightsinglequotemark, zerosubscript, KP_Multiply, KP_Multiply, emptyset, NoSymbol ] }; +}; + +default partial alphanumeric_keys modifier_keys keypad_keys +xkb_symbols "neo_dvorak" { + + include "neo_dvorak(neo_dvorak_base)" + + name[Group1]= "English (Neo, DVORAK)"; + + include "shift(both_capslock)" + include "level3(caps_switch)" + include "level3(bksl_switch)" + include "level5(lsgt_switch_lock)" + include "level5(ralt_switch_lock)" +};