summaryrefslogtreecommitdiff
path: root/Functions/Prompts/prompt_bart_setup
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Prompts/prompt_bart_setup')
-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 "$@"