/etc/skel/.zshrc: added zsh-mime-setup, thanks wuehlmaus!
[grml-etc-core.git] / etc / skel / .zshrc
index de649eb..27d1045 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: Son Okt 22 21:25:17 CEST 2006 [mika]
+# Latest change: Die Mai 15 11:21:56 CEST 2007 [mika]
 ################################################################################
 
 # source ~/.zshrc.global {{{
   fi
 # }}}
 
+# autoloading stuff {{{
+  # associate types and extensions:
+  autoload zsh-mime-setup && zsh-mime-setup
+# }}}
+
 # completion system {{{
 # just make sure it is loaded in this file too
   type compinit &>/dev/null || { autoload -U compinit && compinit }
 # }}}
 
+# make sure isgrmlsmall is defined {{{
+  type isgrmlsmall &>/dev/null || function isgrmlsmall () { return 1 }
+# }}}
+
 ## variables {{{
 
+# do you want grmlsmall-specific adjustments?
+  GRMLSMALL_SPECIFIC=1
+
 # set terminal property (used e.g. by msgid-chooser)
   export COLORTERM="yes"
 
 # set default browser
-  if [ -z $BROWSER ] ; then
+  if [ -z "$BROWSER" ] ; then
      if [ -n "$DISPLAY" ] ; then
-        [ -x =firefox ] && export BROWSER=firefox
+        [ -x $(which firefox) ] && export BROWSER=firefox
      else
-        [ -x =w3m ] && export BROWSER=w3m
+        [ -x $(which w3m) ] && export BROWSER=w3m
      fi
   fi
   (( ${+PAGER} ))   || export PAGER="less"
 # These do not have to be at the beginning of the command line.
 # Avoid typing cd ../../ for going two dirs down and so on
 # Usage, e.g.: "$ cd ...' or just '$ ...' with 'setopt auto_cd'
-  alias -g '...'='../..'
-  alias -g '....'='../../..'
-# Usage is "$ somecommand C (this pipes it into 'wc -l'):
-  alias -g BG='& exit'
-  alias -g C='|wc -l'
-  alias -g G='|grep'
-  alias -g H='|head'
-  alias -g Hl=' --help |& less -r'
-  alias -g K='|keep'
-  alias -g L='|less'
-  alias -g LL='|& less -r'
-  alias -g M='|most'
-  alias -g N='&>/dev/null'
-  alias -g R='| tr A-z N-za-m'
-  alias -g SL='| sort | less'
-  alias -g S='| sort'
-  alias -g T='|tail'
-  alias -g V='| vim -'
+# Notice: deactivated by 061112 by default, we use another approach
+# known as "power completion / abbreviation expansion"
+#  alias -g '...'='../..'
+#  alias -g '....'='../../..'
+#  alias -g BG='& exit'
+#  alias -g C='|wc -l'
+#  alias -g G='|grep'
+#  alias -g H='|head'
+#  alias -g Hl=' --help |& less -r'
+#  alias -g K='|keep'
+#  alias -g L='|less'
+#  alias -g LL='|& less -r'
+#  alias -g M='|most'
+#  alias -g N='&>/dev/null'
+#  alias -g R='| tr A-z N-za-m'
+#  alias -g SL='| sort | less'
+#  alias -g S='| sort'
+#  alias -g T='|tail'
+#  alias -g V='| vim -'
 # }}}
 
 ## aliases {{{
   alias conkeror='firefox -chrome chrome://conkeror/content'
 
 # arch/tla stuff
-  alias ldiff='tla what-changed --diffs | less'
-  alias tbp='tla-buildpackage'
-  alias mirror='tla archive-mirror'
-  alias commit='tla commit'
-  alias merge='tla star-merge'
+  if type -p tla &>/dev/null ; then
+     alias tdi='tla what-changed --diffs | less'
+     alias tbp='tla-buildpackage'
+     alias tmi='tla archive-mirror'
+     alias tco='tla commit'
+     alias tme='tla star-merge'
+  fi
 
 # listing stuff
   alias dir="ls -lSrah"
 
 # console stuff
   alias cmplayer='mplayer -vo fbdev'
