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