From d0ecdfb330f359dc2a800bf6570b31d3497ff0e9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 2 Aug 2019 10:40:11 +0530 Subject: [PATCH] Add a :opt:`kitten_alias` option that can be used to alias kitten invocation for brevity and to change kitten option defaults globally See #1879 --- docs/changelog.rst | 3 +++ kitty/config.py | 27 ++++++++++++++++++++++++++- kitty/config_data.py | 8 ++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 0666f9aa8..7eaec3fda 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -13,6 +13,9 @@ To update |kitty|, :doc:`follow the instructions `. - hints kitten: Allow specifying :option:`kitty +kitten hints --program` multiple times to run multiple programs (:iss:`1879`) +- Add a :opt:`kitten_alias` option that can be used to alias kitten invocation + for brevity and to change kitten option defaults globally (:iss:`1879`) + - Dont fail to start if running the shell to read the EDITOR env var fails (:iss:`1869`) diff --git a/kitty/config.py b/kitty/config.py index 2d4d3e24a..d60dad8ca 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -263,6 +263,21 @@ class KeyDefinition: self.trigger = defines.resolve_key_mods(kitty_mod, self.trigger[0]), self.trigger[1], self.trigger[2] self.rest = tuple((defines.resolve_key_mods(kitty_mod, mods), is_native, key) for mods, is_native, key in self.rest) + def resolve_kitten_aliases(self, aliases): + if not self.action.args: + return + kitten = self.action.args[0] + rest = self.action.args[1] if len(self.action.args) > 1 else '' + changed = False + for key, expanded in aliases.items(): + if key == kitten: + changed = True + kitten = expanded[0] + if len(expanded) > 1: + rest = expanded[1] + ' ' + rest + if changed: + self.action = self.action._replace(args=[kitten + (' ' + rest).rstrip()]) + def parse_key(val, key_definitions): parts = val.split(maxsplit=1) @@ -385,6 +400,13 @@ def handle_symbol_map(key, val, ans): ans['symbol_map'].update(parse_symbol_map(val)) +@special_handler +def handle_kitten_alias(key, val, ans): + parts = val.split(maxsplit=2) + if len(parts) >= 2: + ans['kitten_aliases'][parts[0]] = parts[1:] + + @special_handler def handle_send_text(key, val, ans): # For legacy compatibility @@ -444,7 +466,7 @@ def option_names_for_completion(): def parse_config(lines, check_keys=True, accumulate_bad_lines=None): - ans = {'symbol_map': {}, 'keymap': {}, 'sequence_map': {}, 'key_definitions': [], 'env': {}} + ans = {'symbol_map': {}, 'keymap': {}, 'sequence_map': {}, 'key_definitions': [], 'env': {}, 'kitten_aliases': {}} parse_config_base( lines, defaults, @@ -594,8 +616,11 @@ def finalize_keys(opts): defns = [] else: defns.append(d) + kitten_aliases = opts.kitten_aliases for d in defns: d.resolve(opts.kitty_mod) + if kitten_aliases and d.action.func == 'kitten': + d.resolve_kitten_aliases(kitten_aliases) keymap = {} sequence_map = {} diff --git a/kitty/config_data.py b/kitty/config_data.py index 6610fce56..d066c0549 100644 --- a/kitty/config_data.py +++ b/kitty/config_data.py @@ -992,6 +992,14 @@ o('clear_all_shortcuts', False, long_text=_(''' You can have kitty remove all shortcut definition seen up to this point. Useful, for instance, to remove the default shortcuts.''')) +o('kitten_alias', 'hints hints --hints-offset=0', add_to_default=False, long_text=_(''' +You can create aliases for kitten names, this allows overriding the defaults +for kitten options and can also be used to shorten repeated mappings of the same +kitten with a specific group of options. For example, the above alias +changes the default value of :option:`kitty +kitten hints --hints-offset` +to zero for all mappings, including the builtin ones. +''')) + g('shortcuts.clipboard') # {{{ k('copy_to_clipboard', 'kitty_mod+c', 'copy_to_clipboard', _('Copy to clipboard'), long_text=_(''' There is also a :code:`copy_or_interrupt` action that can be optionally mapped to :kbd:`Ctrl+c`.