diff --git a/docs/changelog.rst b/docs/changelog.rst index 72b132d9a..cdb34ee87 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -17,6 +17,9 @@ Changelog `*_with_cwd` actions that open a new window with the current working directory. +- Add a new ``copy_or_interrupt`` action that can be mapped to kbd:`ctrl+c`. It + will copy if there is a selection and interrupt otherwise (:iss:`1286`) + - Fix setting :opt:`background_opacity` causing window margins/padding to be slightly different shade from background (:iss:`1221`) diff --git a/kitty/config_data.py b/kitty/config_data.py index 8412dd866..b471d7b97 100644 --- a/kitty/config_data.py +++ b/kitty/config_data.py @@ -848,7 +848,10 @@ g('shortcuts.clipboard') # {{{ if is_macos: k('copy_to_clipboard', 'cmd+c', 'copy_to_clipboard', _('Copy to clipboard'), add_to_docs=False) k('paste_from_clipboard', 'cmd+v', 'paste_from_clipboard', _('Paste from clipboard'), add_to_docs=False) -k('copy_to_clipboard', 'kitty_mod+c', 'copy_to_clipboard', _('Copy to clipboard')) +k('copy_to_clipboard', 'kitty_mod+c', 'copy_to_clipboard', _( + 'Copy to clipboard. There is also a :code:`copy_or_interrupt` action that' + ' can be optionally mapped to :kbd:`ctrl+c`. It' + ' will copy only if there is a selection and send an interrupt otherwise. ')) k('paste_from_clipboard', 'kitty_mod+v', 'paste_from_clipboard', _('Paste from clipboard')) k('paste_from_selection', 'kitty_mod+s', 'paste_from_selection', _('Paste from selection')) k('paste_from_selection', 'shift+insert', 'paste_from_selection', _('Paste from selection')) diff --git a/kitty/window.py b/kitty/window.py index 03d439cb8..a041cc88d 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -23,7 +23,7 @@ from .fast_data_types import ( set_clipboard_string, set_titlebar_color, set_window_render_data, update_window_title, update_window_visibility, viewport_for_window ) -from .keys import keyboard_mode_name +from .keys import keyboard_mode_name, extended_key_event, defines from .rgb import to_color from .terminfo import get_capabilities from .utils import ( @@ -524,6 +524,15 @@ class Window: if text: set_clipboard_string(text) + def copy_or_interrupt(self): + text = self.text_for_selection() + if text: + set_clipboard_string(text) + else: + mode = keyboard_mode_name(self.screen) + text = extended_key_event(defines.GLFW_KEY_C, defines.GLFW_MOD_CONTROL, defines.GLFW_PRESS) if mode == 'kitty' else b'\x03' + self.write_to_child(text) + def pass_selection_to_program(self, *args): cwd = self.cwd_of_child text = self.text_for_selection()