git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 2/2] git-prompt.zsh: introduce thin ZSH wrapper

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
May 11, 2013, 16:25 UTC
Message-ID
<1368289513-8700-3-git-send-email-artagnon@gmail.com>
In-Reply-To
<1368289513-8700-1-git-send-email-artagnon@gmail.com>

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 <artagnon@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 0000000..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
+#          GIT_PS1_SHOWDIRTYSTATE=true
+#          GIT_PS1_SHOWUNTRACKEDFILES=true
+
+test -z "$script" && script="$(dirname ${funcsourcetrace[1]%:*})"/git-prompt.sh
+ZSH_VERSION='' . "$script"
+
+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/}"
+
+	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"
+}
-- 
1.8.3.rc1.52.g4537cf1
Previous: Ramkumar RamachandraNext: Felipe Contreras
Message 11 of 16 in “Colored prompt for zsh”
  1. 0/2 Colored prompt for zshRamkumar Ramachandra, May 11, 2013
  2. 1/2 git-prompt.sh: strip unnecessary space in prompt stringRamkumar Ramachandra, May 11, 2013
  3. Junio C HamanoMay 13, 2013
  4. Ramkumar RamachandraMay 13, 2013
  5. SZEDER GáborMay 13, 2013
  6. Ramkumar RamachandraMay 13, 2013
  7. SZEDER GáborMay 13, 2013
  8. SZEDER GáborMay 13, 2013
  9. Junio C HamanoMay 13, 2013
  10. Ramkumar RamachandraMay 13, 2013
  11. 2/2 git-prompt.zsh: introduce thin ZSH wrapperRamkumar Ramachandra, May 11, 2013
  12. Felipe ContrerasMay 11, 2013
  13. git-prompt.sh: colorize ZSH promptRamkumar Ramachandra, May 11, 2013
  14. Felipe ContrerasMay 11, 2013
  15. Ramkumar RamachandraMay 11, 2013
  16. Felipe ContrerasMay 11, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.