web-dev-qa-db-ja.com

IntelliJターミナルをOh My Zshで適切に動作させるにはどうすればよいですか?

Oh My Zshは大好きですが、JetBrains製品のターミナルではこれまで正常に機能したことがありません。

  • 実行ファイルが見つかりません
  • pyenv、sdkman、rvmなどのバージョンマネージャは使用できません

Oh My Zshはzsh Shellの拡張であるため、実際の問題はzshを適切に機能させることだけに減らすことができます。私はいくつかのintellijの問題を読んだ後、すべてのターミナル構成オプション(個別におよびまとめて)を有効に切り替えてみました。

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

7
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
  • ログインシェルの場合:
    • /etc/zprofile
    • $ZDOTDIR/.zprofile
  • インタラクティブシェルの場合:
    • /etc/zshrc
    • $ZDOTDIR/.zshrc
  • ログインシェルの場合:
    • /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を入力できません。影響はありません。少し遊んだ後、[ツール]-> [ターミナル]-> [シェル統合]をオンにすると、ターミナルが「ログインシェル」になり、起動ファイルのロードストーリーが少し改善されました。

/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を少なくとも1回実行することは非常に重要です。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製品についてこのプロセスを繰り返すと、どこでもOh My Zshの喜びを味わうことができます。

:問題は https://youtrack.jetbrains.com/issue/IDEA-194488 でJetBrainsに報告されました。

12
Steve Tarver
zsh --login --interactive

terminal command、または略して私のために働きました:

zsh -li

これにより、Macおよびすべてのログインスクリプトに/ etc/zprofileがロードされます。

0
msemelman

私はすべてを確認できます この回答では ですが、path_helperを2回ロードすることは重要ではないという事実に基づいて、より簡単な回避策があります。

したがって、JetBrainsがターミナルプラグインを修正するまで、source /etc/zprofile~/.zshrcファイルに追加して利益を上げてください。

0
tomasbedrich

Zshでsdkmanを修正するには、次の行を実行します。

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

~/.zshrcの最初の文字列のコメントを外してみてください:

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

それは私を助けました。

0
Pavel Druzhinin