Allow mapping arbitrary remote control commands to key presses in kitty.conf

This commit is contained in:
Kovid Goyal
2020-04-19 20:14:23 +05:30
parent b3f161efce
commit 717c0c96de
4 changed files with 40 additions and 0 deletions

View File

@@ -14,6 +14,9 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- Fix reverse video not being rendered correctly when using transparency or a - Fix reverse video not being rendered correctly when using transparency or a
background image (:iss:`2419`) background image (:iss:`2419`)
- Allow mapping arbitrary remote control commands to key presses in
:file:`kitty.conf`
- X11: Fix crash when doing drag and drop from some applications (:iss:`2505`) - X11: Fix crash when doing drag and drop from some applications (:iss:`2505`)
- Fix :option:`launch --stdin-add-formatting` not working (:iss:`2512`) - Fix :option:`launch --stdin-add-formatting` not working (:iss:`2512`)

View File

@@ -134,6 +134,19 @@ still write to the pipes of any other program on the same computer and
therefore can control |kitty|. It can, however, be useful to block programs therefore can control |kitty|. It can, however, be useful to block programs
running on other computers (for example, over ssh) or as other users. running on other computers (for example, over ssh) or as other users.
Mapping key presses to remote control commands
--------------------------------------------------
If you wish to trigger a remote control command easily with just a keypress,
you can map it in :file:`kitty.conf`. For example::
map F1 remote_control set-spacing margin=30
Then pressing the :kbd:`F1` key will set the active window margins to 30.
The syntax for what follows :code:`remote_control` is exactly the same
as the syntax for what follows :code:`kitty @` above.
Documentation for the remote control protocol Documentation for the remote control protocol
----------------------------------------------- -----------------------------------------------

View File

@@ -339,6 +339,21 @@ class Boss:
response = {'ok': False, 'error': 'Remote control is disabled. Add allow_remote_control to your kitty.conf'} response = {'ok': False, 'error': 'Remote control is disabled. Add allow_remote_control to your kitty.conf'}
return response return response
def remote_control(self, *args: str) -> None:
from .remote_control import parse_rc_args
from .rc.base import command_for_name, parse_subcommand_cli, PayloadGetter
try:
global_opts, items = parse_rc_args(['@'] + list(args))
if not items:
return
cmd = items[0]
c = command_for_name(cmd)
opts, items = parse_subcommand_cli(c, items)
payload = c.message_to_kitty(global_opts, opts, items)
c.response_from_kitty(self, self.active_window, PayloadGetter(c, payload if isinstance(payload, dict) else {}))
except (Exception, SystemExit) as e:
self.show_error(_('remote_control mapping failed'), str(e))
def peer_message_received(self, msg_bytes: bytes) -> Optional[bytes]: def peer_message_received(self, msg_bytes: bytes) -> Optional[bytes]:
msg = msg_bytes.decode('utf-8') msg = msg_bytes.decode('utf-8')
cmd_prefix = '\x1bP@kitty-cmd' cmd_prefix = '\x1bP@kitty-cmd'

View File

@@ -240,6 +240,15 @@ def set_colors(func: str, rest: str) -> FuncArgsType:
return func, r return func, r
@func_with_args('remote_control')
def remote_control(func: str, rest: str) -> FuncArgsType:
import shlex
r = shlex.split(rest)
if len(r) < 1:
log_error('Too few arguments to remote_control function')
return func, r
@func_with_args('nth_window') @func_with_args('nth_window')
def nth_window(func: str, rest: str) -> FuncArgsType: def nth_window(func: str, rest: str) -> FuncArgsType:
try: try: