Vscode 终端在启动时未加载 .zshrc!我该如何解决这个问题?



我已经在Pop!_OS 21.10上安装了code软件包,最近打开集成终端后,我注意到它没有加载我的.zshrc

以下是我的设置:

"terminal.integrated.defaultProfile.linux": "zsh",

注意:当我在打开集成终端后运行source .zshrc时,一切正常,但它不会自动加载配置文件。有人知道为什么吗?

在以下情况下,当前版本的 VSCode 可能会忽略您的.zshrc

  • 选项Terminal › Integrated › Shell Integration: Enabled(terminal.integrated.shellIntegration.enabled) 被选中
  • 环境变量$ZDOTDIR为空

考虑评论并将以下行添加到您的settings.json中:

"terminal.integrated.profiles.osx": { "zsh": { "path": "/bin/zsh", "args": ["-l", "-i"] } }

(设置名称中的osx适用于 MacOS,linux适用于 Linux)

我已经在我的.zshrc中错误地定义了ZDOTDIR指向.cache的变量,这使code在那里寻找我的配置文件。

现在通过将ZDOTDIR定义为我的$HOME目录解决了这个问题。

更新:

-- $HOME是默认值,所以我只是删除了我的定义。

我遇到了同样的问题,也必须手动执行

source ~/.zshrc 

长话短说,我通过执行用符号链接解决了它

ln -s ../.zshrc $ZDOTDIR/.zshrc

解释我是如何想出这个解决方案的,以及为什么我更喜欢这个解决方案而不是上面提出的其他两个可能的解决方案:

按照中的文档进行操作

https://code.visualstudio.com/docs/terminal/shell-integration

我在~/.zshrc末尾添加了以下行

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

每当 VSCode 启动时,它都会获取脚本。

但仅凭这一点并不能解决这个特定问题。

通过执行查看该脚本时

less "$(code --locate-shell-integration-path zsh)"

我发现了导致此问题的以下行

. $USER_ZDOTDIR/.zshrc

$USER_ZDOTDIR指向~/.zsh变量$USER_ZDOTDIR甚至可以设置变量$ZDOTDIR所以设置

USER_ZDOTDIR=${HOME}

本来可以解决它,但由于$ZDOTDIR非常重要,并且将其指向${HOME}可能会因为错过${HOME}/.zsh/.zshenv$ZDOTDIR/.zshenv指向它而破坏事情。

例如,在我的$ZDOTDIR/.zshenv脚本中哪些路径被添加到$PATH变量中(例如$HOME/.cargo/bin)

为了快速查看该脚本,我建议执行

cat "$(code --locate-shell-integration-path zsh)" | grep -E 'bUSER_ZDOTDIRb'

结果在(注意:这些不是连续的行)

ZDOTDIR=$USER_ZDOTDIR
HISTFILE=$USER_ZDOTDIR/.zsh_history
if [[ $options[norcs] = off  && -f $USER_ZDOTDIR/.zshrc ]]; then
ZDOTDIR=$USER_ZDOTDIR
. $USER_ZDOTDIR/.zshrc
if [[ $options[login] = off && $USER_ZDOTDIR != $VSCODE_ZDOTDIR ]]; then
ZDOTDIR=$USER_ZDOTDIR

(注意:这些不是连续的行)与

cat "$(code --locate-shell-integration-path zsh)" | grep -E 'bUSER_ZDOTDIRb' -A 2 -B 2

你会得到这些带有一些上下文的台词!通过增加末尾的数字您可以显示更多上下文

但是您可以看到导致问题的行

. $USER_ZDOTDIR/.zshrc

cat "$(code --locate-shell-integration-path zsh)" | grep -E 'bZDOTDIRb' # -A 1 -B 1

你可以看看$ZDOTDIR的影响。 删除#并更改-A-B后面的数字,以包含更多或更少的上下文。

尽管有这条线,您也不必担心您的$HISTFILE

HISTFILE=$USER_ZDOTDIR/.zsh_history

只要在~/.zshrc文件中设置并覆盖此分配,它就与此解决方案保持不变。


题外话但可能有用

在寻找最适合的解决方案时,我发现您只能通过添加 VSCode 的不同历史文件来

[[ "$TERM_PROGRAM" == "vscode" ]] && HISTFILE=${ZDOTDIR}/.vscode_history

这对于NPM、纱线等壳密集型项目非常有用。

但是这些命令必须在VSCode-Shell中执行才能最终出现在所述历史文件中

由于我已经创建了⁽¹⁾两个别名,它们对自己有用,对其他人也可能有用

您还可以拥有仅分配给单个项目的历史文件。

以下所有额外的历史记录文件都包含在$ZDOTDIR文件夹中

此别名根据您所在的文件夹临时设置$HISTFILE,并且应仅在项目的根文件夹中执行

alias set-project-histfile='eval "[[ "$TERM_PROGRAM" == "vscode" ]] && HISTFILE=${ZDOTDIR}/$(echo $PWD | rev  | cut -d '/' -f1  | rev)_history"'

而以下别名写入$HISTFILE赋值,就像上面一样,也仅在使用 $HOME/.zshrc 末尾的VSCode 终端时才有效,使其成为永久性的,直到手动删除此行

alias set-project-histfile-permanent='echo "[[ "$TERM_PROGRAM" == "vscode" ]] && HISTFILE=${ZDOTDIR}/$(echo $PWD | rev  | cut -d '/' -f1  | rev)_history" >> ${HOME}/.zshrc'

请记住,此$HISTFILE分配的效果是,您正在使用 VSCode 的每个项目在$ZDOTDIR文件夹中都有自己的历史记录文件。

例子:

$ZDOTDI/projectFoo_history
$ZDOTDIR/projectBar_history
$ZDOTDIR/projectFoobar_history
$ZDOTDIR/Fugazi_history
…
$HOME/.zsh/Fugazi_history

您在VSCode终端中执行的命令最终会出现在这些历史文件中,而不是通常的文件中。

最新更新