-  alias fbmplayer='mplayer -vo fbdev'
+  alias fbmplayer='mplayer -vo fbdev -fs -zoom'
   alias fblinks='links2 -driver fb'
 
 # ignore ~/.ssh/known_hosts entries
 #  alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "PreferredAuthentications=keyboard-interactive"'
   alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
+  alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
 
 # use colors when browsing man pages (if not using pinfo or PAGER=most)
   [ -d ~/.terminfo/ ] && alias man='TERMINFO=~/.terminfo/ LESS=C TERM=mostlike PAGER=less man'
 
 # check whether Debian's package management (dpkg) is running
-  alias check_dpkg_running="sudo dpkg_running"
+  salias check_dpkg_running="dpkg_running"
+
+# work around non utf8 capable software in utf environment
+  if [ -x /usr/bin/mrxvt ] ; then
+     isutfenv && [ -n "$LANG" ] && alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} mrxvt"
+  fi
+
+  if [ -x /usr/bin/aterm ] ; then
+     isutfenv && [ -n "$LANG" ] && alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} aterm"
+  fi
+
+  if [ -x /usr/bin/centericq ] ; then
+     isutfenv && [ -n "$LANG" ] && alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} centericq"
+  fi
 # }}}
 
 ## useful functions {{{
   cvsr()    { rcs2log $* | $PAGER }
   cvss()    { cvs status -v $* }
   debbug()  { ${=BROWSER} "http://bugs.debian.org/$*" }
