web-dev-qa-db-fra.com

Comment faire pour que IntelliJ Terminal fonctionne correctement avec Oh My Zsh?

J'adore Oh My Zsh, mais cela n'a jamais fonctionné correctement dans les terminaux du produit JetBrains:

  • impossible de trouver les exécutables
  • ne peut pas utiliser les gestionnaires de versions comme pyenv, sdkman, rvm

Oh My Zsh est une augmentation du shell zsh, donc le problème réel pourrait être réduit à simplement faire fonctionner correctement zsh. J'ai essayé de basculer toutes les options de configuration du terminal (individuellement et en masse) après avoir lu certains problèmes d'intellij, en vain.

réf: https://github.com/robbyrussell/oh-my-zsh

7
Steve Tarver

Vous ne trouvez pas de fichiers binaires, vous ne pouvez pas exécuter de choses? Évidemment un problème $ PATH, mais quoi et pourquoi?

J'ai fait écho à un bon chemin connu dans 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

et dans IntelliJ:

/usr/bin:/bin:/usr/sbin:/sbin

Cela indique un problème de chargement du fichier de démarrage. Ma page de manuel zsh indique que l'ordre de chargement doit être:

  • /etc/zshenv
  • $ZDOTDIR/.zshenv
  • Si un shell de connexion:
    • /etc/zprofile
    • $ZDOTDIR/.zprofile
  • Si un shell interactif:
    • /etc/zshrc
    • $ZDOTDIR/.zshrc
  • Si un shell de connexion:
    • /etc/zlogin
    • $ZDOTDIR/.zlogin

Après avoir ajouté un echo à chacun de ces fichiers qui existaient, j'ai obtenu ce qui suit pour iTerm2:

/etc/zprofile
/Users/starver/.zprofile
/etc/zshrc
/Users/starver/.zshrc
/Users/starver/.zlogin

et cela dans IntelliJ

/etc/zshrc
/Users/starver/.zshrc

IntelliJ pense qu'il ne s'agit pas d'un shell de connexion. Dans la configuration du terminal Jetbrains, vous ne pouvez pas entrer /bin/zsh --login; cela n'a aucun effet. Après avoir joué un peu, j'ai trouvé que l'activation de Tools -> Terminal -> Shell Integration fait du terminal un "shell de connexion" et l'histoire de chargement du fichier de démarrage s'est un peu améliorée:

/etc/zshrc
/Users/starver/.zprofile
/Users/starver/.zshrc
/Users/starver/.zlogin

Notez qu'aucun des fichiers de démarrage global de zsh et c'est le problème racine: /etc/zprofile Contient:

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

quel homme path_helper explique:

L'utilitaire path_helper lit le contenu des fichiers dans les répertoires /etc/paths.d et /etc/manpaths.d et ajoute leur contenu aux variables d'environnement PATH et MANPATH respectivement. (La variable d'environnement MANPATH ne sera modifiée que si elle est déjà définie dans l'environnement.)

L'exécution de path_helper Au moins une fois lors du démarrage de Shell est VRAIMENT importante: paths et paths.d Sont l'endroit où le système et les installateurs tiers définissent leurs ajouts de chemin. Ne pas exécuter le fichier de démarrage du profil système est la raison pour laquelle /usr/local/bin, /usr/local/go, Etc. ne sont pas sur le chemin.

J'ai essayé plusieurs approches, à la recherche d'une solution élégante. Apparemment, l'implémentation du terminal jediterm empêche de se connecter à un processus de démarrage de terminal standard - ils implémentent donc le chargement du fichier de démarrage dans /Applications/IntelliJ IDEA.app/Contents/plugins/terminal/.zshrc. Nous pouvons corriger cette implémentation !! Remplacez ce fichier par:

#!/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

Maintenant, au démarrage du terminal IntelliJ, je vois

/etc/zshrc
/etc/zprofile
/Users/starver/.zprofile
/Users/starver/.Shell-common
/etc/zshrc
/Users/starver/.zshrc
/Users/starver/.zlogin

Le premier /etc/zshrc Est exécuté avant le .zshrc Du plugin, je ne peux rien y faire, et cela ne cause aucun mauvais effet secondaire ...

Répétez le processus pour chaque produit JetBrains et vous pouvez avoir la joie d'Oh My Zsh partout.

Remarque : problème signalé à JetBrains dans https://youtrack.jetbrains.com/issue/IDEA-194488 .

12
Steve Tarver
zsh --login --interactive

A travaillé pour moi en tant que terminal command, ou pour faire court:

zsh -li

Cela chargera/etc/zprofile sur Mac et tous les scripts de connexion.

0
msemelman

Je peux tout confirmer dans cette réponse , mais il existe une solution de contournement plus simple basée sur le fait que le chargement de path_helper deux fois n'a pas d'importance.

Donc, jusqu'à ce que JetBrains corrige son plugin Terminal, mettez simplement source /etc/zprofile à ton ~/.zshrc fichier et profit!

0
tomasbedrich

Pour corriger sdkman avec zsh, il suffit d'exécuter cette ligne: fonctionne bien pour moi Ubuntu 19.04

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

Essayez de décommenter la première chaîne dans ~/.zshrc:

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

Ça m'a aidé.

0
Pavel Druzhinin