diff --git a/kitty/launch.py b/kitty/launch.py index 6bd6d3a5d..efe673761 100644 --- a/kitty/launch.py +++ b/kitty/launch.py @@ -498,9 +498,11 @@ def parse_opts_for_clone(args: List[str]) -> LaunchCLIOptions: def clone_and_launch(msg: str, window: Window) -> None: import base64 + import json from .child import cmdline_of_process args = [] + cmdline: List[str] = [] env: Optional[Dict[str, str]] = None cwd = '' pid = -1 @@ -524,16 +526,19 @@ def clone_and_launch(msg: str, window: Window) -> None: env[k] = v elif k == 'cwd': cwd = v + elif k == 'argv': + cmdline = json.loads(v) opts = parse_opts_for_clone(args) if cwd: opts.cwd = cwd opts.copy_colors = True - try: - cmdline = cmdline_of_process(pid) - except Exception: - cmdline = [] - if not cmdline: - cmdline = list(window.child.argv) + if pid > -1: + try: + cmdline = cmdline_of_process(pid) + except Exception: + cmdline = [] + if not cmdline: + cmdline = list(window.child.argv) ssh_kitten_cmdline = window.ssh_kitten_cmdline() if ssh_kitten_cmdline: from kittens.ssh.main import set_cwd_in_cmdline, set_env_in_cmdline diff --git a/kitty/shell_integration.py b/kitty/shell_integration.py index 19d95a6ec..38d136ded 100644 --- a/kitty/shell_integration.py +++ b/kitty/shell_integration.py @@ -2,15 +2,17 @@ # License: GPLv3 Copyright: 2021, Kovid Goyal +import base64 +import json import os import subprocess from contextlib import suppress from typing import Dict, List, Optional from .constants import shell_integration_dir +from .fast_data_types import get_options from .options.types import Options, defaults from .utils import log_error, which -from .fast_data_types import get_options def setup_fish_env(env: Dict[str, str], argv: List[str]) -> None: @@ -133,6 +135,7 @@ def setup_bash_env(env: Dict[str, str], argv: List[str]) -> None: return env['ENV'] = os.path.join(shell_integration_dir, 'bash', 'kitty.bash') env['KITTY_BASH_INJECT'] = ' '.join(inject) + env['KITTY_BASH_ORIGINAL_ARGV'] = base64.standard_b64encode(json.dumps(argv).encode('utf-8')).decode('ascii') if posix_env: env['KITTY_BASH_POSIX_ENV'] = posix_env if rcfile: diff --git a/shell-integration/bash/kitty.bash b/shell-integration/bash/kitty.bash index a7bae0184..296bb4bd8 100644 --- a/shell-integration/bash/kitty.bash +++ b/shell-integration/bash/kitty.bash @@ -74,8 +74,9 @@ fi builtin declare -A _ksi_prompt _ksi_prompt=( [cursor]='y' [title]='y' [mark]='y' [complete]='y' [cwd]='y' [ps0]='' [ps0_suffix]='' [ps1]='' [ps1_suffix]='' [ps2]='' - [hostname_prefix]='' [sourced]='y' [last_reported_cwd]='' + [hostname_prefix]='' [sourced]='y' [last_reported_cwd]='' [argv]="$KITTY_BASH_ORIGINAL_ARGV" ) +builtin unset KITTY_BASH_ORIGINAL_ARGV _ksi_main() { builtin local ifs="$IFS" @@ -267,3 +268,24 @@ _ksi_main() { } _ksi_main builtin unset -f _ksi_main + +clone-in-kitty() { + builtin local data="argv=${_ksi_prompt[argv]},cwd=$(builtin printf "%s" "$PWD" | builtin command base64),env=$(builtin command env -0 | builtin command base64)" + while :; do + case "$1" in + "") break;; + *) data="$data,a=$(builtin printf "%s" "$1" | builtin command base64)";; + esac + shift + done + data="${data//[[:space:]]}" + builtin local pos=0 + builtin local chunk_num=0 + while [ $pos -lt ${#data} ]; do + builtin local chunk="${data:$pos:2048}" + pos=$(($pos+2048)) + builtin printf '\eP@kitty-clone|%s:%s\e\\' "${chunk_num}" "${chunk}" + chunk_num=$(($chunk_num+1)) + done + builtin printf '\eP@kitty-clone|\e\\' +}