return 1
}
+is437(){
+ [[ $ZSH_VERSION == 4.3.<7->* || $ZSH_VERSION == 4.<4->* \
+ || $ZSH_VERSION == <5->* ]] && return 0
+ return 1
+}
+
is439(){
[[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* \
|| $ZSH_VERSION == <5->* ]] && return 0
zrcautoload $rh
done; unset rh
+# command not found handling
+
+(( ${COMMAND_NOT_FOUND} == 1 )) &&
+function command_not_found_handler() {
+ emulate -L zsh
+ if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then
+ ${GRML_ZSH_CNF_HANDLER} $1
+ fi
+ return 1
+}
+
# completion system
if zrcautoload compinit ; then
compinit || print 'Notice: no compinit available :('
fi # is433
+# Prompt setup for grml:
+
+# set colors for use in prompts (modern zshs allow for the use of %F{red}foo%f
+# in prompts to get a red "foo" embedded, but it's good to keep these for
+# backwards compatibility).
+if zrcautoload colors && colors 2>/dev/null ; then
+ BLUE="%{${fg[blue]}%}"
+ RED="%{${fg_bold[red]}%}"
+ GREEN="%{${fg[green]}%}"
+ CYAN="%{${fg[cyan]}%}"
+ MAGENTA="%{${fg[magenta]}%}"
+ YELLOW="%{${fg[yellow]}%}"
+ WHITE="%{${fg[white]}%}"
+ NO_COLOR="%{${reset_color}%}"
+else
+ BLUE=$'%{\e[1;34m%}'
+ RED=$'%{\e[1;31m%}'
+ GREEN=$'%{\e[1;32m%}'
+ CYAN=$'%{\e[1;36m%}'
+ WHITE=$'%{\e[1;37m%}'
+ MAGENTA=$'%{\e[1;35m%}'
+ YELLOW=$'%{\e[1;33m%}'
+ NO_COLOR=$'%{\e[0m%}'
+fi
+
+# First, the easy ones: PS2..4:
+
+# secondary prompt, printed when the shell needs more information to complete a
+# command.
+PS2='\`%_> '
+# selection prompt used within a select loop.
+PS3='?# '
+# the execution trace prompt (setopt xtrace). default: '+%N:%i>'
+PS4='+%N:%i:%_> '
+
+# Some additional features to use with our prompt:
+#
+# - battery status
+# - debian_chroot
+# - vcs_info setup and version specific fixes
+
# display battery status on right side of prompt via running 'BATTERY=1 zsh'
if [[ $BATTERY -gt 0 ]] ; then
if ! check_com -c acpi ; then
fi
fi
}
-# set colors for use in prompts
-if zrcautoload colors && colors 2>/dev/null ; then
- BLUE="%{${fg[blue]}%}"
- RED="%{${fg_bold[red]}%}"
- GREEN="%{${fg[green]}%}"
- CYAN="%{${fg[cyan]}%}"
- MAGENTA="%{${fg[magenta]}%}"
- YELLOW="%{${fg[yellow]}%}"
- WHITE="%{${fg[white]}%}"
- NO_COLOR="%{${reset_color}%}"
-else
- BLUE=$'%{\e[1;34m%}'
- RED=$'%{\e[1;31m%}'
- GREEN=$'%{\e[1;32m%}'
- CYAN=$'%{\e[1;36m%}'
- WHITE=$'%{\e[1;37m%}'
- MAGENTA=$'%{\e[1;35m%}'
- YELLOW=$'%{\e[1;33m%}'
- NO_COLOR=$'%{\e[0m%}'
+
+# set variable debian_chroot if running in a chroot with /etc/debian_chroot
+if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
+ debian_chroot=$(</etc/debian_chroot)
fi
# gather version control information for inclusion in a prompt
zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b${RED}:${YELLOW}%r"
fi
-# command not found handling
+# Now for the fun part: The grml prompt themes in `promptsys' mode of operation
-(( ${COMMAND_NOT_FOUND} == 1 )) &&
-function command_not_found_handler() {
- emulate -L zsh
- if [[ -x ${GRML_ZSH_CNF_HANDLER} ]] ; then
- ${GRML_ZSH_CNF_HANDLER} $1
- fi
- return 1
-}
+# This actually defines three prompts:
+#
+# - grml
+# - grml-large
+# - grml-chroot
+#
+# They all share the same code and only differ with respect to which items they
+# contain. The main source of documentation is the `prompt_grml_help' function
+# below, which gets called when the user does this: prompt -h grml
function prompt_grml_help () {
cat <<__EOF0__
prompt grml
- This is the prompt as used by the grml-live system <http://grml.org>.
- It is a rather simple one-line prompt, that by default looks like this:
+ This is the prompt as used by the grml-live system <http://grml.org>. It is
+ a rather simple one-line prompt, that by default looks something like this:
<user>@<host> <current-working-directory>[ <vcs_info-data>]%
used before and after the actual item.
The available items are: rc, rc-always, change-root, user, at, host, path,
- vcs, percent, sad-smiley.
+ vcs, percent, sad-smiley, battery.
The actual configuration is done via zsh's \`zstyle' mechanism. The
context, that is used while looking up styles is:
- ':prompt:grml:<sub-context>'
-
- Here <sub-context> is either 'items:<item>' or 'setup'. The available
- styles in the \`setup' context are: use-rprompt, items. For example,
- default \`items' style could be configured like this:
+ ':prompt:grml:<left-or-right>:<subcontext>'
- zstyle ':prompt:grml:setup' items user at host path \\
- vcs percent
+ Here <left-or-right> is either \`left' or \`right', signifying whether the
+ style should affect the left or the right prompt. <subcontext> is either
+ \`setup' or 'items:<item>', where \`<item>' is one of the available items.
The styles:
- use-rprompt (boolean): If \`true' (the default), print a sad smiley
- in $RPROMPT if the last command a returned non-successful error
- code.
+ in $RPROMPT if the last command a returned non-successful error code.
+ (This in only valid if <left-or-right> is "right"; ignored otherwise)
- items (list): The list of items used in the prompt. If \`vcs' is
present in the list, the theme's code invokes \`vcs_info'
following would cause the user name to be printed in red instead of the
default blue:
- zstyle ':prompt:grml:items:user' pre '%F{red}'
+ zstyle ':prompt:grml:*:items:user' pre '%F{red}'
Note, that the \`post' style may remain at its default value, because its
default value is '%f', which turns the foreground text attribute off (which
__EOF0__
}
-function prompt_grml_setup () {
+function grml_prompt_setup () {
emulate -L zsh
autoload -Uz vcs_info
autoload -Uz add-zsh-hook
- add-zsh-hook precmd prompt_grml_precmd
+ add-zsh-hook precmd prompt_$1_precmd
+}
+
+function prompt_grml_setup () {
+ grml_prompt_setup grml
+}
+
+function prompt_grml-chroot_setup () {
+ grml_prompt_setup grml-chroot
+}
+
+function prompt_grml-large_setup () {
+ grml_prompt_setup grml-large
}
+# These maps define default tokens and pre-/post-decoration for items to be
+# used within the themes. All defaults may be customised in a context sensitive
+# matter by using zsh's `zstyle' mechanism.
typeset -gA grml_prompt_pre_default \
grml_prompt_post_default \
grml_prompt_token_default
vcs ''
percent ''
sad-smiley ''
+ battery ' '
+ newline ''
+ jobs '%F{cyan}'
+ history '%F{green}'
+ date '%F{blue}'
+ time '%F{blue}'
+ shell-level '%F{red}'
+ grml-chroot '%F{red}'
)
grml_prompt_post_default=(
change-root ''
user '%f%b'
at ''
- host ' '
- path ' %B'
+ host ''
+ path '%B'
vcs ''
- percent ' '
+ percent ''
sad-smiley ''
+ battery ''
+ newline ''
+ jobs '%f'
+ history '%f'
+ date '%f'
+ time '%f'
+ shell-level '%f'
+ grml-chroot '%f '
)
grml_prompt_token_default=(
change-root 'debian_chroot'
user '%n'
at '@'
- host '%m'
- path '%40<..<%~%<<'
+ host '%m '
+ path '%40<..<%~%<< '
vcs '0'
- percent '%%'
+ percent '%% '
sad-smiley '%(?..:()'
+ battery 'PERCENT'
+ newline $'\n'
+ jobs '[%j running job(s)] '
+ history '{history#%!} '
+ date '%D{%Y-%m-%d}'
+ time '%D{%H:%M:%S} '
+ shell-level '%(3L.+ .)'
+ grml-chroot 'GRML_CHROOT'
)
-function prompt_grml_precmd () {
+function grml_typeset_and_wrap () {
emulate -L zsh
- setopt extendedglob
- local it apre apost new v
+ local target="$1"
+ local new="$2"
+ local left="$3"
+ local right="$4"
+
+ if (( ${+parameters[$new]} )); then
+ typeset -g "${target}=${(P)target}${left}${(P)new}${right}"
+ fi
+}
+
+function grml_prompt_addto () {
+ emulate -L zsh
+ local target="$1"
+ local lr it apre apost new v
local -a items
+ shift
- zstyle -a ':prompt:grml:setup' items items \
- || items=( rc change-root user at host path vcs percent )
- PS1=''
+ [[ $target == PS1 ]] && lr=left || lr=right
+ zstyle -a ":prompt:${grmltheme}:${lr}:setup" items items || items=( "$@" )
+ typeset -g "${target}="
for it in "${items[@]}"; do
- zstyle -s ":prompt:grml:items:$it" pre apre \
+ zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" pre apre \
|| apre=${grml_prompt_pre_default[$it]}
- zstyle -s ":prompt:grml:items:$it" post apost \
+ zstyle -s ":prompt:grml:${grmltheme}:${lr}:$it" post apost \
|| apost=${grml_prompt_post_default[$it]}
- zstyle -s ":prompt:grml:items:$it" token new \
+ zstyle -s ":prompt:${grmltheme}:${lr}:items:$it" token new \
|| new=${grml_prompt_token_default[$it]}
- PS1="${PS1}${apre}"
+ typeset -g "${target}=${(P)target}${apre}"
case $it in
+ battery)
+ grml_typeset_and_wrap $target $new '' ''
+ ;;
change-root)
- (( ${+parameters[$new]} )) && PS1="${PS1}(${(P)new})"
+ grml_typeset_and_wrap $target $new '(' ')'
+ ;;
+ grml-chroot)
+ if [[ -n ${(P)new} ]]; then
+ typeset -g "${target}=${(P)target}(CHROOT)"
+ fi
;;
vcs)
v="vcs_info_msg_${new}_"
- vcs_info
+ if (( ! vcscalled )); then
+ vcs_info
+ vcscalled=1
+ fi
if (( ${+parameters[$v]} )) && [[ -n "${(P)v}" ]]; then
- PS1="${PS1}${(P)v}"
+ typeset -g "${target}=${(P)target}${(P)v}"
fi
;;
- *) PS1="${PS1}${new}" ;;
+ *) typeset -g "${target}=${(P)target}${new}" ;;
esac
- PS1="${PS1}${apost}"
+ typeset -g "${target}=${(P)target}${apost}"
done
- if zstyle -t ':prompt:grml:setup' use-rprompt; then
- zstyle -s ":prompt:grml:items:sad-smiley" token new \
- || new=${grml_prompt_token_default[sad-smiley]}
- RPS1="$new"
+}
+
+function prompt_grml_precmd () {
+ emulate -L zsh
+ local grmltheme=grml
+ local -a left_items right_items
+ left_items=(rc change-root user at host path vcs percent)
+ right_items=(sad-smiley)
+
+ prompt_grml_precmd_worker
+}
+
+function prompt_grml-chroot_precmd () {
+ emulate -L zsh
+ local grmltheme=grml-chroot
+ local -a left_items right_items
+ left_items=(grml-chroot user at host path percent)
+ right_items=()
+
+ prompt_grml_precmd_worker
+}
+
+function prompt_grml-large_precmd () {
+ emulate -L zsh
+ local grmltheme=grml-large
+ local -a left_items right_items
+ left_items=(rc jobs history shell-level change-root time date newline
+ user at host path vcs percent)
+ right_items=(sad-smiley)
+
+ prompt_grml_precmd_worker
+}
+
+function prompt_grml_precmd_worker () {
+ emulate -L zsh
+ local -i vcscalled=0
+
+ grml_prompt_addto PS1 "${left_items[@]}"
+ if zstyle -T ":prompt:${grmltheme}:right:setup" use-rprompt; then
+ grml_prompt_addto RPS1 "${right_items[@]}"
fi
}
-# set prompt
-if zrcautoload promptinit && promptinit 2>/dev/null ; then
- promptinit # people should be able to use their favourite prompt
+grml_prompt_fallback() {
+ setopt prompt_subst
+ precmd() {
+ (( ${+functions[vcs_info]} )) && vcs_info
+ }
+ p0="${RED}%(?..%? )${WHITE}${debian_chroot:+($debian_chroot)}"
+ p1="${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "'${vcs_info_msg_0_}'"%# "
+ if (( EUID == 0 )); then
+ PROMPT="${BLUE}${p0}${RED}${p1}"
+ else
+ PROMPT="${RED}${p0}${BLUE}${p1}"
+ fi
+ unset p0 p1
+}
+
+if zrcautoload promptinit && promptinit 2>/dev/null ; then
# Since we define the required functions in here and not in files in
# $fpath, we need to stick the theme's name into `$prompt_themes'
# ourselves, since promptinit does not pick them up otherwise.
- prompt_themes+=( grml )
+ prompt_themes+=( grml grml-chroot grml-large )
# Also, keep the array sorted...
prompt_themes=( "${(@on)prompt_themes}" )
else
print 'Notice: no promptinit available :('
+ grml_prompt_fallback
fi
-setopt prompt_subst
+if is437; then
+ # The prompt themes use modern features of zsh, that require at least
+ # version 4.3.7 of the shell. Use the fallback otherwise.
+ if [[ $BATTERY -gt 0 ]]; then
+ zstyle ':prompt:grml:right:setup' items sad-smiley battery
+ add-zsh-hook precmd battery
+ fi
+ if [[ "$TERM" == dumb ]] ; then
+ zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" pre ''
+ zstyle ":prompt:grml(|-large|-chroot):*:items:grml-chroot" post ' '
+ for i in rc user path jobs history date time shell-level; do
+ zstyle ":prompt:grml(|-large|-chroot):*:items:$i" pre ''
+ zstyle ":prompt:grml(|-large|-chroot):*:items:$i" post ''
+ done
+ unset i
+ zstyle ':prompt:grml(|-large|-chroot):right:setup' use-rprompt false
+ elif (( EUID == 0 )); then
+ zstyle ':prompt:grml(|-large|-chroot):*:items:user' pre '%F{red}'
+ fi
-# make sure to use right prompt only when not running a command
-is41 && setopt transient_rprompt
+ # Finally enable one of the prompts.
+ if [[ -n $GRML_CHROOT ]]; then
+ prompt grml-chroot
+ elif [[ $GRMLPROMPT -gt 0 ]]; then
+ prompt grml-large
+ else
+ prompt grml
+ fi
+else
+ grml_prompt_fallback
+fi
+# Terminal-title wizardry
function ESC_print () {
info_print $'\ek' $'\e\\' "$@"
add-zsh-hook precmd grml_vcs_to_screen_title
fi
-# TODO: revise all these NO* variables and especially their documentation
-# in zsh-help() below.
-is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
- # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
- if [[ ${DONTSETRPROMPT:-} -eq 0 ]] ; then
- if [[ $BATTERY -gt 0 ]] ; then
- # update battery (dropped into $PERCENT) information
- battery
- RPROMPT="%(?..:() ${PERCENT}"
- else
- RPROMPT="%(?..:() "
- fi
- fi
-}
-
# preexec() => a function running before every command
is4 && [[ $NOPRECMD -eq 0 ]] && \
preexec () {
esac
}
-EXITCODE="%(?..%?%1v )"
-# secondary prompt, printed when the shell needs more information to complete a
-# command.
-PS2='\`%_> '
-# selection prompt used within a select loop.
-PS3='?# '
-# the execution trace prompt (setopt xtrace). default: '+%N:%i>'
-PS4='+%N:%i:%_> '
-
-# set variable debian_chroot if running in a chroot with /etc/debian_chroot
-if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
- debian_chroot=$(cat /etc/debian_chroot)
-fi
-
-# don't use colors on dumb terminals (like emacs):
-if [[ "$TERM" == dumb ]] ; then
- PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "
-else
- # only if $GRMLPROMPT is set (e.g. via 'GRMLPROMPT=1 zsh') use the extended
- # prompt set variable identifying the chroot you work in (used in the
- # prompt below)
- if [[ $GRMLPROMPT -gt 0 ]] ; then
- PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
-${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "
- else
- # This assembles the primary prompt string
- if (( EUID != 0 )); then
- PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "
- else
- PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOR}@%m %40<...<%B%~%b%<< "
- fi
- fi
-fi
-
-PROMPT="${PROMPT}"'${vcs_info_msg_0_}'"%# "
-
-# if we are inside a grml-chroot set a specific prompt theme
-if [[ -n "$GRML_CHROOT" ]] ; then
- PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
-fi
-
# 'hash' some often used directories
#d# start
hash -d deb=/var/cache/apt/archives