Allow __git_ps1 to be used in PROMPT_COMMAND
Changes __git_ps1 to allow its use as PROMPT_COMMAND in bash in addition to setting PS1 with __git_ps1 in a command substitution. PROMPT_COMMAND has advantages for using color without running into prompt-wrapping issues. Only by assigning \[ and \] to PS1 directly can bash know that these and the enclosed zero-width codes in between don't count in the length of the prompt. Signed-off-by: Simon Oosthoek <s.oosthoek@xs4all.nl> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
d64383ab14
commit
1bfc51ac81
@ -10,9 +10,14 @@
|
|||||||
# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
|
# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
|
||||||
# 2) Add the following line to your .bashrc/.zshrc:
|
# 2) Add the following line to your .bashrc/.zshrc:
|
||||||
# source ~/.git-prompt.sh
|
# source ~/.git-prompt.sh
|
||||||
# 3) Change your PS1 to also show the current branch:
|
# 3a) In ~/.bashrc set PROMPT_COMMAND=__git_ps1
|
||||||
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
|
# To customize the prompt, provide start/end arguments
|
||||||
# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
|
# PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
|
||||||
|
# 3b) Alternatively change your PS1 to call __git_ps1 as
|
||||||
|
# command-substitution:
|
||||||
|
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
|
||||||
|
# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
|
||||||
|
# the optional argument will be used as format string
|
||||||
#
|
#
|
||||||
# The argument to __git_ps1 will be displayed only if you are currently
|
# The argument to __git_ps1 will be displayed only if you are currently
|
||||||
# in a git repository. The %s token will be the name of the current
|
# in a git repository. The %s token will be the name of the current
|
||||||
@ -195,11 +200,39 @@ __git_ps1_show_upstream ()
|
|||||||
|
|
||||||
|
|
||||||
# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
|
# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
|
||||||
# returns text to add to bash PS1 prompt (includes branch name)
|
# when called from PS1 using command substitution
|
||||||
|
# in this mode it prints text to add to bash PS1 prompt (includes branch name)
|
||||||
|
#
|
||||||
|
# __git_ps1 requires 2 arguments when called from PROMPT_COMMAND (pc)
|
||||||
|
# in that case it _sets_ PS1. The arguments are parts of a PS1 string.
|
||||||
|
# when both arguments are given, the first is prepended and the second appended
|
||||||
|
# to the state string when assigned to PS1.
|
||||||
__git_ps1 ()
|
__git_ps1 ()
|
||||||
{
|
{
|
||||||
|
local pcmode=no
|
||||||
|
#defaults/examples:
|
||||||
|
local ps1pc_start='\u@\h:\w '
|
||||||
|
local ps1pc_end='\$ '
|
||||||
|
local printf_format=' (%s)'
|
||||||
|
|
||||||
|
case "$#" in
|
||||||
|
2) pcmode=yes
|
||||||
|
ps1pc_start="$1"
|
||||||
|
ps1pc_end="$2"
|
||||||
|
;;
|
||||||
|
0|1) printf_format="${1:-$printf_format}"
|
||||||
|
;;
|
||||||
|
*) return
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
local g="$(__gitdir)"
|
local g="$(__gitdir)"
|
||||||
if [ -n "$g" ]; then
|
if [ -z "$g" ]; then
|
||||||
|
if [ $pcmode = yes ]; then
|
||||||
|
#In PC mode PS1 always needs to be set
|
||||||
|
PS1="$ps1pc_start$ps1pc_end"
|
||||||
|
fi
|
||||||
|
else
|
||||||
local r=""
|
local r=""
|
||||||
local b=""
|
local b=""
|
||||||
if [ -f "$g/rebase-merge/interactive" ]; then
|
if [ -f "$g/rebase-merge/interactive" ]; then
|
||||||
@ -285,6 +318,12 @@ __git_ps1 ()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local f="$w$i$s$u"
|
local f="$w$i$s$u"
|
||||||
printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
|
if [ $pcmode = yes ]; then
|
||||||
|
PS1="$ps1pc_start("
|
||||||
|
PS1="$PS1$c${b##refs/heads/}${f:+ $f}$r$p"
|
||||||
|
PS1="$PS1)$ps1pc_end"
|
||||||
|
else
|
||||||
|
printf -- "$printf_format" "$c${b##refs/heads/}${f:+ $f}$r$p"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user