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

h9vpoimq  于 2022-11-23  发布在  PyCharm
关注(0)|答案(8)|浏览(165)

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

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

哦,我的zsh是zsh shell 增强,所以实际的问题可以减少到只让zsh正常工作。我已经尝试切换所有的终端配置选项(单独和集体)后,阅读了一些intellij问题,以有效。
参考:https://github.com/robbyrussell/oh-my-zsh

kb5ga3dv

kb5ga3dv1#

在我的例子中,使用MacOSX,我只是改变 shell 路径Preferences -> Tools -> Terminal -> Application Settings -> Shell path
/bin/sh替换为/bin/zsh

00jrzges

00jrzges2#

找不到二进制文件,无法运行东西?显然是$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认为这不是一个登录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

其中man path_helper解释了:
path_helper实用程序读取目录/etc/paths. d和/etc/manpaths. d中文件的内容,并将其内容分别附加到PATH和MANPATH环境变量中。(除非已在环境中设置了MANPATH环境变量,否则不会修改它。)
在shell启动期间至少执行一次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无处不在。

brtdzjyr

brtdzjyr3#

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

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

它帮了我。

pinkon5k

pinkon5k4#

zsh --login --interactive

对我来说是terminal command,或者简称:

zsh -li

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

0kjbasz6

0kjbasz65#

我可以确认in this answer的所有内容,但有一个更简单的解决方案,基于这样一个事实,即加载path_helper两次并不重要。
因此,直到JetBrains修复他们的终端插件,只要把source /etc/zprofile到您的~/.zshrc文件和利润!

vq8itlhq

vq8itlhq6#

在Fedora 32中,zoppo在zsh上的回复没有任何效果:/
配置文件已加载,但好像缺少一些配置文件(很抱歉,我没有提供详细信息),手动添加配置文件也不起作用......我的~/.zshrc是空的:所有配置都是/etc/{zshenv, zprofile, zshrc}中的全局配置。
对我来说,唯一可行的办法就是

sh -c zsh

作为" shell 路径"。然后它的工作原理就像在konsole和其他终端模拟器中一样。

s5a0g9ez

s5a0g9ez7#

要使用zsh修复sdkman,只需执行以下行:对我来说很好Ubuntu 19.04

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

brtdzjyr8#

尝试取消注解~/.zshrc中的第一个字符串:
如果您来自bash,则可能需要更改$PATH。

export PATH=$HOME/bin:/usr/local/bin:$PATH

它帮了我。

相关问题