X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=61411712dac77bdc8c5b25e5ae9c93a15841aa39;hb=refs%2Ftags%2F0.3.57;hp=6488a513243bc18783861c288f1f38e9104a2767;hpb=f0e18fbd58fa624ba949a775260fd5e1b180e479;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 6488a51..6141171 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -109,6 +109,11 @@ is42(){ return 1 } +is425(){ + [[ $ZSH_VERSION == 4.2.<5->* || $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0 + return 1 +} + is43(){ [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0 return 1 @@ -1037,73 +1042,162 @@ fi # vcs_info() documentation: {{{ # -# The vcs_info () feature can be configured via zstyle: +# This functionality requires zsh version >= 4.1.*. +# To load vcs_info(), copy this file to your $fpath[] and do: +# % autoload -Uz vcs_info && vcs_info +# +# The vcs_info() feature can be configured via zstyle: # First, the context in which we are working: -# :vcs_info: -# ...where is one of: git, hg, bzr, svn or svk +# :vcs_info:: +# ...where is one of: +# - git, git-svn, hg, darcs, bzr, mtn, svn, cvs or svk +# ...and is a freely configurable string, assignable +# by the user as the first argument to vcs_info(). +# +# There is one special value for named 'init', that +# is in effect as long as there was no decision what vcs backend to use. +# +# There are two pre-defined values for : +# default - the one used if none is specified +# command - used by vcs_info_lastmsg to lookup its styles. +# You may *not* use 'print_systems_' as a user-context string, +# because it is used internally. # -# You can of course use ':vcs_info:*' to match all VCSs at once. +# You can of course use ':vcs_info:*' to match all VCSs in all +# user-contexts at once. # -# There is one special context named 'init', that is in effect as long -# as there was no decision what vcs backend to use. +# Another special context is 'formats', it is used by the +# vcs_info_lastmsg() utility function (see below). # -# There are currently two styles, that are looked up: -# promptformat - Used in most circumstances. -# promptactionformat - Used if a there is a special action going on; +# +# This is a description of all styles, that are looked up: +# format - Used in most circumstances. +# actionformat - Used if a there is a special action going on; # (like an interactive rebase or a merge conflict) -# enable - check in the 'init' context. If set to false, +# branchformat - Some backends replace %b in the format and +# actionformat styles above, not only by a branch +# name but also by a revision number. This style +# let's you modify how that string should look like. +# enable - Check in the 'init' context. If set to false, # vcs_info() will do nothing. -# disable - provide a list of systems, you don't want -# the prompt to check for repositories (checked -# in the 'init' context, too). +# disable - Provide a list of systems, you don't want +# the vcs_info() to check for repositories +# (checked in the 'init' context, too). +# use-simple - If there are two different ways of gathering +# information, you can select the simpler one +# by setting this style to true; the default +# is to use the not-that-simple code, which is +# potentially a lot slower but might be more +# accurate in all possible cases. +# use-prompt-escapes - determines if we assume that the assembled +# string from vcs_info() includes prompt escapes. +# (Used by vcs_info_lastmsg(). +# +# The use-simple style is currently only available for the bzr backend. # # The default values for these in all contexts are: -# promptformat " (%s)-[%b|%a]-" -# promptactionformat " (%s)-[%b]-" +# format " (%s)-[%b|%a]-" +# actionformat " (%s)-[%b]-" +# branchformat "%b:%r" (for bzr, svn and svk) # enable true +# disable (empty list) +# use-simple false +# use-prompt-escapes true +# # -# In these formats, the following replacements are done: +# In format and actionformat, the following replacements are done: # %s - The vcs in use (git, hg, svn etc.) # %b - Information about the current branch. # %a - An identifier, that describes the action. -# Only makes sense in promptactionformat. +# Only makes sense in actionformat. # %R - base directory of the repository. # %r - repository name # If %R is '/foo/bar/repoXY', %r is 'repoXY'. # -# Not all vcs backends may support all replacements +# +# In branchformat these replacements are done: +# %b - the branch name +# %r - the current revision number +# +# Not all vcs backends have to support all replacements. +# +# +# Function descriptions: +# vcs_info() +# The main function, that runs all backends and assembles +# all data into ${VCS_INFO_message_}. This is the function +# you want to call from precmd() if you want to include +# up-to-date information in your prompt (see Variable +# description, too if you are interested in this). +# +# vcs_info_printsys() +# Prints a list of all supported version control systems. +# Useful to find out possible contexts or values for the +# 'disable' style. +# +# vcs_info_lastmsg() +# Outputs the last ${VCS_INFO_message_} value. Takes into account +# the value of the use-prompt-escapes style in ':vcs_info:formats'. +# +# +# Variable description: +# ${VCS_INFO_message_} (Note the trailing underscore) +# This is the storage for the message the last vcs_info() +# call has assembled. +# # # Examples: # Don't use vcs_info at all (even though it's in your prompt): # % zstyle ':vcs_info:*' enable false # -# Don't provide prompt info for bzr and svk: +# Disable the backends for bzr and svk: # % zstyle ':vcs_info:*' disable bzr svk # -# Provide a prompt specifically for git: -# % zstyle ':vcs_info:git' promptformat ' GIT, BABY! [%b]' -# % zstyle ':vcs_info:git' promptactionformat ' GIT ACTION! [%b|%a]' +# Provide a special format for git: +# % zstyle ':vcs_info:*:git' format ' GIT, BABY! [%b]' +# % zstyle ':vcs_info:*:git' actionformat ' GIT ACTION! [%b|%a]' +# +# Use the quicker bzr backend (if you do, please report if it does +# the-right-thing[tm] - thanks): +# % zstyle ':vcs_info:*:bzr' use-simple true +# +# Display the revision number in yellow for bzr and svn: +# % zstyle ':vcs_info:*:(svn|bzr)' branchformat '%b%{'${fg[yellow]}'%}:%r' +# +# If you want colors, make sure you enclose the color codes in %{...%}, +# if you want to use the string provided by vcs_info() in prompts. +# +# Here is an example of how to include vcs_info in PS1 (*requires* +# 'setopt prompt_subst'): +# +# PS1='%(?..[%?]-)%3~%${VCS_INFO_message_}#' +# precmd () { vcs_info; } # -# If you want colors, make sure you enclose the color codes in %{...%}, because -# the string provided by vcs_info() is used for prompts. +# Here is how to print the vcs infomation as a command: +# alias vcsi='vcs_info command; vcs_info_lastmsg' # -# Example: PROMPT='%(?..[%?]-)%3~%$(vcs_info)#' +# This way, you can even define different formats for output via +# vcs_info_lastmsg() in the ':vcs_info:command:*' namespace. # -# This *requires* 'setopt prompt_subst'. # }}} VCS_INFO_adjust () { #{{{ [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]} return 0 } # }}} +VCS_INFO_check_com () { #{{{ + (( ${+commands[$1]} )) && [[ -x ${commands[$1]} ]] && return 0 + return 1 +} +# }}} VCS_INFO_format () { # {{{ local msg if [[ -n ${1} ]] ; then - zstyle -s ":vcs_info:${vcs}" promptactionformat msg + zstyle -s ":vcs_info:${usercontext}:${vcs}" actionformat msg [[ -z ${msg} ]] && msg=' (%s)-[%b|%a]-' else - zstyle -s ":vcs_info:${vcs}" promptformat msg + zstyle -s ":vcs_info:${usercontext}:${vcs}" format msg [[ -z ${msg} ]] && msg=' (%s)-[%b]-' fi printf '%s' ${msg} @@ -1111,13 +1205,14 @@ VCS_INFO_format () { # {{{ # }}} VCS_INFO_realpath () { #{{{ # replacing 'readlink -f', which is really not portable. - - # If there *is* a chpwd() function unfunction it here. - # The *real* zsh does not loose its chpwd(), because we run - # in a different context (process substitution in $PROMPT). - (( ${+functions[chpwd]} )) && unfunction chpwd - setopt chaselinks - cd $1 2>/dev/null && pwd + # forcing a subshell, to ensure chpwd() is not removed + # from the calling shell (if VCS_INFO_realpath() is called + # manually). + ( + (( ${+functions[chpwd]} )) && unfunction chpwd + setopt chaselinks + cd $1 2>/dev/null && pwd + ) } # }}} VCS_INFO_git_getaction () { #{{{ @@ -1222,6 +1317,15 @@ VCS_INFO_git_get_data () { # {{{ printf '%s' ${msg} } # }}} +VCS_INFO_darcs_get_data () { # {{{ + local msg darcsbase + + darcsbase=${vcs_comm[basedir]} + msg=$(VCS_INFO_format) + zformat -f msg "${msg}" "a:" "b:${darcsbase:t}" "s:${vcs}" "r:${darcsbase:t}" "R:${darcsbase}" + printf '%s' ${msg} +} +# }}} VCS_INFO_hg_get_data () { # {{{ local msg hgbranch hgbase @@ -1232,14 +1336,23 @@ VCS_INFO_hg_get_data () { # {{{ printf '%s' ${msg} } # }}} +VCS_INFO_mtn_get_data () { # {{{ + local msg mtnbranch mtnbase + + mtnbase=${vcs_comm[basedir]} + mtnbranch=$(mtn status | awk '/Current branch:/{ sub("Current branch: ", ""); print }') + msg=$(VCS_INFO_format) + zformat -f msg "${msg}" "a:" "b:${mtnbranch}" "s:${vcs}" "r:${mtnbase:t}" "R:${mtnbase}" + printf '%s' ${msg} +} +# }}} VCS_INFO_svk_get_data () { # {{{ local msg svkbranch svkbase svkbase=${vcs_comm[basedir]} - svkbranch=${svkbase##* - } - svkbase=${svkbase%% - *} + + zstyle -s ":vcs_info:${usercontext}:${vcs}" branchformat svkbranch || svkbranch="%b:%r" + zformat -f svkbranch "${svkbranch}" "b:${vcs_comm[branch]}" "r:${vcs_comm[revision]}" msg=$(VCS_INFO_format) zformat -f msg "${msg}" "a:" "b:${svkbranch}" "s:${vcs}" "r:${svkbase:t}" "R:${svkbase}" @@ -1247,14 +1360,19 @@ VCS_INFO_svk_get_data () { # {{{ } # }}} VCS_INFO_svn_get_data () { # {{{ - local msg svnbranch svnbase + setopt localoptions noksharrays + local msg svnbase svnbranch + local -a svninfo svnbase="." while [[ -d "${svnbase}/../.svn" ]]; do svnbase="${svnbase}/.." done svnbase=$(VCS_INFO_realpath ${svnbase}) - svnbranch=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }') + svninfo=($(svn info "${svnbase}" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r"\n"$0 }')) + + zstyle -s ":vcs_info:${usercontext}:${vcs}" branchformat svnbranch || svnbranch="%b:%r" + zformat -f svnbranch "${svnbranch}" "b:${svninfo[1]}" "r:${svninfo[2]}" msg=$(VCS_INFO_format) zformat -f msg "${msg}" "a:" "b:${svnbranch}" "s:${vcs}" "r:${svnbase:t}" "R:${svnbase}" @@ -1262,24 +1380,52 @@ VCS_INFO_svn_get_data () { # {{{ } # }}} VCS_INFO_bzr_get_data () { # {{{ - local msg bzrbranch bzrbase bzrrevno i j + local msg bzrbranch bzrbase bzrrevno bzrbr i j + + if zstyle -t ":vcs_info:${usercontext}:${vcs}" "use-simple" ; then + bzrbase=${vcs_comm[basedir]} + bzrbranch=${bzrbase:t} + if [[ -f ${bzrbase}/.bzr/branch/last-revision ]] ; then + bzrrevno=$(< ${bzrbase}/.bzr/branch/last-revision) + bzrrevno=${bzrrevno%% *} + fi + else + bzrbase=$(bzr info 2>/dev/null | sed -rne 's, *branch root: ,,p') + bzrbase=$(VCS_INFO_realpath ${bzrbase}) + + bzr version-info 2> /dev/null | while read i j; do + case "${i}" in + revno:) + bzrrevno=${j} ;; + branch-nick:) + bzrbranch=${j} ;; + esac + done + fi - bzrbase=$(bzr info | sed -rne 's, *branch root: ,,p') - case ${bzrbase} in - .) bzrbase=${PWD} ;; - esac + zstyle -s ":vcs_info:${usercontext}:${vcs}" branchformat bzrbr || bzrbr="%b:%r" + zformat -f bzrbr "${bzrbr}" "b:${bzrbranch}" "r:${bzrrevno}" - bzr version-info | while read i j; do - case "${i}" in - revno:) - bzrrevno=${j} ;; - branch-nick:) - bzrbranch=${j} ;; - esac + msg=$(VCS_INFO_format) + zformat -f msg "${msg}" "a:" "b:${bzrbr}" "s:${vcs}" "r:${bzrbase:t}" "R:${bzrbase}" + printf '%s' ${msg} +} +# }}} +VCS_INFO_cvs_get_data () { # {{{ + local msg cvsbranch cvsbase basename + + cvsbase="." + while [[ -d "${cvsbase}/../CVS" ]]; do + cvsbase="${cvsbase}/.." done + cvsbase=$(VCS_INFO_realpath ${cvsbase}) + cvsbranch=$(< ./CVS/Repository) + basename=${cvsbase:t} + cvsbranch=${cvsbranch##${basename}/} + [[ -z ${cvsbranch} ]] && cvsbranch=${basename} msg=$(VCS_INFO_format) - zformat -f msg "${msg}" "a:" "b:${bzrbranch}:${bzrrevno}" "s:${vcs}" "r:${bzrbase:t}" "R:${bzrbase}" + zformat -f msg "${msg}" "a:" "b:${cvsbranch}" "s:${vcs}" "r:${basename}" "R:${cvsbase}" printf '%s' ${msg} } # }}} @@ -1309,13 +1455,27 @@ VCS_INFO_detect_by_dir() { } VCS_INFO_bzr_detect() { - check_com -c bzr || return 1 + VCS_INFO_check_com bzr || return 1 + vcs_comm[detect_need_file]=branch/format VCS_INFO_detect_by_dir '.bzr' return $? } +VCS_INFO_cvs_detect() { + VCS_INFO_check_com svn || return 1 + [[ -d "CVS" ]] && return 0 + return 1 +} + +VCS_INFO_darcs_detect() { + VCS_INFO_check_com darcs || return 1 + vcs_comm[detect_need_file]=format + VCS_INFO_detect_by_dir '_darcs' + return $? +} + VCS_INFO_git_detect() { - if check_com -c git && git rev-parse --is-inside-work-tree &> /dev/null ; then + if VCS_INFO_check_com git && git rev-parse --is-inside-work-tree &> /dev/null ; then vcs_comm[gitdir]="$(git rev-parse --git-dir 2> /dev/null)" || return 1 [[ -d ${vcs_comm[gitdir]}/svn ]] && vcs_comm[overwrite_name]='git-svn' return 0 @@ -1324,43 +1484,102 @@ VCS_INFO_git_detect() { } VCS_INFO_hg_detect() { - check_com -c hg || return 1 + VCS_INFO_check_com hg || return 1 vcs_comm[detect_need_file]=branch VCS_INFO_detect_by_dir '.hg' return $? } +VCS_INFO_mtn_detect() { + VCS_INFO_check_com mtn || return 1 + vcs_comm[detect_need_file]=revision + VCS_INFO_detect_by_dir '_MTN' + return $? +} + VCS_INFO_svk_detect() { - local basedir + setopt localoptions noksharrays + local -a info - check_com -c svk || return 1 + VCS_INFO_check_com svk || return 1 [[ -f ~/.svk/config ]] || return 1 - basedir=$(awk '/: *$/ { sub(/^ */,"",$0); sub(/: *$/,"",$0); if (match("'${PWD}'", $0"(/|$)")) { print $0; d=1; } } /depotpath/ && d == 1 { sub(".*/","",$0); r=$0 } /revision/ && d == 1 { print r ":" $2; exit 1 }' ~/.svk/config) && return 1 - - vcs_comm[basedir]=${basedir} + info=( + $(awk ' + /: *$/ { + sub(/^ */,"",$0); + sub(/: *$/,"",$0); + if (match("'${PWD}'", $0"(/|$)")) { + print $0; d=1; + } + } + /depotpath/ && d == 1 { + sub(".*/","",$0); + r=$0 + } + /revision/ && d == 1 { + print r "\n" $2; + exit 1 + }' ~/.svk/config + ) + ) && return 1 + + vcs_comm[basedir]=${info[1]} + vcs_comm[branch]=${info[2]} + vcs_comm[revision]=${info[3]} return 0 } VCS_INFO_svn_detect() { - check_com -c svn || return 1 + VCS_INFO_check_com svn || return 1 [[ -d ".svn" ]] && return 0 return 1 } # }}} +vcs_info_printsys () { # {{{ + vcs_info print_systems_ +} +# }}} +vcs_info_lastmsg () { # {{{ + if zstyle -T ':vcs_info:command:formats' use-prompt-escapes ; then + print -P ${VCS_INFO_message_} + else + print ${VCS_INFO_message_} + fi +} +# }}} vcs_info () { # {{{ + setopt localoptions #xtrace local string local -i found local -a VCSs disabled - local -x vcs + local -x vcs usercontext local -Ax vcs_comm - vcs="init" - zstyle -T ":vcs_info:${vcs}" "enable" || return 0 - zstyle -a ":vcs_info:${vcs}" "disable" disabled + VCSs=(git hg bzr darcs mtn svn cvs svk) + case ${1} in + (print_systems_) + print -l ${VCSs} + # and the special flavours + print -l '# flavours (cannot be used in the disable style; they' \ + '# are disabled with their master [git-svn -> git]):' \ + 'git-svn' + return 0 + ;; + ('') + [[ -t ${usercontext} ]] && usercontext=default + ;; + (*) [[ -t ${usercontext} ]] && usercontext=${1} + ;; + esac - VCSs=(git hg bzr svn svk) + vcs="init" + zstyle -T ":vcs_info:${usercontext}:${vcs}" "enable" || { + typeset -gx VCS_INFO_message_='' + return 0 + } + zstyle -a ":vcs_info:${usercontext}:${vcs}" "disable" disabled (( found = 0 )) for vcs in ${VCSs} ; do @@ -1369,22 +1588,32 @@ vcs_info () { # {{{ VCS_INFO_${vcs}_detect && (( found = 1 )) && break done - (( found == 0 )) && return 0 + (( found == 0 )) && { + typeset -gx VCS_INFO_message_='' + return 0 + } + + string=$(VCS_INFO_${vcs}_get_data) || { + typeset -gx VCS_INFO_message_='' + return 1 + } - string=$(VCS_INFO_${vcs}_get_data) || return 1 - printf '%s' ${string} + typeset -gx VCS_INFO_message_=${string} return 0 } + +typeset -gx VCS_INFO_message_='' # }}} # change vcs_info formats for the grml prompt if [[ "$TERM" == dumb ]] ; then - zstyle ':vcs_info:*' promptactionformat "(%s%)-[%b|%a] " - zstyle ':vcs_info:*' promptformat "(%s%)-[%b] " + zstyle ':vcs_info:*' actionformat "(%s%)-[%b|%a] " + zstyle ':vcs_info:*' format "(%s%)-[%b] " else # these are the same, just with a lot of colours: - zstyle ':vcs_info:*' promptactionformat "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} " - zstyle ':vcs_info:*' promptformat "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} " + zstyle ':vcs_info:*' actionformat "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${YELLOW}|${RED}%a${MAGENTA}]${NO_COLOUR} " + zstyle ':vcs_info:*' format "${MAGENTA}(${NO_COLOUR}%s${MAGENTA})${YELLOW}-${MAGENTA}[${GREEN}%b${MAGENTA}]${NO_COLOUR}%} " + zstyle ':vcs_info:(sv[nk]|bzr)' branchformat "%b${YELLOW}:%r" fi # }}} @@ -1398,19 +1627,17 @@ fi setopt prompt_subst -# precmd() => a function which is executed just before each prompt -# use 'NOPRECMD=1' to disable the precmd + preexec commands - -# precmd () { setopt promptsubst; [[ -o interactive ]] && jobs -l; - # make sure to use right prompt only when not running a command is41 && setopt transient_rprompt is4 && [[ -z $NOPRECMD ]] && precmd () { [[ -n $NOPRECMD ]] && return 0 + # update VCS information + vcs_info + # allow manual overwriting of RPROMPT if [[ -n $RPROMPT ]] ; then - [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\' + [[ $TERM == screen* ]] && print -nP "\ekzsh\e\\" # return 0 fi # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT @@ -1432,8 +1659,6 @@ is4 && [[ -z $NOPRECMD ]] && precmd () { esac } -# chpwd () => a function which is executed whenever the directory is changed - # preexec() => a function running before every command is4 && [[ -z $NOPRECMD ]] && \ preexec () { @@ -1464,7 +1689,7 @@ preexec () { } EXITCODE="%(?..%?%1v )" -PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command. +PS2='\`%_> ' # secondary prompt, printed when the shell needs more information to complete a command. PS3='?# ' # selection prompt used within a select loop. PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>' @@ -1475,7 +1700,7 @@ 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%<< "'$(vcs_info)'"%# " + PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_}'"%# " 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) @@ -1485,9 +1710,9 @@ ${BLUE}%n${NO_COLOUR}@%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_COLOUR}@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# " + PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_}'"%# " else - PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# " + PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'${VCS_INFO_message_}'"%# " fi fi fi @@ -1778,7 +2003,7 @@ fi # {{{ Use hard limits, except for a smaller stack and no core dumps unlimit -is4 && limit stack 8192 +is425 && limit stack 8192 isgrmlcd && limit core 0 # important for a live-cd-system limit -s # }}}