作者:航头党员之家 | 来源:互联网 | 2022-12-12 18:59
我喜欢哦我的Zsh,但它在JetBrains产品的终端中从未正常工作:
找不到可执行文件
不能使用像pyenv,sdkman,rvm这样的版本管理器
哦我的Zsh是zsh shell扩充,所以实际问题可以减少到让zsh正常工作.在阅读了一些intellij问题之后,我尝试切换所有终端配置选项(单独和整体),以获得有用的效果.
参考:https://github.com/robbyrussell/oh-my-zsh
1> Steve Tarver..:
找不到二进制文件,无法运行的东西?显然是一个$ PATH问题,但是为什么以及为什么?
我在iTerm2中回应了一条已知的良好路径
/Users/starver/.sdkman/candidates/maven/current/bin:/Users/starver/.sdkman/candidates/groovy/current/bin:/Users/starver/.sdkman/candidates/gradle/current/bin:/usr/local/Cellar/pyenv-virtualenv/1.1.3/shims:/Users/starver/.pyenv/shims:/Users/starver/.pyenv/bin:/Users/starver/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/opt/X11/bin:/usr/local/git/bin:/Users/starver/bin/:/Users/starver/code/go/bin/:/Users/starver/.rvm/bin
在IntelliJ中:
/usr/bin:/bin:/usr/sbin:/sbin
这暗示了启动文件加载问题.我的zsh手册页说负载顺序应该是:
/etc/zshenv
$ZDOTDIR/.zshenv
如果是登录shell:
/etc/zprofile
$ZDOTDIR/.zprofile
如果是交互式shell:
/etc/zshrc
$ZDOTDIR/.zshrc
如果是登录shell:
/etc/zlogin
$ZDOTDIR/.zlogin
在echo
为每个存在的文件添加一个之后,我为iTerm2获得了以下内容:
/etc/zprofile
/Users/starver/.zprofile
/etc/zshrc
/Users/starver/.zshrc
/Users/starver/.zlogin
这在IntelliJ中
/etc/zshrc
/Users/starver/.zshrc
IntelliJ认为这不是登录shell.在Jetbrains终端配置中,您无法进入/bin/zsh --login
; 它没有效果.玩了一下后,我发现启用工具 - >终端 - > Shell集成使终端成为"登录shell",启动文件加载故事有所改进:
/etc/zshrc
/Users/starver/.zprofile
/Users/starver/.zshrc
/Users/starver/.zlogin
请注意,没有全局zsh启动文件,这是根本问题:/etc/zprofile
包含:
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
哪个人路径_帮助者解释道:
path_helper实用程序读取目录/etc/paths.d和/etc/manpaths.d中文件的内容,并将其内容分别附加到PATH和MANPATH环境变量.(除非已在环境中设置,否则不会修改MANPATH环境变量.)
path_helper
在shell启动期间至少执行一次非常重要:paths
并且paths.d
是系统和第三方安装程序定义其路径添加的位置.不执行系统配置文件启动文件就是为什么/usr/local/bin
,/usr/local/go
等不路径上.
我尝试了几种方法,寻找一种优雅的解决方案.显然,jediterm终端实现可防止挂钩到标准的终端启动过程 - 因此它们实现了启动文件加载/Applications/IntelliJ IDEA.app/Contents/plugins/terminal/.zshrc
.我们可以修复那个实现!! 将文件替换为:
#!/bin/zsh
# starver mod
# Jetbrains uses jediterm as a java terminal emulator for all terminal uses.
# There are some apparent limits on use:
# - must use old-style shebang - not the #!/usr/bin/env zsh
# - must implement the startup file loading here
#
# Note: original contents are in lib/terminal.jar
# mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving
bindkey '^[^[[C' forward-word
bindkey '^[^[[D' backward-word
ZDOTDIR=$_OLD_ZDOTDIR
if [ -n "$JEDITERM_USER_RCFILE" ]
then
source "$JEDITERM_USER_RCFILE"
unset JEDITERM_USER_RCFILE
fi
if [ -n "$ZDOTDIR" ]
then
DOTDIR=$ZDOTDIR
else
DOTDIR=$HOME
fi
if [ -f "/etc/zshenv" ]; then
source "/etc/zshenv"
fi
if [ -f "$DOTDIR/.zshenv" ]; then
source "$DOTDIR/.zshenv"
fi
if [ -n $LOGIN_SHELL ]; then
if [ -f "/etc/zprofile" ]; then
source "/etc/zprofile"
fi
if [ -f "$DOTDIR/.zprofile" ]; then
source "$DOTDIR/.zprofile"
fi
fi
if [ -f "/etc/zshrc" ]; then
source "/etc/zshrc"
fi
if [ -f "$DOTDIR/.zshrc" ]; then
source "$DOTDIR/.zshrc"
fi
if [ -n $LOGIN_SHELL ]; then
if [ -f "/etc/zlogin" ]; then
source "/etc/zlogin"
fi
if [ -f "$DOTDIR/.zlogin" ]; then
source "$DOTDIR/.zlogin"
fi
fi
if [ -n "$JEDITERM_SOURCE" ]
then
source $(echo $JEDITERM_SOURCE)
unset JEDITERM_SOURCE
fi
现在,在IntelliJ终端启动时,我明白了
/etc/zshrc
/etc/zprofile
/Users/starver/.zprofile
/Users/starver/.shell-common
/etc/zshrc
/Users/starver/.zshrc
/Users/starver/.zlogin
第一个/etc/zshrc
是在插件之前执行的.zshrc
,我无能为力,并没有造成任何不良副作用......
为每一个JetBrains产品重复这个过程,你可以在任何地方享受Oh My Zsh的乐趣.
注意:问题已通过https://youtrack.jetbrains.com/issue/IDEA-194488向JetBrains报告.