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

问题描述 投票:0回答:3

我在

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

这是我的设置:

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

注意:当我在打开集成终端后运行

source .zshrc
时一切正常,但它不会自动加载配置文件。有谁知道为什么吗?

zsh visual-studio-code zshrc
3个回答
5
投票

当前版本的 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)


2
投票

我已经在我的

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

现在通过将

ZDOTDIR
定义为我的
$HOME
目录来解决问题。

更新:

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


1
投票

我有同样的问题,也必须手动执行

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脚本中是sourced
哪些路径被添加到
$PATH
变量中(例如
$HOME/.cargo/bin

要快速查看该脚本,我建议执行
cat "$(code --locate-shell-integration-path zsh)" | grep -E '\bUSER_ZDOTDIR\b'

结果(注意:这些不是连续的行)
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_ZDOTDIR\b' -A 2 -B 2

你得到这些线与一些上下文!通过在最后增加数字,您可以显示更多上下文

但是你可以看到导致问题的那一行
. $USER_ZDOTDIR/.zshrc

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

你可以看看
$ZDOTDIR
的效果。
删除
#
并更改
-A
-B

之后的数字以包含更多或更少的上下文。

你也不必担心你的
$HISTFILE

尽管排队
HISTFILE=$USER_ZDOTDIR/.zsh_history

只要它在您的
~/.zshrc

文件中设置并覆盖此分配,它就与此解决方案保持相同。

题外话但可能有用

在搜索最适合的解决方案时,我发现您只能通过添加 also 来获得 VSCode 的不同历史文件
[[ "$TERM_PROGRAM" == "vscode" ]] && HISTFILE=${ZDOTDIR}/.vscode_history

这对于 npm、yarn 等 shell 密集型项目非常有用

是。

但是命令必须在 VSCode-Shell 中执行才能在所述历史文件中结束

.

因为我创建了⁽¹⁾ 两个别名,这两个别名对我自己有用,对其他人也可能有用

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

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

文件夹中

此别名根据您所在的文件夹临时设置
$HISTFILE

,并且应该只在项目的根文件夹中执行
alias set-project-histfile='eval "[[ \"\$TERM_PROGRAM\" == \"vscode\" ]] && HISTFILE=\${ZDOTDIR}/\$(echo \$PWD | rev  | cut -d '/' -f1  | rev)_history"'

虽然下面的别名写了 
$HISTFILE 赋值,就像上面一样 只有在使用 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 的终端中执行的命令最终会出现在这些历史文件中,而不是通常的文件中。

© www.soinside.com 2019 - 2024. All rights reserved.