X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=aecf3d9b13deca17217d67e98fc673f63b956db8;hb=a0594fc0b671d5dabc0eda312a86ebc3ea0b7094;hp=bcddaf6f802bde96f410cf2889ab313666480ac4;hpb=e22f2e742b2db38f890cc445732d278378a611e4;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index bcddaf6..aecf3d9 100644 --- a/etc/zsh/zshrc +++ b/etc/zsh/zshrc @@ -3,7 +3,7 @@ # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Sam Dez 22 19:17:27 CET 2007 [mika] +# Latest change: Wed Aug 06 23:50:53 CEST 2008 [mika] ################################################################################ # This file is sourced only for interactive shells. It # should contain commands to set up aliases, functions, @@ -92,6 +92,99 @@ if [[ -n $ZSH_PROFILE_RC ]] ; then fi # }}} +# {{{ check for version/system +# check for versions (compatibility reasons) +is4(){ + [[ $ZSH_VERSION == <4->* ]] && return 0 + return 1 +} + +is41(){ + [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0 + return 1 +} + +is42(){ + [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0 + return 1 +} + +is43(){ + [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0 + return 1 +} + +#f1# Checks whether or not you're running grml +isgrml(){ + [[ -f /etc/grml_version ]] && return 0 + return 1 +} + +#f1# Checks whether or not you're running a grml cd +isgrmlcd(){ + [[ -f /etc/grml_cd ]] && return 0 + return 1 +} + +if isgrml ; then +#f1# Checks whether or not you're running grml-small + isgrmlsmall() { + [[ ${${${(f)"$( autologin +# Thanks go to Bart Schaefer! +isgrml && checkhome() { + if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then + export ALREADY_DID_CD_HOME=$HOME + cd + fi +} + +# check for zsh v3.1.7+ + +if ! [[ ${ZSH_VERSION} == 3.1.<7->* \ + || ${ZSH_VERSION} == 3.<2->.<->* \ + || ${ZSH_VERSION} == <4->.<->* ]] ; then + + printf '-!-\n' + printf '-!- In this configuration we try to make use of features, that only\n' + printf '-!- require version 3.1.7 of the shell; That way this setup can be\n' + printf '-!- used with a wide range of zsh versions, while using fairly\n' + printf '-!- advanced features in all supported versions.\n' + printf '-!-\n' + printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION" + printf '-!-\n' + printf '-!- While this *may* work, it might as well fail.\n' + printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n' + printf '-!-\n' + printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n' + printf '-!- If it does today, you'\''ve been lucky.\n' + printf '-!-\n' + printf '-!- Ye been warned!\n' + printf '-!-\n' + + function zstyle() { : } +fi + +# }}} + # utility functions {{{ # this function checks if a command exists and returns either true # or false. This avoids using 'which' and 'whence', which will @@ -165,6 +258,29 @@ salias() { return 0 } +# a "print -l ${(u)foo}"-workaround for pre-4.2.0 shells +# usage: uprint foo +# Where foo is the *name* of the parameter you want printed. +# Note that foo is no typo; $foo would be wrong here! +if ! is42 ; then + uprint () { + local -a u + local w + local parameter=${1} + + if [[ -z ${parameter} ]] ; then + printf 'usage: uprint \n' + return 1 + fi + + for w in ${(P)parameter} ; do + [[ -z ${(M)u:#${w}} ]] && u=( ${u} ${w} ) + done + + builtin print -l ${u} + } +fi + # Check if we can read given files and source those we can. xsource() { if (( ${#argv} < 1 )) ; then @@ -194,7 +310,7 @@ xcat() { # setup files. This should be called at the end of .zshrc. xunfunction() { local -a funcs - funcs=(check_com salias xcat xsource xunfunction zrcautoload) + funcs=(salias xcat xsource xunfunction zrcautoload) for func in $funcs ; do [[ -n ${functions[$func]} ]] \ @@ -226,9 +342,17 @@ function zrcautoload() { #}}} +# Load is-at-least() for more precise version checks {{{ + +# Note that this test will *always* fail, if the is-at-least +# function could not be marked for autoloading. +zrcautoload is-at-least || is-at-least() { return 1 } + +# }}} + # locale setup {{{ if [[ -z "$LANG" ]] ; then - xsource "/etc/default/locale" + xsource "/etc/default/locale" fi export LANG=${LANG:-en_US.iso885915} @@ -267,104 +391,6 @@ fi unset xof # }}} -# {{{ check for version/system -# check for versions (compatibility reasons) -is4(){ - [[ $ZSH_VERSION == <4->* ]] && return 0 - return 1 -} - -is41(){ - [[ $ZSH_VERSION == 4.<1->* || $ZSH_VERSION == <5->* ]] && return 0 - return 1 -} - -is42(){ - [[ $ZSH_VERSION == 4.<2->* || $ZSH_VERSION == <5->* ]] && return 0 - return 1 -} - -is43(){ - [[ $ZSH_VERSION == 4.<3->* || $ZSH_VERSION == <5->* ]] && return 0 - return 1 -} - -# Use is-at-least, if you need to check more precisely. -# Note that this test will *always* fail, if the is-at-least -# function could not be marked for autoloading. -zrcautoload is-at-least || is-at-least() { return 1 } - -#f1# Checks whether or not you're running grml -isgrml(){ - [[ -f /etc/grml_version ]] && return 0 - return 1 -} - -#f1# Checks whether or not you're running a grml cd -isgrmlcd(){ - [[ -f /etc/grml_cd ]] && return 0 - return 1 -} - -if isgrml ; then -#f1# Checks whether or not you're running grml-small - isgrmlsmall() { - [[ ${${${(f)"$( autologin -# Thanks go to Bart Schaefer! -isgrml && checkhome() { - if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then - export ALREADY_DID_CD_HOME=$HOME - cd - fi -} - -# check for zsh v3.1.7+ - -if ! [[ ${ZSH_VERSION} == 3.1.<7->* \ - || ${ZSH_VERSION} == 3.<2->.<->* \ - || ${ZSH_VERSION} == <4->.<->* ]] ; then - - printf '-!-\n' - printf '-!- In this configuration we try to make use of features, that only\n' - printf '-!- require version 3.1.7 of the shell; That way this setup can be\n' - printf '-!- used with a wide range of zsh versions, while using fairly\n' - printf '-!- advanced features in all supported versions.\n' - printf '-!-\n' - printf '-!- However, you are running zsh version %s.\n' "$ZSH_VERSION" - printf '-!-\n' - printf '-!- While this *may* work, it might as well fail.\n' - printf '-!- Please consider updating to at least version 3.1.7 of zsh.\n' - printf '-!-\n' - printf '-!- DO NOT EXPECT THIS TO WORK FLAWLESSLY!\n' - printf '-!- If it does today, you'\''ve been lucky.\n' - printf '-!-\n' - printf '-!- Ye been warned!\n' - printf '-!-\n' - - function zstyle() { : } -fi - -# }}} - # {{{ set some variables if check_com -c vim ; then #v# @@ -446,7 +472,9 @@ bindkey '\e[1~' beginning-of-line # home bindkey '\e[4~' end-of-line # end bindkey '\e[A' up-line-or-search # cursor up bindkey '\e[B' down-line-or-search # - -bindkey '^x' history-beginning-search-backward # alternative ways of searching the shell history + +bindkey '^xp' history-beginning-search-backward +bindkey '^xP' history-beginning-search-forward # bindkey -s '^L' "|less\n" # ctrl-L pipes to less # bindkey -s '^B' " &\n" # ctrl-B runs it in the background # if terminal type is set to 'rxvt': @@ -474,6 +502,24 @@ bindkey '^Xi' insert-unicode-char # bindkey . rationalise-dot # bindkey '\eq' push-line-or-edit + +## toggle the ,. abbreviation feature on/off +# NOABBREVIATION: default abbreviation-state +# 0 - enabled (default) +# 1 - disabled +NOABBREVIATION=${NOABBREVIATION:-0} + +grml_toggle_abbrev() { + if (( ${NOABBREVIATION} > 0 )) ; then + NOABBREVIATION=0 + else + NOABBREVIATION=1 + fi +} + +zle -N grml_toggle_abbrev +bindkey '^xA' grml_toggle_abbrev + # }}} # a generic accept-line wrapper {{{ @@ -701,6 +747,12 @@ abk=( globalias() { local MATCH + + if (( NOABBREVIATION > 0 )) ; then + LBUFFER="${LBUFFER},." + return 0 + fi + matched_chars='[.-|_a-zA-Z0-9]#' LBUFFER=${LBUFFER%%(#m)[.-|_a-zA-Z0-9]#} LBUFFER+=${abk[$MATCH]:-$MATCH} @@ -926,15 +978,21 @@ isgrmlcd && SAVEHIST=1000 || SAVEHIST=10000 # useful for setopt append_history # dirstack handling {{{ -DIRSTACKSIZE=20 -if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then - dirstack=( ${(f)"$(< ~/.zdirs)"} ) +DIRSTACKSIZE=${DIRSTACKSIZE:-20} +DIRSTACKFILE=${DIRSTACKFILE:-${HOME}/.zdirs} + +if [[ -f ${DIRSTACKFILE} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then + dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) # "cd -" won't work after login by just setting $OLDPWD, so [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD fi chpwd() { - builtin print -l ${(u)dirstack} >! ~/.zdirs + if is42 ; then + builtin print -l ${(u)dirstack} >! ${DIRSTACKFILE} + else + uprint dirstack >! ${DIRSTACKFILE} + fi } # }}} @@ -952,70 +1010,505 @@ if [[ -n "$BATTERY" ]] ; then fi # }}} -# display version control information on right side of prompt if $VCS is set {{{ -# based on Mike Hommey's http://web.glandium.org/blog/?p=170 -__vcs_dir() { - local vcs base_dir sub_dir ref +# 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_COLOUR="%{${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_COLOUR=$'%{\e[0m%}' +fi - sub_dir() { - local sub_dir - sub_dir=$(readlink -f "${PWD}") - sub_dir=${sub_dir#$1} - echo ${sub_dir#/} - } +# }}} - git_dir() { - base_dir=$(git-rev-parse --show-cdup 2>/dev/null) || return 1 - base_dir=$(readlink -f "$base_dir/..") - sub_dir=$(git-rev-parse --show-prefix) - sub_dir=${sub_dir%/} - ref=$(git-symbolic-ref -q HEAD || git-name-rev --name-only HEAD 2>/dev/null) - ref=${ref#refs/heads/} - vcs="git" - } +# gather version control information for inclusion in a prompt {{{ - svn_dir() { - [[ -d ".svn" ]] || return 1 - base_dir="." - while [[ -d "$base_dir/../.svn" ]]; do base_dir="$base_dir/.."; done - base_dir=$(readlink -f "$base_dir") - sub_dir=$(sub_dir "${base_dir}") - ref=$(svn info "$base_dir" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r":"$0 }') - vcs="svn" - } +# vcs_info() documentation: {{{ +# +# The vcs_info() feature can be configured via zstyle: +# First, the context in which we are working: +# :vcs_info: +# ...where is one of: +# - git, git-svn, hg, darcs, bzr, mtn, svn, cvs or svk +# +# You can of course use ':vcs_info:*' to match all VCSs 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. +# +# 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; +# (like an interactive rebase or a merge conflict) +# branchformat - Some backends replace %b in the prompt*format +# 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). +# 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. +# +# 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]-" +# branchformat "%b:%r" (for bzr, svn and svk) +# enable true +# disable (empty list) +# use-simple false +# +# In the prompt*formats, 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. +# %R - base directory of the repository. +# %r - repository name +# If %R is '/foo/bar/repoXY', %r is 'repoXY'. +# +# In branchformat these replacements are done: +# %b - the branch name +# %r - the current revision number +# +# Not all vcs backends may support all replacements +# +# 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: +# % 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]' +# +# 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 %{...%}, +# because the string provided by vcs_info() is used for prompts. +# +# Example: PROMPT='%(?..[%?]-)%3~%$(vcs_info)#' +# +# This *requires* 'setopt prompt_subst'. +# }}} +VCS_INFO_adjust () { #{{{ + [[ -n ${vcs_comm[overwrite_name]} ]] && vcs=${vcs_comm[overwrite_name]} + return 0 +} +# }}} +VCS_INFO_format () { # {{{ + local msg - svk_dir() { - [[ -f ~/.svk/config ]] || return 1 - base_dir=$(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 - ref=${base_dir##* - } - base_dir=${base_dir%% - *} - sub_dir=$(sub_dir "${base_dir}") - vcs="svk" - } + if [[ -n ${1} ]] ; then + zstyle -s ":vcs_info:${vcs}" promptactionformat msg + [[ -z ${msg} ]] && msg=' (%s)-[%b|%a]-' + else + zstyle -s ":vcs_info:${vcs}" promptformat msg + [[ -z ${msg} ]] && msg=' (%s)-[%b]-' + fi + printf '%s' ${msg} +} +# }}} +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 +} +# }}} +VCS_INFO_git_getaction () { #{{{ + local gitaction='' gitdir=${1} + local tmp + + for tmp in "${gitdir}/rebase-apply" \ + "${gitdir}/rebase" \ + "${gitdir}/../.dotest" ; do + if [[ -d ${tmp} ]] ; then + if [[ -f "${tmp}/rebasing" ]] ; then + gitaction="rebase" + elif [[ -f "${tmp}/applying" ]] ; then + gitaction="am" + else + gitaction="am/rebase" + fi + printf '%s' ${gitaction} + return 0 + fi + done + + for tmp in "${gitdir}/rebase-merge/interactive" \ + "${gitdir}/.dotest-merge/interactive" ; do + if [[ -f "${tmp}" ]] ; then + printf '%s' "rebase-i" + return 0 + fi + done + + for tmp in "${gitdir}/rebase-merge" \ + "${gitdir}/.dotest-merge" ; do + if [[ -d "${tmp}" ]] ; then + printf '%s' "rebase-m" + return 0 + fi + done + + if [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + printf '%s' "merge" + else + if [[ -f "${gitdir}/BISECT_LOG" ]] ; then + printf '%s' "bisect" + fi + fi + + return 1 +} +# }}} +VCS_INFO_git_getbranch () { #{{{ + local gitbranch gitdir=${1} + local gitsymref='git symbolic-ref HEAD' + + if [[ -d "${gitdir}/rebase-apply" ]] \ + || [[ -d "${gitdir}/rebase" ]] \ + || [[ -d "${gitdir}/../.dotest" ]] \ + || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + [[ -z ${gitbranch} ]] && gitbranch="$(< ${gitdir}/rebase-apply/head-name)" + + elif [[ -f "${gitdir}/rebase-merge/interactive" ]] \ + || [[ -d "${gitdir}/rebase-merge" ]] ; then + gitbranch="$(< ${gitdir}/rebase-merge/head-name)" + + elif [[ -f "${gitdir}/.dotest-merge/interactive" ]] \ + || [[ -d "${gitdir}/.dotest-merge" ]] ; then + gitbranch="$(< ${gitdir}/.dotest-merge/head-name)" + + else + gitbranch="$(${(z)gitsymref} 2> /dev/null)" + + if [[ $? -ne 0 ]] ; then + gitbranch="$(git describe --exact-match HEAD 2>/dev/null)" + + if [[ $? -ne 0 ]] ; then + gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..." + fi + fi + fi + + printf '%s' "${gitbranch##refs/heads/}" +} +# }}} +VCS_INFO_git_get_data () { # {{{ + setopt localoptions extendedglob + local gitdir gitbase gitbranch gitaction msg + + gitdir=${vcs_comm[gitdir]} + gitbranch="$(VCS_INFO_git_getbranch ${gitdir})" + + if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then + return + fi + + VCS_INFO_adjust + gitaction="$(VCS_INFO_git_getaction ${gitdir})" + msg=$(VCS_INFO_format ${gitaction}) + + gitbase=${PWD%/${$(git rev-parse --show-prefix)%/##}} - hg_dir() { - base_dir="." - while [[ ! -d "$base_dir/.hg" ]]; do - base_dir="$base_dir/.." - [[ $(readlink -f "${base_dir}") = "/" ]] && return 1 + zformat -f msg "${msg}" "a:${gitaction}" "b:${gitbranch}" "s:${vcs}" "r:${gitbase:t}" "R:${gitbase}" + 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 + + hgbase=${vcs_comm[basedir]} + hgbranch=$(< ${hgbase}/.hg/branch) + msg=$(VCS_INFO_format) + zformat -f msg "${msg}" "a:" "b:${hgbranch}" "s:${vcs}" "r:${hgbase:t}" "R:${hgbase}" + 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]} + + zstyle -s ":vcs_info:${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}" + printf '%s' ${msg} +} +# }}} +VCS_INFO_svn_get_data () { # {{{ + setopt localoptions noksharrays + local msg svnbase svnbranch + local -a svninfo + + svnbase="." + while [[ -d "${svnbase}/../.svn" ]]; do + svnbase="${svnbase}/.." + done + svnbase=$(VCS_INFO_realpath ${svnbase}) + svninfo=($(svn info "${svnbase}" | awk '/^URL/ { sub(".*/","",$0); r=$0 } /^Revision/ { sub("[^0-9]*","",$0); print r"\n"$0 }')) + + zstyle -s ":vcs_info:${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}" + printf '%s' ${msg} +} +# }}} +VCS_INFO_bzr_get_data () { # {{{ + local msg bzrbranch bzrbase bzrrevno bzrbr i j + + if zstyle -t ":vcs_info:${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 - base_dir=$(readlink -f "$base_dir") - sub_dir=$(sub_dir "${base_dir}") - ref=$(< "${base_dir}/.hg/branch") - vcs="hg" - } + fi + + zstyle -s ":vcs_info:${vcs}" branchformat bzrbr || bzrbr="%b:%r" + zformat -f bzrbr "${bzrbr}" "b:${bzrbranch}" "r:${bzrrevno}" - hg_dir || - git_dir || - svn_dir || - svk_dir # || - # base_dir="$PWD" - # echo "${vcs:+($vcs)}${base_dir/$HOME/~}${vcs:+[$ref]${sub_dir}}" - echo "${vcs:+($vcs)}${base_dir}${vcs:+[$ref]${sub_dir}}" + 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:${cvsbranch}" "s:${vcs}" "r:${basename}" "R:${cvsbase}" + printf '%s' ${msg} +} +# }}} +# VCS_INFO_*_detect () {{{ + +VCS_INFO_detect_by_dir() { + local dirname=${1} + local basedir="." realbasedir + + realbasedir=$(VCS_INFO_realpath ${basedir}) + while [[ ${realbasedir} != '/' ]]; do + if [[ -n ${vcs_comm[detect_need_file]} ]] ; then + [[ -d ${basedir}/${dirname} ]] && \ + [[ -f ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \ + break + else + [[ -d ${basedir}/${dirname} ]] && break + fi + + basedir=${basedir}/.. + realbasedir=$(VCS_INFO_realpath ${basedir}) + done + + [[ ${realbasedir} == "/" ]] && return 1 + vcs_comm[basedir]=${realbasedir} + return 0 +} + +VCS_INFO_bzr_detect() { + check_com -c bzr || return 1 + vcs_comm[detect_need_file]=branch/format + VCS_INFO_detect_by_dir '.bzr' + return $? +} + +VCS_INFO_cvs_detect() { + check_com -c svn || return 1 + [[ -d "CVS" ]] && return 0 + return 1 +} + +VCS_INFO_darcs_detect() { + check_com -c 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 + 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 + fi + return 1 +} + +VCS_INFO_hg_detect() { + check_com -c hg || return 1 + vcs_comm[detect_need_file]=branch + VCS_INFO_detect_by_dir '.hg' + return $? +} + +VCS_INFO_mtn_detect() { + check_com -c mtn || return 1 + vcs_comm[detect_need_file]=revision + VCS_INFO_detect_by_dir '_MTN' + return $? +} + +VCS_INFO_svk_detect() { + setopt localoptions noksharrays + local -a info + + check_com -c svk || return 1 + [[ -f ~/.svk/config ]] || return 1 + + 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 + [[ -d ".svn" ]] && return 0 + return 1 +} + +# }}} +vcs_info () { # {{{ + local string + local -i found + local -a VCSs disabled + local -x vcs + 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) + + (( found = 0 )) + for vcs in ${VCSs} ; do + [[ -n ${(M)disabled:#${vcs}} ]] && continue + vcs_comm=() + VCS_INFO_${vcs}_detect && (( found = 1 )) && break + done + + (( found == 0 )) && return 0 + + string=$(VCS_INFO_${vcs}_get_data) || return 1 + printf '%s' ${string} + return 0 +} +# }}} + +# 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] " +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:(svn|bzr)' branchformat "%b${YELLOW]}:%r" +fi + +# }}} # {{{ set prompt if zrcautoload promptinit && promptinit 2>/dev/null ; then @@ -1024,6 +1517,7 @@ else print 'Notice: no promptinit available :(' fi +setopt prompt_subst # precmd() => a function which is executed just before each prompt # use 'NOPRECMD=1' to disable the precmd + preexec commands @@ -1045,8 +1539,6 @@ is4 && [[ -z $NOPRECMD ]] && precmd () { if [[ -n $BATTERY ]] ; then RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}" # RPROMPT="${PERCENT}${SCREENTITLE}" - elif [[ -n $VCS ]] ; then - RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}" else RPROMPT="%(?..:()% ${SCREENTITLE}" # RPROMPT="${SCREENTITLE}" @@ -1092,23 +1584,6 @@ preexec () { esac } -# set colors -if zrcautoload colors && colors 2>/dev/null ; then - BLUE="%{${fg[blue]}%}" - RED="%{${fg_bold[red]}%}" - GREEN="%{${fg[green]}%}" - CYAN="%{${fg[cyan]}%}" - WHITE="%{${fg[white]}%}" - NO_COLOUR="%{${reset_color}%}" -else - BLUE=$'%{\e[1;34m%}' - RED=$'%{\e[1;31m%}' - GREEN=$'%{\e[1;32m%}' - CYAN=$'%{\e[1;36m%}' - WHITE=$'%{\e[1;37m%}' - NO_COLOUR=$'%{\e[0m%}' -fi - EXITCODE="%(?..%?%1v )" PS2='`%_> ' # secondary prompt, printed when the shell needs more information to complete a command. PS3='?# ' # selection prompt used within a select loop. @@ -1121,7 +1596,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%<< %# " + PROMPT="${EXITCODE}${debian_chroot:+($debian_chroot)}%n@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# " 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) @@ -1129,10 +1604,11 @@ else PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D ${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%<< %# " # primary prompt string + PROMPT="${RED}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# " else - PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# " # primary prompt string + PROMPT="${BLUE}${EXITCODE}${WHITE}${debian_chroot:+($debian_chroot)}${RED}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< "'$(vcs_info)'"%# " fi fi fi @@ -1362,7 +1838,11 @@ if [[ -r /etc/debian_version ]] ; then fi } - isgrmlcd && alias su="sudo -s" # get a root shell + # get a root shell as normal user in live-cd mode: + if isgrmlcd && [[ $UID -ne 0 ]] ; then + alias su="sudo su" + fi + #a1# Take a look at the syslog: \kbd{\$PAGER /var/log/syslog} alias llog="$PAGER /var/log/syslog" # take a look at the syslog #a1# Take a look at the syslog: \kbd{tail -f /var/log/syslog} @@ -1508,6 +1988,9 @@ grmlcomp() { # Ignore completion functions for commands you don't have: zstyle ':completion::(^approximate*):*:functions' ignored-patterns '_*' + # Provide more processes in completion of programs like killall: + zstyle ':completion:*:processes-names' command 'ps c -u ${USER} -o command | uniq' + # complete manual by their section zstyle ':completion:*:manuals' separate-sections true zstyle ':completion:*:manuals.*' insert-sections true @@ -1543,6 +2026,9 @@ grmlcomp() { # zstyle ':completion:*' completer _complete _correct _approximate # zstyle ':completion:*' expand prefix suffix + # complete shell aliases + # zstyle ':completion:*' completer _expand_alias _complete _approximate + # command for process lists, the local web server details and host completion zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html' @@ -1789,9 +2275,33 @@ compdef _functions edfunc #m# f6 Stop() \kbd{/etc/init.d/\em{process}}\quad\kbd{stop} #m# f6 Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{reload} #m# f6 Force-Reload() \kbd{/etc/init.d/\em{process}}\quad\kbd{force-reload} -if [[ -d /etc/init.d ]] ; then +if [[ -d /etc/init.d || -d /etc/service ]] ; then + __start_stop() { + local action_="${1:l}" # e.g Start/Stop/Restart + local service_="$2" + local param_="$3" + + local service_target_="$(readlink /etc/init.d/$service_)" + if [[ $service_target_ == "/usr/bin/sv" ]]; then + # runit + case "${action_}" in + start) if [[ ! -e /etc/service/$service_ ]]; then + $SUDO ln -s "/etc/sv/$service_" "/etc/service/" + else + $SUDO "/etc/init.d/$service_" "${action_}" "$param_" + fi ;; + # there is no reload in runits sysv emulation + reload) $SUDO "/etc/init.d/$service_" "force-reload" "$param_" ;; + *) $SUDO "/etc/init.d/$service_" "${action_}" "$param_" ;; + esac + else + # sysvinit + $SUDO "/etc/init.d/$service_" "${action_}" "$param_" + fi + } + for i in Start Restart Stop Force-Reload Reload ; do - eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }" + eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }" done fi @@ -1976,11 +2486,12 @@ bk() { # }}} # {{{ make sure our environment is clean regarding colors -for color in BLUE RED GREEN CYAN WHITE ; unset $color +for color in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $color # }}} # source another config file if present {{{ xsource "/etc/zsh/zshrc.local" +xsource "${HOME}/.zshenv" # }}} # "persistent history" {{{