X-Git-Url: https://git.grml.org/?a=blobdiff_plain;f=etc%2Fzsh%2Fzshrc;h=1c38fcd1c6ca59be96b1dc7f084058feeb9826bc;hb=9b656e87115edc0060041f14adb40dd6ea32d3d8;hp=47c79448f6342ffd16572c02d21f6bc3465933d7;hpb=1ba504b8966b69fae818621fb9d1e96220349c40;p=grml-etc-core.git diff --git a/etc/zsh/zshrc b/etc/zsh/zshrc index 47c7944..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: Mon Feb 11 18:00:55 CET 2008 [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,99 +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 -} - -#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# @@ -369,7 +400,7 @@ else fi #v# -(( ${+PAGER} )) || export PAGER="less" +export PAGER=${PAGER:-less} #v# export MAIL=${MAIL:-/var/mail/$USER} @@ -381,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=(.. ~) @@ -441,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': @@ -469,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 {{{ @@ -696,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} @@ -921,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 } # }}} @@ -947,70 +1010,344 @@ 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 + + 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)%/##}} - 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##* + 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 + + 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 }') - 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:${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 zrcautoload promptinit && promptinit 2>/dev/null ; then @@ -1019,6 +1356,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 @@ -1040,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}" @@ -1087,23 +1423,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. @@ -1116,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) @@ -1124,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 @@ -1507,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 @@ -1542,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' @@ -1788,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 @@ -1980,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" {{{