diff --git a/scripts/gen_keymap.py b/scripts/gen_keymap.py index 7c61847ad84..2ae3dc9e549 100644 --- a/scripts/gen_keymap.py +++ b/scripts/gen_keymap.py @@ -2,8 +2,8 @@ import itertools from dataclasses import dataclass import copy -from enum import Enum -from typing import Generator +from enum import Enum, auto +from typing import Any, Generator, Optional from unicodedata import name as unicode_name import re import argparse @@ -19,7 +19,7 @@ parser.add_argument( "--host", choices=["us", "fr"], - default="us", + default="fr", help="Specify the host on which the keyboard will be plugged", ) parser.add_argument( @@ -33,82 +33,122 @@ class Mode(Enum): - Base = 0 - Qwerty = 1 - DK = 2 - Sym = 3 + Base = auto() + Qwerty = auto() + DK = auto() + Sym = auto() + Nav = auto() + NumFun = auto() # perso - Media = 4 - Fn = 5 + Media = auto() + Fn = auto() class ShiftMode(Enum): - Default = 0 - Override = 1 - CustomKey = 2 - UnicodeMap = 3 + Default = auto() + Override = auto() + CustomKey = auto() + UnicodeMap = auto() -def is_basic(kc) -> bool: +def is_basic(kc: Any) -> bool: return isinstance(kc, str) -def is_unicode(kc) -> bool: +def is_unicode(kc: Any) -> bool: return isinstance(kc, int) -def parse_lt(kc): - pattern = re.compile(r"^LT\((?P\w+)\|\s*(?P\w+)\)$") - if match := pattern.match(kc): - return match.group("layer"), match.group("keycode") - raise ValueError("kc does not match the expected format LT(layer|keycode)") +class Function: + def __init__(self, fn: str, args: list[str]): + self.fn = fn + self.args = args + + @staticmethod + def parse(s: str) -> Optional["Function"]: + pattern = re.compile(r"^(?P\w+)\((?P.+)\)$") + if match := pattern.match(s): + fn = match.group("fn") + args = match.group("args").split("|") + return Function(fn, args) + + return None + + @property + def raw_keycode(self) -> str: + return self.args[self._keycode_idx()] + + def replace_keycode(self, new_kc: str): + self.args[self._keycode_idx()] = new_kc + + def __str__(self): + return f"{self.fn}({', '.join(self.args)})" + + def __repr__(self): + return str(self) + + def __format__(self, format_spec: str) -> str: + return format(str(self), format_spec) + + def _keycode_idx(self): + if self.fn == "LT": + return 1 + + if len(self.args) == 1: + return 0 + + raise ValueError("Unknown function") class KeyCode: - def __init__(self, kc: str | int): - self._kc: str | int = kc - self._layer: str | None = None - self._fn: str | None = None - if isinstance(kc, str) and kc.startswith("LT"): - self._layer, self._kc = parse_lt(kc) - self._fn = "LT" + _kc: str | int | Function + + def __init__(self, s: str | int): + self._kc = s + + if isinstance(s, str): + if fn := Function.parse(s): + self._kc = fn @property def has_function(self): - return self._fn is not None + return isinstance(self._kc, Function) @property def is_unicode(self): + if isinstance(self._kc, Function): + return is_unicode(self._kc.raw_keycode) + return is_unicode(self._kc) @property def is_transparent(self): - return is_transparent(self._kc) + return is_transparent(self.raw_keycode) @property def is_basic(self): - return is_basic(self._kc) - - @property - def layer(self): - return self._layer + return is_basic(self.raw_keycode) @property def raw_keycode(self) -> str | int: + if isinstance(self._kc, Function): + return self._kc.raw_keycode + return self._kc - def replace_keycode(self, new_kc): - self._kc = new_kc + def replace_keycode(self, new_kc: str): + if isinstance(self._kc, Function): + self._kc.replace_keycode(new_kc) + else: + self._kc = new_kc def remove_function(self): - self._layer = None - self._fn = None + if isinstance(self._kc, Function): + self._kc = self._kc.raw_keycode @property - def kc(self): - if self.has_function: - return f"{self._fn}({self.layer}, {self._kc})" - return self._kc + def kc(self) -> str: + return str(self.raw_keycode) def __str__(self): return f"{self.kc}" @@ -116,28 +156,31 @@ def __str__(self): def __repr__(self): return str(self.kc) - def __eq__(self, other: "KeyCode|str"): - if not isinstance(other, KeyCode): - if isinstance(other, str): - return self == KeyCode(other) - return False - return self.kc == other.kc + def __eq__(self, other: Any) -> bool: + if isinstance(other, KeyCode): + return self.kc == other.kc + + if isinstance(other, str): + return self == KeyCode(other) + + return False def __hash__(self): return hash(self.kc) - def __format__(self, format_spec): - if self.has_function: - return f"{self._fn}({self.layer}, {format(self._kc, format_spec)})" - return format(self._kc, format_spec) + def __format__(self, format_spec: str) -> str: + if isinstance(self._kc, Function): + return format(self._kc, format_spec) + + return format(self.raw_keycode, format_spec) def __len__(self): - return len(self.kc) + return len(str(self.kc)) def get_shift_mod(kc: KeyCode, skc: KeyCode) -> ShiftMode: if kc.is_basic: - if skc is None or kc == skc: + if kc == skc: return ShiftMode.Default if kc.has_function and kc.raw_keycode == skc.raw_keycode: return ShiftMode.Default @@ -154,7 +197,7 @@ def get_shift_mod(kc: KeyCode, skc: KeyCode) -> ShiftMode: TRNS = "_______" -def is_transparent(kc): +def is_transparent(kc: Any) -> bool: return kc == "KC_TRNS" or kc == TRNS @@ -228,10 +271,10 @@ def set_key(self, coord: Coord, key: KeyCode): prev = self.rows[coord.row][coord.col] if not prev.is_transparent and key != prev: raise Exception(f"Key at {coord} is not transparent: {prev}") - self.rows[coord.row][coord.col] = key.kc + self.rows[coord.row][coord.col] = key # FIXME check self.max_length = max(self.max_length, len(key)) - def format(self, FMT: str | None): + def format(self, FMT: str | None) -> str: if not FMT: return ",\n".join(", ".join(cols) for cols in self.rows) @@ -243,21 +286,21 @@ def format(self, FMT: str | None): class Keymaps: TRNS = "_______" - def __init__(self, fmt_layer: str, nb_keys): + def __init__(self, fmt_layer: str, nb_keys: int): self.fmt_layer = fmt_layer self.final_layers: dict[Mode, Layer] = {} self.transparent_layer = self._parse(fmt_layer.format(*([self.TRNS] * nb_keys))) @classmethod - def _parse(cls, layout): - lines: str = layout.split("\n") - base_layer = [] + def _parse(cls, layout: str) -> list[list[KeyCode]]: + lines: list[str] = layout.split("\n") + base_layer: list[list[KeyCode]] = [] for line in lines: line = line.lstrip() if line.startswith("//"): continue - keys = list( + keys: list[KeyCode] = list( filter( None, [KeyCode(kc.strip()) for kc in line.split(",") if kc.strip()] ) @@ -267,18 +310,18 @@ def _parse(cls, layout): return base_layer def add_layer(self, m: Mode, preset: None | str = None) -> Layer: - if l := self.final_layers.get(m): - if preset != None: + if la := self.final_layers.get(m): + if preset is not None: raise Exception(f"there is already a layer for mode: {m}") - return l + return la if preset is None: - l = Layer(self, copy.deepcopy(self.transparent_layer)) + la = Layer(self, copy.deepcopy(self.transparent_layer)) else: - l = Layer(self, self._parse(preset)) - self.final_layers[m] = l - return l + la = Layer(self, self._parse(preset)) + self.final_layers[m] = la + return la - def set_base(self, layer): + def set_base(self, layer: str): self.base_layer = self._parse(layer) def base_keys(self) -> Generator[tuple[KeyCode, Coord], None, None]: @@ -296,108 +339,666 @@ def format(self, m: Mode) -> str: ergol_keys = { "us": { # fmt: off - "EKC_Q": Key(base="KC_Q", shifted=None, dk_base=0x00E2, dk_shifted=0x00C2, sym_base="KC_CIRC", sym_shifted=0x0302), - "EKC_C": Key(base="KC_C", shifted=None, dk_base=0x00E7, dk_shifted=0x00C7, sym_base="KC_LABK", sym_shifted=0x2264), - "EKC_O": Key(base="KC_O", shifted=None, dk_base=0x0153, dk_shifted=0x0152, sym_base="KC_RABK", sym_shifted=0x2265), - "EKC_P": Key(base="KC_P", shifted=None, dk_base=0x00F4, dk_shifted=0x00D4, sym_base="KC_DLR", sym_shifted="KC_TRNS"), - "EKC_W": Key(base="KC_W", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="KC_PERC", sym_shifted=0x2030), - - "EKC_J": Key(base="KC_J", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="KC_AT", sym_shifted=0x030A), - "EKC_M": Key(base="KC_M", shifted=None, dk_base=0x00B5, dk_shifted="KC_TRNS", sym_base="KC_AMPR", sym_shifted="KC_TRNS"), - "EKC_D": Key(base="KC_D", shifted=None, dk_base="KC_UNDS", dk_shifted="KC_TRNS", sym_base="KC_ASTR", sym_shifted=0x00D7), - "EKC_DK": Key(base="OSL(DK)", shifted="KC_EXLM", dk_base=0x0308, dk_shifted=0x00A1, sym_base="KC_QUOT", sym_shifted=0x0301), - "EKC_Y": Key(base="KC_Y", shifted=None, dk_base=0x00FB, dk_shifted=0x00DB, sym_base="KC_GRV", sym_shifted=0x0300), - - "EKC_A": Key(base="KC_A", shifted=None, dk_base=0x00E0, dk_shifted=0x00C0, sym_base="KC_LCBR", sym_shifted=0x030C), - "EKC_S": Key(base="KC_S", shifted=None, dk_base=0x00E9, dk_shifted=0x00C9, sym_base="KC_LPRN", sym_shifted="KC_TRNS"), - "EKC_E": Key(base="KC_E", shifted=None, dk_base=0x00E8, dk_shifted=0x00C8, sym_base="KC_RPRN", sym_shifted="KC_TRNS"), - "EKC_N": Key(base="KC_N", shifted=None, dk_base=0x00EA, dk_shifted=0x00CA, sym_base="KC_RCBR", sym_shifted=0x0307), - "EKC_F": Key(base="KC_F", shifted=None, dk_base=0x00F1, dk_shifted=0x00D1, sym_base="KC_EQL", sym_shifted=0x2260), - - "EKC_L": Key(base="KC_L", shifted=None, dk_base="KC_LPRN", dk_shifted="KC_TRNS", sym_base="KC_BSLS", sym_shifted=0x0338), - "EKC_R": Key(base="KC_R", shifted=None, dk_base="KC_RPRN", dk_shifted="KC_TRNS", sym_base="KC_PLUS", sym_shifted=0x2A72), - "EKC_T": Key(base="KC_T", shifted=None, dk_base=0x00EE, dk_shifted=0x00CE, sym_base="KC_MINS", sym_shifted=0x0304), - "EKC_I": Key(base="KC_I", shifted=None, dk_base=0x00EF, dk_shifted=0x00CF, sym_base="KC_SLSH", sym_shifted=0x00F7), - "EKC_U": Key(base="KC_U", shifted=None, dk_base=0x00F9, dk_shifted=0x00D9, sym_base="KC_DQUO", sym_shifted=0x030B), - - "EKC_Z": Key(base="KC_Z", shifted=None, dk_base=0x00E6, dk_shifted=0x00C6, sym_base="KC_TILD", sym_shifted=0x0303), - "EKC_X": Key(base="KC_X", shifted=None, dk_base=0x00DF, dk_shifted=0x1E9E, sym_base="KC_LBRC", sym_shifted=0x0326), - "EKC_MNS": Key(base="KC_MINS", shifted="KC_QUES", dk_base=0x2011, dk_shifted=0x00BF, sym_base="KC_RBRC", sym_shifted=0x0328), - "EKC_V": Key(base="KC_V", shifted=None, dk_base=0x2013, dk_shifted="KC_TRNS", sym_base="KC_UNDS", sym_shifted=0x2013), - "EKC_B": Key(base="KC_B", shifted=None, dk_base=0x2014, dk_shifted="KC_TRNS", sym_base="KC_HASH", sym_shifted="KC_TRNS"), - - "EKC_DOT": Key(base="KC_DOT", shifted="KC_COLN", dk_base=0x2026, dk_shifted="KC_TRNS", sym_base="KC_PIPE", sym_shifted=0x00A6), - "EKC_H": Key(base="KC_H", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="KC_EXLM", sym_shifted=0x00AC), - "EKC_G": Key(base="KC_G", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="KC_SCLN", sym_shifted=0x0312), - "EKC_COMM": Key(base="KC_COMM", shifted="KC_SCLN", dk_base=0x00B7, dk_shifted=0x2022, sym_base="KC_COLN", sym_shifted="KC_TRNS"), - "EKC_K": Key(base="KC_K", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="KC_QUES", sym_shifted=0x0306), - - "EKC_1": Key(base="KC_1", shifted=0x20AC, dk_base=0x201E, dk_shifted=0x201A, sym_base=0x2081, sym_shifted=0x00B9), - "EKC_2": Key(base="KC_2", shifted=0x00AB, dk_base=0x201C, dk_shifted=0x2018, sym_base=0x2082, sym_shifted=0x00B2), - "EKC_3": Key(base="KC_3", shifted=0x00BB, dk_base=0x201D, dk_shifted=0x2019, sym_base=0x2083, sym_shifted=0x00B3), - "EKC_4": Key(base="KC_4", shifted="KC_DLR", dk_base=0x00A2, dk_shifted="KC_TRNS", sym_base=0x2084, sym_shifted=0x2074), - "EKC_5": Key(base="KC_5", shifted="KC_PERC", dk_base=0x2030, dk_shifted="KC_TRNS", sym_base=0x2085, sym_shifted=0x2075), - "EKC_6": Key(base="KC_6", shifted="KC_CIRC", dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base=0x2086, sym_shifted=0x2076), - - "EKC_7": Key(base="KC_7", shifted="KC_AMPR", dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base=0x2087, sym_shifted=0x2077), - "EKC_8": Key(base="KC_8", shifted="KC_ASTR", dk_base=0x00A7, dk_shifted="KC_TRNS", sym_base=0x2088, sym_shifted=0x2078), - "EKC_9": Key(base="KC_9", shifted="KC_HASH", dk_base=0x00B6, dk_shifted="KC_TRNS", sym_base=0x2089, sym_shifted=0x2079), - "EKC_0": Key(base="KC_0", shifted="KC_AT", dk_base=0x00B0, dk_shifted="KC_TRNS", sym_base=0x2080, sym_shifted=0x2070), - - "EKC_SPC": Key(base="KC_SPC", shifted=0x202F, dk_base=0x2019, dk_shifted="KC_TRNS", sym_base="KC_SPC", sym_shifted="KC_TRNS"), + "EKC_Q": Key( + base="KC_Q", + shifted=None, + dk_base=0x00E2, + dk_shifted=0x00C2, + sym_base="KC_CIRC", + sym_shifted=0x0302, + ), + "EKC_C": Key( + base="KC_C", + shifted=None, + dk_base=0x00E7, + dk_shifted=0x00C7, + sym_base="KC_LABK", + sym_shifted=0x2264, + ), + "EKC_O": Key( + base="KC_O", + shifted=None, + dk_base=0x0153, + dk_shifted=0x0152, + sym_base="KC_RABK", + sym_shifted=0x2265, + ), + "EKC_P": Key( + base="KC_P", + shifted=None, + dk_base=0x00F4, + dk_shifted=0x00D4, + sym_base="KC_DLR", + sym_shifted="KC_TRNS", + ), + "EKC_W": Key( + base="KC_W", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="KC_PERC", + sym_shifted=0x2030, + ), + "EKC_J": Key( + base="KC_J", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="KC_AT", + sym_shifted=0x030A, + ), + "EKC_M": Key( + base="KC_M", + shifted=None, + dk_base=0x00B5, + dk_shifted="KC_TRNS", + sym_base="KC_AMPR", + sym_shifted="KC_TRNS", + ), + "EKC_D": Key( + base="KC_D", + shifted=None, + dk_base="KC_UNDS", + dk_shifted="KC_TRNS", + sym_base="KC_ASTR", + sym_shifted=0x00D7, + ), + "EKC_DK": Key( + base="OSL(DK)", + shifted="KC_EXLM", + dk_base=0x0308, + dk_shifted=0x00A1, + sym_base="KC_QUOT", + sym_shifted=0x0301, + ), + "EKC_Y": Key( + base="KC_Y", + shifted=None, + dk_base=0x00FB, + dk_shifted=0x00DB, + sym_base="KC_GRV", + sym_shifted=0x0300, + ), + "EKC_A": Key( + base="KC_A", + shifted=None, + dk_base=0x00E0, + dk_shifted=0x00C0, + sym_base="KC_LCBR", + sym_shifted=0x030C, + ), + "EKC_S": Key( + base="KC_S", + shifted=None, + dk_base=0x00E9, + dk_shifted=0x00C9, + sym_base="KC_LPRN", + sym_shifted="KC_TRNS", + ), + "EKC_E": Key( + base="KC_E", + shifted=None, + dk_base=0x00E8, + dk_shifted=0x00C8, + sym_base="KC_RPRN", + sym_shifted="KC_TRNS", + ), + "EKC_N": Key( + base="KC_N", + shifted=None, + dk_base=0x00EA, + dk_shifted=0x00CA, + sym_base="KC_RCBR", + sym_shifted=0x0307, + ), + "EKC_F": Key( + base="KC_F", + shifted=None, + dk_base=0x00F1, + dk_shifted=0x00D1, + sym_base="KC_EQL", + sym_shifted=0x2260, + ), + "EKC_L": Key( + base="KC_L", + shifted=None, + dk_base="KC_LPRN", + dk_shifted="KC_TRNS", + sym_base="KC_BSLS", + sym_shifted=0x0338, + ), + "EKC_R": Key( + base="KC_R", + shifted=None, + dk_base="KC_RPRN", + dk_shifted="KC_TRNS", + sym_base="KC_PLUS", + sym_shifted=0x2A72, + ), + "EKC_T": Key( + base="KC_T", + shifted=None, + dk_base=0x00EE, + dk_shifted=0x00CE, + sym_base="KC_MINS", + sym_shifted=0x0304, + ), + "EKC_I": Key( + base="KC_I", + shifted=None, + dk_base=0x00EF, + dk_shifted=0x00CF, + sym_base="KC_SLSH", + sym_shifted=0x00F7, + ), + "EKC_U": Key( + base="KC_U", + shifted=None, + dk_base=0x00F9, + dk_shifted=0x00D9, + sym_base="KC_DQUO", + sym_shifted=0x030B, + ), + "EKC_Z": Key( + base="KC_Z", + shifted=None, + dk_base=0x00E6, + dk_shifted=0x00C6, + sym_base="KC_TILD", + sym_shifted=0x0303, + ), + "EKC_X": Key( + base="KC_X", + shifted=None, + dk_base=0x00DF, + dk_shifted=0x1E9E, + sym_base="KC_LBRC", + sym_shifted=0x0326, + ), + "EKC_MNS": Key( + base="KC_MINS", + shifted="KC_QUES", + dk_base=0x2011, + dk_shifted=0x00BF, + sym_base="KC_RBRC", + sym_shifted=0x0328, + ), + "EKC_V": Key( + base="KC_V", + shifted=None, + dk_base=0x2013, + dk_shifted="KC_TRNS", + sym_base="KC_UNDS", + sym_shifted=0x2013, + ), + "EKC_B": Key( + base="KC_B", + shifted=None, + dk_base=0x2014, + dk_shifted="KC_TRNS", + sym_base="KC_HASH", + sym_shifted="KC_TRNS", + ), + "EKC_DOT": Key( + base="KC_DOT", + shifted="KC_COLN", + dk_base=0x2026, + dk_shifted="KC_TRNS", + sym_base="KC_PIPE", + sym_shifted=0x00A6, + ), + "EKC_H": Key( + base="KC_H", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="KC_EXLM", + sym_shifted=0x00AC, + ), + "EKC_G": Key( + base="KC_G", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="KC_SCLN", + sym_shifted=0x0312, + ), + "EKC_COMM": Key( + base="KC_COMM", + shifted="KC_SCLN", + dk_base=0x00B7, + dk_shifted=0x2022, + sym_base="KC_COLN", + sym_shifted="KC_TRNS", + ), + "EKC_K": Key( + base="KC_K", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="KC_QUES", + sym_shifted=0x0306, + ), + "EKC_1": Key( + base="KC_1", + shifted=0x20AC, + dk_base=0x201E, + dk_shifted=0x201A, + sym_base=0x2081, + sym_shifted=0x00B9, + ), + "EKC_2": Key( + base="KC_2", + shifted=0x00AB, + dk_base=0x201C, + dk_shifted=0x2018, + sym_base=0x2082, + sym_shifted=0x00B2, + ), + "EKC_3": Key( + base="KC_3", + shifted=0x00BB, + dk_base=0x201D, + dk_shifted=0x2019, + sym_base=0x2083, + sym_shifted=0x00B3, + ), + "EKC_4": Key( + base="KC_4", + shifted="KC_DLR", + dk_base=0x00A2, + dk_shifted="KC_TRNS", + sym_base=0x2084, + sym_shifted=0x2074, + ), + "EKC_5": Key( + base="KC_5", + shifted="KC_PERC", + dk_base=0x2030, + dk_shifted="KC_TRNS", + sym_base=0x2085, + sym_shifted=0x2075, + ), + "EKC_6": Key( + base="KC_6", + shifted="KC_CIRC", + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base=0x2086, + sym_shifted=0x2076, + ), + "EKC_7": Key( + base="KC_7", + shifted="KC_AMPR", + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base=0x2087, + sym_shifted=0x2077, + ), + "EKC_8": Key( + base="KC_8", + shifted="KC_ASTR", + dk_base=0x00A7, + dk_shifted="KC_TRNS", + sym_base=0x2088, + sym_shifted=0x2078, + ), + "EKC_9": Key( + base="KC_9", + shifted="KC_HASH", + dk_base=0x00B6, + dk_shifted="KC_TRNS", + sym_base=0x2089, + sym_shifted=0x2079, + ), + "EKC_0": Key( + base="KC_0", + shifted="KC_AT", + dk_base=0x00B0, + dk_shifted="KC_TRNS", + sym_base=0x2080, + sym_shifted=0x2070, + ), + "EKC_SPC": Key( + base="KC_SPC", + shifted=0x202F, + dk_base=0x2019, + dk_shifted="KC_TRNS", + sym_base="KC_SPC", + sym_shifted="KC_TRNS", + ), # fmt: on }, "fr": { # fmt: off - "EKC_Q": Key(base="FR_Q", shifted=None, dk_base=0x00E2, dk_shifted=0x00C2, sym_base=0x005E, sym_shifted=0x0302), - "EKC_C": Key(base="FR_C", shifted=None, dk_base="FR_CCED", dk_shifted=0x00C7, sym_base="FR_LABK", sym_shifted=0x2264), - "EKC_O": Key(base="FR_O", shifted=None, dk_base=0x0153, dk_shifted=0x0152, sym_base="FR_RABK", sym_shifted=0x2265), - "EKC_P": Key(base="FR_P", shifted=None, dk_base=0x00F4, dk_shifted=0x00D4, sym_base="FR_DLR", sym_shifted="KC_TRNS"), - "EKC_W": Key(base="FR_W", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="FR_PERC", sym_shifted=0x2030), - - "EKC_J": Key(base="FR_J", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="FR_AT", sym_shifted=0x030A), - "EKC_M": Key(base="FR_M", shifted=None, dk_base=0x00B5, dk_shifted="KC_TRNS", sym_base="FR_AMPR", sym_shifted="KC_TRNS"), - "EKC_D": Key(base="FR_D", shifted=None, dk_base="FR_UNDS", dk_shifted="KC_TRNS", sym_base="FR_ASTR", sym_shifted=0x00D7), - "EKC_DK": Key(base="OSL(DK)", shifted="KC_EXLM", dk_base=0x0308, dk_shifted=0x00A1, sym_base="FR_QUOT", sym_shifted=0x0301), - "EKC_Y": Key(base="FR_Y", shifted=None, dk_base=0x00FB, dk_shifted=0x00DB, sym_base="FR_GRV", sym_shifted=0x0300), - - "EKC_A": Key(base="FR_A", shifted=None, dk_base="FR_AGRV", dk_shifted=0x00C0, sym_base="FR_LCBR", sym_shifted=0x030C), - "EKC_S": Key(base="FR_S", shifted=None, dk_base="FR_EACU", dk_shifted=0x00C9, sym_base="FR_LPRN", sym_shifted="KC_TRNS"), - "EKC_E": Key(base="FR_E", shifted=None, dk_base="FR_EGRV", dk_shifted=0x00C8, sym_base="FR_RPRN", sym_shifted="KC_TRNS"), - "EKC_N": Key(base="FR_N", shifted=None, dk_base=0x00EA, dk_shifted=0x00CA, sym_base="FR_RCBR", sym_shifted=0x0307), - "EKC_F": Key(base="FR_F", shifted=None, dk_base=0x00F1, dk_shifted=0x00D1, sym_base="FR_EQL", sym_shifted=0x2260), - - "EKC_L": Key(base="FR_L", shifted=None, dk_base="FR_LPRN", dk_shifted="KC_TRNS", sym_base="FR_BSLS", sym_shifted=0x0338), - "EKC_R": Key(base="FR_R", shifted=None, dk_base="FR_RPRN", dk_shifted="KC_TRNS", sym_base="FR_PLUS", sym_shifted=0x2A72), - "EKC_T": Key(base="FR_T", shifted=None, dk_base=0x00EE, dk_shifted=0x00CE, sym_base="FR_MINS", sym_shifted=0x0304), - "EKC_I": Key(base="FR_I", shifted=None, dk_base=0x00EF, dk_shifted=0x00CF, sym_base="FR_SLSH", sym_shifted=0x00F7), - "EKC_U": Key(base="FR_U", shifted=None, dk_base=0x00F9, dk_shifted=0x00D9, sym_base="FR_DQUO", sym_shifted=0x030B), - - "EKC_Z": Key(base="FR_Z", shifted=None, dk_base=0x00E6, dk_shifted=0x00C6, sym_base="FR_TILD", sym_shifted=0x0303), - "EKC_X": Key(base="FR_X", shifted=None, dk_base=0x00DF, dk_shifted=0x1E9E, sym_base="FR_LBRC", sym_shifted=0x0326), - "EKC_MNS": Key(base="FR_MINS", shifted="FR_QUES", dk_base=0x2011, dk_shifted=0x00BF, sym_base="FR_RBRC", sym_shifted=0x0328), - "EKC_V": Key(base="FR_V", shifted=None, dk_base=0x2013, dk_shifted="KC_TRNS", sym_base="FR_UNDS", sym_shifted=0x2013), - "EKC_B": Key(base="FR_B", shifted=None, dk_base=0x2014, dk_shifted="KC_TRNS", sym_base="FR_HASH", sym_shifted="KC_TRNS"), - - "EKC_DOT": Key(base="FR_DOT", shifted="FR_COLN", dk_base=0x2026, dk_shifted="KC_TRNS", sym_base="FR_PIPE", sym_shifted=0x00A6), - "EKC_H": Key(base="FR_H", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="FR_EXLM", sym_shifted=0x00AC), - "EKC_G": Key(base="FR_G", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="FR_SCLN", sym_shifted=0x0312), - "EKC_COMM": Key(base="FR_COMM", shifted="FR_SCLN", dk_base=0x00B7, dk_shifted=0x2022, sym_base="FR_COLN", sym_shifted="KC_TRNS"), - "EKC_K": Key(base="FR_K", shifted=None, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base="FR_QUES", sym_shifted=0x0306), - - "EKC_1": Key(base="FR_1", shifted=0x20AC, dk_base=0x201E, dk_shifted=0x201A, sym_base=0x2081, sym_shifted=0x00B9), - "EKC_2": Key(base="FR_2", shifted=0x00AB, dk_base=0x201C, dk_shifted=0x2018, sym_base=0x2082, sym_shifted=0x00B2), - "EKC_3": Key(base="FR_3", shifted=0x00BB, dk_base=0x201D, dk_shifted=0x2019, sym_base=0x2083, sym_shifted=0x00B3), - "EKC_4": Key(base="FR_4", shifted="FR_DLR", dk_base=0x00A2, dk_shifted="KC_TRNS", sym_base=0x2084, sym_shifted=0x2074), - "EKC_5": Key(base="FR_5", shifted="FR_PERC", dk_base=0x2030, dk_shifted="KC_TRNS", sym_base=0x2085, sym_shifted=0x2075), - "EKC_6": Key(base="FR_6", shifted=0x005E, dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base=0x2086, sym_shifted=0x2076), - - "EKC_7": Key(base="FR_7", shifted="FR_AMPR", dk_base="KC_TRNS", dk_shifted="KC_TRNS", sym_base=0x2087, sym_shifted=0x2077), - "EKC_8": Key(base="FR_8", shifted="FR_ASTR", dk_base="FR_SECT", dk_shifted="KC_TRNS", sym_base=0x2088, sym_shifted=0x2078), - "EKC_9": Key(base="FR_9", shifted="FR_HASH", dk_base=0x00B6, dk_shifted="KC_TRNS", sym_base=0x2089, sym_shifted=0x2079), - "EKC_0": Key(base="FR_0", shifted="FR_AT", dk_base="FR_DEG", dk_shifted="KC_TRNS", sym_base=0x2080, sym_shifted=0x2070), - - "EKC_SPC": Key(base="KC_SPC", shifted=0x202F, dk_base=0x2019, dk_shifted="KC_TRNS", sym_base="KC_SPC", sym_shifted="KC_TRNS"), + "EKC_Q": Key( + base="FR_Q", + shifted=None, + dk_base=0x00E2, + dk_shifted=0x00C2, + sym_base=0x005E, + sym_shifted=0x0302, + ), + "EKC_C": Key( + base="FR_C", + shifted=None, + dk_base="FR_CCED", + dk_shifted=0x00C7, + sym_base="FR_LABK", + sym_shifted=0x2264, + ), + "EKC_O": Key( + base="FR_O", + shifted=None, + dk_base=0x0153, + dk_shifted=0x0152, + sym_base="FR_RABK", + sym_shifted=0x2265, + ), + "EKC_P": Key( + base="FR_P", + shifted=None, + dk_base=0x00F4, + dk_shifted=0x00D4, + sym_base="FR_DLR", + sym_shifted="KC_TRNS", + ), + "EKC_W": Key( + base="FR_W", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="FR_PERC", + sym_shifted=0x2030, + ), + "EKC_J": Key( + base="FR_J", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="FR_AT", + sym_shifted=0x030A, + ), + "EKC_M": Key( + base="FR_M", + shifted=None, + dk_base=0x00B5, + dk_shifted="KC_TRNS", + sym_base="FR_AMPR", + sym_shifted="KC_TRNS", + ), + "EKC_D": Key( + base="FR_D", + shifted=None, + dk_base="FR_UNDS", + dk_shifted="KC_TRNS", + sym_base="FR_ASTR", + sym_shifted=0x00D7, + ), + "EKC_DK": Key( + base="OSL(DK)", + shifted="KC_EXLM", + dk_base=0x0308, + dk_shifted=0x00A1, + sym_base="FR_QUOT", + sym_shifted=0x0301, + ), + "EKC_Y": Key( + base="FR_Y", + shifted=None, + dk_base=0x00FB, + dk_shifted=0x00DB, + sym_base="FR_GRV", + sym_shifted=0x0300, + ), + "EKC_A": Key( + base="FR_A", + shifted=None, + dk_base="FR_AGRV", + dk_shifted=0x00C0, + sym_base="FR_LCBR", + sym_shifted=0x030C, + ), + "EKC_S": Key( + base="FR_S", + shifted=None, + dk_base="FR_EACU", + dk_shifted=0x00C9, + sym_base="FR_LPRN", + sym_shifted="KC_TRNS", + ), + "EKC_E": Key( + base="FR_E", + shifted=None, + dk_base="FR_EGRV", + dk_shifted=0x00C8, + sym_base="FR_RPRN", + sym_shifted="KC_TRNS", + ), + "EKC_N": Key( + base="FR_N", + shifted=None, + dk_base=0x00EA, + dk_shifted=0x00CA, + sym_base="FR_RCBR", + sym_shifted=0x0307, + ), + "EKC_F": Key( + base="FR_F", + shifted=None, + dk_base=0x00F1, + dk_shifted=0x00D1, + sym_base="FR_EQL", + sym_shifted=0x2260, + ), + "EKC_L": Key( + base="FR_L", + shifted=None, + dk_base="FR_LPRN", + dk_shifted="KC_TRNS", + sym_base="FR_BSLS", + sym_shifted=0x0338, + ), + "EKC_R": Key( + base="FR_R", + shifted=None, + dk_base="FR_RPRN", + dk_shifted="KC_TRNS", + sym_base="FR_PLUS", + sym_shifted=0x2A72, + ), + "EKC_T": Key( + base="FR_T", + shifted=None, + dk_base=0x00EE, + dk_shifted=0x00CE, + sym_base="FR_MINS", + sym_shifted=0x0304, + ), + "EKC_I": Key( + base="FR_I", + shifted=None, + dk_base=0x00EF, + dk_shifted=0x00CF, + sym_base="FR_SLSH", + sym_shifted=0x00F7, + ), + "EKC_U": Key( + base="FR_U", + shifted=None, + dk_base=0x00F9, + dk_shifted=0x00D9, + sym_base="FR_DQUO", + sym_shifted=0x030B, + ), + "EKC_Z": Key( + base="FR_Z", + shifted=None, + dk_base=0x00E6, + dk_shifted=0x00C6, + sym_base="FR_TILD", + sym_shifted=0x0303, + ), + "EKC_X": Key( + base="FR_X", + shifted=None, + dk_base=0x00DF, + dk_shifted=0x1E9E, + sym_base="FR_LBRC", + sym_shifted=0x0326, + ), + "EKC_MNS": Key( + base="FR_MINS", + shifted="FR_QUES", + dk_base=0x2011, + dk_shifted=0x00BF, + sym_base="FR_RBRC", + sym_shifted=0x0328, + ), + "EKC_V": Key( + base="FR_V", + shifted=None, + dk_base=0x2013, + dk_shifted="KC_TRNS", + sym_base="FR_UNDS", + sym_shifted=0x2013, + ), + "EKC_B": Key( + base="FR_B", + shifted=None, + dk_base=0x2014, + dk_shifted="KC_TRNS", + sym_base="FR_HASH", + sym_shifted="KC_TRNS", + ), + "EKC_DOT": Key( + base="FR_DOT", + shifted="FR_COLN", + dk_base=0x2026, + dk_shifted="KC_TRNS", + sym_base="FR_PIPE", + sym_shifted=0x00A6, + ), + "EKC_H": Key( + base="FR_H", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="FR_EXLM", + sym_shifted=0x00AC, + ), + "EKC_G": Key( + base="FR_G", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="FR_SCLN", + sym_shifted=0x0312, + ), + "EKC_COMM": Key( + base="FR_COMM", + shifted="FR_SCLN", + dk_base=0x00B7, + dk_shifted=0x2022, + sym_base="FR_COLN", + sym_shifted="KC_TRNS", + ), + "EKC_K": Key( + base="FR_K", + shifted=None, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base="FR_QUES", + sym_shifted=0x0306, + ), + "EKC_1": Key( + base="FR_1", + shifted=0x20AC, + dk_base=0x201E, + dk_shifted=0x201A, + sym_base=0x2081, + sym_shifted=0x00B9, + ), + "EKC_2": Key( + base="FR_2", + shifted=0x00AB, + dk_base=0x201C, + dk_shifted=0x2018, + sym_base=0x2082, + sym_shifted=0x00B2, + ), + "EKC_3": Key( + base="FR_3", + shifted=0x00BB, + dk_base=0x201D, + dk_shifted=0x2019, + sym_base=0x2083, + sym_shifted=0x00B3, + ), + "EKC_4": Key( + base="FR_4", + shifted="FR_DLR", + dk_base=0x00A2, + dk_shifted="KC_TRNS", + sym_base=0x2084, + sym_shifted=0x2074, + ), + "EKC_5": Key( + base="FR_5", + shifted="FR_PERC", + dk_base=0x2030, + dk_shifted="KC_TRNS", + sym_base=0x2085, + sym_shifted=0x2075, + ), + "EKC_6": Key( + base="FR_6", + shifted=0x005E, + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base=0x2086, + sym_shifted=0x2076, + ), + "EKC_7": Key( + base="FR_7", + shifted="FR_AMPR", + dk_base="KC_TRNS", + dk_shifted="KC_TRNS", + sym_base=0x2087, + sym_shifted=0x2077, + ), + "EKC_8": Key( + base="FR_8", + shifted="FR_ASTR", + dk_base="FR_SECT", + dk_shifted="KC_TRNS", + sym_base=0x2088, + sym_shifted=0x2078, + ), + "EKC_9": Key( + base="FR_9", + shifted="FR_HASH", + dk_base=0x00B6, + dk_shifted="KC_TRNS", + sym_base=0x2089, + sym_shifted=0x2079, + ), + "EKC_0": Key( + base="FR_0", + shifted="FR_AT", + dk_base="FR_DEG", + dk_shifted="KC_TRNS", + sym_base=0x2080, + sym_shifted=0x2070, + ), + "EKC_SPC": Key( + base="KC_SPC", + shifted=0x202F, + dk_base=0x2019, + dk_shifted="KC_TRNS", + sym_base="KC_SPC", + sym_shifted="KC_TRNS", + ), # fmt: on }, } @@ -438,7 +1039,7 @@ class Gen: {custom_autoshift} """ - def __init__(self, host, kms: "Keymaps", autoshift=False): + def __init__(self, host: str, kms: "Keymaps", autoshift: bool = False): self.host = host self.keymaps = kms self.autoshift = autoshift @@ -471,9 +1072,9 @@ def _gen_unicode_map(self): {unicode_map_lines}, }}; """ - indices = [] - unicode_map_lines = [] - already_gen = set() + indices: list[str] = [] + unicode_map_lines: list[str] = [] + already_gen: set[KeyCode] = set() for _, key in self.keys.items(): for m in Mode: kc, skc = key.get_kc(m) @@ -485,11 +1086,11 @@ def _gen_unicode_map(self): continue already_gen.add(k) - ch = chr(k.raw_keycode) + ch = chr(k.raw_keycode) # type: ignore name = unicode_name(ch) name = name.replace(" ", "_").replace("-", "_") - idx = indices_line.format(idx=name) + idx: str = indices_line.format(idx=name) self.unicode_to_idx[k] = idx ln = unicode_map_line.format(idx=idx, cp=k, dsp=ch) indices.append(idx) @@ -499,7 +1100,7 @@ def _gen_unicode_map(self): unicode_map_lines=",\n".join(unicode_map_lines), ) - def _create_override(self, m: Mode, name, kc: KeyCode, skc: KeyCode): + def _create_override(self, m: Mode, name: str, kc: KeyCode, skc: KeyCode): if skc.is_unicode: skc = KeyCode(f"UM({self.unicode_to_idx[skc]})") if skc.is_transparent: @@ -518,8 +1119,8 @@ def _gen_override(self): NULL, }}; """ - overrides = [] - override_names = [] + overrides: list[str] = [] + override_names: list[str] = [] for m, override_per_kc in self.override.items(): for _, override in override_per_kc.items(): overrides.append( @@ -536,7 +1137,7 @@ def _gen_override(self): override_names=",\n".join(override_names), ) - def _create_custom_key(self, m: Mode, name, kc: KeyCode, skc: KeyCode): + def _create_custom_key(self, m: Mode, name: str, kc: KeyCode, skc: KeyCode): if not skc.is_unicode: raise Exception("a custom key must be mapped to an unicode keycode") @@ -594,8 +1195,8 @@ def _gen_custom_keys(self): break; """ - self.custom_keycodes = [] - self.cases = [] + self.custom_keycodes: list[str] = [] + self.cases: list[str] = [] for m in Mode: if not self.keymaps.has_keys(m): @@ -740,7 +1341,7 @@ def _gen_custom_autoshift(self): ) guard = "\n".join( - autoshift_guard.format(layer=l.name) for l in mode_without_autoshift + autoshift_guard.format(layer=la.name) for la in mode_without_autoshift ) self.custom_autoshift = """ {press} @@ -754,17 +1355,15 @@ def _gen_custom_autoshift(self): ), ) - def _alias(self, name, value: KeyCode): - if not isinstance(value, KeyCode): - raise Exception("alias keycode") + def _alias(self, name: str, value: KeyCode) -> KeyCode: if v := self.aliases.get(name): if v != value: raise Exception(f"conflict for {name}, we have {v} and {value}") - return name + return v self.aliases[name] = value return KeyCode(name) - def _gen_kc(self, m: Mode, name, kc: KeyCode, skc: KeyCode): + def _gen_kc(self, m: Mode, name: str | int, kc: KeyCode, skc: KeyCode): alias_name = f"{m.name}_{name}" match get_shift_mod(kc, skc): case ShiftMode.Default: @@ -791,12 +1390,12 @@ def _gen_kc(self, m: Mode, name, kc: KeyCode, skc: KeyCode): return a def _gen(self, m: Mode): - l = self.keymaps.add_layer(m) + layer = self.keymaps.add_layer(m) for n, coord in self.keymaps.base_keys(): - key = self.keys.get(n.raw_keycode) + key = self.keys.get(n.raw_keycode) # type: ignore if not key: if m == Mode.Base: - l.set_key(coord, n) + layer.set_key(coord, n) continue kc = copy.deepcopy(n) @@ -808,7 +1407,7 @@ def _gen(self, m: Mode): kc.replace_keycode(rkc) skc = KeyCode(rskc) final_kc = self._gen_kc(m, n.raw_keycode, kc, skc) - l.set_key(coord, final_kc) + layer.set_key(coord, final_kc) def gen(self): extra_includes = [] @@ -843,32 +1442,40 @@ def gen(self): fmt_layer = """ - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, - {}, {}, {}, {}, {}, {} + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, + {}, {}, {}, {}, {}, {} """ +# homerow mod-taps (aliases for readability) +EHM_A = "LSFT_T(EKC_A)" +EHM_S = "LGUI_T(EKC_S)" +EHM_E = "LALT_T(EKC_E)" +EHM_N = "LCTL_T(EKC_N)" +EHM_R = "LCTL_T(EKC_R)" +EHM_T = "LALT_T(EKC_T)" +EHM_I = "LGUI_T(EKC_I)" keymaps = { "std": { - Mode.Base: """ - KC_ESC , EKC_1 , EKC_2 , EKC_3 , EKC_4 , EKC_5 , LT(Fn|KC_ESC), LT(Fn|KC_ESC), EKC_6 , EKC_7, EKC_8 , EKC_9 , EKC_0 , KC_INS, - KC_TAB , EKC_Q , EKC_C , EKC_O , EKC_P , EKC_W , KC_DEL , KC_BSPC, EKC_J , EKC_M , EKC_D , EKC_DK , EKC_Y , _______, - KC_GRV , EKC_A , EKC_S , EKC_E , EKC_N , EKC_F , _______, _______, EKC_L , EKC_R , EKC_T , EKC_I , _______, _______, - KC_LSFT, EKC_Z , EKC_X , EKC_MNS, EKC_V , EKC_B , EKC_DOT, EKC_H , EKC_G ,EKC_COMM, EKC_K , KC_RSFT, - KC_LCTL, _______, KC_LEFT,KC_RIGHT, KC_LGUI, _______, _______, KC_UP , KC_DOWN, _______, _______, _______, - MO(Sym), _______, _______, KC_LALT, KC_ENTER, EKC_SPC + Mode.Base: f""" + EKC_Q , EKC_C , EKC_O , EKC_P , EKC_W , EKC_J , EKC_M , EKC_D , EKC_DK , EKC_Y, + {EHM_A} , {EHM_S} , {EHM_E} , {EHM_N} , EKC_F , EKC_L , {EHM_R} , {EHM_T} , {EHM_I} , EKC_U, + EKC_Z , EKC_X , EKC_MNS , EKC_V , EKC_B , EKC_DOT, EKC_H , EKC_G , EKC_COMM , EKC_K, + LSFT_T(KC_ESC), LT(Nav|KC_BSPC), KC_ESC, LT(NumFun|KC_TAB), LT(Nav|KC_SPC), LT(Sym|KC_ENT) """, - Mode.Fn: """ - KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , _______, _______, KC_F7 , KC_F8 , KC_F9 , KC_F10, KC_F11 , KC_F12 , - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, UC_PREV, UC_NEXT, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______ + Mode.Nav: """ + KC_BRIU, KC_BTN4, KC_MS_U, KC_BTN5, KC_VOLU, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_DEL, + KC_BRID, KC_MS_L, KC_MS_D, KC_MS_R, KC_VOLD, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, LSFT(KC_ENT), + KC_SLEP, KC_BTN3, KC_WH_U, KC_WH_D, KC_MUTE, KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, KC_NO, + KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_BTN2, KC_BTN1 + """, + Mode.NumFun: """ + KC_EXLM,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_PERC ,KC_TRNS,KC_TRNS ,KC_TRNS ,KC_TRNS ,KC_TRNS, + FR_1 ,FR_2 ,FR_3 ,FR_4 ,FR_5 ,FR_6 ,FR_7 ,FR_8 ,FR_9 ,FR_0 , + KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS , KC_TRNS ,KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS ,KC_QUES, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_ESC, LSFT(KC_SPC) """, }, "daedric": { @@ -908,7 +1515,7 @@ def gen(self): } -km = Keymaps(fmt_layer=fmt_layer, nb_keys=72) +km = Keymaps(fmt_layer=fmt_layer, nb_keys=36) for mode, k in keymaps[args.keymap].items(): if mode == Mode.Base: