def do_window_resize(self, is_decrease: bool = False, is_horizontal: bool = True, reset: bool = False, multiplier: int = 1) -> None: resize_window = command_for_name('resize_window') increment = self.opts.horizontal_increment if is_horizontal else self.opts.vertical_increment increment *= multiplier if is_decrease: increment *= -1 axis = 'reset' if reset else ( 'horizontal' if is_horizontal else 'vertical') cmdline = [ resize_window.name, '--self', f'--increment={increment}', '--axis=' + axis ] opts, items = parse_subcommand_cli(resize_window, cmdline) payload = resize_window.message_to_kitty(global_opts, opts, items) send = { 'cmd': resize_window.name, 'version': version, 'payload': payload, 'no_response': False } self.write(encode_send(send))
def generate_stub() -> None: from .cli import parse_option_spec, as_type_stub from .conf.definition import save_type_stub text = 'import typing\n\n\n' def do(otext=None, cls: str = 'CLIOptions', extra_fields: Sequence[str] = ()): nonlocal text text += as_type_stub(*parse_option_spec(otext), class_name=cls, extra_fields=extra_fields) do(extra_fields=('args: typing.List[str]', )) from .launch import options_spec do(options_spec(), 'LaunchCLIOptions') from .remote_control import global_options_spec do(global_options_spec(), 'RCOptions', extra_fields=['no_command_response: typing.Optional[bool]']) from kittens.ask.main import option_text do(option_text(), 'AskCLIOptions') from kittens.remote_file.main import option_text do(option_text(), 'RemoteFileCLIOptions') from kittens.clipboard.main import OPTIONS do(OPTIONS(), 'ClipboardCLIOptions') from kittens.diff.main import OPTIONS do(OPTIONS(), 'DiffCLIOptions') from kittens.hints.main import OPTIONS do(OPTIONS(), 'HintsCLIOptions') from kittens.icat.main import options_spec do(options_spec(), 'IcatCLIOptions') from kittens.panel.main import OPTIONS do(OPTIONS(), 'PanelCLIOptions') from kittens.resize_window.main import OPTIONS do(OPTIONS(), 'ResizeCLIOptions') from kittens.show_error.main import OPTIONS do(OPTIONS(), 'ErrorCLIOptions') from kittens.unicode_input.main import OPTIONS do(OPTIONS(), 'UnicodeCLIOptions') from kitty.rc.base import all_command_names, command_for_name for cmd_name in all_command_names(): cmd = command_for_name(cmd_name) if cmd.options_spec: do(cmd.options_spec, cmd.__class__.__name__ + 'RCOptions') save_type_stub(text, __file__)
def write_cli_docs(all_kitten_names: Iterable[str]) -> None: from kitty.cli import option_spec_as_rst from kitty.launch import options_spec as launch_options_spec with open('generated/launch.rst', 'w') as f: f.write( option_spec_as_rst(appname='launch', ospec=launch_options_spec, heading_char='_', message='''\ Launch an arbitrary program in a new kitty window/tab. Note that if you specify a program-to-run you can use the special placeholder :code:`@selection` which will be replaced by the current selection. ''')) with open('generated/cli-kitty.rst', 'w') as f: f.write( option_spec_as_rst(appname='kitty').replace( 'kitty --to', 'kitty @ --to')) as_rst = partial(option_spec_as_rst, heading_char='_') from kitty.rc.base import all_command_names, command_for_name from kitty.remote_control import cli_msg, global_options_spec with open('generated/cli-kitty-at.rst', 'w') as f: p = partial(print, file=f) p('kitty @') p('-' * 80) p('.. program::', 'kitty @') p('\n\n' + as_rst(global_options_spec, message=cli_msg, usage='command ...', appname='kitty @')) from kitty.rc.base import cli_params_for for cmd_name in sorted(all_command_names()): func = command_for_name(cmd_name) p(f'.. _at_{func.name}:\n') p('kitty @', func.name) p('-' * 120) p('.. program::', 'kitty @', func.name) p('\n\n' + as_rst(*cli_params_for(func))) from kittens.runner import get_kitten_cli_docs for kitten in all_kitten_names: data = get_kitten_cli_docs(kitten) if data: with open(f'generated/cli-kitten-{kitten}.rst', 'w') as f: p = partial(print, file=f) p('.. program::', 'kitty +kitten', kitten) p('\nSource code for', kitten) p('-' * 72) p(f'\nThe source code for this kitten is `available on GitHub <https://github.com/kovidgoyal/kitty/tree/master/kittens/{kitten}>`_.' ) p('\nCommand Line Interface') p('-' * 72) p('\n\n' + option_spec_as_rst(data['options'], message=data['help_text'], usage=data['usage'], appname=f'kitty +kitten {kitten}', heading_char='^'))
def change_theme(self, theme_name): """ Performs the theme change """ set_colors = command_for_name("set_colors") cmdline = [set_colors.name, "-a", "-c", theme_name] opts, items = parse_subcommand_cli(set_colors, cmdline) payload = set_colors.message_to_kitty(self.global_opts, opts, items) send = { "cmd": set_colors.name, "version": version, "payload": payload, "no_response": False, } self.write(encode_send(send)) remove(expanduser("~/.config/kitty/colors.conf")) symlink(theme_name, expanduser("~/.config/kitty/colors.conf"))
def write_remote_control_protocol_docs() -> None: # {{{ from kitty.rc.base import (RemoteCommand, all_command_names, command_for_name) field_pat = re.compile(r'\s*([a-zA-Z0-9_+]+)\s*:\s*(.+)') def format_cmd(p: Callable[..., None], name: str, cmd: RemoteCommand) -> None: p(name) p('-' * 80) lines = (cmd.__doc__ or '').strip().splitlines() fields = [] for line in lines: m = field_pat.match(line) if m is None: p(line) else: fields.append((m.group(1), m.group(2))) if fields: p('\nFields are:\n') for (name, desc) in fields: if '+' in name: title = name.replace('+', ' (required)') else: title = name defval = cmd.get_default(name.replace('-', '_'), cmd) if defval is not cmd: title = f'{title} (default: {defval})' else: title = f'{title} (optional)' p(f':code:`{title}`') p(' ', desc), p() p(), p() with open('generated/rc.rst', 'w') as f: p = partial(print, file=f) for name in sorted(all_command_names()): cmd = command_for_name(name) if not cmd.__doc__: continue name = name.replace('_', '-') format_cmd(p, name, cmd)
def generate_stub() -> None: from .cli import parse_option_spec, as_type_stub from .conf.utils import save_type_stub text = 'import typing\n\n\n' def do(otext=None, cls: str = 'CLIOptions', extra_fields: Sequence[str] = ()): nonlocal text text += as_type_stub(*parse_option_spec(otext), class_name=cls, extra_fields=extra_fields) do(extra_fields=('args: typing.List[str]', )) from .launch import options_spec do(options_spec(), 'LaunchCLIOptions') from .remote_control import global_options_spec do(global_options_spec(), 'RCOptions') from kittens.ask.main import option_text do(option_text(), 'AskCLIOptions') from kittens.remote_file.main import option_text do(option_text(), 'RemoteFileCLIOptions') from kittens.clipboard.main import OPTIONS do(OPTIONS(), 'ClipboardCLIOptions') from kittens.show_key.main import OPTIONS do(OPTIONS(), 'ShowKeyCLIOptions') from kittens.diff.main import OPTIONS do(OPTIONS(), 'DiffCLIOptions') from kittens.hints.main import OPTIONS do(OPTIONS(), 'HintsCLIOptions') from kittens.broadcast.main import OPTIONS do(OPTIONS(), 'BroadcastCLIOptions') from kittens.icat.main import options_spec do(options_spec(), 'IcatCLIOptions') from kittens.query_terminal.main import options_spec do(options_spec(), 'QueryTerminalCLIOptions') from kittens.panel.main import OPTIONS do(OPTIONS(), 'PanelCLIOptions') from kittens.resize_window.main import OPTIONS do(OPTIONS(), 'ResizeCLIOptions') from kittens.show_error.main import OPTIONS do(OPTIONS(), 'ErrorCLIOptions') from kittens.unicode_input.main import OPTIONS do(OPTIONS(), 'UnicodeCLIOptions') from kittens.themes.main import OPTIONS do(OPTIONS(), 'ThemesCLIOptions') from kittens.transfer.main import option_text as OPTIONS do(OPTIONS(), 'TransferCLIOptions') from kittens.ssh.copy import option_text as OPTIONS do(OPTIONS(), 'CopyCLIOptions') from kitty.rc.base import all_command_names, command_for_name for cmd_name in all_command_names(): cmd = command_for_name(cmd_name) if cmd.options_spec: do(cmd.options_spec, f'{cmd.__class__.__name__}RCOptions') save_type_stub(text, __file__)