about summary refs log tree commit diff
path: root/Functions
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>2000-03-23 04:00:14 +0000
committerTanaka Akira <akr@users.sourceforge.net>2000-03-23 04:00:14 +0000
commitb397911726151269fcd5652218e86990fbb5b58f (patch)
tree71f370fbab4ac3d575bbf700dbc0cec96a992ad0 /Functions
parent5726c2ec9d98e71726697de4d6ae6683b03b0ab3 (diff)
downloadzsh-b397911726151269fcd5652218e86990fbb5b58f.tar.gz
zsh-b397911726151269fcd5652218e86990fbb5b58f.tar.xz
zsh-b397911726151269fcd5652218e86990fbb5b58f.zip
zsh-workers/10173
Diffstat (limited to 'Functions')
-rw-r--r--Functions/Prompts/prompt_bart_setup153
-rw-r--r--Functions/Prompts/promptinit50
2 files changed, 174 insertions, 29 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 "$@"
diff --git a/Functions/Prompts/promptinit b/Functions/Prompts/promptinit
index faa73be21..adf0d4f2d 100644
--- a/Functions/Prompts/promptinit
+++ b/Functions/Prompts/promptinit
@@ -55,6 +55,18 @@ Use prompt -h <theme> for help on specific themes.'
 
   getopts "chlps" opt
   case "$opt" in
+    (h|p)
+      setopt localtraps
+      if [[ -z "$prompt_theme[1]" ]]; then
+        # Not using a prompt theme; save settings
+	local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
+	trap "${$(functions precmd):-:} ; ${$(functions preexec):-:}" 0
+      else
+        trap 'prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"' 0
+      fi
+      ;;
+  esac
+  case "$opt" in
     c) if (( $+prompt_theme )); then
          print -n "Current prompt theme"
          (( $#prompt_theme > 1 )) && print -n " with parameters"
@@ -65,6 +77,12 @@ Use prompt -h <theme> for help on specific themes.'
        return
        ;;
     h) if [[ -n "$2" && -n $prompt_themes[(r)$2] ]]; then
+         if functions prompt_$2_setup >/dev/null; then
+	   # The next line is a bit ugly.  It (perhaps unnecessarily)
+	   # runs the prompt theme setup function to ensure that if
+	   # the theme has a _help function that it's been autoloaded.
+	   prompt_$2_setup
+	 fi
          if functions prompt_$2_help >/dev/null; then
            print "Help for $2 theme:\n"
            prompt_$2_help
@@ -81,13 +99,7 @@ Use prompt -h <theme> for help on specific themes.'
        print $prompt_themes
        return
        ;;
-    p) if [[ -z "$prompt_theme[1]" ]]; then
-         # Not using a prompt theme; save settings
-         prompt_non_theme=( "$PS1" "$PS2" "$PS3" "$PS4" "$RPS1" )
-         prompt_old_precmd="$(functions precmd)"
-         prompt_old_preexec="$(functions preexec)"
-       fi
-       preview=( $prompt_themes )
+    p) preview=( $prompt_themes )
        (( $#* > 1 )) && preview=( "$@[2,-1]" )
        for theme in $preview; do
          theme_args=( "$=theme" )
@@ -110,25 +122,6 @@ Use prompt -h <theme> for help on specific themes.'
          fi
        done
        print
-       if [[ -z "$prompt_theme[1]" ]]; then
-         PS1="$prompt_non_theme[1]"
-         PS2="$prompt_non_theme[2]"
-         PS3="$prompt_non_theme[3]"
-         PS4="$prompt_non_theme[4]"
-         RPS1="$prompt_non_theme[5]"
-         if [[ -z "$prompt_old_precmd" ]]; then
-           precmd () { }
-         else
-           eval "$prompt_old_precmd"
-         fi
-         if [[ -z "$prompt_old_preexec" ]]; then
-           preexec () { }
-         else
-           eval "$prompt_old_preexec"
-         fi
-       else
-         prompt_${prompt_theme[1]}_setup "${(@)prompt_theme[2,-1]}"
-       fi
        ;;
     s) print "Set and save not yet implemented.  Please ensure your ~/.zshrc"
        print "contains something similar to the following:\n"
@@ -150,8 +143,7 @@ Use prompt -h <theme> for help on specific themes.'
          print "$usage"
          return
        fi
-       prompt_$1_setup "$@[2,-1]"
-       prompt_theme=( "$@" )
+       prompt_$1_setup "$@[2,-1]" && prompt_theme=( "$@" )
 
        # Avoid screwing up the environment listing
        PSZZZZ=$reset_color
@@ -185,4 +177,4 @@ prompt_preview_theme () {
   print "command arg1 arg2 ... argn"
 }
 
-promptinit "$@"
+[[ -o kshautoload ]] || promptinit "$@"