More sophisticated PATH resolution for the launch command

This commit is contained in:
Kovid Goyal 2020-12-29 11:51:17 +05:30
parent c1b7023e3a
commit 2a026de526
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 24 additions and 2 deletions

View File

@ -13,6 +13,10 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- Add entries to the terminfo file for some user capabilities that are shared
with XTerm (:pull:`3193`)
- The launch command now does more sophisticated resolving of executables to
run. The system-wide PATH is used first, then system specific default paths,
and finally the PATH inside the shell.
0.19.3 [2020-12-19]
-------------------

View File

@ -93,6 +93,16 @@ in the window and ``window.id`` is the internal kitty ``id`` of the
window.
Finding executables
-----------------------
When you specify a command to run as just a name rather than an absolute path,
it is searched for in the system-wide ``PATH`` environment variable. Note that
this **may not** be the value of ``PATH`` inside a shell, as shell startup scripts
often change the value of this variable. If it is not found there, then a
system specific list of default paths is searched. If it is still not found,
then your shell is run and the value of ``PATH`` inside the shell is used.
Syntax reference
------------------

View File

@ -8,12 +8,12 @@ from typing import Any, Dict, List, Optional, Sequence, Tuple
from .boss import Boss
from .child import Child
from .cli import parse_args, WATCHER_DEFINITION
from .cli import WATCHER_DEFINITION, parse_args
from .cli_stub import LaunchCLIOptions
from .constants import resolve_custom_file
from .fast_data_types import set_clipboard_string
from .tabs import Tab
from .utils import set_primary_selection
from .utils import find_exe, set_primary_selection, read_shell_environment
from .window import Watchers, Window
try:
@ -274,6 +274,14 @@ def launch(boss: Boss, opts: LaunchCLIOptions, args: List[str], target_tab: Opti
elif x == '@active-kitty-window-id':
x = str(active.id)
final_cmd.append(x)
exe = find_exe(final_cmd[0])
if not exe:
env = read_shell_environment(boss.opts)
if 'PATH' in env:
import shutil
exe = shutil.which(final_cmd[0], path=env['PATH'])
if exe:
final_cmd[0] = exe
kw['cmd'] = final_cmd
if opts.type == 'overlay' and active:
kw['overlay_for'] = active.id