<p>L'intégration du powerline et du shell iTerm2 ne fonctionne plus ensemble</p>

Créé le 9 oct. 2017  ·  7Commentaires  ·  Source: powerline/powerline

iTerm2 : Build 3.1.4.beta.1
ligne électrique : 2,6

Contenu de bash_login:

# iterm shell integration
test -e ${HOME}/.iterm2_shell_integration.bash && source ${HOME}/.iterm2_shell_integration.bash

# powerline prompt
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /usr/local/lib/python2.7/site-packages/powerline/bindings/bash/powerline.sh

Contenu de $ PROMPT_COMMAND:

__bp_precmd_invoke_cmd; _powerline_set_prompt; __bp_interactive_mode

La toute première invite d'un shell fonctionne (le petit chevron d'iterm est présent et la première commande est enregistrée dans Toolbelt > Command History

Toutes les invites suivantes n'appellent pas les fonctions d'intégration du shell iterm.

Le comportement est le même quelle que soit la personne qui reçoit la première fissure sur PS1 (c'est-à-dire si je déplace l'initialiseur d'intégration du shell iterm en dessous de celui de la ligne électrique).

cshell serror in environment bug

Tous les 7 commentaires

Vous devez avoir autre chose dans le bashrc, ni l'intégration du shell iTerm ni Powerline ne définissent __bp_precmd_invoke_cmd. Tout d'abord, je ne vois aucun problème avec l'intégration iTerm, sauf qu'il a un bogue.

Aussi quand j'ai

POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
source ~/.vam/powerline/powerline/bindings/bash/powerline.sh

source ~/tmp/iterm2_shell_integration

PROMPT_COMMAND est _powerline_status_wrapper _powerline_set_prompt; iterm2_preexec_invoke_cmd comme prévu (bien que je ne puisse pas vérifier qu'il fonctionne comme prévu sans iTerm2). (L'encapsuleur d'état est un ajout récent, pas encore en sortie.)

Je dois dire cependant que l'intégration du shell iTerm2 contient un bogue sérieux qui empêche l'invite Powerline de fonctionner correctement au cas où quelqu'un (y compris Powerline lui-même, ce qu'il fait lorsqu'il est exécuté dans tmux à moins que l'intégration tmux ne soit désactivée, bien que l'intégration iterm ne prenne pas en charge tmux, donc elle ne l'a pas fait frappez-les encore) utilise la même méthode d'ajout à PROMPT_COMMAND: il a

        PROMPT_COMMAND="$(echo -n $PROMPT_COMMAND | sed -e 's/; *$//'); iterm2_preexec_invoke_cmd";

: notez que $PROMPT_COMMAND n'est pas cité. Quelqu'un doit dire au suivi des problèmes que

  1. Il doit être entre guillemets pour conserver les nouvelles lignes, les doubles espaces dans les littéraux, etc.
  2. La chose entière sed avec le tout if est complètement inutile, juste ils ne devraient pas utiliser de point-virgule et écrire à la place

    PROMPT_COMMAND="$PROMPT_COMMAND"$'\niterm2_preexec_invoke_cmd'
    

    : le bogue auquel ils font référence ne va pas apparaître si l'on utilise newline comme séparateur de commandes car on peut avoir n'importe quel nombre de retours à la ligne comme séparateurs dont ils ont besoin et laisser les retours à la ligne de fin ou de tête sans aucun problème (donc sans se soucier de vérifier si $ PROMPT_COMMAND est vide en premier lieu: cette ligne doit remplacer les six lignes if qu'elles ont dans iterm2_preexec_install).

Dans tous les cas, je ne vois pas cela comme un problème d'intégration Powerline ou Iterm, traitez ce qui ajoute __bp_… trucs.

iTerm2 utilise définitivement bash-preexec - c'est là que bash-preexec est né. Je pense que vous regardez une ancienne version de l'intégration du shell iterm2, antérieure à l'extraction de bash-preexec .

(Et, pour info, l'étrange sed disparu - mais n'était-il pas là à cause de la façon dont la ligne électrique était utilisée pour configurer PROMPT_COMMAND?)

Dans tous les cas, la dernière version (v0.3.4) de bash-preexec résout le problème. La nouvelle version utilise un piège DEBUG pour ajouter toutes les nouvelles choses ajoutées à PROMPT_COMMAND à l'ensemble des commandes bp preexec, ce qui a pour effet secondaire de ne plus afficher Powerline dans la var PROMPT_COMMAND:

echo $PROMPT_COMMAND
__bp_precmd_invoke_cmd; __bp_interactive_mode

Pour quiconque recherche ce problème sur Google jusqu'à ce que iterm2 incorpore le nouveau bash-preexec: il suffit de copier-coller la v0.3.4 dans votre iterm2_shell_integration.bash

@lastobelus J'ai téléchargé l'intégration du shell iTerm2 en utilisant le lien suggéré dans https://www.iterm2.com/documentation-shell-integration.html (c'est-à-dire https://iterm2.com/misc/bash_startup.in) et il ne contient ni source ou dot et ne définit pas les fonctions __bp* , bien qu'il crée des hooks precmd / preexec et qu'il contienne sed .

J'ai eu ce même problème, mon $PROMPT_COMMAND est:

echo $PROMPT_COMMAND
__bp_precmd_invoke_cmd; __bp_interactive_mode

La solution de contournement pour moi était d'ajouter _powerline_set_prompt au precmd_functions après avoir sourci powerline.sh dans mon bashrc :

...
# Regular powerline configuration
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
source <powerline_folder>/powerline.sh

# Next line is the workaround
precmd_functions+=(_powerline_set_prompt)
...

J'espère que cela aide quelqu'un.

Pour les autres rencontrant le même problème 2 ans et demi plus tard, voici la solution de contournement qui a fonctionné pour moi avec une version récente sur Mac OS Mojave avec iTerm 2 installé:

function _powerline_set_prompt() {
    PS1="$(powerline-shell "$?")"
}

precmd_functions+=(_powerline_set_prompt)
Cette page vous a été utile?
0 / 5 - 0 notes