Skip to content

Instantly share code, notes, and snippets.

@reinvanoyen
Last active March 28, 2024 12:55
Star You must be signed in to star a gist
Save reinvanoyen/05bcfe95ca9cb5041a4eafd29309ff29 to your computer and use it in GitHub Desktop.
Add Git Branch Name to Terminal Prompt (MacOS zsh)

Add Git Branch Name to Terminal Prompt (zsh)

Updated for MacOS with zsh

  • Catalina
  • Big Sur
  • Monterey
  • Ventura
  • Sonoma

screenshot

Install

Open ~/.zshrc in your favorite editor and add the following content to the bottom.

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Reload and apply adjustments

To reload and apply adjustments to the formatting use source ~/.zshrc in the zsh shell.

Credits

@jous32
Copy link

jous32 commented Oct 16, 2021

Awesome

@cjba850
Copy link

cjba850 commented Oct 21, 2021

I found this mucked up my wraparound - but the fix I found was to tell zsh the color definitions were Zero-length strings.

COLOR_DEF=$'%{\e[0m%}'
COLOR_USR=$'%{\e[38;5;243m%}'
COLOR_DIR=$'%{\e[38;5;197m%}'
COLOR_GIT=$'%{\e[38;5;39m%}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Made a massive difference for me. Hope that helps someone else!

@Rah1x
Copy link

Rah1x commented Nov 17, 2021

Here is for ppl who have light blue background (Ocean theme) 😆

#/ Add git branch to prompt

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/\(\1\)/p'
}

NEW_LINE=$'\n'
COLOR_MAIN=$'\e[1;33m'
COLOR_END=$'\e[0m'

setopt PROMPT_SUBST
export PROMPT='${NEW_LINE}${COLOR_MAIN}%n %~${COLOR_END} $(parse_git_branch)${COLOR_MAIN}$:${COLOR_END}${NEW_LINE}'

Also notice ive added newlines before and after the prompt line to make the system really clean.

@DarylAranha
Copy link

Thank you 👍 😄

@ZhiMing96
Copy link

Thanks

@rd67
Copy link

rd67 commented Dec 16, 2021

Thank you.

@kerwin0104
Copy link

Thank you!

@JulioCLop
Copy link

Very Helpful! Thanks!

@ggustafsson
Copy link

$ git branch --show-current
master

@eliozashvili
Copy link

So how can I save it so it will always work automatically? Because it resets everytime I close terminal

@itsalb3rt
Copy link

thanks!!!

@benP2ER
Copy link

benP2ER commented Mar 31, 2022

Thanks for the script.
I ran into some issues on my system (macOS Monterey 12.0.1; zsh 5.8). When I autocomplete paths or use the arrow key to scroll through previous commands the formatting gets screwed up. Turns out the issues occur because of the ANSI color codes.

Solution:

The zsh shell has its own Prompt Expensions with visual effects. For colors you use %F and %f to escape the foreground color. (This also allows the usage of color aliases like %F{blue}This text is blue!%f)

Adjusted script:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Other Things:

To avoid non ascii characters causing this issue try wrapping them in a 'glitch' sequence which assumes everything inside is only one character long, like this: %{👌%G%}.

To reload and apply adjustments to the formatting use $ source ~/.zshrc in the zsh shell.

If you have a long working directory, you can shorten the path by only displaying the last n elements of the path. To display the last 2 elements replace %~ with %2~.

I also didn't want 2 spaces displayed, when the current working directory is not a repository so I adjusted the spacings:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1] /p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%2~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}$ '

You could also shorten the script by removing the COLOR_... variables and using the extensions directly:

export PROMPT='%F{243}%n%f %F{197}%2~%f %F{39}$(parse_git_branch)%f$ '

Hope this maybe helps anyone with the same issues.

@thiagovars
Copy link

Works fine to me. Thanks a lot!

@michaeljohncalvey
Copy link

Thanks for the script. I ran into some issues on my system (macOS Monterey 12.0.1; zsh 5.8). When I autocomplete paths or use the arrow key to scroll through previous commands the formatting gets screwed up. Turns out the issues occur because of the ANSI color codes.

Solution:

The zsh shell has its own Prompt Extensions with visual effects. For colors you use %F and %f to escape the foreground color. (This also allows the usage of color aliases like %F{blue}This text is blue!%f)

Adjusted script:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Other Things:

To avoid non ascii characters causing this issue try wrapping them in a 'glitch' sequence which assumes everything inside is only one character long, like this: %{👌%G%}.

To reload and apply adjustments to the formatting use $ source ~/.zshrc in the zsh shell.

If you have a long working directory, you can shorten the path by only displaying the last n elements of the path. To display the last 2 elements replace %~ with %2~.

I also didn't want 2 spaces displayed, when the current working directory is not a repository so I adjusted the spacings:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1] /p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%2~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}$ '

You could also shorten the script by removing the COLOR_... variables and using the extensions directly:

export PROMPT='%F{243}%n%f %F{197}%2~%f %F{39}$(parse_git_branch)%f$ '

Hope this maybe helps anyone with the same issues.

This was super helpful, ty

@Wamae
Copy link

Wamae commented Jun 14, 2022

Lovely!, thank you.

@matthewbordas
Copy link

Thanks for the script. I ran into some issues on my system (macOS Monterey 12.0.1; zsh 5.8). When I autocomplete paths or use the arrow key to scroll through previous commands the formatting gets screwed up. Turns out the issues occur because of the ANSI color codes.

Solution:

The zsh shell has its own Prompt Expensions with visual effects. For colors you use %F and %f to escape the foreground color. (This also allows the usage of color aliases like %F{blue}This text is blue!%f)

Adjusted script:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Other Things:

To avoid non ascii characters causing this issue try wrapping them in a 'glitch' sequence which assumes everything inside is only one character long, like this: %{👌%G%}.

To reload and apply adjustments to the formatting use $ source ~/.zshrc in the zsh shell.

If you have a long working directory, you can shorten the path by only displaying the last n elements of the path. To display the last 2 elements replace %~ with %2~.

I also didn't want 2 spaces displayed, when the current working directory is not a repository so I adjusted the spacings:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1] /p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%2~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}$ '

You could also shorten the script by removing the COLOR_... variables and using the extensions directly:

export PROMPT='%F{243}%n%f %F{197}%2~%f %F{39}$(parse_git_branch)%f$ '

Hope this maybe helps anyone with the same issues.

Thank you!!

@rcrick
Copy link

rcrick commented Aug 22, 2022

Thanks!

@kevin-almeida-ilia
Copy link

thanks

@mannyanebi
Copy link

Thank you!

@saintmalik
Copy link

function parse_git_branch() {
git branch 2> /dev/null | sed -n -e 's/^* (.*)/git:(\1)/p'
}

COLOR_DEF=$'\e[0m'
COLOR_USR=$'\e[38;5;2m'
COLOR_DIR=$'\e[38;5;32m'
COLOR_GIT=$'\e[38;5;39m'
setopt PROMPT_SUBST
export PROMPT='➜ ${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

@carlosjarrieta
Copy link

Thanks you

@RodrigoIbarraSanchez
Copy link

Thanks!

@jsohndata
Copy link

Thanks!!!

@reinvanoyen
Copy link
Author

Thanks for the script. I ran into some issues on my system (macOS Monterey 12.0.1; zsh 5.8). When I autocomplete paths or use the arrow key to scroll through previous commands the formatting gets screwed up. Turns out the issues occur because of the ANSI color codes.

Solution:

The zsh shell has its own Prompt Expensions with visual effects. For colors you use %F and %f to escape the foreground color. (This also allows the usage of color aliases like %F{blue}This text is blue!%f)

Adjusted script:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Other Things:

To avoid non ascii characters causing this issue try wrapping them in a 'glitch' sequence which assumes everything inside is only one character long, like this: %{👌%G%}.

To reload and apply adjustments to the formatting use $ source ~/.zshrc in the zsh shell.

If you have a long working directory, you can shorten the path by only displaying the last n elements of the path. To display the last 2 elements replace %~ with %2~.

I also didn't want 2 spaces displayed, when the current working directory is not a repository so I adjusted the spacings:

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1] /p'
}

COLOR_DEF=$'%f'
COLOR_USR=$'%F{243}'
COLOR_DIR=$'%F{197}'
COLOR_GIT=$'%F{39}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%2~ ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}$ '

You could also shorten the script by removing the COLOR_... variables and using the extensions directly:

export PROMPT='%F{243}%n%f %F{197}%2~%f %F{39}$(parse_git_branch)%f$ '

Hope this maybe helps anyone with the same issues.

Thank you for your deep-dive comment. I updated the gist with your solution and linked your comment.

@DigitalSolomon
Copy link

Great stuff.

@trontrytel
Copy link

Thank you!

@silviomedice
Copy link

Thanks :)

@amalsalimz
Copy link

finally!! thanks

@chunshao90
Copy link

Thank you!!!

@jake-betplusev
Copy link

this is awesome :)

@Dayglor
Copy link

Dayglor commented May 23, 2023

Nice! Thank you!

@saintmalik
Copy link

thanks

@giedriusksd
Copy link

Thanks

@cmiller96
Copy link

Thank you!

@nicholaide
Copy link

Thank you

@daCFniel
Copy link

It's perfect, thank you :)

@symplytheo
Copy link

Gracias

@Ramizdo
Copy link

Ramizdo commented Oct 6, 2023

Funciona, gracias..

@vnguyen13
Copy link

Works wonderfully. Thank you!!

@devih-21
Copy link

helpful, thanks bro

@vasu2912
Copy link

Looks Clean !!!

@csarrvas
Copy link

Thanks!! 👍

@pychap
Copy link

pychap commented Dec 21, 2023

Thank you!

@z-coder-hub
Copy link

Thank you!

@emcfarlane
Copy link

Thank you!

@gideonokyere
Copy link

Thanks

@TrevorPawlewicz
Copy link

This is exactly what I was looking for... thank you!

@beitomartinez
Copy link

Simple and exactly what I was looking for... thanks!! 💯

@joyoy96
Copy link

joyoy96 commented Mar 26, 2024

but it adds unneccesary space when I opening the non git folder, could we do something about that?

the syntax to get the branch also could be simpler we could do this now

git branch --show-current

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment