[PATCH 2/2] git-prompt.zsh: introduce thin ZSH wrapper
To facilitate a colored prompt in ZSH, write a thin wrapper around git-prompt.sh, factoring out and overriding the coloring logic. Since ZSH lacks a PROMPT_COMMAND, instruct the user to execute __git_ps1 inside precmd(). Signed-off-by: Ramkumar Ramachandra artag...@gmail.com --- contrib/completion/git-prompt.sh | 73 +-- contrib/completion/git-prompt.zsh | 59 +++ 2 files changed, 99 insertions(+), 33 deletions(-) create mode 100644 contrib/completion/git-prompt.zsh diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh index 08c9b22..0bc51ad 100644 --- a/contrib/completion/git-prompt.sh +++ b/contrib/completion/git-prompt.sh @@ -222,6 +222,45 @@ __git_ps1_show_upstream () } +# Helper function that is meant to be called from __git_ps1. It +# builds up a gitstring injecting color codes into the appropriate +# places. +__git_ps1_colorize_gitstring () +{ + local c_red='\e[31m' + local c_green='\e[32m' + local c_lblue='\e[1;34m' + local c_clear='\e[0m' + local bad_color=$c_red + local ok_color=$c_green + local branch_color=$c_clear + local flags_color=$c_lblue + local branchstring=$c${b##refs/heads/} + + if [ $detached = no ]; then + branch_color=$ok_color + else + branch_color=$bad_color + fi + + # Setting gitstring directly with \[ and \] around colors + # is necessary to prevent wrapping issues! + gitstring=\[$branch_color\]$branchstring\[$c_clear\] + + if [ $w = * ]; then + gitstring=$gitstring\[$bad_color\]$w + fi + if [ -n $i ]; then + gitstring=$gitstring\[$ok_color\]$i + fi + if [ -n $s ]; then + gitstring=$gitstring\[$flags_color\]$s + fi + if [ -n $u ]; then + gitstring=$gitstring\[$bad_color\]$u + fi + gitstring=$gitstring\[$c_clear\]$r$p +} # __git_ps1 accepts 0 or 1 arguments (i.e., format string) # when called from PS1 using command substitution @@ -363,39 +402,7 @@ __git_ps1 () if [ $pcmode = yes ]; then local gitstring= if [ -n ${GIT_PS1_SHOWCOLORHINTS-} ]; then - local c_red='\e[31m' - local c_green='\e[32m' - local c_lblue='\e[1;34m' - local c_clear='\e[0m' - local bad_color=$c_red - local ok_color=$c_green - local branch_color=$c_clear - local flags_color=$c_lblue - local branchstring=$c${b##refs/heads/} - - if [ $detached = no ]; then - branch_color=$ok_color - else - branch_color=$bad_color - fi - - # Setting gitstring directly with \[ and \] around colors - # is necessary to prevent wrapping issues! - gitstring=\[$branch_color\]$branchstring\[$c_clear\] - - if [ $w = * ]; then - gitstring=$gitstring\[$bad_color\]$w - fi - if [ -n $i ]; then - gitstring=$gitstring\[$ok_color\]$i - fi - if [ -n $s ]; then - gitstring=$gitstring\[$flags_color\]$s - fi - if [ -n $u ]; then - gitstring=$gitstring\[$bad_color\]$u - fi - gitstring=$gitstring\[$c_clear\]$r$p + __git_ps1_colorize_gitstring else gitstring=$c${b##refs/heads/}${f:+$f}$r$p fi diff --git a/contrib/completion/git-prompt.zsh b/contrib/completion/git-prompt.zsh new file mode 100644 index 000..dc164dd --- /dev/null +++ b/contrib/completion/git-prompt.zsh @@ -0,0 +1,59 @@ +# git prompt support for zsh: wrapper around git-prompt.sh +# +# To enable: +# +#1) Copy this file and git-prompt.sh to ~/.zsh/prompt +#2) Add the following lines to your .zshrc: +# +# source ~/.zsh/prompt/git-prompt.zsh +# GIT_PS1_SHOWCOLORHINTS=true +# precmd () { __git_ps1 %n| :%~$ %s } +# +#3) You can now add the following to ~/.zshrc and expect the +# characters to be displayed in color: +# +# GIT_PS1_DESCRIBE_STYLE=branch +# GIT_PS1_SHOWUPSTREAM=auto +#
Re: [PATCH 2/2] git-prompt.zsh: introduce thin ZSH wrapper
On Sat, May 11, 2013 at 11:25 AM, Ramkumar Ramachandra artag...@gmail.com wrote: To facilitate a colored prompt in ZSH, write a thin wrapper around git-prompt.sh, factoring out and overriding the coloring logic. Since ZSH lacks a PROMPT_COMMAND, instruct the user to execute __git_ps1 inside precmd(). I think this is two logical changes into one. --- /dev/null +++ b/contrib/completion/git-prompt.zsh @@ -0,0 +1,59 @@ +# git prompt support for zsh: wrapper around git-prompt.sh +# +# To enable: +# +#1) Copy this file and git-prompt.sh to ~/.zsh/prompt +#2) Add the following lines to your .zshrc: +# +# source ~/.zsh/prompt/git-prompt.zsh +# GIT_PS1_SHOWCOLORHINTS=true +# precmd () { __git_ps1 %n| :%~$ %s } +# +#3) You can now add the following to ~/.zshrc and expect the +# characters to be displayed in color: +# +# GIT_PS1_DESCRIBE_STYLE=branch +# GIT_PS1_SHOWUPSTREAM=auto +# GIT_PS1_SHOWDIRTYSTATE=true +# GIT_PS1_SHOWUNTRACKEDFILES=true + +test -z $script script=$(dirname ${funcsourcetrace[1]%:*})/git-prompt.sh +ZSH_VERSION='' . $script I've been thinking that this method of loading the script is not the best; we should probably have a list of locations where distributions usually put this file. So if we could avoid the creation of of a new file, that would be great. +autoload colors +colors + +__git_ps1_colorize_gitstring () +{ + local c_red='%F{red}' + local c_green='%F{green}' + local c_lblue='%F{blue}' + local c_clear='%f' + local bad_color=$c_red + local ok_color=$c_green + local branch_color=$c_clear + local flags_color=$c_lblue + local branchstring=$c${b##refs/heads/} This is the only real difference with bash colors, no? I think it's overkill to create a new file, and load the old one, only to override part of a function. We should probably start with everything in the same file, and only later if we find it's necessary, split. + if [ $detached = no ]; then + branch_color=$ok_color + else + branch_color=$bad_color + fi + + gitstring=$branch_color$branchstring$c_clear + + if [ $w = * ]; then + gitstring=$gitstring$bad_color$w + fi + if [ -n $i ]; then + gitstring=$gitstring$ok_color$i + fi + if [ -n $s ]; then + gitstring=$gitstring$flags_color$s + fi + if [ -n $u ]; then + gitstring=$gitstring$bad_color$u + fi + gitstring=$gitstring$c_clear$r$p +} -- -- Felipe Contreras -- To unsubscribe from this list: send the line unsubscribe git in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html