From 007f377f1609a10034c17025655071a350dea267 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 25 Jul 2018 09:45:11 +0530 Subject: [PATCH] Allow running kitten via the remote control system Fixes #738 --- docs/changelog.rst | 2 ++ kitty/boss.py | 11 ++++++++--- kitty/cmds.py | 27 +++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index b1b6e8827..bcd9e4d30 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -22,6 +22,8 @@ Changelog - Remote control: Allow matching windows by the environment variables of their child process as well +- Allow running kitten via the remote control system (:iss:`738`) + 0.11.3 [2018-07-10] ------------------------------ diff --git a/kitty/boss.py b/kitty/boss.py index 592e8e846..0eb9db7a2 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -582,9 +582,14 @@ class Boss: output += str(s.linebuf.line(i)) return output - def _run_kitten(self, kitten, args=(), input_data=None): - w = self.active_window - tab = self.active_tab + def _run_kitten(self, kitten, args=(), input_data=None, window=None): + if window is None: + w = self.active_window + tab = self.active_tab + else: + w = window + tab = w.tabref() + if w is not None and tab is not None and w.overlay_for is None: orig_args, args = list(args), list(args) from kittens.runner import create_kitten_handler diff --git a/kitty/cmds.py b/kitty/cmds.py index c77e52430..bf29185be 100644 --- a/kitty/cmds.py +++ b/kitty/cmds.py @@ -682,6 +682,33 @@ def set_background_opacity(boss, window, payload): # }}} +# kitten {{{ +@cmd( + 'Run a kitten', + 'Run a kitten over the specified window (active window by default)', + options_spec=MATCH_WINDOW_OPTION, + argspec='kitten_name', +) +def cmd_kitten(global_opts, opts, args): + if len(args) < 1: + raise SystemExit('Must specify kitten name') + return {'match': opts.match, 'args': list(args)[1:], 'kitten': args[0]} + + +def kitten(boss, window, payload): + windows = [window or boss.active_window] + match = payload['match'] + if match: + windows = tuple(boss.match_windows(match)) + if not windows: + raise MatchError(match) + for window in windows: + if window: + boss._run_kitten(payload['kitten'], args=tuple(payload['args']), window=window) + break +# }}} + + cmap = {v.name: v for v in globals().values() if hasattr(v, 'is_cmd')}