Saltar al contenido

¿Cómo hago para que IntelliJ Terminal funcione correctamente con Oh My Zsh?

Revisamos profundamente cada una de las secciones en nuestro espacio con la meta de mostrarte en todo momento información con la mayor veracidad y certera.

Solución:

¿No puede encontrar binarios, no puede ejecutar cosas? Obviamente un problema de $ PATH, pero ¿qué y por qué?

Me hice eco de un buen camino conocido en 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

y en IntelliJ:

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

Esto sugiere un problema de carga de archivos de inicio. Mi página de manual de zsh dice que el orden de carga debería ser:

  • /etc/zshenv
  • $ZDOTDIR/.zshenv
  • Si es un shell de inicio de sesión:
    • /etc/zprofile
    • $ZDOTDIR/.zprofile
  • Si es un shell interactivo:
    • /etc/zshrc
    • $ZDOTDIR/.zshrc
  • Si es un shell de inicio de sesión:
    • /etc/zlogin
    • $ZDOTDIR/.zlogin

Después de agregar un echo a cada uno de esos archivos que existían, obtuve lo siguiente para iTerm2:

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

y esto en IntelliJ

/etc/zshrc
/Users/starver/.zshrc

IntelliJ cree que esto no es un shell de inicio de sesión. En la configuración de la terminal Jetbrains, no puede ingresar /bin/zsh --login; no tiene ningún efecto. Después de jugar un poco, descubrí que activar Herramientas -> Terminal -> Integración de Shell hace que el terminal sea un “shell de inicio de sesión” y la historia de carga del archivo de inicio mejoró un poco:

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

Tenga en cuenta que ninguno de los archivos de inicio global de zsh y este es el problema raíz: /etc/zprofile contiene:

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

que hombre path_helper explica:

La utilidad path_helper lee el contenido de los archivos en los directorios /etc/paths.d y /etc/manpaths.d y agrega su contenido a las variables de entorno PATH y MANPATH respectivamente. (La variable de entorno MANPATH no se modificará a menos que ya esté configurada en el entorno).

Ejecutando path_helper al menos una vez durante el inicio del shell es REALMENTE importante: paths y paths.d es donde el sistema y los instaladores de terceros definen sus adiciones de ruta. No ejecutar el archivo de inicio del perfil del sistema es la razón /usr/local/bin, /usr/local/go, etc. no están en el camino.

Probé varios enfoques, buscando una solución elegante. Aparentemente, la implementación de la terminal jediterm evita que se conecte a un proceso de inicio de terminal estándar, por lo que implementan la carga de archivos de inicio en /Applications/IntelliJ IDEA.app/Contents/plugins/terminal/.zshrc. ¡Podemos arreglar esa implementación! Reemplace ese archivo con:

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

Ahora, en el inicio de la terminal IntelliJ, veo

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

El primero /etc/zshrc se ejecuta antes que el complemento .zshrc, no puedo hacer nada al respecto, y no está causando ningún efecto secundario negativo …

Repita el proceso para cada producto JetBrains y podrá disfrutar de la alegría de Oh My Zsh en todas partes.

Nota: Problema informado a JetBrains en https://youtrack.jetbrains.com/issue/IDEA-194488.

zsh --login --interactive

Trabajó para mí como terminal command, o para abreviar:

zsh -li

Esto cargará / etc / zprofile en Mac y todos los scripts de inicio de sesión.

Si aceptas, tienes el poder dejar un ensayo acerca de qué te ha impresionado de este enunciado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *