mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-22 16:20:23 +02:00
Initial revision
This commit is contained in:
parent
b41868cf7b
commit
44cff5e0ea
1 changed files with 153 additions and 0 deletions
153
Functions/Prompts/prompt_bart_setup
Normal file
153
Functions/Prompts/prompt_bart_setup
Normal file
|
@ -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 "$@"
|
Loading…
Add table
Add a link
Reference in a new issue