From b4cb6e10ca0ad32aeae0d1c88f48f46505812a2f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 28 May 2021 18:21:41 +0530 Subject: [PATCH] Dont resolve kitty_mod in the defaults key definitions Needed to allow multiple load_config calls --- kitty/config.py | 13 ++----------- kitty/options/utils.py | 27 ++++++++++++--------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/kitty/config.py b/kitty/config.py index 48c06b01d..874d60662 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -269,11 +269,7 @@ def finalize_keys(opts: OptionsStub) -> None: if d is None: # clear_all_shortcuts defns = [] else: - defns.append(d) - for d in defns: - d.resolve(opts.kitty_mod) - if opts.kitten_alias and d.action.func == 'kitten': - d.resolve_kitten_aliases(opts.kitten_alias) + defns.append(d.resolve_and_copy(opts.kitty_mod, opts.kitten_alias)) keymap: KeyMap = {} sequence_map: SequenceMap = {} @@ -304,12 +300,7 @@ def finalize_mouse_mappings(opts: OptionsStub) -> None: if d is None: # clear_all_shortcuts defns = [] else: - defns.append(d) - kitten_aliases: List[Dict[str, Sequence[str]]] = getattr(opts, 'kitten_alias') - for d in defns: - d.resolve(opts.kitty_mod) - if kitten_aliases and d.action.func == 'kitten': - d.resolve_kitten_aliases(kitten_aliases) + defns.append(d.resolve_and_copy(opts.kitty_mod, opts.kitten_alias)) mousemap: MouseMap = {} for defn in defns: diff --git a/kitty/options/utils.py b/kitty/options/utils.py index c94afca84..1ea5b2380 100644 --- a/kitty/options/utils.py +++ b/kitty/options/utils.py @@ -762,9 +762,9 @@ def parse_key_action(action: str, action_type: str = 'map') -> Optional[KeyActio class BaseDefinition: action: KeyAction - def resolve_kitten_aliases(self, aliases: Dict[str, Sequence[str]]) -> None: - if not self.action.args: - return + def resolve_kitten_aliases(self, aliases: Dict[str, Sequence[str]]) -> KeyAction: + if not self.action.args or not aliases: + return self.action kitten = self.action.args[0] rest = str(self.action.args[1] if len(self.action.args) > 1 else '') changed = False @@ -774,8 +774,7 @@ class BaseDefinition: kitten = expanded[0] if len(expanded) > 1: rest = expanded[1] + ' ' + rest - if changed: - self.action = self.action._replace(args=(kitten, rest.rstrip())) + return self.action._replace(args=(kitten, rest.rstrip())) if changed else self.action class MouseMapping(BaseDefinition): @@ -790,8 +789,8 @@ class MouseMapping(BaseDefinition): def __repr__(self) -> str: return f'MouseMapping({self.button}, {self.mods}, {self.repeat_count}, {self.grabbed}, {self.action})' - def resolve(self, kitty_mod: int) -> None: - self.mods = defines.resolve_key_mods(kitty_mod, self.mods) + def resolve_and_copy(self, kitty_mod: int, aliases: Dict[str, Sequence[str]]) -> 'MouseMapping': + return MouseMapping(self.button, defines.resolve_key_mods(kitty_mod, self.mods), self.repeat_count, self.grabbed, self.resolve_kitten_aliases(aliases)) @property def trigger(self) -> MouseEvent: @@ -809,16 +808,14 @@ class KeyDefinition(BaseDefinition): def __repr__(self) -> str: return f'KeyDefinition({self.is_sequence}, {self.action}, {self.trigger.mods}, {self.trigger.is_native}, {self.trigger.key}, {self.rest})' - def resolve(self, kitty_mod: int) -> None: - + def resolve_and_copy(self, kitty_mod: int, aliases: Dict[str, Sequence[str]]) -> 'KeyDefinition': def r(k: SingleKey) -> SingleKey: mods = defines.resolve_key_mods(kitty_mod, k.mods) - key = k.key - is_native = k.is_native - return SingleKey(mods, is_native, key) - - self.trigger = r(self.trigger) - self.rest = tuple(map(r, self.rest)) + return k._replace(mods=mods) + return KeyDefinition( + self.is_sequence, self.resolve_kitten_aliases(aliases), + defines.resolve_key_mods(kitty_mod, self.trigger.mods), + self.trigger.is_native, self.trigger.key, tuple(map(r, self.rest))) def parse_map(val: str) -> Iterable[KeyDefinition]: