mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-23 04:30:24 +02:00
11866: More ANSI color stuff; preserve more state during prompt previewing.
This commit is contained in:
parent
bae526275a
commit
21f6b9d14c
3 changed files with 195 additions and 95 deletions
|
@ -1,27 +1,32 @@
|
|||
# zsh prompt themes extension
|
||||
#
|
||||
# Load with `autoload -U promptinit; promptinit'.
|
||||
##
|
||||
## zsh prompt themes extension
|
||||
## by Adam Spiers <adam@spiers.net>
|
||||
##
|
||||
## Load with `autoload -U promptinit; promptinit'.
|
||||
## Type `prompt -h' for help.
|
||||
##
|
||||
|
||||
prompt_themes=()
|
||||
typeset -gU prompt_themes
|
||||
typeset -g prompt_theme
|
||||
typeset -g prompt_theme >/dev/null
|
||||
|
||||
promptinit () {
|
||||
emulate -L zsh
|
||||
local ppath='' name
|
||||
setopt extendedglob
|
||||
local ppath='' name theme
|
||||
|
||||
# Autoload all prompt_*_setup functions in fpath
|
||||
for theme in $fpath/prompt_*_setup(N); do
|
||||
for theme in $^fpath/prompt_*_setup(N); do
|
||||
if [[ $theme == */prompt_(#b)(*)_setup ]]; then
|
||||
name="$match[1]"
|
||||
if [[ -r "$theme" ]]; then
|
||||
prompt_themes=($name $prompt_themes)
|
||||
prompt_themes=($prompt_themes $name)
|
||||
autoload -U prompt_${name}_setup
|
||||
else
|
||||
print "Couldn't find theme $theme"
|
||||
print "Couldn't read file $theme containing theme $name."
|
||||
fi
|
||||
else
|
||||
print "eh?"
|
||||
print "Eh? Mismatch between glob patterns in promptinit."
|
||||
fi
|
||||
done
|
||||
|
||||
|
@ -30,29 +35,86 @@ promptinit () {
|
|||
colors
|
||||
|
||||
# Variables common to all prompt styles
|
||||
prompt_newline=$(echo -ne "\n%{\r%}")
|
||||
prompt_newline=$'\n%{\r%}'
|
||||
}
|
||||
|
||||
prompt () {
|
||||
prompt_preview_safely() {
|
||||
print $reset_color
|
||||
if [[ -z "$prompt_themes[(r)$1]" ]]; then
|
||||
print "Unknown theme: $1"
|
||||
return
|
||||
fi
|
||||
|
||||
local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
|
||||
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
|
||||
trap "${$(functions precmd):-:} ; ${$(functions preexec):-:}" 0
|
||||
|
||||
# The next line is a bit ugly. It (perhaps unnecessarily)
|
||||
# runs the prompt theme setup function to ensure that if
|
||||
# the theme has a _preview function that it's been autoloaded.
|
||||
prompt_${1}_setup
|
||||
|
||||
if typeset +f prompt_${1}_preview >&/dev/null; then
|
||||
prompt_${1}_preview "$@[2,-1]"
|
||||
else
|
||||
prompt_preview_theme "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
set_prompt() {
|
||||
emulate -L zsh
|
||||
local opt preview theme usage old_theme
|
||||
|
||||
usage='Usage: prompt <options>
|
||||
Options:
|
||||
-c Show currently selected theme and parameters
|
||||
-l List currently available prompt themes
|
||||
-p [<themes>] Preview given themes (defaults to all)
|
||||
-h [<theme>] Display help (for given theme)
|
||||
-s <theme> Set and save theme
|
||||
<theme> Switch to new theme immediately (changes not saved)'
|
||||
<theme> Switch to new theme immediately (changes not saved)
|
||||
|
||||
getopts "hlps" opt
|
||||
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 -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
|
||||
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"
|
||||
print " is:\n $prompt_theme"
|
||||
else
|
||||
print "Current prompt is not a theme."
|
||||
fi
|
||||
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"
|
||||
print "Help for $2 theme:\n"
|
||||
prompt_$2_help
|
||||
else
|
||||
print "No help available for $2 theme"
|
||||
print "No help available for $2 theme."
|
||||
fi
|
||||
print "\nType \`prompt -p $2' to preview the theme, \`prompt $2'"
|
||||
print "to try it out, and \`prompt -s $2' to use it in future sessions."
|
||||
else
|
||||
print "$usage"
|
||||
fi
|
||||
|
@ -61,24 +123,13 @@ Options:
|
|||
print $prompt_themes
|
||||
return
|
||||
;;
|
||||
p) if (( ! $+prompt_theme )); then
|
||||
print "Cannot preview; current prompt is non-themeable and would"
|
||||
print "be destroyed."
|
||||
return
|
||||
fi
|
||||
preview=( $prompt_themes )
|
||||
[[ -n "$2" && -n $prompt_themes[(r)$2] ]] && preview=( $*[2,-1] )
|
||||
p) preview=( $prompt_themes )
|
||||
(( $#* > 1 )) && preview=( "$@[2,-1]" )
|
||||
for theme in $preview; do
|
||||
[[ $theme == $prompt_theme[1] ]] && continue
|
||||
print "\nTheme: $theme"
|
||||
prompt_${theme}_setup
|
||||
precmd
|
||||
print -n -P "${PS1}"
|
||||
preexec
|
||||
print "command arg1 arg2 ... argn"
|
||||
[[ "$theme" == "$prompt_theme[*]" ]] && continue
|
||||
prompt_preview_safely "$=theme"
|
||||
done
|
||||
print
|
||||
prompt_${prompt_theme}_setup
|
||||
print $reset_color
|
||||
;;
|
||||
s) print "Set and save not yet implemented. Please ensure your ~/.zshrc"
|
||||
print "contains something similar to the following:\n"
|
||||
|
@ -86,12 +137,21 @@ Options:
|
|||
print " promptinit"
|
||||
print " prompt $*[2,-1]"
|
||||
;;
|
||||
*) if [[ -z "$1" || -z $prompt_themes[(r)$1] ]]; then
|
||||
*) if [[ "$1" == 'random' ]]; then
|
||||
local random_themes
|
||||
if (( $#* == 1 )); then
|
||||
random_themes=( $prompt_themes )
|
||||
else
|
||||
random_themes=( "$@[2,-1]" )
|
||||
fi
|
||||
local i=$(( ( $RANDOM % $#random_themes ) + 1 ))
|
||||
argv=( "${=random_themes[$i]}" )
|
||||
fi
|
||||
if [[ -z "$1" || -z $prompt_themes[(r)$1] ]]; then
|
||||
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
|
||||
|
@ -103,5 +163,29 @@ Options:
|
|||
esac
|
||||
}
|
||||
|
||||
promptinit "$@"
|
||||
prompt () {
|
||||
local prompt_opts
|
||||
|
||||
set_prompt "$@"
|
||||
|
||||
(( $#prompt_opts )) &&
|
||||
setopt noprompt{bang,cr,percent,subst} prompt${^prompt_opts[@]}
|
||||
|
||||
true
|
||||
}
|
||||
|
||||
prompt_preview_theme () {
|
||||
local -a psv; psv=($psvar); local -a +h psvar; psvar=($psv) # Ick
|
||||
local +h PS1=$PS1 PS2=$PS2 PS3=$PS3 PS4=$PS4 RPS1=$RPS1
|
||||
trap "${$(functions precmd):-:} ; ${$(functions preexec):-:}" 0
|
||||
|
||||
print -n "$1 theme"
|
||||
(( $#* > 1 )) && print -n " with parameters \`$*[2,-1]'"
|
||||
print ":"
|
||||
prompt_${1}_setup "$@[2,-1]"
|
||||
precmd
|
||||
print -P "${PS1}command arg1 arg2 ... argn"
|
||||
preexec
|
||||
}
|
||||
|
||||
[[ -o kshautoload ]] || promptinit "$@"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue