Apply patch by z3ttacht regarding issue354
[grml-etc-core.git] / etc / zsh / zshrc
index 038ab43..5a9a2a5 100644 (file)
@@ -3,7 +3,7 @@
 # Authors:       grml-team (grml.org), (c) Michael Prokop <mika@grml.org>
 # Bug-Reports:   see http://grml.org/bugs/
 # License:       This file is licensed under the GPL v2.
-# Latest change: Mit Jun 20 10:28:28 CEST 2007 [mika]
+# Latest change: Don Nov 22 11:13:15 CET 2007 [mika]
 ################################################################################
 # This file is sourced only for interactive shells. It
 # should contain commands to set up aliases, functions,
 # Global Order: zshenv, zprofile, zshrc, zlogin
 ################################################################################
 
+# zsh-refcard-tag documentation: {{{
+#   You may notice strange looking comments in the zshrc (and ~/.zshrc as
+#   well). These are there for a purpose. grml's zsh-refcard can now be
+#   automatically generated from the contents of the actual configuration
+#   files. However, we need a little extra information on which comments
+#   and what lines of code to take into account (and for what purpose).
+#
+# Here is what they mean:
+#
+# List of tags (comment types) used:
+#   #a#     Next line contains an important alias, that should
+#           be included in the grml-zsh-refcard.
+#           (placement tag: @@INSERT-aliases@@)
+#   #f#     Next line contains the beginning of an important function.
+#           (placement tag: @@INSERT-functions@@)
+#   #v#     Next line contains an important variable.
+#           (placement tag: @@INSERT-variables@@)
+#   #k#     Next line contains an important keybinding.
+#           (placement tag: @@INSERT-keybindings@@)
+#   #d#     Hashed directories list generation:
+#               start   denotes the start of a list of 'hash -d'
+#                       definitions.
+#               end     denotes its end.
+#           (placement tag: @@INSERT-hasheddirs@@)
+#   #A#     Abbreviation expansion list generation:
+#               start   denotes the beginning of abbreviations.
+#               end     denotes their end.
+#           Lines within this section that end in '#d .*' provide
+#           extra documentation to be included in the refcard.
+#           (placement tag: @@INSERT-abbrev@@)
+#   #m#     This tag allows you to manually generate refcard entries
+#           for code lines that are hard/impossible to parse.
+#               Example:
+#                   #m# k ESC-h Call the run-help function
+#               That would add a refcard entry in the keybindings table
+#               for 'ESC-h' with the given comment.
+#           So the syntax is: #m# <section> <argument> <comment>
+#   #o#     This tag lets you insert entries to the 'other' hash.
+#           Generally, this should not be used. It is there for
+#           things that cannot be done easily in another way.
+#           (placement tag: @@INSERT-other-foobar@@)
+#
+#   All of these tags (except for m and o) take two arguments, the first
+#   within the tag, the other after the tag:
+#
+#   #<tag><section># <comment>
+#
+#   Where <section> is really just a number, which are defined by the
+#   @secmap array on top of 'genrefcard.pl'. The reason for numbers
+#   instead of names is, that for the reader, the tag should not differ
+#   much from a regular comment. For zsh, it is a regular comment indeed.
+#   The numbers have got the following meanings:
+#         0 -> "default"
+#         1 -> "system"
+#         2 -> "user"
+#         3 -> "debian"
+#         4 -> "search"
+#         5 -> "shortcuts"
+#         6 -> "services"
+#
+#   So, the following will add an entry to the 'functions' table in the
+#   'system' section, with a (hopefully) descriptive comment:
+#       #f1# Edit an alias via zle
+#       edalias() {
+#
+#   It will then show up in the @@INSERT-aliases-system@@ replacement tag
+#   that can be found in 'grml-zsh-refcard.tex.in'.
+#   If the section number is omitted, the 'default' section is assumed.
+#   Furthermore, in 'grml-zsh-refcard.tex.in' @@INSERT-aliases@@ is
+#   exactly the same as @@INSERT-aliases-default@@. If you want a list of
+#   *all* aliases, for example, use @@INSERT-aliases-all@@.
+#}}}
+
 # zsh profiling {{{
 # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details
   if [[ -n $ZSH_PROFILE_RC ]] ; then
 # }}}
 
 # locale setup {{{
-  if [ -n "$LANG" ]  ; then
+  if [[ -n "$LANG" ]]  ; then
      export LANG
   else
-     [ -r /etc/default/locale ] && source /etc/default/locale
+     [[ -r /etc/default/locale ]] && source /etc/default/locale
   fi
-  [ -n "$LANG" ]          && export LANG || export LANG="en_US.iso885915"
-  [ -n "$LC_ALL" ]        && export LC_ALL
-  [ -n "$LC_MESSAGES" ]   && export LC_MESSAGES
+  [[ -n "$LANG" ]]          && export LANG || export LANG="en_US.iso885915"
+  [[ -n "$LC_ALL" ]]        && export LC_ALL
+  [[ -n "$LC_MESSAGES" ]]   && export LC_MESSAGES
 
-  [ -r /etc/sysconfig/keyboard ] && source /etc/sysconfig/keyboard
-  [ -r /etc/timezone ] && TZ=$(cat /etc/timezone)
+  [[ -r /etc/sysconfig/keyboard ]] && source /etc/sysconfig/keyboard
+  [[ -r /etc/timezone ]] && TZ=$(cat /etc/timezone)
 # }}}
 
 # check for potentially old files in 'completion.d' {{{
 # 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(){
 # grml specific stuff
 #f1# Checks whether or not you're running grml
   isgrml(){
-    [ -f /etc/grml_version ] && return 0
+    [[ -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
+    [[ -f /etc/grml_cd ]] && return 0
     return 1
   }
 
   #f1# Checks whether or not you're running grml-small
     isgrmlsmall() {
     [[ ${${${(f)"$(</etc/grml_version)"}%% *}##*-} == 'small' ]] && return 0 ; return 1
-  }
+    }
   else
     isgrmlsmall() { return 1 }
   fi
 # important for rungetty -> autologin
 # Thanks go to Bart Schaefer!
   isgrml && checkhome() {
-  if [[ -z "$ALREADY_DID_CD_HOME" ]]; then
+  if [[ -z "$ALREADY_DID_CD_HOME" ]] ; then
      export ALREADY_DID_CD_HOME=$HOME
      cd
   fi
 
 # {{{ set some variables
   #v#
-  export EDITOR=${EDITOR:-vim}
+  if type -p vim &>/dev/null ; then
+     export EDITOR=${EDITOR:-vim}
+  else
+     export EDITOR=${EDITOR:-vi}
+  fi
   #v#
+
   export MAIL=${MAIL:-/var/mail/$USER}
+
   # if we don't set $SHELL then aterm, rxvt,.. will use /bin/sh or /bin/bash :-/
   export SHELL='/bin/zsh'
-  [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
-  [ -x $(which dircolors) ] && eval `dircolors -b`
 
-# Search path for the cd comman
-#  cdpath=(.. ~)
+  # color setup for ls:
+  [[ -x $(type dircolors) ]] && eval `dircolors -b`
+
+  # set width of man pages to 80 for more convenient reading
+  # (( ${+MANWIDTH} )) || export MANWIDTH=80
+
+  # Search path for the cd command
+  #  cdpath=(.. ~)
 
-# completion functions go to /etc/zsh/completion.d
-# function files may be put into /etc/zsh/functions.d, from where they
-# will be automatically autoloaded.
-  if [ -n "$BROKEN_COMPLETION_DIR" ] ; then
+  # completion functions go to /etc/zsh/completion.d
+  # function files may be put into /etc/zsh/functions.d, from where they
+  # will be automatically autoloaded.
+  if [[ -n "$BROKEN_COMPLETION_DIR" ]] ; then
      print 'Warning: not setting completion directories because broken files have been found.'>&2
   else
      [[ -d /etc/zsh/completion.d ]] && fpath+=( /etc/zsh/completion.d )
      fi
   fi
 
-# automatically remove duplicates from these arrays
+  # automatically remove duplicates from these arrays
   typeset -U path cdpath fpath manpath
 # }}}
 
 # {{{ keybindings
- if [[ "$TERM" != emacs ]]; then
+ if [[ "$TERM" != emacs ]] ; then
   [[ -z "$terminfo[kdch1]" ]] || bindkey -M emacs "$terminfo[kdch1]" delete-char
   [[ -z "$terminfo[khome]" ]] || bindkey -M emacs "$terminfo[khome]" beginning-of-line
   [[ -z "$terminfo[kend]"  ]] || bindkey -M emacs "$terminfo[kend]"  end-of-line
@@ -218,7 +302,7 @@ fi
 # use vi style:
 # bindkey -v
 
-#if [[ "$TERM" == screen ]]; then
+#if [[ "$TERM" == screen ]] ; then
   bindkey '\e[1~' beginning-of-line       # home
   bindkey '\e[4~' end-of-line             # end
   bindkey '\e[A'  up-line-or-search       # cursor up
@@ -241,7 +325,7 @@ fi
 
 # just type 'cd ...' to get 'cd ../..'
 #  rationalise-dot() {
-#  if [[ $LBUFFER = *.. ]]; then
+#  if [[ $LBUFFER = *.. ]] ; then
 #    LBUFFER+=/..
 #  else
 #    LBUFFER+=.
@@ -358,7 +442,7 @@ fi
   # fi
   alias url-quote='autoload -U url-quote-magic ; zle -N self-insert url-quote-magic'
 
-  #m# k ESC-h Call \kbd{run-help} for the 1st word on the commandline
+  #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'
 
@@ -378,12 +462,20 @@ fi
          done
 
 # autoload zsh modules when they are referenced
-  is4 && for opt mod in a  stat    \
-                        a  zpty    \
-                        ap zprof   \
-                        ap mapfile ; do
-             zmodload -${opt} zsh/${mod} ${mod}
-         done ; unset opt mod
+  if is4 ; then
+    tmpargs=(
+      a   stat
+      a   zpty
+      ap  zprof
+      ap  mapfile
+    )
+
+    while (( ${#tmpargs} > 0 )) ; do
+      zmodload -${tmpargs[1]} zsh/${tmpargs[2]} ${tmpargs[2]}
+      shift 2 tmpargs
+    done
+    unset tmpargs
+  fi
 
   is4 && autoload -U insert-files && \
   zle -N insert-files && \
@@ -405,8 +497,8 @@ fi
 
 # press "ctrl-e d" to insert the actual date in the form yyyy-mm-dd
   _bkdate() { BUFFER="$BUFFER$(date '+%F')"; CURSOR=$#BUFFER; }
-  #k# Insert a timestamp on the commandline (yyyy-mm-dd)
-  bindkey '\C-ed' _bkdate
+  #k# Insert a timestamp on the command line (yyyy-mm-dd)
+  bindkey '^Ed' _bkdate
   zle -N _bkdate
 
 # press esc-m for inserting last typed word again (thanks to caphuso!)
@@ -436,11 +528,12 @@ fi
 #  zle -N mquote && bindkey '^q' mquote
 
 # run command line as user root via sudo:
-  _sudo-command-line() {
-    [[ $BUFFER != sudo\ * ]] && LBUFFER="sudo $LBUFFER"
+  sudo-command-line() {
+    [[ -z $BUFFER ]] && zle up-history
+    [[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER"
   }
-  zle -N sudo-command-line _sudo-command-line
-#k# Put the current commandline into a \kbd{sudo} call
+  zle -N sudo-command-line
+#k# Put the current command line into a \kbd{sudo} call
   bindkey "^Os" sudo-command-line
 
 ### jump behind the first word on the cmdline.
@@ -494,9 +587,10 @@ fi
   setopt auto_pushd           # make cd push the old directory onto the directory stack.
   setopt nonomatch            # try to avoid the 'zsh: no matches found...'
   setopt nobeep               # avoid "beep"ing
+  setopt pushd_ignore_dups    # don't push the same dir twice.
 
   MAILCHECK=30       # mailchecks
-  REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 secondes
+  REPORTTIME=5       # report about cpu-/system-/user-time of command if running longer than 5 seconds
   watch=(notme root) # watch for everyone but me and root
 
 # define word separators (for stuff like backward-word, forward-word, backward-kill-word,..)
@@ -527,8 +621,8 @@ fi
 
 # dirstack handling {{{
   DIRSTACKSIZE=20
-  if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]]; then
-     dirstack=( ${(uf)"$(< ~/.zdirs)"} )
+  if [[ -f ~/.zdirs ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
+     dirstack=( ${(f)"$(< ~/.zdirs)"} )
      # "cd -" won't work after login by just setting $OLDPWD, so
      [[ -d $dirstack[0] ]] && cd $dirstack[0] && cd $OLDPWD
   fi
@@ -538,17 +632,78 @@ fi
 # }}}
 
 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
-  if [ -n "$BATTERY" ] ; then
-     if [ -x $(which acpi) ] ; then
+  if [[ -n "$BATTERY" ]] ; then
+     if [[ -x $(type acpi) ]] ; then
         PERCENT="${(C)${(s| |)$(acpi 2>/dev/null)}[4]}"
-        [ -z "$PERCENT" ] && PERCENT='acpi not present'
-        if [ "${PERCENT%%%}" -lt 20 ] ; then
+        [[ -z "$PERCENT" ]] && PERCENT='acpi not present'
+        if [[ "${PERCENT%%%}" -lt 20 ]] ; then
            PERCENT="warning: ${PERCENT}%"
         fi
      fi
   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
+    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"
+    }
+
+    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"
+    }
+
+    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"
+    }
+
+    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"
+    }
+
+    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}}"
+  }
+# }}}
+
 # {{{ set prompt
   if autoload promptinit && promptinit 2>/dev/null ; then
      promptinit # people should be able to use their favourite prompt
@@ -556,26 +711,29 @@ fi
      print 'Notice: no promptinit available :('
   fi
 
+
 # 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
-  is4 && setopt transient_rprompt
+  is41 && setopt transient_rprompt
 
   is4 && [[ -z $NOPRECMD ]] && precmd () {
       [[ -n $NOPRECMD ]] && return 0
       # allow manual overwriting of RPROMPT
       if [[ -n $RPROMPT ]] ; then
          [[ $TERM == screen* ]] && echo -n $'\ekzsh\e\\'
-         return 0
+         return 0
       fi
       # just use DONTSETRPROMPT=1 to be able to overwrite RPROMPT
       if [[ -z $DONTSETRPROMPT ]] ; then
          if [[ -n $BATTERY ]] ; then
             RPROMPT="%(?..:()% ${PERCENT}${SCREENTITLE}"
             # RPROMPT="${PERCENT}${SCREENTITLE}"
+         elif [[ -n $VCS ]] ; then
+            RPROMPT="%(?..:()% $(__vcs_dir)${SCREENTITLE}"
          else
             RPROMPT="%(?..:()% ${SCREENTITLE}"
             # RPROMPT="${SCREENTITLE}"
@@ -601,13 +759,13 @@ fi
       fi
   # get the name of the program currently running and hostname of local machine
   # set screen window title if running in a screen
-      if [[ "$TERM" == screen* ]]; then
-         # local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]}       # dont't use hostname
+      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\\"
       fi
   # set the screen title to "zsh" when sitting at the command prompt:
-      if [[ "$TERM" == screen* ]]; then
+      if [[ "$TERM" == screen* ]] ; then
          SCREENTITLE=$'%{\ekzsh\e\\%}'
       else
          SCREENTITLE=''
@@ -642,7 +800,7 @@ fi
   PS4='+%N:%i:%_> ' # the execution trace prompt (setopt xtrace). default: '+%N:%i>'
 
   # set variable debian_chroot if running in a chroot with /etc/debian_chroot
-  if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
+  if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
     debian_chroot=$(cat /etc/debian_chroot)
   fi
 
@@ -652,7 +810,7 @@ fi
   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)
-    if [[ -n $GRMLPROMPT ]]; then
+    if [[ -n $GRMLPROMPT ]] ; then
       PROMPT="${RED}${EXITCODE}${CYAN}[%j running job(s)] ${GREEN}{history#%!} ${RED}%(3L.+.) ${BLUE}%* %D
 ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
     else
@@ -665,7 +823,7 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
   fi
 
   # if we are inside a grml-chroot set a specific prompt theme
-  if [ -n "$GRML_CHROOT" ] ; then
+  if [[ -n "$GRML_CHROOT" ]] ; then
      PROMPT="%{$fg[red]%}(CHROOT) %{$fg_bold[red]%}%n%{$fg_no_bold[white]%}@%m %40<...<%B%~%b%<< %\# "
   fi
 # }}}
@@ -685,16 +843,16 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
 # }}}
 
 # {{{ some aliases
-  if [ $UID = 0 ] ; then
-     [ -r /etc/grml/screenrc ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
-  elif [ -r $HOME/.screenrc ] ; then
+  if [[ $UID = 0 ]] ; then
+     [[ -r /etc/grml/screenrc ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc'
+  elif [[ -r $HOME/.screenrc ]] ; then
      alias screen="/usr/bin/screen -c $HOME/.screenrc"
   else
-     [ -r /etc/grml/screenrc_grml ] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
+     [[ -r /etc/grml/screenrc_grml ]] && alias screen='/usr/bin/screen -c /etc/grml/screenrc_grml'
   fi
 
   # do we have GNU ls with color-support?
-  if ls --help 2>/dev/null |grep -- --color= >/dev/null && [ "$TERM" != dumb ] ; then
+  if ls --help 2>/dev/null |grep -- --color= >/dev/null && [[ "$TERM" != dumb ]] ; then
      #a1# execute \kbd{@a@}:\quad ls with colors
      alias ls='ls -b -CF --color=auto'
      #a1# execute \kbd{@a@}:\quad list all files, with colors
@@ -716,6 +874,11 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
   alias mdstat='cat /proc/mdstat'
   alias ...='cd ../../'
 
+  # generate alias named "$KERNELVERSION-reboot" so you can use boot with kexec:
+  if [[ -x /sbin/kexec -a -r /proc/cmdline ]] ; then
+     alias "$(uname -r)-reboot"="kexec -l --initrd=/boot/initrd.img-"$(uname -r)" --command-line=\"$(cat /proc/cmdline)\" /boot/vmlinuz-"$(uname -r)""
+  fi
+
   alias cp='nocorrect cp'         # no spelling correction on cp
   alias mkdir='nocorrect mkdir'   # no spelling correction on mkdir
   alias mv='nocorrect mv'         # no spelling correction on mv
@@ -730,21 +893,30 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
   alias term2iso="echo 'Setting terminal to iso mode' ; print -n '\e%@'"
   alias term2utf="echo 'Setting terminal to utf-8 mode'; print -n '\e%G'"
 
-  alias utf2iso='if isutfenv ; then
-   for ENV in `env | grep UTF` ; do
-       eval export "$(echo $ENV | sed 's/UTF-8/iso885915/')"
-   done
-   fi'
-  alias iso2utf='if isutfenv ; then
-   for ENV in `env | grep '\.iso'` ; do
-       eval export "$(echo $ENV | sed 's/iso.*/UTF-8/')"
-   done
-   fi'
+  # make sure it is not assigned yet
+  [[ $(whence -w utf2iso &>/dev/null) == 'utf2iso: alias' ]] && unalias utf2iso
+  utf2iso() {
+    if isutfenv ; then
+       for ENV in $(env | command grep -i '.utf') ; do
+           eval export "$(echo $ENV | sed 's/UTF-8/iso885915/ ; s/utf8/iso885915/')"
+       done
+     fi
+  }
+
+  # make sure it is not assigned yet
+  [[ $(whence -w iso2utf &>/dev/null) == 'iso2utf: alias' ]] && unalias iso2utf
+  iso2utf() {
+   if ! isutfenv ; then
+      for ENV in $(env | command grep -i '\.iso') ; do
+          eval export "$(echo $ENV | sed 's/iso.*/UTF-8/ ; s/ISO.*/UTF-8/')"
+      done
+   fi
+ }
 
 # set up software synthesizer via speakup
   alias swspeak='
     aumix -w 90 -v 90 -p 90 -m 90
-    if ! [ -r /dev/softsynth ] ; then
+    if ! [[ -r /dev/softsynth ]] ; then
        flite -o play -t "Sorry, software synthesizer not available. Did you boot with swspeak bootoption?"
        return 1
     else
@@ -760,8 +932,15 @@ ${BLUE}%n${NO_COLOUR}@%m %40<...<%B%~%b%<< %# "
 # I like clean prompt, so provide simple way to get that
   alias 0 &>/dev/null || functions 0 &>/dev/null || alias 0='return 0'
 
+# for really lazy people like mika:
+  type S &>/dev/null || alias S='screen'
+  type s &>/dev/null || alias s='ssh'
+
+# get top 10 shell commands:
+  alias top10='print -l ? ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
+
 # truecrypt; use e.g. via 'truec /dev/ice /mnt/ice' or 'truec -i'
-  if [ -x $(which truecrypt) ] ; then
+  if [[ -x $(type truecrypt) ]] ; then
      if isutfenv ; then
         alias truec='truecrypt --mount-options "rw,sync,dirsync,users,uid=1000,gid=users,umask=077,utf8" '
      else
@@ -820,7 +999,7 @@ Enjoy your grml system with the zsh!$reset_color"
 }
 
 # debian stuff
-  if [ -r /etc/debian_version ] ; then
+  if [[ -r /etc/debian_version ]] ; then
     #a3# Execute \kbd{apt-cache search}
     alias acs='apt-cache search'
     #a3# Execute \kbd{apt-cache show}
@@ -837,8 +1016,8 @@ Enjoy your grml system with the zsh!$reset_color"
     salias ag="apt-get upgrade"
     #a3# Execute \kbd{apt-get update}
     salias au="apt-get update"
-    #a3# Execute \kbd{aptitude update ; aptitude upgrade}
-    salias -a up="aptitude update ; aptitude upgrade"
+    #a3# Execute \kbd{aptitude update ; aptitude safe-upgrade}
+    salias -a up="aptitude update ; aptitude safe-upgrade"
     #a3# Execute \kbd{dpkg-buildpackage}
     alias dbp='dpkg-buildpackage'
     #a3# Execute \kbd{grep-excuses}
@@ -847,7 +1026,7 @@ Enjoy your grml system with the zsh!$reset_color"
     # debian upgrade
     #f3# Execute \kbd{apt-get update \&\& }\\&\quad \kbd{apt-get dist-upgrade}
     upgrade () {
-      if [ -z "$1" ] ; then
+      if [[ -z "$1" ]] ; then
           $SUDO apt-get update
           $SUDO apt-get -u upgrade
       else
@@ -864,7 +1043,7 @@ Enjoy your grml system with the zsh!$reset_color"
     }
 
     isgrmlcd && alias su="sudo -s"          # get a root shell
-    #a1# Take a look at the syslog: \kbd{$PAGER /var/log/syslog}
+    #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}
     alias tlog="tail -f /var/log/syslog"    # follow the syslog
@@ -873,14 +1052,14 @@ Enjoy your grml system with the zsh!$reset_color"
   fi
 
 # sort installed Debian-packages by size
-  if [ -x $(which grep-status) ] ; then
+  if [[ -x $(type grep-status) ]] ; then
      #a3# List installed Debian-packages sorted by size
      alias debs-by-size='grep-status -FStatus -sInstalled-Size,Package -n "install ok installed" | paste -sd "  \n" | sort -rn'
   fi
 
 # if cdrecord is a symlink (to wodim) or isn't present at all warn:
-  if [ -L /usr/bin/cdrecord -o ! -x $(which cdrecord) ] ; then
-     if [ -x $(which wodim) ] ; then
+  if [[ -L /usr/bin/cdrecord -o ! -x $(type cdrecord) ]] ; then
+     if [[ -x $(type wodim) ]] ; then
         alias cdrecord="echo 'cdrecord is not provided under its original name by Debian anymore.
 See #377109 in the BTS of Debian for more details.
 
@@ -889,15 +1068,15 @@ Please use the wodim binary instead' ; return 1"
   fi
 
 # get_tw_cli has been renamed into get_3ware
-  if [ -x $(which get_3ware) ] ; then
+  if [[ -x $(type get_3ware) ]] ; then
      get_tw_cli() {
        echo 'Warning: get_tw_cli has been renamed into get_3ware. Invoking get_3ware for you.'>&2
        get_3ware
      }
   fi
 
-# I hate lacking backward compability, so provide an alternative therefore
-  if ! [ -x $(which apache2-ssl-certificate) ] ; then
+# I hate lacking backward compatibility, so provide an alternative therefore
+  if ! [[ -x $(type apache2-ssl-certificate) ]] ; then
      apache2-ssl-certificate(){
 
      print 'Debian does not ship apache2-ssl-certificate anymore (see #398520). :('
@@ -932,7 +1111,7 @@ Run "grml-tips ssl-certificate" if you need further instructions.
 grmlcomp() {
 ## completion system
   zstyle ':completion:*:approximate:'    max-errors 'reply=( $((($#PREFIX+$#SUFFIX)/3 )) numeric )' # allow one error for every three characters typed in approximate completer
-  zstyle ':completion:*:complete:-command-::commands' ignored-patterns '*\~' # don't complete backup files as executables
+  zstyle ':completion:*:complete:-command-::commands' ignored-patterns '(aptitude-*|*\~)' # don't complete backup files as executables
   zstyle ':completion:*:correct:*'       insert-unambiguous true             # start menu completion only if it could find no unambiguous initial string
   zstyle ':completion:*:corrections'     format $'%{\e[0;31m%}%d (errors: %e)%{\e[0m%}' #
   zstyle ':completion:*:correct:*'       original true                       #
@@ -976,20 +1155,20 @@ grmlcomp() {
     }
 # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
   if [[ -n "$NOCOR" ]] ; then
-    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files
+    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
     setopt nocorrect # do not try to correct the spelling if possible
   else
-#    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _correct _approximate _files
+#    zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _ignored _correct _approximate _files
     setopt correct  # try to correct the spelling if possible
     zstyle -e ':completion:*' completer '
-        if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]]; then
+        if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
           _last_try="$HISTNO$BUFFER$CURSOR"
-          reply=(_complete _match _prefix _files)
+          reply=(_complete _match _ignored _prefix _files)
         else
-          if [[ $words[1] = (rm|mv) ]]; then
+          if [[ $words[1] = (rm|mv) ]] ; then
             reply=(_complete _files)
           else
-            reply=(_oldlist _expand _force_rehash _complete _correct _approximate _files)
+            reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
           fi
         fi'
   fi
@@ -1011,13 +1190,13 @@ grmlcomp() {
   zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
 
 # caching
-  [ -d $ZSHDIR/cache ] && zstyle ':completion:*' use-cache yes && \
+  [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
                           zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
 
 # host completion /* add brackets as vim can't parse zsh's complex cmdlines 8-) {{{ */
   if is42 ; then
-    [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
-    [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
+    [[ -r ~/.ssh/known_hosts ]] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
+    [[ -r /etc/hosts ]] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()
   else
     _ssh_hosts=()
     _etc_hosts=()
@@ -1066,8 +1245,8 @@ grmlcomp() {
 grmlstuff() {
 # people should use 'grml-x'!
   startx() {
-    if [ -e /etc/X11/xorg.conf ] ; then
-       [ -x /usr/bin/startx ] && /usr/bin/startx || /usr/X11R6/bin/startx
+    if [[ -e /etc/X11/xorg.conf ]] ; then
+       [[ -x /usr/bin/startx ]] && /usr/bin/startx "$@" || /usr/X11R6/bin/startx "$@"
     else
       echo "Please use the script \"grml-x\" for starting the X Window System
 because there does not exist /etc/X11/xorg.conf yet.
@@ -1077,8 +1256,8 @@ If you want to use startx anyway please call \"/usr/bin/startx\"."
   }
 
   xinit() {
-    if [ -e /etc/X11/xorg.conf ] ; then
-       [ -x /usr/bin/xinit ] && /usr/bin/xinit || /usr/X11R6/bin/xinit
+    if [[ -e /etc/X11/xorg.conf ]] ; then
+       [[ -x /usr/bin/xinit ]] && /usr/bin/xinit || /usr/X11R6/bin/xinit
     else
       echo "Please use the script \"grml-x\" for starting the X Window System.
 because there does not exist /etc/X11/xorg.conf yet.
@@ -1087,19 +1266,19 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
     fi
   }
 
-  if [ -x $(which 915resolution) ] ; then
+  if [[ -x $(type 915resolution) ]] ; then
      alias 855resolution='echo -e "Please use 915resolution as resolution modify tool for Intel graphic chipset."; return -1'
   fi
 
   #a1# Output version of running grml
   alias grml-version='cat /etc/grml_version'
 
-  if [ -x $(which rebuildfstab) ] ; then
+  if [[ -x $(type rebuildfstab) ]] ; then
      #a1# Rebuild /etc/fstab
      alias grml-rebuildfstab='rebuildfstab -v -r -config'
   fi
 
-  if [ -x $(which grml-debootstrap) ] ; then
+  if [[ -x $(type grml-debootstrap) ]] ; then
      alias debian2hd='print "Installing debian to harddisk is possible via using grml-debootstrap." ; return 1'
   fi
 }
@@ -1112,7 +1291,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 # }}}
 
 # {{{ keephack
-  [ -r /etc/zsh/keephack ] && is4 && source /etc/zsh/keephack
+  [[ -r /etc/zsh/keephack ]] && is4 && source /etc/zsh/keephack
 # }}}
 
 # {{{ wonderful idea of using "e" glob qualifier by Peter Stephenson
@@ -1123,7 +1302,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 # You can also specify the reference file inline; note quotes:
 # $ ls -l *(e:'nt ~/.zshenv':)
   is4 && nt() {
-    if [[ -n $1 ]]; then
+    if [[ -n $1 ]] ; then
       local NTREF=${~1}
     fi
     [[ $REPLY -nt $NTREF ]]
@@ -1137,8 +1316,8 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
   #f1# Reload zsh setup
   reload () {
-   if [[ "$#*" -eq 0 ]]; then
-      [ -r ~/.zshrc ] && . ~/.zshrc
+   if [[ "$#*" -eq 0 ]] ; then
+      [[ -r ~/.zshrc ]] && . ~/.zshrc
    else
       local fn
       for fn in "$@"; do
@@ -1151,10 +1330,10 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   #f1# List symlinks in detail (more detailed version of 'readlink -f' and 'whence -s')
   sll() {
-    [ -z "$1" ] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
+    [[ -z "$1" ]] && printf 'Usage: %s <file(s)>\n' "$0" && return 1
     for i in "$@" ; do
       file=$i
-      while [ -h "$file" ] ; do
+      while [[ -h "$file" ]] ; do
         ls -l $file
         file=$(readlink "$file")
       done
@@ -1169,17 +1348,25 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   else
      manzsh()  { /usr/bin/man zshall |  vim -c "se ft=man| se hlsearch" +/"$1" - ; }
      # manzsh()  { /usr/bin/man zshall |  most +/"$1" ; }
+     # [[ -f ~/.terminfo/m/mostlike ]] && MYLESS='LESS=C TERMINFO=~/.terminfo TERM=mostlike less' || MYLESS='less'
      # manzsh()  { man zshall | $MYLESS -p $1 ; }
   fi
 
-  if [ -x $(which most) ] ; then
+  if [[ -x $(type most) ]] ; then
   #f1# View Debian's changelog of a given package
     dchange() {
-      if [ -r /usr/share/doc/${1}/changelog.Debian.gz ] ; then
+      if [[ -r /usr/share/doc/${1}/changelog.Debian.gz ]] ; then
          most /usr/share/doc/${1}/changelog.Debian.gz
+      elif [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
+         most /usr/share/doc/${1}/changelog.gz
       else
-         if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
-            most /usr/share/doc/${1}/changelog.gz
+         if type -p aptitude &>/dev/null ; then
+            echo "No changelog for package $1 found, using aptitude to retrieve it."
+            if isgrml ; then
+              aptitude -t unstable changelog ${1}
+            else
+              aptitude changelog ${1}
+            fi
          else
             echo "No changelog for package $1 found, sorry."
             return 1
@@ -1191,10 +1378,10 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   #f1# View Debian's NEWS of a given package
     dnews() {
-      if [ -r /usr/share/doc/${1}/NEWS.Debian.gz ] ; then
+      if [[ -r /usr/share/doc/${1}/NEWS.Debian.gz ]] ; then
          most /usr/share/doc/${1}/NEWS.Debian.gz
       else
-         if [ -r /usr/share/doc/${1}/NEWS.gz ] ; then
+         if [[ -r /usr/share/doc/${1}/NEWS.gz ]] ; then
             most /usr/share/doc/${1}/NEWS.gz
          else
             echo "No NEWS file for package $1 found, sorry."
@@ -1207,7 +1394,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   #f1# View upstream's changelog of a given package
     uchange() {
-      if [ -r /usr/share/doc/${1}/changelog.gz ] ; then
+      if [[ -r /usr/share/doc/${1}/changelog.gz ]] ; then
          most /usr/share/doc/${1}/changelog.gz
       else
          echo "No changelog for package $1 found, sorry."
@@ -1225,13 +1412,13 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
 #f1# Edit an alias via zle
   edalias() {
-    [ -z "$1" ] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
+    [[ -z "$1" ]] && { echo "Usage: edalias <alias_to_edit>" ; return 1 } || vared aliases'[$1]' ;
   }
   compdef _aliases edalias
 
 #f1# Edit a function via zle
   edfunc() {
-    [ -z "$1" ] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
+    [[ -z "$1" ]] && { echo "Usage: edfun <function_to_edit>" ; return 1 } || zed -f "$1" ;
   }
   compdef _functions edfunc
 
@@ -1241,12 +1428,10 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 #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 ]] ; then
   for i in Start Restart Stop Force-Reload Reload ; do
     eval "$i() { $SUDO /etc/init.d/\$1 ${i:l} \$2 ; }"
   done
-  # now the completion for this:
-  compctl -g "$(echo /etc/init.d/*(:t))" Start Restart Stop Force-Reload Reload
  fi
 
   #f1# Provides useful information on globbing
@@ -1294,7 +1479,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   # grep for running process, like: 'any vim'
   any() {
-  if [ -z "$1" ] ; then
+  if [[ -z "$1" ]] ; then
      echo "any - grep for process(es) by keyword" >&2
      echo "Usage: any <keyword>" >&2 ; return 1
   else
@@ -1306,9 +1491,9 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   fi
   }
 
-  # After resuming from suspend, system is paging heavilly, leading to very bad interactivity.
+  # After resuming from suspend, system is paging heavily, leading to very bad interactivity.
   # taken from $LINUX-KERNELSOURCE/Documentation/power/swsusp.txt
-  [ -r /proc/1/maps ] && deswap() {
+  [[ -r /proc/1/maps ]] && deswap() {
      print 'Reading /proc/[0-9]*/maps and sending output to /dev/null, this might take a while.'
      cat $(sed -ne 's:.* /:/:p' /proc/[0-9]*/maps | sort -u | grep -v '^/dev/')  > /dev/null
      print 'Finished, running "swapoff -a; swapon -a" may also be useful.'
@@ -1316,13 +1501,13 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   # print hex value of a number
   hex() {
-    [ -n "$1" ] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
+    [[ -n "$1" ]] && printf "%x\n" $1 || { print 'Usage: hex <number-to-convert>' ; return 1 }
   }
 
   # calculate (or eval at all ;-)) with perl => p[erl-]eval
   # hint: also take a look at zcalc -> 'autoload zcalc' -> 'man zshmodules | less -p MATHFUNC'
   peval() {
-    [ -n "$1" ] && CALC="$*" || print "Usage: calc [expression]"
+    [[ -n "$1" ]] && CALC="$*" || print "Usage: calc [expression]"
     perl -e "print eval($CALC),\"\n\";"
   }
   functions peval &>/dev/null && alias calc=peval
@@ -1330,7 +1515,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
   # brltty seems to have problems with utf8 environment and/or font Uni3-Terminus16 under
   # certain circumstances, so work around it, no matter which environment we have
   brltty() {
-    if [ -z "$DISPLAY" ] ; then
+    if [[ -z "$DISPLAY" ]] ; then
        consolechars -f /usr/share/consolefonts/default8x16.psf.gz
        command brltty "$@"
     else
@@ -1340,18 +1525,13 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 
   # just press 'asdf' keys to toggle between dvorak and us keyboard layout
   aoeu() {
-     if [ -n "$XKEYBOARD" -a -n "$KEYTABLE" ] ; then
-        echo -n "Switching to $KEYTABLE keyboard layout: "
-        [ -z "$DISPLAY" ] && $SUDO loadkeys $KEYTABLE &>/dev/null || setxkbmap $XKEYBOARD &>/dev/null
-     else
-        echo -n 'Switching to us keyboard layout: '
-        [ -z "$DISPLAY" ] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
-     fi
+     echo -n 'Switching to us keyboard layout: '
+     [[ -z "$DISPLAY" ]] && $SUDO loadkeys us &>/dev/null || setxkbmap us &>/dev/null
      echo 'Done'
   }
   asdf() {
      echo -n 'Switching to dvorak keyboard layout: '
-     [ -z "$DISPLAY" ] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
+     [[ -z "$DISPLAY" ]] && $SUDO loadkeys dvorak &>/dev/null || setxkbmap dvorak &>/dev/null
      echo 'Done'
   }
   # just press 'asdf' key to toggle from neon layout to us keyboard layout
@@ -1368,9 +1548,9 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
           print 'ipv6 tunnel already set up, nothing to be done.'
           print 'execute: "ifconfig sit1 down ; ifconfig sit0 down" to remove ipv6-tunnel.' ; return 1
        else
-          [ -n "$PUBLIC_IP" ] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
+          [[ -n "$PUBLIC_IP" ]] || local PUBLIC_IP=$(ifconfig $(route -n | awk '/^0\.0\.0\.0/{print $8; exit}') | \
                                              awk '/inet addr:/ {print $2}' | tr -d 'addr:')
-          [ -n "$PUBLIC_IP" ] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
+          [[ -n "$PUBLIC_IP" ]] || { print 'No $PUBLIC_IP set and could not determine default one.' ; return 1 }
           local IPV6ADDR=$(printf "2002:%02x%02x:%02x%02x:1::1" $(print ${PUBLIC_IP//./ }))
           print -n "Setting up ipv6 tunnel $IPV6ADDR via ${PUBLIC_IP}: "
           ifconfig sit0 tunnel ::192.88.99.1 up
@@ -1408,6 +1588,11 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
     exec env -i ENV="/etc/minimal-shellrc" HOME="$HOME" TERM="$TERM" ksh
   }
 
+  # make a backup of a file
+  bk() {
+    cp -a "$1" "${1}_$(date --iso-8601=seconds)"
+  }
+
   # Switching shell safely and efficiently? http://www.zsh.org/mla/workers/2001/msg02410.html
   # bash() {
   #  NO_SWITCH="yes" command bash "$@"
@@ -1421,7 +1606,7 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 # log out? set timeout in seconds {{{
 # TMOUT=1800
 # do not log out in some specific terminals:
-#  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]]; then
+#  if [[ "${TERM}" == ([Exa]term*|rxvt|dtterm|screen*) ]] ; then
 #    unset TMOUT
 #  fi
 # }}}
@@ -1431,20 +1616,20 @@ If you want to use xinit anyway please call \"/usr/bin/xinit\"."
 # }}}
 
 # source another config file if present {{{
-  if [ -r /etc/zsh/zshrc.local ]; then
+  if [[ -r /etc/zsh/zshrc.local ]] ; then
    source /etc/zsh/zshrc.local
   fi
 # }}}
 
 # "persistent history" {{{
 # just write important commands you always need to ~/.important_commands
-  if [ -r ~/.important_commands ] ; then
+  if [[ -r ~/.important_commands ]] ; then
      fc -R ~/.important_commands
   fi
 # }}}
 
 ## genrefcard.pl settings {{{
-### example: split funtions-search 8,16,24,32
+### example: split functions-search 8,16,24,32
 #@# split functions-search 8
 ## }}}