diff options
Diffstat (limited to 'Functions')
-rw-r--r-- | Functions/Prompts/prompt_bart_setup | 153 |
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 "$@" |