Obtenez la fonction dans PS1 (Zsh)?

15

Cela fonctionne dans bash( parse_git_branchest une fonction définie)

export PS1="\$(parse_git_branch)"

Mais je ne peux pas trouver l'équivalent dans zsh.

Remarque: si je le fais

PROMPT="$(parse_git_branch)"

Cela semble fonctionner, mais en fait, il exécute la commande lorsque je définis l'invite, ce qui n'est pas le but.

Dan Rosenstark
la source

Réponses:

26

Vous devez inclure

setopt PROMPT_SUBST

dans votre .zshrc, l' man zshallexplique dans la section EXPANSION RAPIDE :

Si l'option PROMPT_SUBST est définie, la chaîne d'invite est d'abord soumise à l'expansion des paramètres, à la substitution de commandes et à l'expansion arithmétique.

akira
la source
14

En fait, votre problème ne se limitait pas à la configuration PROMPT_SUBST: vous utilisez des guillemets doubles dans votre script forçant l'évaluation de la fonction lorsque vous définissez les PROMPTvariables. Vous ne souhaitez une évaluation que lorsque l'invite est calculée, c'est-à-dire que vous devez utiliser des guillemets simples.

Jn
la source
5

Comme le dit Akira, vous devez utiliser prompt subst. Ceci est mon premier code (y travaille toujours):

setopt PROMPT_SUBST
PROMPT='$(parse_git_branch)'

ou mieux

setopt PROMPT_SUBST
PROMPT='[$PR_MAGENTA%n$PR_NO_COLOR@$PR_GREEN%U%m%u$PR_NO_COLOR:$PR_RED%2c$PR_NO_COLOR]$(parse_git_branch) %(!.#.$)'
Dan Rosenstark
la source