about summary refs log tree commit diff
path: root/Functions
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-04-08 20:16:22 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-04-08 20:16:22 +0000
commit9ce24e26ea030ed8b66397ecfcd208e111ab5c38 (patch)
tree6347d36f6644a638fa876907d3fbe2eeca8adddf /Functions
parentb63a35810c550822e31237a3d4a4cc117451466c (diff)
downloadzsh-9ce24e26ea030ed8b66397ecfcd208e111ab5c38.tar.gz
zsh-9ce24e26ea030ed8b66397ecfcd208e111ab5c38.tar.xz
zsh-9ce24e26ea030ed8b66397ecfcd208e111ab5c38.zip
Merge from trunk for next 4.2 release.
Diffstat (limited to 'Functions')
-rw-r--r--Functions/Prompts/prompt_bart_setup99
1 files changed, 73 insertions, 26 deletions
diff --git a/Functions/Prompts/prompt_bart_setup b/Functions/Prompts/prompt_bart_setup
index 6c154134f..c09ec64df 100644
--- a/Functions/Prompts/prompt_bart_setup
+++ b/Functions/Prompts/prompt_bart_setup
@@ -2,8 +2,8 @@ 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'
+    [[ $ZSH_VERSION < 4.2.2 ]] &&
+	print 'Requires ZSH_VERSION 4.2.2'$'\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
@@ -17,9 +17,11 @@ prompt_bart_help () {
 	given.  The defaults look best on a light background.
 
 	The "off" token temporarily disables the theme; "on" restores it.
+	No background colors or hardwired cursor motion escapes are used,
+	and it is not necessary to setopt promptsubst.
 	EOF
-    [[ $(read -Ek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
-	print -nP $'\r'%E && return
+    [[ $(read -sek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
+	print -nP '\r%E' && return
     <<-\EOF
 
 	The "upper left prompt" looks like:
@@ -28,6 +30,10 @@ prompt_bart_help () {
 	last command is shown in standout mode if the exit status was
 	nonzero, or underlined if the job was stopped.
 
+	If the last command is too wide to fit without truncating the
+	current directory, it is put on a middle line by itself.  The
+	current	directory uses %~, so namedir abbreviation applies.
+
 	The "upper right prompt" looks like:
 	    date time
 	The fourth color is used for the date, and the first again for the
@@ -35,8 +41,8 @@ prompt_bart_help () {
 	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
+    [[ $(read -sek 1 "?${(%):-%S[press return]%s}") == [Qq] ]] &&
+	print -nP '\r%E' && return
     <<-\EOF
 
 	When RPS1 (RPROMPT) is set before this prompt is selected and a
@@ -44,38 +50,67 @@ prompt_bart_help () {
 	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
+	This prompt hijacks psvar[7] through [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.
+	prompt may not match the window width until the next command.
+
+	When setopt nopromptcr is in effect, an ANSI terminal protocol
+	exchange is attempted in order to determine the current cursor
+	column, and the width of the upper prompt is adjusted accordingly.
+	If your terminal is not ANSI compliant, this may cause unexpected
+	behavior, and in any case it may consume typeahead.  (Recommended
+	workaround is to setopt promptcr.)
 	EOF
+    [[ $(read -sek 1 "?${(%):-%S[done]%s}") == $'\n' ]] ||
+	print -nP '\n%E'
 }
 
+integer PSCOL=1
+
 prompt_bart_precmd () {
-    setopt localoptions noxtrace extendedglob noksharrays
+    setopt localoptions noxtrace noksharrays unset
+    local zero='%([BSUbsu]|{*%})' escape colno lineno
 
     # 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
 
-    repeat $[COLUMNS-${#${(%%f)${PS1//[%]\{[^%]#%\}/}}[1]}-1]
-    do
-	psvar[9]="$psvar[9] "
-    done
+    psvar[7]="$history[$[HISTCMD-1]]"	# Use history text, not just number
+    psvar[8]=''				# No padding until we compute it
+    psvar[9]=()
+
+    # Reset the truncation widths for upcoming computations
+    ((PSCOL == 1)) || { PSCOL=1 ; prompt_bart_ps1 }
+    if [[ -o promptcr ]]
+    then
+        # Emulate the 4.3.x promptsp option if it isn't available
+        eval '[[ -o promptsp ]] 2>/dev/null' ||
+            print -nP "${(l.COLUMNS.. .)}\e[s${(pl.COLUMNS..\b.)}%E\e[u" >$TTY
+    else IFS='[;' read -s -d R escape\?$'\e[6n' lineno PSCOL <$TTY
+    fi
+    ((PSCOL == 1)) || prompt_bart_ps1
+    ((colno = COLUMNS-PSCOL))
+
+    # Compute the size of the upper left prompt and set psvar[9] if needed.
+    ((${#${(f)${(%%)${(S)PS1//$~zero/}}}[1]} > colno)) && psvar[9]=''
+
+    # Compute and set the padding between upper left and right prompts.
+    (((colno -= ${#${(f)${(%%)${(S)PS1//$~zero/}}}[1]}) > 0)) &&
+	psvar[8]=${(l:colno:: :)}
 }
 
 prompt_bart_ps1 () {
+    setopt localoptions noxtrace noksharrays
+
     local -ah ps1
-    local -h host hist dir space date time rs="%{$reset_color%}"
+    local -h host hist1 hist2 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
+    hist1="%9(v. . %{$fg[%h]%}$eon%7v$eoff$rs )"
+    hist2=$'%9(v.\n'"%{$fg[%h]%}$eon%7v$eoff$rs.)"
+    dir="%{$fg[%~]%}%8~$rs"
+    space=%8v
     date="%{$fg[%D]%}%D$rs"	# Prefer "%{$fg[%D]%}%W$rs" in the USA?
     time="%{$fg[%@]%}%@$rs"
 
@@ -85,26 +120,33 @@ prompt_bart_ps1 () {
 
     # Assemble the new prompt
     ps1=( ${(f)PS1} )		# Split the existing prompt at newlines
-    ps1=( "%$[COLUMNS-3]>..>"	# Begin truncation (upper left prompt)
+    ps1=(
+        "%$[COLUMNS-PSCOL]>..>"	# Begin truncation (upper left prompt)
 	"$host"
-	" $hist "		# I prefer spaces around this; do you?
+	"$hist1"		# Empty when too wide for one line
 	"$dir"
 	"%<<"			# End truncation (end upper left prompt)
 	"$space"		# Pad line to upper right position
-	"%$[COLUMNS-16](l.  . $date)"
-	"%$[COLUMNS-6](l.. $time)"
+	"%$[COLUMNS-PSCOL-15](l. . $date)"
+	"%$[COLUMNS-PSCOL-7](l.. $time)"
+	"$hist2"		# Empty when $hist1 is not empty
 	$'\n'
-	$ps1[-1] )		# Keep last line of the existing prompt
+	$ps1[-1]		# Keep last line of the existing prompt
+	)
     PS1="${(j::)ps1}"
 }
 
 prompt_bart_winch () {
+    setopt localoptions noksharrays unset
+
     # 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 () {
+    setopt localoptions noksharrays unset
+
     # A few extra niceties ...
     repeat 1 case "$1:l" in
       (off|disable)
@@ -141,4 +183,9 @@ prompt_bart_setup () {
     return 0
 }
 
+prompt_bart_preview () {
+    local +h PS1='%# '
+    prompt_preview_theme bart "$@"
+}
+
 [[ -o kshautoload ]] || prompt_bart_setup "$@"