From b921916a26df1a00d57ca11dbeac559440843a2c Mon Sep 17 00:00:00 2001 From: Jonas Bulik Date: Mon, 18 Dec 2023 12:51:52 +0100 Subject: [PATCH] Improve venv shell activation in fish shell Instead of mimicking a user typing the command we use fish's builtin `--init-command` option. --- src/poetry/utils/shell.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/poetry/utils/shell.py b/src/poetry/utils/shell.py index 6e7301fc5e0..caf08c82348 100644 --- a/src/poetry/utils/shell.py +++ b/src/poetry/utils/shell.py @@ -106,7 +106,12 @@ def activate(self, env: VirtualEnv) -> int | None: cmd = f"{self._get_source_command()} {shlex.quote(str(activate_path))}" with env.temp_environ(): - args = ["-e", cmd] if self._name == "nu" else ["-i"] + if self._name == "nu": + args = ["-e", cmd] + elif self._name == "fish": + args = ["-i", "--init-command", cmd] + else: + args = ["-i"] c = pexpect.spawn( self._path, args, dimensions=(terminal.lines, terminal.columns) @@ -120,14 +125,11 @@ def activate(self, env: VirtualEnv) -> int | None: c.sendline(f"emulate bash -c '. {shlex.quote(str(activate_path))}'") elif self._name == "xonsh": c.sendline(f"vox activate {shlex.quote(str(env.path))}") - elif self._name == "nu": - # If this is nu, we don't want to send the activation command to the + elif self._name in ["nu", "fish"]: + # If this is nu or fish, we don't want to send the activation command to the # command line since we already ran it via the shell's invocation. pass else: - if self._name in ["fish"]: - # Under fish, "\r" should be sent explicitly - cmd += "\r" c.sendline(cmd) def resize(sig: Any, data: Any) -> None: