X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=1c38fcd1c6ca59be96b1dc7f084058feeb9826bc;hb=9b656e87115edc0060041f14adb40dd6ea32d3d8;hp=671e7c195715af342449e2adbb1f6274677eba26;hpb=5d7147e4efe5bfdfdc033b9f582476b2e949a0e3;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 671e7c1..1c38fcd 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) + funcs=(salias xcat xsource xunfunction zrcautoload) for func in $funcs ; do [[ -n ${functions[$func]} ]] \ @@ -202,11 +318,41 @@ xunfunction() { done return 0 } + +# autoload wrapper - use this one instead of autoload directly +function zrcautoload() { + setopt local_options extended_glob + local fdir ffile + local -i ffound + + ffile=${1} + (( found = 0 )) + for fdir in ${fpath} ; do + [[ -e ${fdir}/${ffile} ]] && (( ffound = 1 )) + done + + (( ffound == 0 )) && return 1 + if [[ $ZSH_VERSION == 3.1.<6-> || $ZSH_VERSION == <4->* ]] ; then + autoload -U ${ffile} || return 1 + else + autoload ${ffile} || return 1 + fi + return 0 +} + #}}} +# 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} @@ -245,67 +391,6 @@ fi unset xof # }}} -# {{{ check for version/system -# check for versions (compatibility reasons) -if autoload is-at-least && is-at-least 2>/dev/null ; then - is4() { is-at-least 4 } - is41() { is-at-least 4.1 } - is42() { is-at-least 4.2 } -else - is4(){ - [[ $ZSH_VERSION == 4.* ]] && return 0 - return 1 - } - is42(){ - [[ $ZSH_VERSION == 4.<2->* ]] && return 0 - return 1 - } -fi - -#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 -} -# }}} - # {{{ set some variables if check_com -c vim ; then #v# @@ -315,7 +400,7 @@ else fi #v# -(( ${+PAGER} )) || export PAGER="less" +export PAGER=${PAGER:-less} #v# export MAIL=${MAIL:-/var/mail/$USER} @@ -327,7 +412,7 @@ export SHELL='/bin/zsh' check_com -c dircolors && eval $(dircolors -b) # set width of man pages to 80 for more convenient reading -# (( ${+MANWIDTH} )) || export MANWIDTH=80 +# export MANWIDTH=${MANWIDTH:-80} # Search path for the cd command # cdpath=(.. ~) @@ -342,7 +427,7 @@ else if [[ -d /etc/zsh/functions.d ]] ; then fpath+=( /etc/zsh/functions.d ) for func in /etc/zsh/functions.d/[^_]*[^~] ; do - autoload -U ${func:t} + zrcautoload -U ${func:t} done fi fi @@ -387,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': @@ -398,7 +485,7 @@ bindkey '\e[8~' end-of-line # end # insert unicode character # usage example: 'ctrl-x i' 00A7 'ctrl-x i' will give you an ยง # See for example http://unicode.org/charts/ for unicode characters code -autoload insert-unicode-char +zrcautoload insert-unicode-char zle -N insert-unicode-char #k# Insert Unicode character bindkey '^Xi' insert-unicode-char @@ -415,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 {{{ @@ -642,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} @@ -652,8 +763,8 @@ bindkey ",." globalias # }}} # {{{ autoloading -autoload -U zmv # who needs mmv or rename? -autoload history-search-end +zrcautoload zmv # who needs mmv or rename? +zrcautoload history-search-end # we don't want to quote/espace URLs on our own... # if autoload -U url-quote-magic ; then @@ -666,10 +777,10 @@ alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magi #m# k ESC-h Call \kbd{run-help} for the 1st word on the command line alias run-help >&/dev/null && unalias run-help -autoload run-help # use via 'esc-h' +zrcautoload run-help # use via 'esc-h' # completion system -if autoload -U compinit && compinit 2>/dev/null ; then +if zrcautoload compinit && compinit 2>/dev/null ; then compinit 2>/dev/null || print 'Notice: no compinit available :(' else print 'Notice: no compinit available :(' @@ -677,7 +788,7 @@ else function compdef { } fi -is4 && autoload -U zed # use ZLE editor to edit a file or function +is4 && zrcautoload zed # use ZLE editor to edit a file or function is4 && \ for mod in complist deltochar mathfunc ; do @@ -700,7 +811,7 @@ if is4 ; then unset tmpargs fi -if is4 && autoload -U insert-files && zle -N insert-files ; then +if is4 && zrcautoload insert-files && zle -N insert-files ; then #k# Insert files bindkey "^Xf" insert-files # C-x-f fi @@ -710,7 +821,7 @@ bindkey ' ' magic-space # also do history expansion on space bindkey '\ei' menu-complete # menu completion via esc-i # press esc-e for editing command line in $EDITOR or $VISUAL -if is4 && autoload -U edit-command-line && zle -N edit-command-line ; then +if is4 && zrcautoload edit-command-line && zle -N edit-command-line ; then #k# Edit the current line in \kbd{\$EDITOR} bindkey '\ee' edit-command-line fi @@ -746,7 +857,7 @@ zle -N insert-last-typed-word; bindkey "\em" insert-last-typed-word # set command prediction from history, see 'man 1 zshcontrib' -# is4 && autoload -U predict-on && \ +# is4 && zrcautoload predict-on && \ # zle -N predict-on && \ # zle -N predict-off && \ # bindkey "^X^Z" predict-on && \ @@ -817,6 +928,7 @@ setopt extended_glob # in order to use #, ~ and ^ for filename generation # grep word *~(*.gz|*.bz|*.bz2|*.zip|*.Z) -> # -> searches for word not in compressed files # don't forget to quote '^', '~' and '#'! +setopt longlistjobs # display PID when suspending processes as well setopt notify # report the status of backgrounds jobs immediately setopt hash_list_all # Whenever a command completion is attempted, make sure \ # the entire command path is hashed first. @@ -866,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 } # }}} @@ -892,78 +1010,353 @@ 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, hg, bzr, svn 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) +# enable - check in the 'init' context. If set to false, +# vcs_info() will do nothing. +# +# The default values for these in all contexts are: +# promptformat " (%s)-[%b|%a]-" +# promptactionformat " (%s)-[%b]-" +# enable true +# +# In these 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'. +# +# Not all vcs backends may support all replacements +# +# If you want colors, make sure you enclose the color codes in %{...%}, because +# the string provided by vcs_info() is commonly used for prompts. +# +# Example: PROMPT='%(?..[%?]-)%3~%$(vcs_info)#' +# +# This *requires* 'setopt prompt_subst'. +# }}} +VCS_INFO_default_action_format=' (%s)-[%b|%a]-' +VCS_INFO_default_format=' (%s)-[%b]-' +VCS_INFO_realpath () { #{{{ + # replacing 'readlink -f', which is really not portable. + (( ${+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 + print '%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 - 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##* + 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)" + + 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="$(git rev-parse --git-dir 2> /dev/null)" + + if [[ $? -eq 0 ]] ; then + gitbranch="$(VCS_INFO_git_getbranch ${gitdir})" + fi + + if [[ -z ${gitdir} ]] || [[ -z ${gitbranch} ]] ; then + return + fi + + gitaction="$(VCS_INFO_git_getaction ${gitdir})" + msg=$(VCS_INFO_format ${gitaction}) + + gitbase=${PWD%/${$(git rev-parse --show-prefix)%/##}} + + zformat -f msg "${msg}" "a:${gitaction}" "b:${gitbranch}" "s:${vcs}" "r:${gitbase:t}" "R:${gitbase}" + printf '%s' ${msg} +} +# }}} +VCS_INFO_hg_get_data () { # {{{ + local msg hgbranch hgbase + + hgbase=${1} + 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_svk_get_data () { # {{{ + local msg svkbranch svkbase + + svkbase=${1} + svkbranch=${svkbase##* } - base_dir=${base_dir%% + svkbase=${svkbase%% *} - sub_dir=$(sub_dir "${base_dir}") - vcs="svk" - } - hg_dir() { - base_dir="." - while [[ ! -d "$base_dir/.hg" ]]; do - base_dir="$base_dir/.." - [[ $(readlink -f "${base_dir}") = "/" ]] && return 1 - done - base_dir=$(readlink -f "$base_dir") - sub_dir=$(sub_dir "${base_dir}") - ref=$(< "${base_dir}/.hg/branch") - vcs="hg" - } + 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 () { # {{{ + local msg svnbranch svnbase - 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}}" + 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 }') + + 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 i j + + bzrbase=$(bzr info | sed -rne 's, *branch root: ,,p') + case ${bzrbase} in + .) bzrbase=${PWD} ;; + esac + + bzr version-info | while read i j; do + case "${i}" in + revno:) + bzrrevno=${j} ;; + branch-nick:) + bzrbranch=${j} ;; + esac + done + + msg=$(VCS_INFO_format) + zformat -f msg "${msg}" "a:" "b:${bzrbranch}:${bzrrevno}" "s:${vcs}" "r:${bzrbase:t}" "R:${bzrbase}" + printf '%s' ${msg} +} +# }}} +# VCS_INFO_*_detect () {{{ + +VCS_INFO_detect_by_dir() { + local tool=${1} dirname=${2} + local basedir="." + + check_com -c ${tool} || return 1 + while [[ ! -d ${basedir}/${dirname} ]]; do + basedir=${basedir}/.. + [[ $(VCS_INFO_realpath ${basedir}) = "/" ]] && return 1 + done + + printf '%s' $(VCS_INFO_realpath ${basedir}) + return 0 +} + +VCS_INFO_bzr_detect() { + VCS_INFO_detect_by_dir 'bzr' '.bzr' + return $? +} + +VCS_INFO_git_detect() { + check_com -c git && git rev-parse --is-inside-work-tree &> /dev/null && return 0 + return 1 +} + +VCS_INFO_hg_detect() { + VCS_INFO_detect_by_dir 'hg' '.hg' + return $? +} + +VCS_INFO_svk_detect() { + local output + + check_com -c svk || return 1 + [[ -f ~/.svk/config ]] || return 1 + + output=$(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 + + printf '%s' ${output} + return 0 +} + +VCS_INFO_svn_detect() { + check_com -c svn || return 1 + [[ -d ".svn" ]] && return 0 + return 1 +} + +# }}} +VCS_INFO_format () { # {{{ + local msg + + if [[ -n ${1} ]] ; then + zstyle -s ":vcs_info:${vcs}" promptactionformat msg + [[ -z ${msg} ]] && msg=${VCS_INFO_default_action_format} + else + zstyle -s ":vcs_info:${vcs}" promptformat msg + [[ -z ${msg} ]] && msg=${VCS_INFO_default_format} + fi + printf '%s' ${msg} +} +# }}} +vcs_info () { # {{{ + local string output + local -i found + local -a VCSs + local -x vcs + + vcs="init" + zstyle -T ":vcs_info:${vcs}" "enable" || return 0 + + VCSs=(git hg bzr svn svk) + + (( found = 0 )) + for vcs in ${VCSs} ; do + output=$(VCS_INFO_${vcs}_detect) && (( found = 1 )) && break + done + + (( found == 0 )) && return 0 + + string=$(VCS_INFO_${vcs}_get_data ${output}) || 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}%} " +fi + +# }}} + # {{{ set prompt -if autoload promptinit && promptinit 2>/dev/null ; then +if zrcautoload promptinit && promptinit 2>/dev/null ; then promptinit # people should be able to use their favourite prompt 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 @@ -985,8 +1378,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}" @@ -1032,23 +1423,6 @@ preexec () { esac } -# set colors -if autoload 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. @@ -1061,7 +1435,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) @@ -1069,10 +1443,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 @@ -1302,7 +1677,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} @@ -1448,6 +1827,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 @@ -1483,6 +1865,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' @@ -1729,9 +2114,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 @@ -1921,6 +2330,7 @@ for color in BLUE RED GREEN CYAN WHITE ; unset $color # source another config file if present {{{ xsource "/etc/zsh/zshrc.local" +xsource "${HOME}/.zshenv" # }}} # "persistent history" {{{