-  debbugm() { bts show --mbox $1 } # provide bugnummer as $1
+  debbugm() { bts show --mbox $1 } # provide bugnummer as "$1"
   disassemble(){ gcc -pipe -S -o - -O -g $* | as -aldh -o /dev/null }
   dmoz()    { ${=BROWSER} http://search.dmoz.org/cgi-bin/search\?search=${1// /_} }
   dwicti()  { ${=BROWSER} http://de.wiktionary.org/wiki/${(C)1// /_} }
   fir()     { firefox -a firefox -remote "openURL($1)" }
   ggogle()  { ${=BROWSER} "http://groups.google.com/groups?q=$*" }
   google()  { ${=BROWSER} "http://www.google.com/search?&num=100&q=$*" }
+  mcd()     { mkdir -p "$@"; cd "$@" } # mkdir && cd
   mdiff()   { diff -udrP "$1" "$2" > diff.`date "+%Y-%m-%d"`."$1" }
   memusage(){ ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc }
   mggogle() { ${=BROWSER} "http://groups.google.com/groups?selm=$*" }
   wikien()  { ${=BROWSER} http://en.wikipedia.org/wiki/"$*" }
   wodeb ()  { ${=BROWSER} "http://packages.debian.org/cgi-bin/search_contents.pl?word=$1&version=${2:-unstable}" }
 
-# Function Usage: doc packagename
-  doc() { cd /usr/share/doc/$1 && ls }
-  _doc() { _files -W /usr/share/doc -/ }
-  compdef _doc doc
+  which google &>/dev/null && gex () { google "\"[ $1]\" $*" } # exact search at google
 
-# debian upgrade
-  upgrade () {
-    if [ -z $1 ] ; then
-        sudo apt-get update
-        sudo apt-get -u upgrade
+  # download video from youtube
+  ytdl() {
+    if ! [ -n "$2" ] ; then
+       print "Usage: ydtl http://youtube.com/watch?v=.... outputfile.flv">&2
+       return 1
     else
-        ssh $1 sudo apt-get update
-        # ask before the upgrade
-        local dummy
-        ssh $1 sudo apt-get --no-act upgrade
-        echo -n "Process the upgrade ?"
-        read -q dummy
-        if [[ $dummy == "y" ]] ; then
-            ssh $1 sudo apt-get -u upgrade --yes
-        fi
+       wget -O${2} "http://youtube.com/get_video?"${${${"$(wget -o/dev/null -O- "${1}" | grep -e watch_fullscreen)"}##*watch_fullscreen\?}%%\&fs=*}
     fi
   }
 
+
+# Function Usage: doc packagename
+  doc() { cd /usr/share/doc/$1 && ls }
+  _doc() { _files -W /usr/share/doc -/ }
+  compdef _doc doc
+
 # make screenshot of current desktop (use 'import' from ImageMagic)
   sshot() {
         [[ ! -d ~/shots  ]] && mkdir ~/shots
         cd ~/shots ; sleep 5; import -window root shot_`date --iso-8601=m`.jpg
   }
 
-
 # list images only
   limg() {
     local -a images
     fi
   }
 
-
 # create pdf file from source code
   makereadable() {
      output=$1
     pcre_compile $1 && \
     pcre_match $2 && echo "regex matches" || echo "regex does not match"
   }
+
 # list files which have been modified within the last x days
   new() { print -l *(m-$1) }
 
     cd ~$dir
   }
 
-# provide useful information on globbing
-  H-Glob() {
-  echo -e "
-      /      directories
-      .      plain files
-      @      symbolic links
-      =      sockets
-      p      named pipes (FIFOs)
-      *      executable plain files (0100)
-      %      device files (character or block special)
-      %b     block special files
-      %c     character special files
-      r      owner-readable files (0400)
-      w      owner-writable files (0200)
-      x      owner-executable files (0100)
-      A      group-readable files (0040)
-      I      group-writable files (0020)
-      E      group-executable files (0010)
-      R      world-readable files (0004)
-      W      world-writable files (0002)
-      X      world-executable files (0001)
-      s      setuid files (04000)
-      S      setgid files (02000)
-      t      files with the sticky bit (01000)
-   print *(m-1)          # Dateien, die vor bis zu einem Tag modifiziert wurden.
-   print *(a1)           # Dateien, auf die vor einem Tag zugegriffen wurde.
-   print *(@)            # Nur Links
-   print *(Lk+50)        # Dateien die ueber 50 Kilobytes grosz sind
-   print *(Lk-50)        # Dateien die kleiner als 50 Kilobytes sind
-   print **/*.c          # Alle *.c - Dateien unterhalb von \$PWD
-   print **/*.c~file.c   # Alle *.c - Dateien, aber nicht 'file.c'
-   print (foo|bar).*     # Alle Dateien mit 'foo' und / oder 'bar' am Anfang
-   print *~*.*           # Nur Dateien ohne '.' in Namen
-   chmod 644 *(.^x)      # make all non-executable files publically readable
-   print -l *(.c|.h)     # Nur Dateien mit dem Suffix '.c' und / oder '.h'
-   print **/*(g:users:)  # Alle Dateien/Verzeichnisse der Gruppe >users<
-   echo /proc/*/cwd(:h:t:s/self//) # Analog zu >ps ax | awk '{print $1}'<"
-  }
-
+# find out which libs define a symbol
+# usage example: 'lcheck strcpy'
   lcheck() {
-   nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1"":[[:xdigit:]]\{8\} . .*$1"
+     if [ -n "$1" ] ; then
+        nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1"
+      else
+        echo "Usage: lcheck <function>" >&2
+     fi
   }
 
 # clean up directory
         print -z "${cmd[$answer]#*$TAB}"
   }
 
-# mkdir && cd
-  mcd() { mkdir -p "$@"; cd "$@" }  # mkdir && cd
-
-# cd && ls
-  cl() { cd $1 && ls -a }
-
 # Use vim to convert plaintext to HTML
-  2html() { vim -u NONE -n -c ':syntax on' -c ':so $VIMRUNTIME/syntax/2html.vim' -c ':wqa' $1 > /dev/null 2> /dev/null }
+  2html() { vim -u NONE -n -c ':syntax on' -c ':so $VIMRUNTIME/syntax/2html.vim' -c ':wqa' $1 &>/dev/null }
 
 # Usage: simple-extract <file>
 # Description: extracts archived files (maybe)
         fi
   }
 
+# follow symlinks
   folsym() {
     if [[ -e $1 || -h $1 ]]; then
         file=$1
   suidfind() { ls -latg $path/*(sN) }
 
 # See above but this is /better/ ... anywise ..
-#  Note: Add $USER and 'find' with "NOPASSWD" in your /etc/sudoers or run it
-#        as root (UID == 0)
   findsuid() {
-    if [ UID != 0 ] ; then
-      print 'Not running as root. Trying to run via sudo...'
-      RUNASROOT=sudo
-    fi
-        print 'Output will be written to ~/suid_* ...'
-        $RUNASROOT find / -type f \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suidfiles.`date "+%Y-%m-%d"`.out 2>&1
-        $RUNASROOT find / -type d \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suiddirs.`date "+%Y-%m-%d"`.out 2>&1
-        $RUNASROOT find / -type f \( -perm -2 -o -perm -20 \) -ls > ~/suid_writefiles.`date "+%Y-%m-%d"`.out 2>&1
-        $RUNASROOT find / -type d \( -perm -2 -o -perm -20 \) -ls > ~/suid_writedirs.`date "+%Y-%m-%d"`.out 2>&1
-        print 'Finished'
+    print 'Output will be written to ~/suid_* ...'
+    $SUDO find / -type f \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suidfiles.`date "+%Y-%m-%d"`.out 2>&1
+    $SUDO find / -type d \( -perm -4000 -o -perm -2000 \) -ls > ~/suid_suiddirs.`date "+%Y-%m-%d"`.out 2>&1
+    $SUDO find / -type f \( -perm -2 -o -perm -20 \) -ls > ~/suid_writefiles.`date "+%Y-%m-%d"`.out 2>&1
+    $SUDO find / -type d \( -perm -2 -o -perm -20 \) -ls > ~/suid_writedirs.`date "+%Y-%m-%d"`.out 2>&1
+    print 'Finished'
   }
 
 # Reload functions.
 # a small check to see which DIR is located on which server/partition.
 # stolen and modified from Sven's zshrc.forall
   dirspace() {
-        for dir in $path;
-        do
-                (cd $dir; echo "-<$dir>"; du -shx .; echo);
+    if [ -n "$1" ] ; then
+       for dir in $* ; do
+          if [ -d "$dir" ] ; then
+             ( cd $dir; echo "-<$dir>"; du -shx .; echo);
+          else
+             echo "warning: $dir does not exist" >&2
+          fi
+       done
+    else
+        for dir in $path; do
+          if [ -d "$dir" ] ; then
+             ( cd $dir; echo "-<$dir>"; du -shx .; echo);
+          else
+             echo "warning: $dir does not exist" >&2
+          fi
         done
+    fi
   }
 
-# $ show_print `cat /etc/passwd`
+# % slow_print `cat /etc/passwd`
   slow_print() {
         for argument in "${@}"
         do
         print ""
   }
 
+# display system state
   status() {
         print ""
         print "Date..: "$(date "+%Y-%m-%d %H:%M:%S")""
         print ""
   }
 
+# Rip an audio CD
   audiorip() {
         mkdir -p ~/ripps
         cd ~/ripps
         fi
   }
 
+# and burn it
   audioburn() {
         cd ~/ripps
         cdrdao write --device $DEVICE --driver generic-mmc audiocd.toc
         fi
   }
 
+# Make an audio CD from all mp3 files
   mkaudiocd() {
         cd ~/ripps
         for i in *.[Mm][Pp]3; do mv "$i" `echo $i | tr '[A-Z]' '[a-z]'`; done
         for i in *.wav; do sox $i.wav -r 44100 $i.wav resample; done
   }
 
+# Create an ISO image. You are prompted for volume name, filename and directory
   mkiso() {
         echo " * Volume name "
         read volume
         mkisofs -o ~/$iso -A $volume -allow-multidot -J -R -iso-level 3 -V $volume -R $files
   }
 
-# generate thumbnails ;)
+# simple thumbnails generator
   genthumbs () {
     rm -rf thumb-* index.html
     echo "
 
 # get x-lite voip software
   getxlite() {
-   [ -d ~/tmp ] || mkdir ~/tmp
-   cd ~/tmp
-   echo "Downloading http://www.counterpath.com/download/X-Lite_Install.tar.gz and storing it in ~/tmp:"
-   if wget http://www.counterpath.com/download/X-Lite_Install.tar.gz ; then
-     unp X-Lite_Install.tar.gz && echo done || echo failed
-   else
-     echo "Error while downloading." ; return 1
-   fi
-   if [ -x xten-xlite/xtensoftphone ] ; then
-     echo "Execute xten-xlite/xtensoftphone to start xlite."
-   fi
+    setopt local_options
+    setopt errreturn
+    [ -d ~/tmp ] || mkdir ~/tmp
+    cd ~/tmp
+    echo "Downloading http://www.counterpath.com/download/X-Lite_Install.tar.gz and storing it in ~/tmp:"
+    if wget http://www.counterpath.com/download/X-Lite_Install.tar.gz ; then
+       unp X-Lite_Install.tar.gz && echo done || echo failed
+    else
+       echo "Error while downloading." ; return 1
+    fi
+    if [ -x xten-xlite/xtensoftphone ] ; then
+       echo "Execute xten-xlite/xtensoftphone to start xlite."
+    fi
    }
 
 # get skype
   getskype() {
-   echo "Downloading debian package of skype."
-   echo "Notice: If you want to use a more recent skype version run 'getskypebeta'."
-   wget http://www.skype.com/go/getskype-linux-deb
-   # mkdir skype.install
-   # dpkg-deb --extract skype_*.deb skype.install/
-   # dpkg-deb --control skype_*.deb skype.install/DEBIAN
-   # sed -i 's/libqt3c102-mt/libqt3-mt/' skype.install/DEBIAN/control
-   # dpkg --build skype.install
-   sudo dpkg -i skype_debian-*.deb && echo "skype installed."
+    setopt local_options
+    setopt errreturn
+    echo "Downloading debian package of skype."
+    echo "Notice: If you want to use a more recent skype version run 'getskypebeta'."
+    wget http://www.skype.com/go/getskype-linux-deb
+    $SUDO dpkg -i skype_debian-*.deb && echo "skype installed."
   }
 
 # get beta-version of skype
   getskypebeta() {
-   echo "Downloading debian package of skype (beta version)."
-   wget http://www.skype.com/go/getskype-linux-beta-deb
-   sudo dpkg -i skype-beta*.deb && echo "skype installed."
+    setopt local_options
+    setopt errreturn
+    echo "Downloading debian package of skype (beta version)."
+    wget http://www.skype.com/go/getskype-linux-beta-deb
+    $SUDO dpkg -i skype-beta*.deb && echo "skype installed."
   }
 
-# get gzimo (voicp software)
+# get gzimo (VoIP software)
   getgizmo() {
+    setopt local_options
+    setopt errreturn
     echo "gconf2-common and libgconf2-4 have to be available. Installing therefor."
-    sudo apt-get update
-    sudo apt-get install gconf2-common libgconf2-4
+    $SUDO apt-get update
+    $SUDO apt-get install gconf2-common libgconf2-4
     wget $(lynx --dump http://www.gizmoproject.com/download-linux.html | awk '/\.deb/ {print $2" "}' | tr -d '\n')
-    sudo dpkg -i libsipphoneapi*.deb bonjour_*.deb gizmo-*.deb && echo "gizmo installed."
+    $SUDO dpkg -i libsipphoneapi*.deb bonjour_*.deb gizmo-*.deb && echo "gizmo installed."
   }
 
 # get AIR - Automated Image and Restore
   getair() {
+    setopt local_options
+    setopt errreturn
     [ -w . ] || { echo 'Error: you do not have write permissions in this directory. Exiting.' ; return 1 }
     local VER='1.2.8'
     wget http://puzzle.dl.sourceforge.net/sourceforge/air-imager/air-$VER.tar.gz
     tar zxf air-$VER.tar.gz
     cd air-$VER
-    INTERACTIVE=no sudo ./install-air-1.2.8
-    [ -x /usr/local/bin/air ] && [ -n "$DISPLAY" ] && sudo air
+    INTERACTIVE=no $SUDO ./install-air-1.2.8
+    [ -x /usr/local/bin/air ] && [ -n "$DISPLAY" ] && $SUDO air
   }
 
 # get specific git commitdiff
     indent -npro -kr -i8 -ts8 -sob -l80 -ss -ncs $*
   }
 
+# highlight important stuff in diff output, usage example: hg diff | hidiff
+  [ -x $(which histring) ] && \
+  alias hidiff="histring -fE '^Comparing files .*|^diff .*' | histring -c yellow -fE '^\-.*' | histring -c green -fE '^\+.*'"
 
 # rename pictures based on information found in exif headers
   exirename() {
        fi
     fi
   }
+
+# open file in vim and jump to line
+# http://www.downgra.de/archives/2007/05/08/T19_21_11/
+  j2v() {
+    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() {
+    local port
+    if [[ ! -z $1 ]]; then
+      port=${2:-143}
+      print "querying imap server on $1:${port}...\n";
+      print "a1 capability\na2 logout\n" | nc $1 ${port}
+    else
+      print "usage:\n  $0 <imap-server> [port]"
+    fi
+  }
+
+# creates a Maildir/ with its {new,cur,tmp} subdirs
+  mkmaildir() {
+    local root subdir
+    root=${MAILDIR_ROOT:-${HOME}/Mail}
+    if [[ -z ${1} ]] ; then print "Usage\n $0 <dirname>" ; fi
+    subdir=${1}
+    mkdir -p ${root}/${subdir}/{cur,new,tmp}
+  }
+
+# xtrename() rename xterm from within GNU-screen
+  xtrename() {
+    if [[ -z ${DISPLAY} ]] ; then
+      printf 'xtrename only makes sense in X11.\n'
+      return 1
+    fi
+    if [[ -z ${1} ]] ; then
+      printf 'usage: xtrename() "title for xterm"\n'
+      printf '  renames the title of xterm from _within_ screen.\n'
+      printf '  Also works without screen.\n'
+      return 0
+    fi
+    print -n "\eP\e]0;${1}\C-G\e\\"
+    return 0
+  }
+
+# hl() highlighted less
+# http://ft.bewatermyfriend.org/comp/data/zsh/zfunct.html
+  if [[ -x $(which highlight) ]] ; then
+    function hl() {
+      local theme lang
+      theme=${HL_THEME:-""}
+      case ${1} in
+        (-l|--list)
+          ( printf 'available languages (syntax parameter):\n\n' ;
+            highlight --list-langs ; ) | less -SMr
+          ;;
+        (-t|--themes)
+          ( printf 'available themes (style parameter):\n\n' ;
+            highlight --list-themes ; ) | less -SMr
+          ;;
+        (-h|--help)
+          printf 'usage: hl <syntax[:theme]> <file>\n'
+          printf '    available options: --list (-l), --themes (-t), --help (-h)\n\n'
+          printf '  Example: hl c main.c\n'
+          ;;
+        (*)
+          if [[ -z ${2} ]] || (( ${#argv} > 2 )) ; then
+            printf 'usage: hl <syntax[:theme]> <file>\n'
+            printf '    available options: --list (-l), --themes (-t), --help (-h)\n'
+            (( ${#argv} > 2 )) && printf '  Too many arguments.\n'
+            return 1
+          fi
+          lang=${1%:*}
+          [[ ${1} == *:* ]] && [[ -n ${1#*:} ]] && theme=${1#*:}
+          if [[ -n ${theme} ]] ; then
+            highlight --xterm256 --syntax ${lang} --style ${theme} ${2} | less -SMr
+          else
+            highlight --ansi --syntax ${lang} ${2} | less -SMr
+          fi
+          ;;
+      esac
+      return 0
+    }
+    # ... and a proper completion for hl()
+    # needs 'highlight' as well, so it fits fine in here.
+    function _hl_genarg()  {
+      local expl
+      if [[ -prefix 1 *: ]] ; then
+        local themes
+        themes=(${${${(f)"$(LC_ALL=C highlight --list-themes)"}/ #/}:#*(Installed|Use name)*})
+        compset -P 1 '*:'
+        _wanted -C list themes expl theme compadd ${themes}
+      else
+        local langs
+        langs=(${${${(f)"$(LC_ALL=C highlight --list-langs)"}/ #/}:#*(Installed|Use name)*})
+        _wanted -C list languages expl languages compadd -S ':' -q ${langs}
+      fi
+    }
+    function _hl_complete() {
+      _arguments -s '1: :_hl_genarg' '2:files:_path_files'
+    }
+    compdef _hl_complete hl
+  fi
+
+# create small urls via tinyurl.com using wget, grep and sed
+  zurl() {
+  [[ -z ${1} ]] && print "please give an url to shrink." && return 1
+  local url=${1}
+  local tiny="http://tinyurl.com/create.php?url="
+  #print "${tiny}${url}" ; return
+  wget  -O-             \
+        -o/dev/null     \
+        "${tiny}${url}" \
+    | grep -Eio 'value="(http://tinyurl.com/.*)"' \
+    | sed 's/value=//;s/"//g'
+}
+
 # }}}
 
 # mercurial related stuff {{{
-  if type -p hg >/dev/null 2>&1 ; then
+  if type -p hg &>/dev/null ; then
   # gnu like diff for mercurial
   # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
     hgdi() {
       for i in `hg status -marn "$@"` ; diff -ubwd <(hg cat "$i") "$i"
     }
 
-  # diffstat for specific version of mercurial
+  # build debian package
+    alias hbp='hg-buildpackage'
+
+  # execute commands on the versioned patch-queue from the current repos
+    alias mq='hg -R $(readlink -f $(hg root)/.hg/patches)'
+
+  # diffstat for specific version of a mercurial repository
   #   hgstat      => display diffstat between last revision and tip
   #   hgstat 1234 => display diffstat between revision 1234 and tip
     hgstat() {
       [ -n "$1" ] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
     }
-  fi
+
+  # get current mercurial tip via hg itself
+    gethgclone() {
+      setopt local_options
+      setopt errreturn
+      if [ -f mercurial-tree/.hg ] ; then
+        cd mercurial-tree
+        echo "Running hg pull for retreiving latest version..."
+        hg pull
+        echo "Finished update. Building mercurial"
+        make local
+        echo "Setting \$PATH to $PWD:\$PATH..."
+        export PATH="$PWD:$PATH"
+      else
+        echo "Downloading mercurial via hg"
+        hg clone http://selenic.com/repo/hg mercurial-tree
+        cd mercurial-tree
+        echo "Building mercurial"
+        make local
+        echo "Setting \$PATH to $PWD:\$PATH..."
+        export PATH="$PWD:$PATH"
+        echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
+        # echo "Setting \$PYTHONPATH to PYTHONPATH=\${HOME}/lib/python,"
+        # export PYTHONPATH=${HOME}/lib/python
+      fi
+    }
+
+  fi # end of check whether we have the 'hg'-executable
+
+  # get current mercurial snapshot
+    gethgsnap() {
+      setopt local_options
+      setopt errreturn
+      if [ -f mercurial-snapshot.tar.gz ] ; then
+         echo "mercurial-snapshot.tar.gz exists already, skipping download."
+      else
+        echo "Downloading mercurial snapshot"
+        wget http://www.selenic.com/mercurial/mercurial-snapshot.tar.gz
+      fi
+      echo "Unpacking mercurial-snapshot.tar.gz"
+      tar zxf mercurial-snapshot.tar.gz
+      cd mercurial-snapshot/
+      echo "Installing required build-dependencies"
+      $SUDO apt-get update
+      $SUDO apt-get install python2.4-dev
+      echo "Building mercurial"
+      make local
+      echo "Setting \$PATH to $PWD:\$PATH..."
+      export PATH="$PWD:$PATH"
+      echo "make sure you set it permanent via ~/.zshrc if you plan to use it permanently."
+    }
 # }}}
 
 # some useful commands often hard to remember - let's grep for them {{{
 # print $'\e[?96;0;64c'
 # }}}
 
-# finally source a local zshrc {{{
+# finally source a local zshrc and grmlsmall-specific configuration {{{
+
+# The following file is used to remove zsh-config-items that do not work
+# in grml-small by default.
+# If you do not want these adjustments (for whatever reason),
+# there are three ways to accomplish that:
+#  a) at the beginning of this file (variables section), set
+#     $GRMLSMALL_SPECIFIC to 0 or comment out the variable definition.
+#  b) remove/rename .zshrc.grmlsmall
+#  c) comment out the following line
+  (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall && source ~/.zshrc.grmlsmall
+
 # this allows us to stay in sync with /etc/skel/.zshrc
 # through 'ln -s /etc/skel/.zshrc ~/.zshrc' and put own
 # modifications in ~/.zshrc.local