我在
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)
我已经在我的
ZDOTDIR
中定义了 .cache
变量错误地指向 .zshrc
,这使得 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
脚本中是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 的终端中执行的命令最终会出现在这些历史文件中,而不是通常的文件中。