diff --git a/docs/changelog.rst b/docs/changelog.rst index 96b2daad9..a96d4ba16 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -50,6 +50,9 @@ Changelog - macOS: Keep kitty running even when the last window is closed. This is in line with how applications are supposed to behave on macOS (:iss:`543`) +- macOS: Add macOS standard shortcuts for copy, paste and new OS window + (⌘+C, ⌘+V, ⌘+N) + - Add a config option (:opt:`editor`) to set the EDITOR kitty uses (:iss:`580`) - Add a config option (:opt:`x11_hide_window_decorations`) to hide window diff --git a/docs/index.rst b/docs/index.rst index cf240c677..1b14f9386 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -138,7 +138,7 @@ Windows Action Shortcut ======================== ======================= New window :sc:`new_window` -New OS window :sc:`new_os_window` +New OS window :sc:`new_os_window` (also :kbd:`⌘+n` on macOS) Close window :sc:`close_window` Next window :sc:`next_window` Previous window :sc:`previous_window` @@ -156,8 +156,8 @@ Other keyboard shortcuts ================================== ======================= Action Shortcut ================================== ======================= -Copy to clipboard :sc:`copy_to_clipboard` -Paste from clipboard :sc:`paste_from_clipboard` +Copy to clipboard :sc:`copy_to_clipboard` (also :kbd:`⌘+c` on macOS) +Paste from clipboard :sc:`paste_from_clipboard` (also :kbd:`⌘+v` on macOS) Paste from selection :sc:`paste_from_selection` Increase font size :sc:`increase_font_size` Decrease font size :sc:`decrease_font_size` diff --git a/kitty/config_data.py b/kitty/config_data.py index 098835fc0..d611b1d10 100644 --- a/kitty/config_data.py +++ b/kitty/config_data.py @@ -10,6 +10,7 @@ from .conf.definition import option_func from .conf.utils import ( choices, positive_float, positive_int, to_cmdline, to_color, unit_float ) +from .constants import is_macos from .fast_data_types import CURSOR_BEAM, CURSOR_BLOCK, CURSOR_UNDERLINE from .layout import all_layouts from .rgb import color_as_int, color_as_sharp, color_from_int @@ -690,6 +691,9 @@ You can have kitty remove all shortcut definition seen up to this point. Useful, instance, to remove the default shortcuts.''')) 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('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')) @@ -741,6 +745,8 @@ working directory of the current window using:: map ctrl+alt+enter new_window_with_cwd ''')) +if is_macos: + k('new_os_window', 'cmd+n', 'new_os_window', _('New OS window')) k('new_os_window', 'kitty_mod+n', 'new_os_window', _('New OS window')) k('close_window', 'kitty_mod+w', 'close_window', _('Close window')) k('next_window', 'kitty_mod+]', 'next_window', _('Next window')) diff --git a/kitty/main.py b/kitty/main.py index 4c70a56d0..123216934 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -16,7 +16,7 @@ from .constants import ( ) from .fast_data_types import ( create_os_window, free_font_data, glfw_init, glfw_terminate, - set_default_window_icon, set_options + set_default_window_icon, set_options, GLFW_MOD_SUPER ) from .fonts.box_drawing import set_scale from .fonts.render import set_font_family @@ -42,16 +42,29 @@ def init_graphics(debug_keyboard=False): return glfw_module -def _run_app(opts, args): +def prefer_cmd_shortcuts(x): + return x[0] == GLFW_MOD_SUPER + + +def get_new_os_window_trigger(opts): new_os_window_trigger = None if is_macos: + new_os_window_shortcuts = [] for k, v in opts.keymap.items(): if v.func == 'new_os_window': - new_os_window_trigger = k - from .fast_data_types import cocoa_set_new_window_trigger - if not cocoa_set_new_window_trigger(*new_os_window_trigger): - new_os_window_trigger = None + new_os_window_shortcuts.append(k) + if new_os_window_shortcuts: + from .fast_data_types import cocoa_set_new_window_trigger + new_os_window_shortcuts.sort(key=prefer_cmd_shortcuts, reverse=True) + for candidate in new_os_window_shortcuts: + if cocoa_set_new_window_trigger(*candidate): + new_os_window_trigger = candidate + break + return new_os_window_trigger + +def _run_app(opts, args): + new_os_window_trigger = get_new_os_window_trigger(opts) with cached_values_for(run_app.cached_values_name) as cached_values: with startup_notification_handler(extra_callback=run_app.first_window_callback) as pre_show_callback: window_id = create_os_window(