mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-28 11:11:47 +02:00
Ensure colors are copied form the correct window when cloning
Also, encapsulate clone command into its own class to ease testing
This commit is contained in:
@@ -346,9 +346,10 @@ def launch(
|
|||||||
args: List[str],
|
args: List[str],
|
||||||
target_tab: Optional[Tab] = None,
|
target_tab: Optional[Tab] = None,
|
||||||
force_target_tab: bool = False,
|
force_target_tab: bool = False,
|
||||||
base_env: Optional[Dict[str, str]] = None
|
base_env: Optional[Dict[str, str]] = None,
|
||||||
|
active: Optional[Window] = None,
|
||||||
) -> Optional[Window]:
|
) -> Optional[Window]:
|
||||||
active = boss.active_window_for_cwd
|
active = active or boss.active_window_for_cwd
|
||||||
if active:
|
if active:
|
||||||
active_child = active.child
|
active_child = active.child
|
||||||
else:
|
else:
|
||||||
@@ -496,45 +497,52 @@ def parse_opts_for_clone(args: List[str]) -> LaunchCLIOptions:
|
|||||||
return default_opts
|
return default_opts
|
||||||
|
|
||||||
|
|
||||||
|
class CloneCmd:
|
||||||
|
|
||||||
|
def __init__(self, msg: str) -> None:
|
||||||
|
self.cmdline: List[str] = []
|
||||||
|
self.args: List[str] = []
|
||||||
|
self.env: Optional[Dict[str, str]] = None
|
||||||
|
self.cwd = ''
|
||||||
|
self.pid = -1
|
||||||
|
self.parse_message(msg)
|
||||||
|
self.opts = parse_opts_for_clone(self.args)
|
||||||
|
|
||||||
|
def parse_message(self, msg: str) -> None:
|
||||||
|
import base64
|
||||||
|
import json
|
||||||
|
for x in msg.split(','):
|
||||||
|
k, v = x.split('=', 1)
|
||||||
|
if k == 'pid':
|
||||||
|
self.pid = int(v)
|
||||||
|
continue
|
||||||
|
v = base64.standard_b64decode(v).decode('utf-8', 'replace')
|
||||||
|
if k == 'a':
|
||||||
|
self.args.append(v)
|
||||||
|
elif k == 'env':
|
||||||
|
env = {}
|
||||||
|
for line in v.split('\0'):
|
||||||
|
if line:
|
||||||
|
try:
|
||||||
|
k, v = line.split('=', 1)
|
||||||
|
except ValueError:
|
||||||
|
continue
|
||||||
|
env[k] = v
|
||||||
|
elif k == 'cwd':
|
||||||
|
self.cwd = v
|
||||||
|
elif k == 'argv':
|
||||||
|
self.cmdline = json.loads(v)
|
||||||
|
|
||||||
|
|
||||||
def clone_and_launch(msg: str, window: Window) -> None:
|
def clone_and_launch(msg: str, window: Window) -> None:
|
||||||
import base64
|
|
||||||
import json
|
|
||||||
|
|
||||||
from .child import cmdline_of_process
|
from .child import cmdline_of_process
|
||||||
args = []
|
c = CloneCmd(msg)
|
||||||
cmdline: List[str] = []
|
if c.cwd and not c.opts.cwd:
|
||||||
env: Optional[Dict[str, str]] = None
|
c.opts.cwd = c.cwd
|
||||||
cwd = ''
|
c.opts.copy_colors = True
|
||||||
pid = -1
|
if c.pid > -1:
|
||||||
|
|
||||||
for x in msg.split(','):
|
|
||||||
k, v = x.split('=', 1)
|
|
||||||
if k == 'pid':
|
|
||||||
pid = int(v)
|
|
||||||
continue
|
|
||||||
v = base64.standard_b64decode(v).decode('utf-8', 'replace')
|
|
||||||
if k == 'a':
|
|
||||||
args.append(v)
|
|
||||||
elif k == 'env':
|
|
||||||
env = {}
|
|
||||||
for line in v.split('\0'):
|
|
||||||
if line:
|
|
||||||
try:
|
|
||||||
k, v = line.split('=', 1)
|
|
||||||
except ValueError:
|
|
||||||
continue
|
|
||||||
env[k] = v
|
|
||||||
elif k == 'cwd':
|
|
||||||
cwd = v
|
|
||||||
elif k == 'argv':
|
|
||||||
cmdline = json.loads(v)
|
|
||||||
opts = parse_opts_for_clone(args)
|
|
||||||
if cwd and not opts.cwd:
|
|
||||||
opts.cwd = cwd
|
|
||||||
opts.copy_colors = True
|
|
||||||
if pid > -1:
|
|
||||||
try:
|
try:
|
||||||
cmdline = cmdline_of_process(pid)
|
cmdline = cmdline_of_process(c.pid)
|
||||||
except Exception:
|
except Exception:
|
||||||
cmdline = []
|
cmdline = []
|
||||||
if not cmdline:
|
if not cmdline:
|
||||||
@@ -543,10 +551,10 @@ def clone_and_launch(msg: str, window: Window) -> None:
|
|||||||
if ssh_kitten_cmdline:
|
if ssh_kitten_cmdline:
|
||||||
from kittens.ssh.main import set_cwd_in_cmdline, set_env_in_cmdline
|
from kittens.ssh.main import set_cwd_in_cmdline, set_env_in_cmdline
|
||||||
cmdline[:] = ssh_kitten_cmdline
|
cmdline[:] = ssh_kitten_cmdline
|
||||||
if opts.cwd:
|
if c.opts.cwd:
|
||||||
set_cwd_in_cmdline(opts.cwd, cmdline)
|
set_cwd_in_cmdline(c.opts.cwd, cmdline)
|
||||||
opts.cwd = None
|
c.opts.cwd = None
|
||||||
if env:
|
if c.env:
|
||||||
set_env_in_cmdline(env, cmdline)
|
set_env_in_cmdline(c.env, cmdline)
|
||||||
env = None
|
c.env = None
|
||||||
launch(get_boss(), opts, cmdline, base_env=env)
|
launch(get_boss(), c.opts, cmdline, base_env=c.env, active=window)
|
||||||
|
|||||||
Reference in New Issue
Block a user