如何让IntelliJ终端与Oh My Zsh一起正常工作?

Ste*_*ver 6 zsh intellij-idea pycharm oh-my-zsh goland

我喜欢哦我的Zsh,但它在JetBrains产品的终端中从未正常工作:

  • 找不到可执行文件
  • 不能使用像pyenv,sdkman,rvm这样的版本管理器

哦我的Zsh是zsh shell扩充,所以实际问题可以减少到让zsh正常工作.在阅读了一些intellij问题之后,我尝试切换所有终端配置选项(单独和整体),以获得有用的效果.

参考:https://github.com/robbyrussell/oh-my-zsh

Ste*_*ver 12

找不到二进制文件,无法运行的东西?显然是一个$ 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
Run Code Online (Sandbox Code Playgroud)

这暗示了启动文件加载问题.我的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
Run Code Online (Sandbox Code Playgroud)

这在IntelliJ中

/etc/zshrc
/Users/starver/.zshrc
Run Code Online (Sandbox Code Playgroud)

IntelliJ认为这不是登录shell.在Jetbrains终端配置中,您无法进入/bin/zsh --login; 它没有效果.玩了一下后,我发现启用工具 - >终端 - > Shell集成使终端成为"登录shell",启动文件加载故事有所改进:

/etc/zshrc
/Users/starver/.zprofile
/Users/starver/.zshrc
/Users/starver/.zlogin
Run Code Online (Sandbox Code Playgroud)

请注意,没有全局zsh启动文件,这是根本问题:/etc/zprofile包含:

# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi
Run Code Online (Sandbox Code Playgroud)

哪个人路径_帮助者解释道:

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
Run Code Online (Sandbox Code Playgroud)

现在,在IntelliJ终端启动时,我明白了

/etc/zshrc
/etc/zprofile
/Users/starver/.zprofile
/Users/starver/.shell-common
/etc/zshrc
/Users/starver/.zshrc
/Users/starver/.zlogin
Run Code Online (Sandbox Code Playgroud)

第一个/etc/zshrc是在插件之前执行的.zshrc,我无能为力,并没有造成任何不良副作用......

为每一个JetBrains产品重复这个过程,你可以在任何地方享受Oh My Zsh的乐趣.

注意:问题已通过https://youtrack.jetbrains.com/issue/IDEA-194488向JetBrains报告.

  • 我在 /Applications/IntelliJ IDEA.app/Contents/plugins/terminal/.zshrc 下没有 .zshrc 文件 - macOS monterey MBP 2021 M1 (2认同)

mse*_*man 8

zsh --login --interactive
Run Code Online (Sandbox Code Playgroud)

为我工作terminal command,或简称:

zsh -li
Run Code Online (Sandbox Code Playgroud)

这将加载 Mac 中的 /etc/zprofile 和所有登录脚本。


pav*_*roo 7

尝试取消注释中的第一个字符串~/.zshrc

# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH
Run Code Online (Sandbox Code Playgroud)


Har*_*llo 7

在我的情况下,使用 MacOSX,我只是更改 Shell Path Preferences -> Tools -> Terminal -> Application Settings -> Shell path

替换/bin/sh/bin/zsh

在此处输入图片说明