如何让 IntelliJ 终端与 Oh My Zsh 一起正常工作?
How do I get IntelliJ Terminal to work properly with Oh My Zsh?
我喜欢 Oh My Zsh,但它从未在 JetBrains 产品的终端中正常工作:
- 找不到可执行文件
- 不能使用 pyenv、sdkman、rvm 等版本管理器
Oh My Zsh 是 zsh shell 的增强,因此实际问题可以简化为让 zsh 正常工作。在阅读了一些 intellij 问题后,我尝试切换所有终端配置选项(单独和集体),但无济于事。
找不到二进制文件,不能 运行 东西吗?显然是 $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
;它没有效果。玩了一下,发现打开Tools -> Terminal -> Shell Integration 使终端变成了"login shell",启动文件加载故事也改善了一点:
/etc/zshrc
/Users/starver/.zprofile
/Users/starver/.zshrc
/Users/starver/.zlogin
注意全局 zsh 启动文件的 none,这是根本问题:/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解释说:
The path_helper utility reads the contents of the files in the directories /etc/paths.d and /etc/manpaths.d and appends their contents to the PATH and MANPATH environment variables respectively. (The MANPATH environment variable will not be modified unless it is already set in the environment.)
在 shell 启动期间至少执行一次 path_helper
非常重要: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 的乐趣。
中报告给 JetBrains
尝试取消注释 ~/.zshrc
中的第一个字符串:
# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH
它帮助了我。
我可以确认一切 ,但有一个更简单的解决方法,即加载 path_helper
两次并不重要。
因此,在 JetBrains 修复他们的终端插件之前,只需将 source /etc/zprofile
放入您的 ~/.zshrc
文件并获利!
zsh --login --interactive
为我工作 terminal command
,或简称:
zsh -li
这将在 Mac 和所有登录脚本中加载 /etc/zprofile。
要用 zsh 修复 sdkman,只需执行此行:对我来说效果很好 Ubuntu 19.04
echo 'source "$HOME/.sdkman/bin/sdkman-init.sh"' >> ~/.zshrc
在 Fedora 32 中使用 zoppo over zsh 的回复没有任何效果:/
配置文件已加载,但好像缺少其中一些(很抱歉没有那么详细),手动添加它们也没有用...我的 ~/.zshrc
是空的: /etc/{zshenv, zprofile, zshrc}
.
中的所有配置都是全局配置
对我来说,唯一可行的解决方案是使用
sh -c zsh
作为“Shell 路径”。然后它像在 konsole 和其他终端仿真器中一样工作。
就我而言,使用 MacOSX,我只是更改 Shell 路径
Preferences -> Tools -> Terminal -> Application Settings -> Shell path
将/bin/sh
替换为/bin/zsh
我喜欢 Oh My Zsh,但它从未在 JetBrains 产品的终端中正常工作:
- 找不到可执行文件
- 不能使用 pyenv、sdkman、rvm 等版本管理器
Oh My Zsh 是 zsh shell 的增强,因此实际问题可以简化为让 zsh 正常工作。在阅读了一些 intellij 问题后,我尝试切换所有终端配置选项(单独和集体),但无济于事。
找不到二进制文件,不能 运行 东西吗?显然是 $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
;它没有效果。玩了一下,发现打开Tools -> Terminal -> Shell Integration 使终端变成了"login shell",启动文件加载故事也改善了一点:
/etc/zshrc
/Users/starver/.zprofile
/Users/starver/.zshrc
/Users/starver/.zlogin
注意全局 zsh 启动文件的 none,这是根本问题:/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解释说:
The path_helper utility reads the contents of the files in the directories /etc/paths.d and /etc/manpaths.d and appends their contents to the PATH and MANPATH environment variables respectively. (The MANPATH environment variable will not be modified unless it is already set in the environment.)
在 shell 启动期间至少执行一次 path_helper
非常重要: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 的乐趣。
中报告给 JetBrains尝试取消注释 ~/.zshrc
中的第一个字符串:
# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH
它帮助了我。
我可以确认一切 path_helper
两次并不重要。
因此,在 JetBrains 修复他们的终端插件之前,只需将 source /etc/zprofile
放入您的 ~/.zshrc
文件并获利!
zsh --login --interactive
为我工作 terminal command
,或简称:
zsh -li
这将在 Mac 和所有登录脚本中加载 /etc/zprofile。
要用 zsh 修复 sdkman,只需执行此行:对我来说效果很好 Ubuntu 19.04
echo 'source "$HOME/.sdkman/bin/sdkman-init.sh"' >> ~/.zshrc
在 Fedora 32 中使用 zoppo over zsh 的回复没有任何效果:/
配置文件已加载,但好像缺少其中一些(很抱歉没有那么详细),手动添加它们也没有用...我的 ~/.zshrc
是空的: /etc/{zshenv, zprofile, zshrc}
.
对我来说,唯一可行的解决方案是使用
sh -c zsh
作为“Shell 路径”。然后它像在 konsole 和其他终端仿真器中一样工作。
就我而言,使用 MacOSX,我只是更改 Shell 路径
Preferences -> Tools -> Terminal -> Application Settings -> Shell path
将/bin/sh
替换为/bin/zsh