Document the mouse action mapping infrastructure

This commit is contained in:
Kovid Goyal 2021-05-11 08:39:13 +05:30
parent 858dac5601
commit 2b4d55804c
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 54 additions and 27 deletions

View File

@ -4,9 +4,12 @@ Changelog
|kitty| is a feature-rich, cross-platform, *fast*, GPU based terminal.
To update |kitty|, :doc:`follow the instructions <binary>`.
0.20.4 [future]
0.21.0 [future]
----------------------
- Allow remapping all mouse button press/release events to perform arbitrary
actions. :ref:`See details <conf-kitty-mouse.mousemap>`.
- Support infinite length ligatures (:iss:`3504`)
- Unicode input kitten: Fix a regression in 0.20.0 that broke keyboard handling

View File

@ -272,6 +272,9 @@ Mouse features
* You can select text with kitty even when a terminal program has grabbed
the mouse by holding down the :kbd:`shift` key.
All these actions can be customized in :file:`kitty.conf` as described
:ref:`here <conf-kitty-mouse.mousemap>`.
Font control
-----------------

View File

@ -255,27 +255,27 @@ def as_conf_file(all_options: Iterable[OptionOrAction]) -> List[str]:
ans = ['# vim:fileencoding=utf-8:ft=conf:foldmethod=marker', '']
a = ans.append
current_group: Optional[Group] = None
num_open_folds = 0
group_folds = []
all_options_ = list(all_options)
def render_group(group: Group, is_shortcut: bool) -> None:
nonlocal num_open_folds
if is_shortcut or '.' not in group.name:
a('#: ' + group.short_text + ' {{''{')
num_open_folds += 1
a('#: ' + group.short_text + ' {{''{')
group_folds.append(group.name)
a('')
if group.start_text:
a(render_block(group.start_text))
a('')
def handle_group_end(group: Group, new_group_name: str = '', new_group_is_shortcut: bool = False) -> None:
nonlocal num_open_folds
if group.end_text:
a(''), a(render_block(group.end_text))
is_subgroup = new_group_name.startswith(group.name + '.')
if not is_subgroup and num_open_folds > 0:
while group_folds:
is_subgroup = new_group_name.startswith(group_folds[-1] + '.')
if is_subgroup:
break
a('#: }}''}'), a('')
num_open_folds -= 1
del group_folds[-1]
def handle_group(new_group: Group, is_shortcut: bool = False) -> None:
nonlocal current_group
@ -314,9 +314,9 @@ def as_conf_file(all_options: Iterable[OptionOrAction]) -> List[str]:
if current_group:
handle_group_end(current_group)
while num_open_folds > 0:
while group_folds:
a('# }}''}')
num_open_folds -= 1
del group_folds[-1]
map_groups = []
start: Optional[int] = None

View File

@ -139,8 +139,27 @@ as color16 to color255.''')
],
'advanced': [_('Advanced')],
'os': [_('OS specific tweaks')],
'mousemap': [
'mouse.mousemap': [
_('Mouse actions'),
_('''\
Mouse buttons can be remapped to perform arbitrary actions. The syntax for
doing so is:
.. code-block:: none
mouse_map button-name event-type modes action
Where ``button-name`` is one of ``left``, ``middle``, ``right`` or ``b1 ... b8``
with added keyboard modifiers, for example: ``ctrl+shift+left`` refers to holding
the :kbd:`ctrl+shift` keys while clicking with the left mouse button. The
number ``b1 ... b8`` can be used to refer to upto eight buttons on a mouse.
``event-type`` is one ``press``, ``release``, ``doublepress`` and ``triplepress``.
``modes`` indicates whether the action is performed when the mouse is grabbed by the
terminal application or not. It can have one or more or the values, ``grabbed,ungrabbed``.
See the builtin actions below to get a sense of what is possible.
'''),
],
'shortcuts': [
_('Keyboard shortcuts'),
@ -637,6 +656,23 @@ The default shape of the mouse pointer when dragging across text.
Valid values are: :code:`arrow`, :code:`beam` and :code:`hand`
'''))
g('mouse.mousemap') # {{{
m('click_url', 'ctrl+shift+left', 'release', 'grabbed,ungrabbed', 'mouse_click_url', _('Click the link under the mouse cursor'))
m('paste_selection', 'middle', 'release', 'grabbed,ungrabbed', 'paste_selection', _('Paste from the primary selection'))
m('extend_selection', 'right', 'press', 'grabbed,ungrabbed', 'mouse_selection extend', _('Extend the current selection'))
for grabbed in (False, True):
modes = 'ungrabbed' + (',grabbed' if grabbed else '')
name_s = '_grabbed' if grabbed else ''
mods_p = 'shift+' if grabbed else ''
ts = _(' even when grabbed') if grabbed else ''
m('start_simple_selection' + name_s, mods_p + 'left', 'press', modes, 'mouse_selection normal', _('Start selecting text') + ts)
m('start_rectangle_selection' + name_s, mods_p + 'ctrl+alt+left', 'press', modes, 'mouse_selection rectangle',
_('Start selecting text in a rectangle') + ts)
m('select_word' + name_s, mods_p + 'left', 'doublepress', modes, 'mouse_selection word', _('Select a word') + ts)
m('select_line' + name_s, mods_p + 'left', 'triplepress', modes, 'mouse_selection line', _('Select a line') + ts)
# }}}
# }}}
g('performance') # {{{
@ -1343,21 +1379,6 @@ automatically. Set it to :code:`x11` or :code:`wayland`
to force the choice.'''))
# }}}
g('mousemap') # {{{
m('click_url', 'ctrl+shift+left', 'release', 'grabbed,ungrabbed', 'mouse_click_url', _('Click the link under the mouse cursor'))
m('paste_selection', 'middle', 'release', 'grabbed,ungrabbed', 'paste_selection', _('Paste from the primary selection'))
m('extend_selection', 'right', 'press', 'grabbed,ungrabbed', 'mouse_selection extend', _('Extend the current selection'))
for grabbed in (False, True):
modes = 'ungrabbed' + (',grabbed' if grabbed else '')
name_s = '_grabbed' if grabbed else ''
mods_p = 'shift+' if grabbed else ''
m('start_simple_selection' + name_s, mods_p + 'left', 'press', modes, 'mouse_selection normal', _('Start selecting text'))
m('start_rectangle_selection' + name_s, mods_p + 'ctrl+alt+left', 'press', modes, 'mouse_selection rectangle',
_('Start selecting text in a rectangle'))
m('select_word' + name_s, mods_p + 'left', 'doublepress', modes, 'mouse_selection word', _('Select a word'))
m('select_line' + name_s, mods_p + 'left', 'triplepress', modes, 'mouse_selection line', _('Select a line'))
# }}}
g('shortcuts') # {{{