Get clone-in-kitty working for bash as well

This commit is contained in:
Kovid Goyal 2022-04-13 20:38:04 +05:30
parent 4b7c50518e
commit d0c0b01724
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 38 additions and 8 deletions

View File

@ -498,9 +498,11 @@ def parse_opts_for_clone(args: List[str]) -> LaunchCLIOptions:
def clone_and_launch(msg: str, window: Window) -> None: def clone_and_launch(msg: str, window: Window) -> None:
import base64 import base64
import json
from .child import cmdline_of_process from .child import cmdline_of_process
args = [] args = []
cmdline: List[str] = []
env: Optional[Dict[str, str]] = None env: Optional[Dict[str, str]] = None
cwd = '' cwd = ''
pid = -1 pid = -1
@ -524,10 +526,13 @@ def clone_and_launch(msg: str, window: Window) -> None:
env[k] = v env[k] = v
elif k == 'cwd': elif k == 'cwd':
cwd = v cwd = v
elif k == 'argv':
cmdline = json.loads(v)
opts = parse_opts_for_clone(args) opts = parse_opts_for_clone(args)
if cwd: if cwd:
opts.cwd = cwd opts.cwd = cwd
opts.copy_colors = True opts.copy_colors = True
if pid > -1:
try: try:
cmdline = cmdline_of_process(pid) cmdline = cmdline_of_process(pid)
except Exception: except Exception:

View File

@ -2,15 +2,17 @@
# License: GPLv3 Copyright: 2021, Kovid Goyal <kovid at kovidgoyal.net> # License: GPLv3 Copyright: 2021, Kovid Goyal <kovid at kovidgoyal.net>
import base64
import json
import os import os
import subprocess import subprocess
from contextlib import suppress from contextlib import suppress
from typing import Dict, List, Optional from typing import Dict, List, Optional
from .constants import shell_integration_dir from .constants import shell_integration_dir
from .fast_data_types import get_options
from .options.types import Options, defaults from .options.types import Options, defaults
from .utils import log_error, which 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: 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 return
env['ENV'] = os.path.join(shell_integration_dir, 'bash', 'kitty.bash') env['ENV'] = os.path.join(shell_integration_dir, 'bash', 'kitty.bash')
env['KITTY_BASH_INJECT'] = ' '.join(inject) 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: if posix_env:
env['KITTY_BASH_POSIX_ENV'] = posix_env env['KITTY_BASH_POSIX_ENV'] = posix_env
if rcfile: if rcfile:

View File

@ -74,8 +74,9 @@ fi
builtin declare -A _ksi_prompt builtin declare -A _ksi_prompt
_ksi_prompt=( _ksi_prompt=(
[cursor]='y' [title]='y' [mark]='y' [complete]='y' [cwd]='y' [ps0]='' [ps0_suffix]='' [ps1]='' [ps1_suffix]='' [ps2]='' [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() { _ksi_main() {
builtin local ifs="$IFS" builtin local ifs="$IFS"
@ -267,3 +268,24 @@ _ksi_main() {
} }
_ksi_main _ksi_main
builtin unset -f _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\\'
}