如何使IntelliJ终端与Oh My Zsh一起正常使用?

时间:2018-06-24 00:11:53

标签: intellij-idea pycharm zsh oh-my-zsh goland

我爱我的Zsh,但它在JetBrains产品的终端中无法正常工作:

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

哦,我的Zsh是zsh shell扩充,因此实际问题可以减少为仅使zsh正常工作。在阅读了一些intellij问题后,我尝试过切换所有的Terminal config选项(单独和整体)。

ref:https://github.com/robbyrussell/oh-my-zsh

7 个答案:

答案 0 :(得分:10)

找不到二进制文件,无法运行内容?显然是$ 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
  • 如果是交互式外壳:
    • /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认为这不是登录外壳。在Jetbrains终端配置中,您无法输入/bin/zsh --login;它没有任何作用。玩了一段时间之后,我发现打开工具->终端-> 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所解释的人

  

path_helper实用程序读取目录/etc/paths.d和/etc/manpaths.d中文件的内容,并将它们的内容分别附加到PATH和MANPATH环境变量中。 (除非已在环境中设置MANPATH环境变量,否则将不会对其进行修改。)

在外壳启动期间至少执行一次path_helper非常重要:pathspaths.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产品重复该过程,您将无处不在享受“我的Zsh”的乐趣。

注意:问题已在https://youtrack.jetbrains.com/issue/IDEA-194488中报告给JetBrains。

答案 1 :(得分:5)

就我而言,使用 MacOSX,我只是更改 Shell Path Preferences -> Tools -> Terminal -> Application Settings -> Shell path

/bin/sh替换/bin/zsh

enter image description here

答案 2 :(得分:0)

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

# If you come from bash you might have to change your $PATH.
export PATH=$HOME/bin:/usr/local/bin:$PATH

它帮助了我。

答案 3 :(得分:0)

我可以确认所有in this answer,但是基于这样的事实,有一个更简单的解决方法,即两次加载path_helper无关紧要。

因此,在JetBrains修复其Terminal插件之前,只需将source /etc/zprofile放入您的~/.zshrc文件中并获利!

答案 4 :(得分:0)

zsh --login --interactive

terminal command的身份为我工作,或者简称为:

zsh -li

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

答案 5 :(得分:0)

要使用zsh修复sdkman,只需执行以下行:对我来说Ubuntu 16.04正常工作

echo 'source "$HOME/.sdkman/bin/sdkman-init.sh"' >> ~/.zshrc

答案 6 :(得分:0)

Fedora 32中的回复与zop上的zoppo无关:/

配置文件已加载,但好像缺少其中一些(抱歉,我没有这么详细),包括手动配置也无法正常工作……我的~/.zshrc为空:所有配置是/etc/{zshenv, zprofile, zshrc}中的全局变量。

对我来说,唯一可行的解​​决方案是使用

sh -c zsh

作为“外壳路径”。然后,它就可以在konsole和其他终端仿真器中使用。