macOS: Allow opening text files, images and directories with kitty when launched using "Open with" in Finder

Fixes #4460
This commit is contained in:
Kovid Goyal 2022-01-07 12:25:30 +05:30
parent a155b081b7
commit ffa63e27ea
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 35 additions and 9 deletions

View File

@ -73,6 +73,12 @@ command.
Detailed list of changes
-------------------------------------
0.24.2 [future]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- macOS: Allow opening text files, images and directories with kitty when
launched using "Open with" in Finder (:iss:`4460`)
0.24.1 [2022-01-06]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -2200,18 +2200,38 @@ class Boss:
if path == ":cocoa::application launched::":
self.cocoa_application_launched = True
return
is_executable = is_dir = False
with suppress(OSError):
is_executable = os.access(path, os.X_OK)
with suppress(OSError):
is_dir = os.path.isdir(path)
def new_os_window() -> None:
self.new_os_window(path)
needs_new_os_window = self.cocoa_application_launched or not self.os_window_map or self.active_tab is None
launch_cmd = []
if needs_new_os_window:
launch_cmd += ['--type', 'os-window']
if is_dir:
launch_cmd += ['--cwd', path]
elif is_executable:
launch_cmd += [path]
else:
from .guess_mime_type import guess_type
mt = guess_type(path) or ''
if mt.startswith('text/'):
launch_cmd += get_editor() + [path]
elif mt.startswith('image/'):
launch_cmd = [kitty_exe(), '+kitten', 'icat', '--hold', path]
else:
launch_cmd = [kitty_exe(), '+runpy', f'print("The file:", {path!r}, "is of unknown type, cannot open it.");'
'from kitty.utils import hold_till_enter; hold_till_enter(); raise SystemExit(1)']
if self.cocoa_application_launched or not self.os_window_map:
return new_os_window()
tab = self.active_tab
if tab is None:
return new_os_window()
w = tab.active_window
self.new_window(path)
if w is not None:
if tab is not None:
w = tab.active_window
else:
w = None
self.launch(*launch_cmd)
if not needs_new_os_window and tab is not None and w is not None:
tab.remove_window(w)
@ac('debug', 'Show the effective configuration kitty is running with')