Uzyskaj funkcję w PS1 (Zsh)?

15

Działa to w bash( parse_git_branchjest zdefiniowaną funkcją)

export PS1="\$(parse_git_branch)"

Ale nie mogę znaleźć odpowiednika w zsh.

Uwaga: jeśli to zrobię

PROMPT="$(parse_git_branch)"

Wydaje się, że działa, ale w rzeczywistości uruchamia polecenie po ustawieniu monitu, co nie jest celem.

Dan Rosenstark
źródło

Odpowiedzi:

26

Musisz dołączyć

setopt PROMPT_SUBST

W twojej .zshrc, man zshallwyjaśnia to w PROMPT EXPANSION sekcji:

Jeśli ustawiona jest opcja PROMPT_SUBST, łańcuch zachęty jest najpierw poddawany interpretacji parametrów, podstawianiu poleceń i interpretacji arytmetycznej.

akira
źródło
14

W rzeczywistości twoim problemem nie było tylko ustawienie PROMPT_SUBST: używasz podwójnych cudzysłowów w skrypcie, zmuszając ocenę funkcji podczas ustawiania PROMPTzmiennych. Potrzebujesz oceny tylko po obliczeniu monitu, czyli musisz użyć pojedynczych cudzysłowów.

JN
źródło
5

Jak mówi Akira, musisz użyć szybkiego zastępstwa. To jest mój wczesny kod (wciąż nad nim pracuję):

setopt PROMPT_SUBST
PROMPT='$(parse_git_branch)'

albo lepiej

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
źródło