Document all mappable actions

This commit is contained in:
Kovid Goyal 2021-06-30 14:33:28 +05:30
parent e6a17f78b6
commit 2ec0d94c31
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 124 additions and 6 deletions

15
docs/actions.rst Normal file
View File

@ -0,0 +1,15 @@
:tocdepth: 2
Mappable actions
===================
.. highlight:: conf
The actions described below can be mapped to any key press or mouse action
using the ``map`` and ``mouse_map`` directives in :file:`kitty.conf`.
.. contents::
:local:
:depth: 1
.. include:: /generated/actions.rst

View File

@ -102,6 +102,9 @@ the currently active window::
Other keyboard shortcuts
----------------------------------
The full list of actions that can be mapped to key presses is available
:doc:`here </actions>`.
================================== =======================
Action Shortcut
================================== =======================

View File

@ -510,6 +510,10 @@ def write_conf_docs(app: Any, all_kitten_names: Iterable[str]) -> None:
definition = get_kitten_conf_docs(kitten)
if definition:
generate_default_config(definition, f'kitten-{kitten}')
from kitty.actions import as_rst
with open(f'generated/actions.rst', 'w', encoding='utf-8') as f:
f.write(as_rst())
# }}}

94
kitty/actions.py Normal file
View File

@ -0,0 +1,94 @@
#!/usr/bin/env python
# vim:fileencoding=utf-8
# License: GPLv3 Copyright: 2021, Kovid Goyal <kovid at kovidgoyal.net>
from typing import NamedTuple, Dict, List
from .window import Window
from .tabs import Tab
from .boss import Boss
from .types import run_once
import inspect
class Action(NamedTuple):
name: str
group: str
short_help: str
long_help: str
groups = {
'cp': 'Copy/paste',
'sc': 'Scrolling',
'win': 'Window management',
'tab': 'Tab management',
'mouse': 'Mouse actions',
'mk': 'Marks',
'misc': 'Miscellaneous',
}
group_title = groups.__getitem__
@run_once
def get_all_actions() -> Dict[str, List[Action]]:
ans: Dict[str, List[Action]] = {}
def is_action(x: object) -> bool:
doc = getattr(x, '__doc__', '')
return bool(doc and doc.strip().startswith('@ac:'))
def as_action(x: object) -> Action:
doc = (x.__doc__ or '').strip()
lines = doc.splitlines()
first = lines.pop(0)
parts = first.split(':', 2)
grp = parts[1].strip()
short_help = parts[2].strip()
long_help = '\n'.join(lines).strip()
return Action(getattr(x, '__name__'), grp, short_help, long_help)
seen = set()
for cls in (Window, Tab, Boss):
for (name, func) in inspect.getmembers(cls, is_action):
ac = as_action(func)
if ac.name not in seen:
ans.setdefault(ac.group, []).append(ac)
seen.add(ac.name)
return ans
def dump() -> None:
from pprint import pprint
pprint(get_all_actions())
def as_rst() -> str:
allg = get_all_actions()
lines: List[str] = []
a = lines.append
for group in sorted(allg, key=lambda x: group_title(x).lower()):
title = group_title(group)
a('')
a(f'.. _action-group-{group}:')
a('')
a(title)
a('-' * len(title))
a('')
a('.. contents::')
a(' :local:')
a(' :depth: 1')
a('')
for action in allg[group]:
a('')
a(f'.. _action-{action.name}:')
a('')
a(action.name)
a('^' * len(action.name))
a('')
a(action.short_help)
a('')
if action.long_help:
a(action.long_help)
return '\n'.join(lines)

View File

@ -566,7 +566,7 @@ class Boss:
'''
@ac:misc: Clear the terminal
For example::
See :sc:`reset_terminal` for details. For example::
# Reset the terminal
map kitty_mod+f9 clear_terminal reset active
@ -577,7 +577,6 @@ class Boss:
# Scroll the contents of the screen into the scrollback
map kitty_mod+f12 clear_terminal scroll active
See :sc:`reset_terminal` for details.
'''
if only_active:
windows = []
@ -1067,7 +1066,7 @@ class Boss:
return overlay_window
def kitten(self, kitten: str, *args: str) -> None:
'@ac:misc: Run the specified kitten. See :doc:`kittens/custom` for details'
'@ac:misc: Run the specified kitten. See :doc:`/kittens/custom` for details'
import shlex
cmdline = args[0] if args else ''
kargs = shlex.split(cmdline) if cmdline else []
@ -1084,7 +1083,7 @@ class Boss:
end_kitten(data, target_window_id, self)
def input_unicode_character(self) -> None:
'@ac:misc: Input an arbitrary unicode character. See :doc:`kittens/unicode_input` for details.'
'@ac:misc: Input an arbitrary unicode character. See :doc:`/kittens/unicode-input` for details.'
self._run_kitten('unicode_input')
def set_tab_title(self) -> None:
@ -1739,7 +1738,7 @@ class Boss:
'''
@ac:win: Detach a window, moving it to another tab or OS Window
See :ref:`detach_window` for details.
See :ref:`detaching windows <detach_window>` for details.
'''
if not args or args[0] == 'new':
return self._move_window_to(target_os_window_id='new')
@ -1794,7 +1793,7 @@ class Boss:
'''
@ac:tab: Detach a tab, moving it to another OS Window
See :ref:`detach_window` for details.
See :ref:`detaching windows <detach_window>` for details.
'''
if not args or args[0] == 'new':
return self._move_tab_to()

View File

@ -2700,6 +2700,9 @@ You can use multi-key shortcuts using the syntax shown below::
For example::
map ctrl+f>2 set_font_size 20
The full list of actions that can be mapped to key presses is available
:doc:`here </actions>`.
''')
opt('kitty_mod', 'ctrl+shift',