zshrc: Switch `minimal-shell()' from ksh93 to mksh
[grml-etc-core.git] / etc / zsh / zshrc
index 6221861..e30f511 100644 (file)
@@ -134,7 +134,12 @@ is43(){
 }
 
 is433(){
-    [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == <5->* ]] && return 0
+    [[ $ZSH_VERSION == 4.3.<3->* || $ZSH_VERSION == 4.<4->* || $ZSH_VERSION == <5->* ]] && return 0
+    return 1
+}
+
+is439(){
+    [[ $ZSH_VERSION == 4.3.<9->* || $ZSH_VERSION == 4.<4->* || $ZSH_VERSION == <5->* ]] && return 0
     return 1
 }
 
@@ -276,6 +281,7 @@ setopt nobeep               # avoid "beep"ing
 setopt pushd_ignore_dups    # don't push the same dir twice.
 setopt noglobdots           # * shouldn't match dotfiles. ever.
 setopt noshwordsplit        # use zsh style word splitting
+setopt unset                # don't error out when unset parameters are used
 
 # }}}
 
@@ -617,6 +623,11 @@ zle -N slash-backward-kill-word
 #k# Kill everything in a word up to its last \kbd{/}
 bindkey '\ev' slash-backward-kill-word
 
+# use the new *-pattern-* widgets for incremental history search
+if is439 ; then
+    bindkey '^r' history-incremental-pattern-search-backward
+    bindkey '^s' history-incremental-pattern-search-forward
+fi
 # }}}
 
 # a generic accept-line wrapper {{{
@@ -639,7 +650,7 @@ bindkey '\ev' slash-backward-kill-word
 zstyle ':acceptline:*' rehash true
 
 function Accept-Line() {
-    setopt localoptions noksharrays
+    emulate -L zsh
     local -a subs
     local -xi aldone
     local sub
@@ -658,6 +669,7 @@ function Accept-Line() {
 }
 
 function Accept-Line-getdefault() {
+    emulate -L zsh
     local default_action
 
     zstyle -s ":acceptline:${alcontext}" default_action default_action
@@ -672,7 +684,7 @@ function Accept-Line-getdefault() {
 }
 
 function accept-line() {
-    setopt localoptions noksharrays
+    emulate -L zsh
     local -a cmdline
     local -x alcontext
     local buf com fname format msg default_action
@@ -1596,30 +1608,38 @@ VCS_INFO_git_getaction () { #{{{
 }
 # }}}
 VCS_INFO_git_getbranch () { #{{{
-    local gitbranch gitdir=$1
+    local gitbranch gitdir=$1 tmp actiondir
     local gitsymref='git symbolic-ref HEAD'
 
-    if    [[ -d "${gitdir}/rebase-apply" ]] \
-       || [[ -d "${gitdir}/rebase" ]]       \
-       || [[ -d "${gitdir}/../.dotest" ]]   \
-       || [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
+    actiondir=''
+    for tmp in "${gitdir}/rebase-apply" \
+               "${gitdir}/rebase"       \
+               "${gitdir}/../.dotest"; do
+        if [[ -d ${tmp} ]]; then
+            actiondir=${tmp}
+            break
+        fi
+    done
+    if [[ -n ${actiondir} ]]; then
         gitbranch="$(${(z)gitsymref} 2> /dev/null)"
-        [[ -z ${gitbranch} ]] && [[ -r ${gitdir}/rebase-apply/head-name ]] \
-            && gitbranch="$(< ${gitdir}/rebase-apply/head-name)"
+        [[ -z ${gitbranch} ]] && [[ -r ${actiondir}/head-name ]] \
+            && gitbranch="$(< ${actiondir}/head-name)"
 
-    elif   [[ -f "${gitdir}/rebase-merge/interactive" ]] \
-        || [[ -d "${gitdir}/rebase-merge" ]] ; then
+    elif [[ -f "${gitdir}/MERGE_HEAD" ]] ; then
+        gitbranch="$(${(z)gitsymref} 2> /dev/null)"
+        [[ -z ${gitbranch} ]] && gitbranch="$(< ${gitdir}/MERGE_HEAD)"
+
+    elif [[ -d "${gitdir}/rebase-merge" ]] ; then
         gitbranch="$(< ${gitdir}/rebase-merge/head-name)"
 
-    elif   [[ -f "${gitdir}/.dotest-merge/interactive" ]] \
-        || [[ -d "${gitdir}/.dotest-merge" ]] ; then
+    elif [[ -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)"
+            gitbranch="refs/tags/$(git describe --exact-match HEAD 2>/dev/null)"
 
             if [[ $? -ne 0 ]] ; then
                 gitbranch="${${"$(< $gitdir/HEAD)"}[1,7]}..."
@@ -1627,7 +1647,7 @@ VCS_INFO_git_getbranch () { #{{{
         fi
     fi
 
-    printf '%s' "${gitbranch##refs/heads/}"
+    printf '%s' "${gitbranch##refs/[^/]##/}"
     return 0
 }
 # }}}
@@ -1719,6 +1739,7 @@ VCS_INFO_detect_by_dir() { #{{{
 
     realbasedir="$(VCS_INFO_realpath ${basedir})"
     while [[ ${realbasedir} != '/' ]]; do
+        [[ -r ${realbasedir} ]] || return 1
         if [[ -n ${vcs_comm[detect_need_file]} ]] ; then
             [[ -d ${basedir}/${dirname} ]] && \
             [[ -e ${basedir}/${dirname}/${vcs_comm[detect_need_file]} ]] && \
@@ -1840,6 +1861,7 @@ vcs_info_printsys () { # {{{
 }
 # }}}
 vcs_info_lastmsg () { # {{{
+    emulate -L zsh
     local -i i
 
     VCS_INFO_maxexports
@@ -1855,6 +1877,11 @@ vcs_info_lastmsg () { # {{{
 }
 # }}}
 vcs_info () { # {{{
+    emulate -L zsh
+    setopt extendedglob
+
+    [[ -r . ]] || return 1
+
     local pat
     local -i found
     local -a VCSs disabled dps
@@ -1970,6 +1997,26 @@ setopt prompt_subst
 # make sure to use right prompt only when not running a command
 is41 && setopt transient_rprompt
 
+
+function ESC_print () {
+    info_print $'\ek' $'\e\\' "$@"
+}
+function set_title () {
+    info_print  $'\e]0;' $'\a' "$@"
+}
+
+function info_print () {
+    local esc_begin esc_end
+    esc_begin="$1"
+    esc_end="$2"
+    shift 2
+    printf '%s' ${esc_begin}
+    for item in "$@" ; do
+        printf '%s ' "$item"
+    done
+    printf '%s' "${esc_end}"
+}
+
 # TODO: revise all these NO* variables and especially their documentation
 #       in zsh-help() below.
 is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
@@ -1979,9 +2026,9 @@ is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
 
     if [[ $TERM == screen* ]] ; then
         if [[ -n ${VCS_INFO_message_1_} ]] ; then
-            print -nP "\ek${VCS_INFO_message_1_}\e\\"
+            ESC_print ${VCS_INFO_message_1_}
         else
-            print -nP "\ekzsh\e\\"
+            ESC_print "zsh"
         fi
     fi
     # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
@@ -1999,7 +2046,7 @@ is4 && [[ $NOPRECMD -eq 0 ]] && precmd () {
     [[ ${NOTITLE} -gt 0 ]] && return 0
     case $TERM in
         (xterm*|rxvt*)
-            print -Pn "\e]0;%n@%m: %~\a"
+            set_title ${(%):-"%n@%m: %~"}
             ;;
     esac
 }
@@ -2017,13 +2064,13 @@ preexec () {
     if [[ "$TERM" == screen* ]] ; then
         # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # don't use hostname
         local CMD="${1[(wr)^(*=*|sudo|ssh|-*)]}$NAME" # use hostname
-        echo -ne "\ek$CMD\e\\"
+        ESC_print ${CMD}
     fi
 # adjust title of xterm
     [[ ${NOTITLE} -gt 0 ]] && return 0
     case $TERM in
         (xterm*|rxvt*)
-            print -Pn "\e]0;%n@%m: $1\a"
+            set_title "${(%):-"%n@%m:"}" "$1"
             ;;
     esac
 }
@@ -2158,7 +2205,6 @@ swspeak() {
        export PS1="%m%# "
        /usr/sbin/swspeak-setup $@
      else # old version:
-        aumix -w 90 -v 90 -p 90 -m 90
         if ! [[ -r /dev/softsynth ]] ; then
             flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
             return 1
@@ -2907,9 +2953,17 @@ iwclient() {
     salias dhclient "$(wavemon -d | awk '/device/{print $2}')"
 }
 
-# spawn a minimally set up ksh - useful if you want to umount /usr/.
+# spawn a minimally set up mksh - useful if you want to umount /usr/.
 minimal-shell() {
-    exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
+    emulate -L zsh
+    local shell="mksh"
+
+    if ! check_com -c ${shell}; then
+        printf '`%s'\'' not available, giving up.\n' ${shell} >&2
+        return 1
+    fi
+
+    exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ${shell}
 }
 
 # a wrapper for vim, that deals with title setting
@@ -3964,16 +4018,6 @@ exirename() {
     fi
 }
 
-# open file in vim and jump to line
-# http://www.downgra.de/archives/2007/05/08/T19_21_11/
-j2v() {
-    emulate -L zsh
-    local -a params
-    params=(${*//(#m):[0-9]*:/\\n+${MATCH//:/}}) # replace ':23:' to '\n+23'
-    params=(${(s|\n|)${(j|\n|)params}}) # join array using '\n', then split on all '\n'
-    vim ${params}
-}
-
 # get_ic() - queries imap servers for capabilities; real simple. no imaps
 ic_get() {
     emulate -L zsh
@@ -4414,3 +4458,6 @@ zrclocal
 
 ## END OF FILE #################################################################
 # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4
+# Local variables:
+# mode: sh
+# End: