J'adore Oh My Zsh, mais cela n'a jamais fonctionné correctement dans les terminaux du produit JetBrains:
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.
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
/etc/zprofile
$ZDOTDIR/.zprofile
/etc/zshrc
$ZDOTDIR/.zshrc
/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 .
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.
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!
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
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é.