我已经在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终端中执行的命令最终会出现在这些历史文件中,而不是通常的文件中。