From 946d28ae371de82b988cc599f699f37e3a9a93fb Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sat, 10 Feb 2024 14:52:29 +0530 Subject: [PATCH] Completion for kitty @ load-config --override xxx --- gen/go_code.py | 6 +++--- kitty/rc/load_config.py | 1 + tools/cmd/at/complete_actions.go | 13 +++++++++++++ tools/cmd/completion/kitty.go | 10 +++++++--- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/gen/go_code.py b/gen/go_code.py index 6776f8330..16db8685e 100755 --- a/gen/go_code.py +++ b/gen/go_code.py @@ -238,13 +238,10 @@ def completion_for_launch_wrappers(*names: str) -> None: def generate_completions_for_kitty() -> None: - from kitty.config import option_names_for_completion print('package completion\n') print('import "kitty/tools/cli"') print('import "kitty/tools/cmd/tool"') print('import "kitty/tools/cmd/at"') - conf_names = ', '.join((f'"{serialize_as_go_string(x)}"' for x in option_names_for_completion())) - print('var kitty_option_names_for_completion = []string{' + conf_names + '}') print('func kitty(root *cli.Command) {') @@ -573,6 +570,7 @@ def load_ref_map() -> Dict[str, Dict[str, str]]: def generate_constants() -> str: from kittens.hints.main import DEFAULT_REGEX + from kitty.config import option_names_for_completion from kitty.fast_data_types import FILE_TRANSFER_CODE from kitty.options.utils import allowed_shell_integration_values del sys.modules['kittens.hints.main'] @@ -583,6 +581,7 @@ def generate_constants() -> str: placeholder_char = int(m.group(1), 16) dp = ", ".join(map(lambda x: f'"{serialize_as_go_string(x)}"', kc.default_pager_for_help)) url_prefixes = ','.join(f'"{x}"' for x in Options.url_prefixes) + option_names = '`' + '\n'.join(option_names_for_completion()) + '`' return f'''\ package kitty @@ -618,6 +617,7 @@ Term: "{Options.term}", Shell_integration: "{' '.join(Options.shell_integration) Select_by_word_characters: `{Options.select_by_word_characters}`, Wheel_scroll_multiplier: {Options.wheel_scroll_multiplier}, Shell: "{Options.shell}", Url_excluded_characters: "{Options.url_excluded_characters}", }} +const OptionNames = {option_names} ''' # }}} diff --git a/kitty/rc/load_config.py b/kitty/rc/load_config.py index fca346202..ed994fb76 100644 --- a/kitty/rc/load_config.py +++ b/kitty/rc/load_config.py @@ -44,6 +44,7 @@ or a previous load-config-file command are respected. Use this option to have th --override -o type=list +completion=type:special group:complete_kitty_override Override individual configuration options, can be specified multiple times. Syntax: :italic:`name=value`. For example: :option:`{appname} -o` font_size=20 diff --git a/tools/cmd/at/complete_actions.go b/tools/cmd/at/complete_actions.go index 79a3e0766..2533af5a4 100644 --- a/tools/cmd/at/complete_actions.go +++ b/tools/cmd/at/complete_actions.go @@ -6,6 +6,7 @@ import ( "fmt" "strings" + "kitty" "kitty/tools/cli" "kitty/tools/utils" ) @@ -24,3 +25,15 @@ func complete_actions(completions *cli.Completions, word string, arg_num int) { } } } + +func complete_kitty_override(completions *cli.Completions, word string, arg_num int) { + mg := completions.AddMatchGroup("Config directives") + mg.NoTrailingSpace = true + scanner := utils.NewLineScanner(kitty.OptionNames) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, word) { + mg.AddMatch(line + "=") + } + } +} diff --git a/tools/cmd/completion/kitty.go b/tools/cmd/completion/kitty.go index 175ea1852..b15eeeb42 100644 --- a/tools/cmd/completion/kitty.go +++ b/tools/cmd/completion/kitty.go @@ -6,8 +6,10 @@ import ( "fmt" "strings" + kitty_constants "kitty" "kitty/tools/cli" "kitty/tools/themes" + "kitty/tools/utils" ) var _ = fmt.Print @@ -15,9 +17,11 @@ var _ = fmt.Print func complete_kitty_override(completions *cli.Completions, word string, arg_num int) { mg := completions.AddMatchGroup("Config directives") mg.NoTrailingSpace = true - for _, q := range kitty_option_names_for_completion { - if strings.HasPrefix(q, word) { - mg.AddMatch(q + "=") + scanner := utils.NewLineScanner(kitty_constants.OptionNames) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, word) { + mg.AddMatch(line + "=") } } }