summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Functions/Prompts/prompt_bart_setup153
1 files changed, 153 insertions, 0 deletions
diff --git a/Functions/Prompts/prompt_bart_setup b/Functions/Prompts/prompt_bart_setup
new file mode 100644
index 000000000..d602cc9ec
--- /dev/null
+++ b/Functions/Prompts/prompt_bart_setup
@@ -0,0 +1,153 @@
+zmodload -i zsh/parameter || return 1
+
+prompt_bart_help () {
+    setopt localoptions nocshnullcmd noshnullcmd
+    [[ $ZSH_VERSION < 3.1.6-dev-20 ]] &&
+	print 'Requires 3.1.6-dev-19 plus zsh-workers/10168.'$'\n'
+    <<-\EOF
+	This prompt gives the effect of left and right prompts on the upper
+	line of a two-line prompt.  It also illustrates including history
+	text in the prompt.  The lower line is initialized from the last
+	(or only) line of whatever prompt was previously in effect.
+
+	    prompt bart [on|off] [color...]
+
+	You may provide up to five colors, though only three colors (red,
+	blue, and the default foreground) are used if no arguments are
+	given.  The defaults look best on a light background.
+
+	The "off" token temporarily disables the theme; "on" restores it.
+	EOF
+    [[ $(read -Ek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
+	print -nP $'\r'%E && return
+    <<-\EOF
+
+	The "upper left prompt" looks like:
+	    machine [last command] /current/working/dir
+	The first three color arguments apply to these components.  The
+	last command is shown in standout mode if the exit status was
+	nonzero, or underlined if the job was stopped.
+
+	The "upper right prompt" looks like:
+	    date time
+	The fourth color is used for the date, and the first again for the
+	time.  As with RPS1, first the date and then the time disappear as
+	the upper left prompt grows too wide.  The clock is not live; it
+	changes only after each command, as does the rest of the prompt.
+	EOF
+    [[ $(read -Ek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
+	print -nP $'\r'%E && return
+    <<-\EOF
+
+	When RPS1 (RPROMPT) is set before this prompt is selected and a
+	fifth color is specified, that color is turned on before RPS1 is
+	displayed and reset after it.  Other color changes within RPS1, if
+	any, remain in effect.
+
+	This prompt hijacks psvar[8] and psvar[9] to avoid having to reset
+	the entire PS1 string on every command.  It uses TRAPWINCH to set
+	the position of the upper right prompt on a window resize, so the
+	prompt may not match the window width until the next command.  No
+	background colors or hardwired cursor motion escapes are used, and
+	it is not necessary to setopt promptsubst.
+	EOF
+}
+
+prompt_bart_precmd () {
+    setopt localoptions noxtrace extendedglob noksharrays
+
+    # Using psvar here protects against unwanted promptsubst expansions.
+    psvar[8]="$history[$#history]"	# Use history text, not just number
+    psvar[9]=''				# Padding before upper right prompt
+
+    if [[ -o promptsubst ]]
+    then
+	# This is a bug workaround; ${(%)...} mishandles promptsubst
+	repeat $[COLUMNS-${#${(%f)${${(e)PS1}//[%]\{[^%]#%\}/}}[1]}-1]
+	do
+	    psvar[9]="$psvar[9] "
+	done
+    else
+	repeat $[COLUMNS-${#${(%f)${PS1//[%]\{[^%]#%\}/}}[1]}-1]
+	do
+	    psvar[9]="$psvar[9] "
+	done
+    fi
+}
+
+prompt_bart_ps1 () {
+    local -ah ps1
+    local -h host hist dir space date time rs="%{$reset_color%}"
+    local -h eon="%(?.[.%20(?.[%U.%S[))" eoff="%(?.].%20(?.%u].]%s))"
+
+    # Set up the components of the upper line
+    host="%{$fg[%m]%}%m$rs"
+    hist="%{$fg[%h]%}$eon%8v$eoff$rs"
+    dir="%{$fg[%~]%}%~$rs"
+    space=%9v
+    date="%{$fg[%D]%}%D$rs"	# Prefer "%{$fg[%D]%}%W$rs" in the USA?
+    time="%{$fg[%@]%}%@$rs"
+
+    # This is just a tad silly ...
+    [[ $prompt_theme[1] = oliver ]] && PS1='[%h%0(?..:%?)]%# ' ||
+	PS1=${PS1//$prompt_newline/$'\n'}
+
+    # Assemble the new prompt
+    ps1=( ${(f)PS1} )		# Split the existing prompt at newlines
+    ps1=( "%$[COLUMNS-3]>..>"	# Begin truncation (upper left prompt)
+	"$host"
+	" $hist "		# I prefer spaces around this; do you?
+	"$dir"
+	"%<<"			# End truncation (end upper left prompt)
+	"$space"		# Pad line to upper right position
+	"%$[COLUMNS-16](l.  . $date)"
+	"%$[COLUMNS-6](l.. $time)"
+	$'\n'
+	$ps1[-1] )		# Keep last line of the existing prompt
+    PS1="${(j::)ps1}"
+}
+
+prompt_bart_winch () {
+    # Delete ourself from TRAPWINCH if not using our precmd insert.
+    [[ $functions[precmd] = *prompt_bart_precmd* ]] && prompt_bart_ps1 ||
+	functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}"
+}
+
+prompt_bart_setup () {
+    # A few extra niceties ...
+    repeat 1 case "$1:l" in
+      (off|disable)
+	functions[precmd]="${functions[precmd]//prompt_bart_precmd}"
+	functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}"
+	[[ $prompt_theme[1] = bart ]] && PS1=${${(f)PS1}[-1]}
+	return 1
+	;;
+      (on|enable)
+	shift
+	[[ $prompt_theme[1] = bart ]] && break
+	;&
+      (*)
+	# Abuse the fg assoc to hold our selected colors ...
+	fg[%m]=$fg[${1:-red}]
+	fg[%h]=$fg[${2:-blue}]
+	fg[%~]=$fg[${3:-none}]
+	fg[%D]=$fg[${4:-none}]
+	fg[%@]=$fg[${1:-red}]
+	;;
+    esac
+
+    prompt_bart_ps1
+
+    # No RPS1 by default because prompt_off_setup doesn't fix it.
+    (($#RPS1 && $# > 4)) && RPS1="%{$fg[$5]%}$RPS1%{$reset_color%}"
+
+    # Paste our special commands into precmd and TRAPWINCH
+    functions[precmd]="${functions[precmd]//prompt_*_precmd}
+	prompt_bart_precmd"
+    functions[TRAPWINCH]="${functions[TRAPWINCH]//prompt_bart_winch}
+	prompt_bart_winch"
+
+    return 0
+}
+
+[[ -o kshautoload ]] || prompt_bart_setup "$@"