+ zstyle ':completion:*:messages' format '%d'
+ zstyle ':completion:*:options' auto-description '%d'
+
+ # describe options in full
+ zstyle ':completion:*:options' description 'yes'
+
+ # on processes completion complete all user processes
+ zstyle ':completion:*:processes' command 'ps -au$USER'
+
+ # offer indexes before parameters in subscripts
+ zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
+
+ # provide verbose completion information
+ zstyle ':completion:*' verbose true
+
+ # recent (as of Dec 2007) zsh versions are able to provide descriptions
+ # for commands (read: 1st word in the line) that it will list for the user
+ # to choose from. The following disables that, because it's not exactly fast.
+ zstyle ':completion:*:-command-:*:' verbose false
+
+ # set format for warnings
+ zstyle ':completion:*:warnings' format $'%{\e[0;31m%}No matches for:%{\e[0m%} %d'
+
+ # define files to ignore for zcompile
+ zstyle ':completion:*:*:zcompile:*' ignored-patterns '(*~|*.zwc)'
+ zstyle ':completion:correct:' prompt 'correct to: %e'
+
+ # 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
+ zstyle ':completion:*:man:*' menu yes select
+
+ # provide .. as a completion
+ zstyle ':completion:*' special-dirs ..
+
+ # run rehash on completion so new installed program are found automatically:
+ _force_rehash() {
+ (( CURRENT == 1 )) && rehash
+ return 1
+ }
+
+ ## correction
+ # some people don't like the automatic correction - so run 'NOCOR=1 zsh' to deactivate it
+ if [[ "$NOCOR" -gt 0 ]] ; then
+ zstyle ':completion:*' completer _oldlist _expand _force_rehash _complete _files _ignored
+ setopt nocorrect
+ else
+ # try to be smart about when to use what completer...
+ setopt correct
+ zstyle -e ':completion:*' completer '
+ if [[ $_last_try != "$HISTNO$BUFFER$CURSOR" ]] ; then
+ _last_try="$HISTNO$BUFFER$CURSOR"
+ reply=(_complete _match _ignored _prefix _files)
+ else
+ if [[ $words[1] == (rm|mv) ]] ; then
+ reply=(_complete _files)
+ else
+ reply=(_oldlist _expand _force_rehash _complete _ignored _correct _approximate _files)
+ fi
+ fi'
+ fi
+
+ # command for process lists, the local web server details and host completion
+ zstyle ':completion:*:urls' local 'www' '/var/www/' 'public_html'
+
+ # caching
+ [[ -d $ZSHDIR/cache ]] && zstyle ':completion:*' use-cache yes && \
+ zstyle ':completion::complete:*' cache-path $ZSHDIR/cache/
+
+ # host completion
+ 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=()
+ else
+ _ssh_hosts=()
+ _etc_hosts=()
+ fi
+ hosts=(
+ $(hostname)
+ "$_ssh_hosts[@]"
+ "$_etc_hosts[@]"
+ grml.org
+ localhost
+ )
+ zstyle ':completion:*:hosts' hosts $hosts
+ # TODO: so, why is this here?
+ # zstyle '*' hosts $hosts
+
+ # use generic completion system for programs not yet defined; (_gnu_generic works
+ # with commands that provide a --help option with "standard" gnu-like output.)
+ for compcom in cp deborphan df feh fetchipac head hnb ipacsum mv \
+ pal stow tail uname ; do
+ [[ -z ${_comps[$compcom]} ]] && compdef _gnu_generic ${compcom}
+ done; unset compcom
+
+ # see upgrade function in this file
+ compdef _hosts upgrade
+}
+
+# grmlstuff
+grmlstuff() {
+# people should use 'grml-x'!
+ if check_com -c 915resolution; then
+ 855resolution() {
+ echo "Please use 915resolution as resolution modifying tool for Intel \
+graphic chipset."
+ return -1
+ }
+ fi
+
+ #a1# Output version of running grml
+ alias grml-version='cat /etc/grml_version'
+
+ if check_com -c rebuildfstab ; then
+ #a1# Rebuild /etc/fstab
+ alias grml-rebuildfstab='rebuildfstab -v -r -config'
+ fi
+
+ if check_com -c grml-debootstrap ; then
+ debian2hd() {
+ echo "Installing debian to harddisk is possible by using grml-debootstrap."
+ return 1
+ }
+ fi
+}
+
+# now run the functions
+isgrml && checkhome
+is4 && isgrml && grmlstuff
+is4 && grmlcomp
+
+# keephack
+is4 && xsource "/etc/zsh/keephack"
+
+# wonderful idea of using "e" glob qualifier by Peter Stephenson
+# You use it as follows:
+# $ NTREF=/reference/file
+# $ ls -l *(e:nt:)
+# This lists all the files in the current directory newer than the reference file.
+# You can also specify the reference file inline; note quotes:
+# $ ls -l *(e:'nt ~/.zshenv':)
+is4 && nt() {
+ if [[ -n $1 ]] ; then
+ local NTREF=${~1}
+ fi
+ [[ $REPLY -nt $NTREF ]]
+}
+
+# shell functions
+
+#f1# Provide csh compatibility
+setenv() { typeset -x "${1}${1:+=}${(@)argv[2,$#]}" } # csh compatibility
+
+#f1# Reload an autoloadable function
+freload() { while (( $# )); do; unfunction $1; autoload -U $1; shift; done }
+compdef _functions freload
+
+#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
+ for file in "$@" ; do
+ while [[ -h "$file" ]] ; do
+ ls -l $file
+ file=$(readlink "$file")
+ done
+ done
+}
+
+# fast manual access
+if check_com qma ; then
+ #f1# View the zsh manual
+ manzsh() { qma zshall "$1" }
+ compdef _man qma
+else
+ manzsh() { /usr/bin/man zshall | vim -c "se ft=man| se hlsearch" +/"$1" - ; }
+fi
+
+# TODO: Is it supported to use pager settings like this?
+# PAGER='less -Mr' - If so, the use of $PAGER here needs fixing
+# with respect to wordsplitting. (ie. ${=PAGER})
+if check_com -c $PAGER ; then
+ #f1# View Debian's changelog of a given package
+ dchange() {
+ emulate -L zsh
+ if [[ -r /usr/share/doc/$1/changelog.Debian.gz ]] ; then
+ $PAGER /usr/share/doc/$1/changelog.Debian.gz
+ elif [[ -r /usr/share/doc/$1/changelog.gz ]] ; then
+ $PAGER /usr/share/doc/$1/changelog.gz
+ else
+ if check_com -c aptitude ; 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
+ fi
+ fi
+ }
+ _dchange() { _files -W /usr/share/doc -/ }
+ compdef _dchange dchange
+
+ #f1# View Debian's NEWS of a given package
+ dnews() {
+ emulate -L zsh
+ if [[ -r /usr/share/doc/$1/NEWS.Debian.gz ]] ; then
+ $PAGER /usr/share/doc/$1/NEWS.Debian.gz
+ else
+ if [[ -r /usr/share/doc/$1/NEWS.gz ]] ; then
+ $PAGER /usr/share/doc/$1/NEWS.gz
+ else
+ echo "No NEWS file for package $1 found, sorry."
+ return 1
+ fi
+ fi
+ }
+ _dnews() { _files -W /usr/share/doc -/ }
+ compdef _dnews dnews
+
+ #f1# View upstream's changelog of a given package
+ uchange() {
+ emulate -L zsh
+ if [[ -r /usr/share/doc/$1/changelog.gz ]] ; then
+ $PAGER /usr/share/doc/$1/changelog.gz
+ else
+ echo "No changelog for package $1 found, sorry."
+ return 1
+ fi
+ }
+ _uchange() { _files -W /usr/share/doc -/ }
+ compdef _uchange uchange
+fi
+
+# zsh profiling
+profile() {
+ ZSH_PROFILE_RC=1 $SHELL "$@"
+}
+
+#f1# Edit an alias via zle
+edalias() {
+ [[ -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: edfunc <function_to_edit>" ; return 1 } || zed -f "$1" ;
+}
+compdef _functions edfunc
+
+# use it e.g. via 'Restart apache2'
+#m# f6 Start() \kbd{/etc/init.d/\em{process}}\quad\kbd{start}
+#m# f6 Restart() \kbd{/etc/init.d/\em{process}}\quad\kbd{restart}
+#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 || -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
+ }
+
+ _grmlinitd() {
+ local -a scripts
+ scripts=( /etc/init.d/*(x:t) )
+ _describe "service startup script" scripts
+ }
+
+ for i in Start Restart Stop Force-Reload Reload ; do
+ eval "$i() { __start_stop $i \"\$1\" \"\$2\" ; }"
+ compdef _grmlinitd $i
+ done
+fi
+
+#f1# Provides 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) # Files modified up to a day ago
+ print *(a1) # Files accessed a day ago
+ print *(@) # Just symlinks
+ print *(Lk+50) # Files bigger than 50 kilobytes
+ print *(Lk-50) # Files smaller than 50 kilobytes
+ print **/*.c # All *.c files recursively starting in \$PWD
+ print **/*.c~file.c # Same as above, but excluding 'file.c'
+ print (foo|bar).* # Files starting with 'foo' or 'bar'
+ print *~*.* # All Files that do not contain a dot
+ chmod 644 *(.^x) # make all plain non-executable files publically readable
+ print -l *(.c|.h) # Lists *.c and *.h
+ print **/*(g:users:) # Recursively match all files that are owned by group 'users'
+ echo /proc/*/cwd(:h:t:s/self//) # Analogous to >ps ax | awk '{print $1}'<"
+}
+alias help-zshglob=H-Glob
+
+#v1# set number of lines to display per page
+HELP_LINES_PER_PAGE=20
+#v1# set location of help-zle cache file
+HELP_ZLE_CACHE_FILE=~/.cache/zsh_help_zle_lines.zsh
+#f1# helper function for help-zle, actually generates the help text
+help_zle_parse_keybindings()
+{
+ emulate -L zsh
+ setopt extendedglob
+ unsetopt ksharrays #indexing starts at 1
+
+ #v1# choose files that help-zle will parse for keybindings
+ ((${+HELPZLE_KEYBINDING_FILES})) || HELPZLE_KEYBINDING_FILES=( /etc/zsh/zshrc ~/.zshrc.pre ~/.zshrc ~/.zshrc.local )
+
+ if [[ -r $HELP_ZLE_CACHE_FILE ]]; then
+ local load_cache=0
+ for f ($KEYBINDING_FILES) [[ $f -nt $HELP_ZLE_CACHE_FILE ]] && load_cache=1
+ [[ $load_cache -eq 0 ]] && . $HELP_ZLE_CACHE_FILE && return
+ fi
+
+ #fill with default keybindings, possibly to be overwriten in a file later
+ #Note that due to zsh inconsistency on escaping assoc array keys, we encase the key in '' which we will remove later
+ local -A help_zle_keybindings
+ help_zle_keybindings['<Ctrl>@']="set MARK"
+ help_zle_keybindings['<Ctrl>X<Ctrl>J']="vi-join lines"
+ help_zle_keybindings['<Ctrl>X<Ctrl>B']="jump to matching brace"
+ help_zle_keybindings['<Ctrl>X<Ctrl>U']="undo"
+ help_zle_keybindings['<Ctrl>_']="undo"
+ help_zle_keybindings['<Ctrl>X<Ctrl>F<c>']="find <c> in cmdline"
+ help_zle_keybindings['<Ctrl>A']="goto beginning of line"
+ help_zle_keybindings['<Ctrl>E']="goto end of line"
+ help_zle_keybindings['<Ctrl>t']="transpose charaters"
+ help_zle_keybindings['<Alt>T']="transpose words"
+ help_zle_keybindings['<Alt>s']="spellcheck word"
+ help_zle_keybindings['<Ctrl>K']="backward kill buffer"
+ help_zle_keybindings['<Ctrl>U']="forward kill buffer"
+ help_zle_keybindings['<Ctrl>y']="insert previously killed word/string"
+ help_zle_keybindings["<Alt>'"]="quote line"
+ help_zle_keybindings['<Alt>"']="quote from mark to cursor"
+ help_zle_keybindings['<Alt><arg>']="repeat next cmd/char <arg> times (<Alt>-<Alt>1<Alt>0a -> -10 times 'a')"
+ help_zle_keybindings['<Alt>U']="make next word Uppercase"
+ help_zle_keybindings['<Alt>l']="make next word lowercase"
+ help_zle_keybindings['<Ctrl>Xd']="preview expansion under cursor"
+ help_zle_keybindings['<Alt>q']="push current CL into background, freeing it. Restore on next CL"
+ help_zle_keybindings['<Alt>.']="insert (and interate through) last word from prev CLs"
+ help_zle_keybindings['<Alt>,']="complete word from newer history (consecutive hits)"
+ help_zle_keybindings['<Alt>m']="repeat last typed word on current CL"
+ help_zle_keybindings['<Ctrl>V']="insert next keypress symbol literally (e.g. for bindkey)"
+ help_zle_keybindings['!!:n*<Tab>']="insert last n arguments of last command"
+ help_zle_keybindings['!!:n-<Tab>']="insert arguments n..N-2 of last command (e.g. mv s s d)"
+ help_zle_keybindings['<Alt>H']="run help on current command"
+
+ #init global variables
+ unset help_zle_lines help_zle_sln
+ typeset -g -a help_zle_lines
+ typeset -g help_zle_sln=1
+
+ local k v
+ local lastkeybind_desc contents #last description starting with #k# that we found
+ local num_lines_elapsed=0 #number of lines between last description and keybinding
+ #search config files in the order they a called (and thus the order in which they overwrite keybindings)
+ for f in $HELPZLE_KEYBINDING_FILES; do
+ [[ -r "$f" ]] || continue #not readable ? skip it
+ contents="$(<$f)"
+ for cline in "${(f)contents}"; do
+ #zsh pattern: matches lines like: #k# ..............
+ if [[ "$cline" == (#s)[[:space:]]#\#k\#[[:space:]]##(#b)(*)[[:space:]]#(#e) ]]; then
+ lastkeybind_desc="$match[*]"
+ num_lines_elapsed=0
+ #zsh pattern: matches lines that set a keybinding using bindkey or compdef -k
+ # ignores lines that are commentend out
+ # grabs first in '' or "" enclosed string with length between 1 and 6 characters
+ elif [[ "$cline" == [^#]#(bindkey|compdef -k)[[:space:]](*)(#b)(\"((?)(#c1,6))\"|\'((?)(#c1,6))\')(#B)(*) ]]; then
+ #description prevously found ? description not more than 2 lines away ? keybinding not empty ?
+ if [[ -n $lastkeybind_desc && $num_lines_elapsed -lt 2 && -n $match[1] ]]; then
+ #substitute keybinding string with something readable
+ k=${${${${${${${match[1]/\\e\^h/<Alt><BS>}/\\e\^\?/<Alt><BS>}/\\e\[5~/<PageUp>}/\\e\[6~/<PageDown>}//(\\e|\^\[)/<Alt>}//\^/<Ctrl>}/3~/<Alt><Del>}
+ #put keybinding in assoc array, possibly overwriting defaults or stuff found in earlier files
+ #Note that we are extracting the keybinding-string including the quotes (see Note at beginning)
+ help_zle_keybindings[${k}]=$lastkeybind_desc
+ fi
+ lastkeybind_desc=""
+ else
+ ((num_lines_elapsed++))
+ fi
+ done
+ done
+ unset contents
+ #calculate length of keybinding column
+ local kstrlen=0
+ for k (${(k)help_zle_keybindings[@]}) ((kstrlen < ${#k})) && kstrlen=${#k}
+ #convert the assoc array into preformated lines, which we are able to sort
+ for k v in ${(kv)help_zle_keybindings[@]}; do
+ #pad keybinding-string to kstrlen chars and remove outermost characters (i.e. the quotes)
+ help_zle_lines+=("${(r:kstrlen:)k[2,-2]}${v}")
+ done
+ #sort lines alphabetically
+ help_zle_lines=("${(i)help_zle_lines[@]}")
+ [[ -d ${HELP_ZLE_CACHE_FILE:h} ]] || mkdir -p "${HELP_ZLE_CACHE_FILE:h}"
+ echo "help_zle_lines=(${(q)help_zle_lines[@]})" >| $HELP_ZLE_CACHE_FILE
+ zcompile $HELP_ZLE_CACHE_FILE
+}
+typeset -g help_zle_sln
+typeset -g -a help_zle_lines
+
+#f1# Provides (partially autogenerated) help on keybindings and the zsh line editor
+help-zle()
+{
+ emulate -L zsh
+ unsetopt ksharrays #indexing starts at 1
+ #help lines already generated ? no ? then do it
+ [[ ${+functions[help_zle_parse_keybindings]} -eq 1 ]] && {help_zle_parse_keybindings && unfunction help_zle_parse_keybindings}
+ #already displayed all lines ? go back to the start
+ [[ $help_zle_sln -gt ${#help_zle_lines} ]] && help_zle_sln=1
+ local sln=$help_zle_sln
+ #note that help_zle_sln is a global var, meaning we remember the last page we viewed
+ help_zle_sln=$((help_zle_sln + HELP_LINES_PER_PAGE))
+ zle -M "${(F)help_zle_lines[sln,help_zle_sln-1]}"
+}
+#k# display help for keybindings and ZLE (cycle pages with consecutive use)
+zle -N help-zle && bindkey '^Xz' help-zle
+
+check_com -c qma && alias ?='qma zshall'
+
+# grep for running process, like: 'any vim'
+any() {
+ emulate -L zsh
+ unsetopt KSH_ARRAYS
+ if [[ -z "$1" ]] ; then
+ echo "any - grep for process(es) by keyword" >&2
+ echo "Usage: any <keyword>" >&2 ; return 1
+ else
+ ps xauwww | grep -i --color=auto "[${1[1]}]${1[2,-1]}"
+ fi
+}
+
+
+# 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() {
+ 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.'
+}
+
+# print hex value of a number
+hex() {
+ emulate -L zsh
+ [[ -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]"
+ perl -e "print eval($CALC),\"\n\";"
+}
+functions peval &>/dev/null && alias calc=peval
+
+# just press 'asdf' keys to toggle between dvorak and us keyboard layout
+aoeu() {
+ 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
+ echo 'Done'
+}
+# just press 'asdf' key to toggle from neon layout to us keyboard layout
+uiae() {
+ echo -n 'Switching to us keyboard layout: '
+ setxkbmap us && echo 'Done' || echo 'Failed'
+}
+
+# set up an ipv6 tunnel
+ipv6-tunnel() {
+ emulate -L zsh
+ case $1 in
+ start)
+ if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
+ 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}') | \
+ awk '/inet addr:/ {print $2}' | tr -d 'addr:')
+
+ [[ -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
+ ifconfig sit1 add "$IPV6ADDR" && print done || print failed
+ fi
+ ;;
+ status)
+ if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
+ print 'ipv6 tunnel available' ; return 0
+ else
+ print 'ipv6 tunnel not available' ; return 1
+ fi
+ ;;
+ stop)
+ if ifconfig sit1 2>/dev/null | grep -q 'inet6 addr: 2002:.*:1::1' ; then
+ print -n 'Stopping ipv6 tunnel (sit0 + sit1): '
+ ifconfig sit1 down ; ifconfig sit0 down && print done || print failed
+ else
+ print 'No ipv6 tunnel found, nothing to be done.' ; return 1
+ fi
+ ;;
+ *)
+ print "Usage: ipv6-tunnel [start|stop|status]">&2 ; return 1
+ ;;
+ esac
+}
+
+# run dhclient for wireless device
+iwclient() {
+ sudo dhclient "$(wavemon -d | awk '/device/{print $3}')"
+}
+
+# spawn a minimally set up mksh - useful if you want to umount /usr/.
+minimal-shell() {
+ emulate -L zsh
+ local shell="/bin/mksh"
+
+ if [[ ! -x ${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
+# VIM_OPTIONS
+# set this array to a set of options to vim you always want
+# to have set when calling vim (in .zshrc.local), like:
+# VIM_OPTIONS=( -p )
+# This will cause vim to send every file given on the
+# commandline to be send to it's own tab (needs vim7).
+vim() {
+ VIM_PLEASE_SET_TITLE='yes' command vim ${VIM_OPTIONS} "$@"
+}
+
+# make a backup of a file
+bk() {
+ cp -a "$1" "${1}_$(date --iso-8601=seconds)"
+}
+
+#f1# grep for patterns in grml's zsh setup
+zg() {
+ LANG=C perl -e '
+
+sub usage {
+ print "usage: zg -[anr] <pattern>\n";
+ print " Search for patterns in grml'\''s zshrc.\n";
+ print " zg takes no or exactly one option plus a non empty pattern.\n\n";
+ print " options:\n";
+ print " -- no options (use if your pattern starts in with a dash.\n";
+ print " -a search for the pattern in all code regions\n";
+ print " -n search for the pattern in non-root code only\n";
+ print " -r search in code for everyone (also root) only\n\n";
+ print " The default is -a for non-root users and -r for root.\n\n";
+ print " If you installed the zshrc to a non-default locations (ie *NOT*\n";
+ print " in /etc/zsh/zshrc) do: export GRML_ZSHRC=\$HOME/.zshrc\n";
+ print " ...in case you copied the file to that location.\n\n";
+ exit 1;
+}
+
+if ($ENV{GRML_ZSHRC} ne "") {
+ $RC = $ENV{GRML_ZSHRC};
+} else {
+ $RC = "/etc/zsh/zshrc";
+}
+
+usage if ($#ARGV < 0 || $#ARGV > 1);
+if ($> == 0) { $mode = "allonly"; }
+else { $mode = "all"; }
+
+$opt = $ARGV[0];
+if ($opt eq "--") { shift; }
+elsif ($opt eq "-a") { $mode = "all"; shift; }
+elsif ($opt eq "-n") { $mode = "nonroot"; shift; }
+elsif ($opt eq "-r" ) { $mode = "allonly"; shift; }
+elsif ($opt =~ m/^-/ || $#ARGV > 0) { usage(); }
+
+$pattern = $ARGV[0];
+usage() if ($pattern eq "");
+
+open FH, "<$RC" or die "zg: Could not open $RC: $!\n";
+while ($line = <FH>) {
+ chomp $line;
+ if ($line =~ m/^#:grep:marker:for:mika:/) { $markerfound = 1; next; }
+ next if ($mode eq "nonroot" && markerfound == 0);
+ break if ($mode eq "allonly" && markerfound == 1);
+ print $line, "\n" if ($line =~ /$pattern/);
+}
+close FH;
+exit 0;
+
+ ' -- "$@"
+ return $?
+}
+
+ssl_hashes=( sha512 sha256 sha1 md5 )
+
+for sh in ${ssl_hashes}; do
+ eval 'ssl-cert-'${sh}'() {
+ emulate -L zsh
+ if [[ -z $1 ]] ; then
+ printf '\''usage: %s <file>\n'\'' "ssh-cert-'${sh}'"
+ return 1
+ fi
+ openssl x509 -noout -fingerprint -'${sh}' -in $1
+ }'
+done; unset sh
+
+ssl-cert-fingerprints() {
+ emulate -L zsh
+ local i
+ if [[ -z $1 ]] ; then
+ printf 'usage: ssl-cert-fingerprints <file>\n'
+ return 1
+ fi
+ for i in ${ssl_hashes}
+ do ssl-cert-$i $1;
+ done
+}
+
+ssl-cert-info() {
+ emulate -L zsh
+ if [[ -z $1 ]] ; then
+ printf 'usage: ssl-cert-info <file>\n'
+ return 1
+ fi
+ openssl x509 -noout -text -in $1
+ ssl-cert-fingerprints $1
+}
+
+# make sure our environment is clean regarding colors
+for color in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $color
+
+# "persistent history"
+# just write important commands you always need to ~/.important_commands
+if [[ -r ~/.important_commands ]] ; then
+ fc -R ~/.important_commands
+fi
+
+# load the lookup subsystem if it's available on the system
+zrcautoload lookupinit && lookupinit
+
+#:grep:marker:for:mika: :-)
+### non-root (EUID != 0) code below
+###
+
+if (( GRML_ALWAYS_LOAD_ALL == 0 )) && (( $EUID == 0 )) ; then
+ zrclocal
+ return 0
+fi
+
+# variables
+
+# set terminal property (used e.g. by msgid-chooser)
+export COLORTERM="yes"
+
+#m# v QTDIR \kbd{/usr/share/qt[34]}\quad [for non-root only]
+[[ -d /usr/share/qt3 ]] && export QTDIR=/usr/share/qt3
+[[ -d /usr/share/qt4 ]] && export QTDIR=/usr/share/qt4
+
+# support running 'jikes *.java && jamvm HelloWorld' OOTB:
+#v# [for non-root only]
+[[ -f /usr/share/classpath/glibj.zip ]] && export JIKESPATH=/usr/share/classpath/glibj.zip
+
+# aliases
+
+# Xterm resizing-fu.
+# Based on http://svn.kitenet.net/trunk/home-full/.zshrc?rev=11710&view=log (by Joey Hess)
+alias hide='echo -en "\033]50;nil2\007"'
+alias tiny='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-80-*-*-c-*-iso8859-15\007"'
+alias small='echo -en "\033]50;6x10\007"'
+alias medium='echo -en "\033]50;-misc-fixed-medium-r-normal--13-120-75-75-c-80-iso8859-15\007"'
+alias default='echo -e "\033]50;-misc-fixed-medium-r-normal-*-*-140-*-*-c-*-iso8859-15\007"'
+alias large='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-150-*-*-c-*-iso8859-15\007"'
+alias huge='echo -en "\033]50;-misc-fixed-medium-r-normal-*-*-210-*-*-c-*-iso8859-15\007"'
+alias smartfont='echo -en "\033]50;-artwiz-smoothansi-*-*-*-*-*-*-*-*-*-*-*-*\007"'
+alias semifont='echo -en "\033]50;-misc-fixed-medium-r-semicondensed-*-*-120-*-*-*-*-iso8859-15\007"'
+
+# general
+#a2# Execute \kbd{du -sch}
+alias da='du -sch'
+#a2# Execute \kbd{jobs -l}
+alias j='jobs -l'
+
+# compile stuff
+#a2# Execute \kbd{./configure}
+alias CO="./configure"
+#a2# Execute \kbd{./configure --help}
+alias CH="./configure --help"
+
+# listing stuff
+#a2# Execute \kbd{ls -lSrah}
+alias dir="ls -lSrah"
+#a2# Only show dot-directories
+alias lad='ls -d .*(/)' # only show dot-directories
+#a2# Only show dot-files
+alias lsa='ls -a .*(.)' # only show dot-files
+#a2# Only files with setgid/setuid/sticky flag
+alias lss='ls -l *(s,S,t)' # only files with setgid/setuid/sticky flag
+#a2# Only show 1st ten symlinks
+alias lsl='ls -l *(@)' # only symlinks
+#a2# Display only executables
+alias lsx='ls -l *(*)' # only executables
+#a2# Display world-{readable,writable,executable} files
+alias lsw='ls -ld *(R,W,X.^ND/)' # world-{readable,writable,executable} files
+#a2# Display the ten biggest files
+alias lsbig="ls -flh *(.OL[1,10])" # display the biggest files
+#a2# Only show directories
+alias lsd='ls -d *(/)' # only show directories
+#a2# Only show empty directories
+alias lse='ls -d *(/^F)' # only show empty directories
+#a2# Display the ten newest files
+alias lsnew="ls -rtlh *(D.om[1,10])" # display the newest files
+#a2# Display the ten oldest files
+alias lsold="ls -rtlh *(D.Om[1,10])" # display the oldest files
+#a2# Display the ten smallest files
+alias lssmall="ls -Srl *(.oL[1,10])" # display the smallest files
+
+# chmod
+#a2# Execute \kbd{chmod 600}
+alias rw-='chmod 600'
+#a2# Execute \kbd{chmod 700}
+alias rwx='chmod 700'
+#m# a2 r-{}- Execute \kbd{chmod 644}
+alias r--='chmod 644'
+#a2# Execute \kbd{chmod 755}
+alias r-x='chmod 755'
+
+# some useful aliases
+#a2# Execute \kbd{mkdir -p}
+alias md='mkdir -p'
+#a2# Remove current empty directory. Execute \kbd{cd ..; rmdir $OLDCWD}
+alias rmcdir='cd ..; rmdir $OLDPWD || cd $OLDPWD'
+
+# console stuff
+#a2# Execute \kbd{mplayer -vo fbdev}
+alias cmplayer='mplayer -vo fbdev'
+#a2# Execute \kbd{mplayer -vo fbdev -fs -zoom}
+alias fbmplayer='mplayer -vo fbdev -fs -zoom'
+#a2# Execute \kbd{links2 -driver fb}
+alias fblinks='links2 -driver fb'
+
+#a2# ssh with StrictHostKeyChecking=no \\&\quad and UserKnownHostsFile unset
+alias insecssh='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
+alias insecscp='scp -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null"'
+
+# simple webserver
+check_com -c python && alias http="python -m SimpleHTTPServer"
+
+# Use 'g' instead of 'git':
+check_com g || alias g='git'
+
+# work around non utf8 capable software in utf environment via $LANG and luit
+if check_com isutfenv && check_com luit ; then
+ if check_com -c mrxvt ; then
+ isutfenv && [[ -n "$LANG" ]] && \
+ alias mrxvt="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit mrxvt"
+ fi
+
+ if check_com -c aterm ; then
+ isutfenv && [[ -n "$LANG" ]] && \
+ alias aterm="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit aterm"
+ fi
+
+ if check_com -c centericq ; then
+ isutfenv && [[ -n "$LANG" ]] && \
+ alias centericq="LANG=${LANG/(#b)(*)[.@]*/$match[1].iso885915} luit centericq"
+ fi
+fi
+
+# useful functions
+
+# searching
+#f4# Search for newspostings from authors
+agoogle() { ${=BROWSER} "http://groups.google.com/groups?as_uauthors=$*" ; }
+#f4# Search Debian Bug Tracking System
+debbug() {
+ emulate -L zsh
+ setopt extendedglob
+ if [[ $# -eq 1 ]]; then
+ case "$1" in
+ ([0-9]##)
+ ${=BROWSER} "http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=$1"
+ ;;
+ (*@*)
+ ${=BROWSER} "http://bugs.debian.org/cgi-bin/pkgreport.cgi?submitter=$1"
+ ;;
+ (*)
+ ${=BROWSER} "http://bugs.debian.org/$*"
+ ;;
+ esac
+ else
+ print "$0 needs one argument"
+ return 1
+ fi
+}
+#f4# Search Debian Bug Tracking System in mbox format
+debbugm() {
+ emulate -L zsh
+ bts show --mbox $1
+}
+#f4# Search DMOZ
+dmoz() {
+ emulate -L zsh
+ ${=BROWSER} http://search.dmoz.org/cgi-bin/search\?search=${1// /_}
+}
+#f4# Search German Wiktionary
+dwicti() {
+ emulate -L zsh
+ ${=BROWSER} http://de.wiktionary.org/wiki/${(C)1// /_}
+}
+#f4# Search English Wiktionary
+ewicti() {
+ emulate -L zsh
+ ${=BROWSER} http://en.wiktionary.org/wiki/${(C)1// /_}
+}
+#f4# Search Google Groups
+ggogle() {
+ emulate -L zsh
+ ${=BROWSER} "http://groups.google.com/groups?q=$*"
+}
+#f4# Search Google
+google() {
+ emulate -L zsh
+ ${=BROWSER} "http://www.google.com/search?&num=100&q=$*"
+}
+#f4# Search Google Groups for MsgID
+mggogle() {
+ emulate -L zsh
+ ${=BROWSER} "http://groups.google.com/groups?selm=$*"
+}
+#f4# Search Netcraft
+netcraft(){
+ emulate -L zsh
+ ${=BROWSER} "http://toolbar.netcraft.com/site_report?url=$1"
+}
+#f4# Use German Wikipedia's full text search
+swiki() {
+ emulate -L zsh
+ ${=BROWSER} http://de.wikipedia.org/wiki/Spezial:Search/${(C)1}
+}
+#f4# search \kbd{dict.leo.org}
+oleo() {
+ emulate -L zsh
+ ${=BROWSER} "http://dict.leo.org/?search=$*"
+}
+#f4# Search German Wikipedia
+wikide() {
+ emulate -L zsh
+ ${=BROWSER} http://de.wikipedia.org/wiki/"${(C)*}"
+}
+#f4# Search English Wikipedia
+wikien() {
+ emulate -L zsh
+ ${=BROWSER} http://en.wikipedia.org/wiki/"${(C)*}"
+}
+#f4# Search official debs
+wodeb() {
+ emulate -L zsh
+ ${=BROWSER} "http://packages.debian.org/search?keywords=$1&searchon=contents&suite=${2:=unstable}§ion=all"
+}
+
+#m# f4 gex() Exact search via Google
+check_com google && gex () {
+ google "\"[ $1]\" $*"
+}
+
+# misc
+#f5# Backup \kbd{file {\rm to} file\_timestamp}
+bk() {
+ emulate -L zsh
+ cp -b $1 $1_`date --iso-8601=m`
+}
+#f5# Copied diff
+cdiff() {
+ emulate -L zsh
+ diff -crd "$@" | egrep -v "^Only in |^Binary files "
+}
+#f5# cd to directoy and list files
+cl() {
+ emulate -L zsh
+ cd $1 && ls -a
+}
+#f5# Cvs add
+cvsa() {
+ emulate -L zsh
+ cvs add $* && cvs com -m 'initial checkin' $*
+}
+#f5# Cvs diff
+cvsd() {
+ emulate -L zsh
+ cvs diff -N $* |& $PAGER
+}
+#f5# Cvs log
+cvsl() {
+ emulate -L zsh
+ cvs log $* |& $PAGER
+}
+#f5# Cvs update
+cvsq() {
+ emulate -L zsh
+ cvs -nq update
+}
+#f5# Rcs2log
+cvsr() {
+ emulate -L zsh
+ rcs2log $* | $PAGER
+}
+#f5# Cvs status
+cvss() {
+ emulate -L zsh
+ cvs status -v $*
+}
+#f5# Disassemble source files using gcc and as
+disassemble(){
+ emulate -L zsh
+ gcc -pipe -S -o - -O -g $* | as -aldh -o /dev/null
+}
+#f5# Firefox remote control - open given URL
+fir() {
+ if [ -e /etc/debian_version ]; then
+ firefox -a iceweasel -remote "openURL($1)" || firefox ${1}&
+ else
+ firefox -a firefox -remote "openURL($1)" || firefox ${1}&
+ fi
+}
+# smart cd function, allows switching to /etc when running 'cd /etc/fstab'
+cd() {
+ if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
+ [[ ! -e ${1:h} ]] && return 1
+ print "Correcting ${1} to ${1:h}"
+ builtin cd ${1:h}
+ else
+ builtin cd "$@"
+ fi
+}
+
+#f5# Create Directoy and \kbd{cd} to it
+mcd() {
+ mkdir -p "$@" && cd "$@"
+}
+#f5# Create temporary directory and \kbd{cd} to it
+cdt() {
+ local t
+ t=$(mktemp -d)
+ echo "$t"
+ builtin cd "$t"
+}
+#f5# Unified diff to timestamped outputfile
+mdiff() {
+ diff -udrP "$1" "$2" > diff.`date "+%Y-%m-%d"`."$1"
+}
+
+#f5# Create directory under cursor or the selected area
+# Press ctrl-xM to create the directory under the cursor or the selected area.
+# To select an area press ctrl-@ or ctrl-space and use the cursor.
+# Use case: you type "mv abc ~/testa/testb/testc/" and remember that the
+# directory does not exist yet -> press ctrl-XM and problem solved
+inplaceMkDirs() {
+ local PATHTOMKDIR
+ if ((REGION_ACTIVE==1)); then
+ local F=$MARK T=$CURSOR
+ if [[ $F -gt $T ]]; then
+ F=${CURSOR}
+ T=${MARK}
+ fi
+ # get marked area from buffer and eliminate whitespace
+ PATHTOMKDIR=${BUFFER[F+1,T]%%[[:space:]]##}
+ PATHTOMKDIR=${PATHTOMKDIR##[[:space:]]##}
+ else
+ local bufwords iword
+ bufwords=(${(z)LBUFFER})
+ iword=${#bufwords}
+ bufwords=(${(z)BUFFER})
+ PATHTOMKDIR="${(Q)bufwords[iword]}"
+ fi
+ [[ -z "${PATHTOMKDIR}" ]] && return 1
+ if [[ -e "${PATHTOMKDIR}" ]]; then
+ zle -M " path already exists, doing nothing"
+ else
+ zle -M "$(mkdir -p -v "${PATHTOMKDIR}")"
+ zle end-of-line
+ fi
+}
+#k# mkdir -p <dir> from string under cursor or marked area
+zle -N inplaceMkDirs && bindkey '^XM' inplaceMkDirs
+
+#f5# Memory overview
+memusage() {
+ ps aux | awk '{if (NR > 1) print $5; if (NR > 2) print "+"} END { print "p" }' | dc
+}
+#f5# Show contents of gzipped tar file
+shtar() {
+ emulate -L zsh
+ gunzip -c $1 | tar -tf - -- | $PAGER
+}
+#f5# Show contents of zip file
+shzip() {
+ emulate -L zsh
+ unzip -l $1 | $PAGER
+}
+#f5# Unified diff
+udiff() {
+ emulate -L zsh
+ diff -urd $* | egrep -v "^Only in |^Binary files "
+}
+#f5# (Mis)use \kbd{vim} as \kbd{less}
+viless() {
+ emulate -L zsh
+ vim --cmd 'let no_plugin_maps = 1' -c "so \$VIMRUNTIME/macros/less.vim" "${@:--}"
+}
+
+# Function Usage: uopen $URL/$file
+#f5# Download a file and display it locally
+uopen() {
+ emulate -L zsh
+ if ! [[ -n "$1" ]] ; then
+ print "Usage: uopen \$URL/\$file">&2
+ return 1
+ else
+ FILE=$1
+ MIME=$(curl --head $FILE | grep Content-Type | cut -d ' ' -f 2 | cut -d\; -f 1)
+ MIME=${MIME%$'\r'}
+ curl $FILE | see ${MIME}:-
+ fi
+}
+
+# Function Usage: doc packagename
+#f5# \kbd{cd} to /usr/share/doc/\textit{package}
+doc() {
+ emulate -L zsh
+ cd /usr/share/doc/$1 && ls
+}
+_doc() { _files -W /usr/share/doc -/ }
+check_com compdef && compdef _doc doc
+
+#f5# Make screenshot
+sshot() {
+ [[ ! -d ~/shots ]] && mkdir ~/shots
+ #cd ~/shots ; sleep 5 ; import -window root -depth 8 -quality 80 `date "+%Y-%m-%d--%H:%M:%S"`.png
+ cd ~/shots ; sleep 5; import -window root shot_`date --iso-8601=m`.jpg
+}
+
+# list images only
+limg() {
+ local -a images
+ images=( *.{jpg,gif,png}(.N) )
+
+ if [[ $#images -eq 0 ]] ; then
+ print "No image files found"
+ else
+ ls "$images[@]"
+ fi
+}
+
+#f5# Create PDF file from source code
+makereadable() {
+ emulate -L zsh
+ output=$1
+ shift
+ a2ps --medium A4dj -E -o $output $*
+ ps2pdf $output
+}
+
+# zsh with perl-regex - use it e.g. via:
+# regcheck '\s\d\.\d{3}\.\d{3} Euro' ' 1.000.000 Euro'
+#f5# Checks whether a regex matches or not.\\&\quad Example: \kbd{regcheck '.\{3\} EUR' '500 EUR'}
+regcheck() {
+ emulate -L zsh
+ zmodload -i zsh/pcre
+ pcre_compile $1 && \
+ pcre_match $2 && echo "regex matches" || echo "regex does not match"
+}
+
+#f5# List files which have been accessed within the last {\it n} days, {\it n} defaults to 1
+accessed() {
+ emulate -L zsh
+ print -l -- *(a-${1:-1})
+}
+
+#f5# List files which have been changed within the last {\it n} days, {\it n} defaults to 1
+changed() {
+ emulate -L zsh
+ print -l -- *(c-${1:-1})
+}
+
+#f5# List files which have been modified within the last {\it n} days, {\it n} defaults to 1
+modified() {
+ emulate -L zsh
+ print -l -- *(m-${1:-1})
+}
+# modified() was named new() in earlier versions, add an alias for backwards compatibility
+check_com new || alias new=modified
+
+#f5# Grep in history
+greph() {
+ emulate -L zsh
+ history 0 | grep $1
+}
+# use colors when GNU grep with color-support
+#a2# Execute \kbd{grep -{}-color=auto}
+(grep --help 2>/dev/null |grep -- --color) >/dev/null && alias grep='grep --color=auto'
+#a2# Execute \kbd{grep -i -{}-color=auto}
+alias GREP='grep -i --color=auto'
+
+#f5# Watch manpages in a stretched style
+man2() { PAGER='dash -c "sed G | /usr/bin/less"' command man "$@" ; }
+
+# usage example: 'lcheck strcpy'
+#f5# Find out which libs define a symbol
+lcheck() {
+ if [[ -n "$1" ]] ; then
+ nm -go /usr/lib/lib*.a 2>/dev/null | grep ":[[:xdigit:]]\{8\} . .*$1"
+ else
+ echo "Usage: lcheck <function>" >&2
+ fi
+}
+
+#f5# Clean up directory - remove well known tempfiles
+purge() {
+ emulate -L zsh
+ setopt HIST_SUBST_PATTERN
+ local -a TEXTEMPFILES GHCTEMPFILES PYTEMPFILES FILES
+ TEXTEMPFILES=(*.tex(N:s/%tex/'(log|toc|aux|nav|snm|out|tex.backup|bbl|blg|bib.backup|vrb|lof|lot|hd|idx)(N)'/))
+ GHCTEMPFILES=(*.(hs|lhs)(N:r:s/%/'.(hi|hc|(p|u|s)_(o|hi))(N)'/))
+ PYTEMPFILES=(*.py(N:s/%py/'(pyc|pyo)(N)'/))
+ LONELY_MOOD_FILES=((*.mood)(.NDe:'local -a AF;AF=( ${${REPLY#.}%mood}(mp3|flac|ogg|asf|wmv|aac)(N) ); [[ -z "$AF" ]]':))
+ ZSH_COMPILED=(*.zwc(.NDe:'[[ -f ${REPLY%.zwc} && ${REPLY%.zwc} -nt ${REPLY} ]]':))
+ FILES=(*~(.N) \#*\#(.N) *.o(.N) a.out(.N) (*.|)core(.N) *.cmo(.N) *.cmi(.N) .*.swp(.N) *.(orig|rej)(.DN) *.dpkg-(old|dist|new)(DN) ._(cfg|mrg)[0-9][0-9][0-9][0-9]_*(N) ${~TEXTEMPFILES} ${~GHCTEMPFILES} ${~PYTEMPFILES} ${LONELY_MOOD_FILES} ${ZSH_COMPILED} )
+ local NBFILES=${#FILES}
+ local CURDIRSUDO=""
+ [[ ! -w ./ ]] && CURDIRSUDO=$SUDO
+ if [[ $NBFILES > 0 ]] ; then
+ print -l $FILES
+ local ans
+ echo -n "Remove these files? [y/n] "
+ read -q ans; echo
+ if [[ $ans == "y" ]] ; then
+ $CURDIRSUDO rm ${FILES}
+ echo ">> $PWD purged, $NBFILES files removed"
+ else
+ echo "Ok. .. then not.."
+ fi
+ fi
+}
+
+# Translate DE<=>EN
+# 'translate' looks up fot a word in a file with language-to-language
+# translations (field separator should be " : "). A typical wordlist looks
+# like at follows:
+# | english-word : german-transmission
+# It's also only possible to translate english to german but not reciprocal.
+# Use the following oneliner to turn back the sort order:
+# $ awk -F ':' '{ print $2" : "$1" "$3 }' \
+# /usr/local/lib/words/en-de.ISO-8859-1.vok > ~/.translate/de-en.ISO-8859-1.vok
+#f5# Translates a word
+trans() {
+ emulate -L zsh
+ case "$1" in
+ -[dD]*)
+ translate -l de-en $2
+ ;;
+ -[eE]*)
+ translate -l en-de $2
+ ;;
+ *)
+ echo "Usage: $0 { -D | -E }"
+ echo " -D == German to English"
+ echo " -E == English to German"
+ esac
+}
+
+# Usage: simple-extract <file>
+# Using option -d deletes the original archive file.
+#f5# Smart archive extractor
+simple-extract() {
+ emulate -L zsh
+ setopt extended_glob noclobber
+ local DELETE_ORIGINAL DECOMP_CMD USES_STDIN USES_STDOUT GZTARGET WGET_CMD
+ local RC=0
+ zparseopts -D -E "d=DELETE_ORIGINAL"
+ for ARCHIVE in "${@}"; do
+ case $ARCHIVE in
+ *.(tar.bz2|tbz2|tbz))
+ DECOMP_CMD="tar -xvjf -"
+ USES_STDIN=true
+ USES_STDOUT=false
+ ;;
+ *.(tar.gz|tgz))
+ DECOMP_CMD="tar -xvzf -"
+ USES_STDIN=true
+ USES_STDOUT=false
+ ;;
+ *.(tar.xz|txz|tar.lzma))
+ DECOMP_CMD="tar -xvJf -"
+ USES_STDIN=true
+ USES_STDOUT=false
+ ;;
+ *.tar)
+ DECOMP_CMD="tar -xvf -"
+ USES_STDIN=true
+ USES_STDOUT=false
+ ;;
+ *.rar)
+ DECOMP_CMD="unrar x"
+ USES_STDIN=false
+ USES_STDOUT=false
+ ;;
+ *.lzh)
+ DECOMP_CMD="lha x"
+ USES_STDIN=false
+ USES_STDOUT=false
+ ;;
+ *.7z)
+ DECOMP_CMD="7z x"
+ USES_STDIN=false
+ USES_STDOUT=false
+ ;;
+ *.(zip|jar))
+ DECOMP_CMD="unzip"
+ USES_STDIN=false
+ USES_STDOUT=false
+ ;;
+ *.deb)
+ DECOMP_CMD="ar -x"
+ USES_STDIN=false
+ USES_STDOUT=false
+ ;;
+ *.bz2)
+ DECOMP_CMD="bzip2 -d -c -"
+ USES_STDIN=true
+ USES_STDOUT=true
+ ;;
+ *.(gz|Z))
+ DECOMP_CMD="gzip -d -c -"
+ USES_STDIN=true
+ USES_STDOUT=true
+ ;;
+ *.(xz|lzma))
+ DECOMP_CMD="xz -d -c -"
+ USES_STDIN=true
+ USES_STDOUT=true
+ ;;
+ *)
+ print "ERROR: '$ARCHIVE' has unrecognized archive type." >&2
+ RC=$((RC+1))
+ continue
+ ;;
+ esac
+
+ if ! check_com ${DECOMP_CMD[(w)1]}; then
+ echo "ERROR: ${DECOMP_CMD[(w)1]} not installed." >&2
+ RC=$((RC+2))
+ continue
+ fi
+
+ GZTARGET="${ARCHIVE:t:r}"
+ if [[ -f $ARCHIVE ]] ; then
+
+ print "Extracting '$ARCHIVE' ..."
+ if $USES_STDIN; then
+ if $USES_STDOUT; then
+ ${=DECOMP_CMD} < "$ARCHIVE" > $GZTARGET
+ else
+ ${=DECOMP_CMD} < "$ARCHIVE"
+ fi
+ else
+ if $USES_STDOUT; then
+ ${=DECOMP_CMD} "$ARCHIVE" > $GZTARGET
+ else
+ ${=DECOMP_CMD} "$ARCHIVE"
+ fi
+ fi
+ [[ $? -eq 0 && -n "$DELETE_ORIGINAL" ]] && rm -f "$ARCHIVE"
+
+ elif [[ "$ARCHIVE" == (#s)(https|http|ftp)://* ]] ; then
+ if check_com curl; then
+ WGET_CMD="curl -L -k -s -o -"
+ elif check_com wget; then
+ WGET_CMD="wget -q -O - --no-check-certificate"
+ else
+ print "ERROR: neither wget nor curl is installed" >&2
+ RC=$((RC+4))
+ continue
+ fi
+ print "Downloading and Extracting '$ARCHIVE' ..."
+ if $USES_STDIN; then
+ if $USES_STDOUT; then
+ ${=WGET_CMD} "$ARCHIVE" | ${=DECOMP_CMD} > $GZTARGET
+ RC=$((RC+$?))
+ else
+ ${=WGET_CMD} "$ARCHIVE" | ${=DECOMP_CMD}
+ RC=$((RC+$?))
+ fi
+ else
+ if $USES_STDOUT; then
+ ${=DECOMP_CMD} =(${=WGET_CMD} "$ARCHIVE") > $GZTARGET
+ else
+ ${=DECOMP_CMD} =(${=WGET_CMD} "$ARCHIVE")
+ fi
+ fi
+
+ else
+ print "ERROR: '$ARCHIVE' is neither a valid file nor a supported URI." >&2
+ RC=$((RC+8))
+ fi
+ done
+ return $RC
+}
+
+__archive_or_uri()
+{
+ _alternative \
+ 'files:Archives:_files -g "*.(#l)(tar.bz2|tbz2|tbz|tar.gz|tgz|tar.xz|txz|tar.lzma|tar|rar|lzh|7z|zip|jar|deb|bz2|gz|Z|xz|lzma)"' \
+ '_urls:Remote Archives:_urls'
+}
+
+_simple_extract()
+{
+ _arguments \
+ '-d[delete original archivefile after extraction]' \
+ '*:Archive Or Uri:__archive_or_uri'
+}
+compdef _simple_extract simple-extract
+alias se=simple-extract
+
+# Usage: smartcompress <file> (<type>)
+#f5# Smart archive creator
+smartcompress() {
+ emulate -L zsh
+ if [[ -n $2 ]] ; then
+ case $2 in
+ tgz | tar.gz) tar -zcvf$1.$2 $1 ;;
+ tbz2 | tar.bz2) tar -jcvf$1.$2 $1 ;;
+ tar.Z) tar -Zcvf$1.$2 $1 ;;
+ tar) tar -cvf$1.$2 $1 ;;
+ gz | gzip) gzip $1 ;;
+ bz2 | bzip2) bzip2 $1 ;;
+ *)
+ echo "Error: $2 is not a valid compression type"
+ ;;
+ esac
+ else
+ smartcompress $1 tar.gz
+ fi
+}
+
+# Usage: show-archive <archive>
+#f5# List an archive's content
+show-archive() {
+ emulate -L zsh
+ if [[ -f $1 ]] ; then
+ case $1 in
+ *.tar.gz) gunzip -c $1 | tar -tf - -- ;;
+ *.tar) tar -tf $1 ;;
+ *.tgz) tar -ztf $1 ;;
+ *.zip) unzip -l $1 ;;
+ *.bz2) bzless $1 ;;
+ *.deb) dpkg-deb --fsys-tarfile $1 | tar -tf - -- ;;
+ *) echo "'$1' Error. Please go away" ;;
+ esac
+ else
+ echo "'$1' is not a valid archive"
+ fi
+}
+
+# TODO: So, this is the third incarnation of this function!?
+#f5# Reload given functions
+refunc() {
+ for func in $argv ; do
+ unfunction $func
+ autoload $func
+ done
+}
+compdef _functions refunc
+
+#f5# Set all ulimit parameters to \kbd{unlimited}
+allulimit() {
+ ulimit -c unlimited
+ ulimit -d unlimited
+ ulimit -f unlimited
+ ulimit -l unlimited
+ ulimit -n unlimited
+ ulimit -s unlimited
+ ulimit -t unlimited
+}
+
+# highlight important stuff in diff output, usage example: hg diff | hidiff
+#m# a2 hidiff \kbd{histring} oneliner for diffs
+check_com -c histring && \
+ alias hidiff="histring -fE '^Comparing files .*|^diff .*' | histring -c yellow -fE '^\-.*' | histring -c green -fE '^\+.*'"
+
+#f5# Change the xterm title from within GNU-screen
+xtrename() {
+ emulate -L zsh
+ if [[ $1 != "-f" ]] ; then
+ if [[ -z ${DISPLAY} ]] ; then
+ printf 'xtrename only makes sense in X11.\n'
+ return 1
+ fi
+ else
+ shift
+ fi
+ if [[ -z $1 ]] ; then
+ printf 'usage: xtrename [-f] "title for xterm"\n'
+ printf ' renames the title of xterm from _within_ screen.\n'
+ printf ' also works without screen.\n'
+ printf ' will not work if DISPLAY is unset, use -f to override.\n'
+ return 0
+ fi
+ print -n "\eP\e]0;${1}\C-G\e\\"
+ return 0
+}
+
+# TODO:
+# Rewrite this by either using tinyurl.com's API
+# or using another shortening service to comply with
+# tinyurl.com's policy.
+#
+# Create small urls via http://tinyurl.com using wget(1).
+#function zurl() {
+# emulate -L zsh
+# [[ -z $1 ]] && { print "USAGE: zurl <URL>" ; return 1 }
+#
+# local PN url tiny grabber search result preview
+# PN=$0
+# url=$1
+## Check existence of given URL with the help of ping(1).
+## N.B. ping(1) only works without an eventual given protocol.
+# ping -c 1 ${${url#(ftp|http)://}%%/*} >& /dev/null || \
+# read -q "?Given host ${${url#http://*/}%/*} is not reachable by pinging. Proceed anyway? [y|n] "
+#
+# if (( $? == 0 )) ; then
+## Prepend 'http://' to given URL where necessary for later output.
+# [[ ${url} != http(s|)://* ]] && url='http://'${url}
+# tiny='http://tinyurl.com/create.php?url='
+# if check_com -c wget ; then
+# grabber='wget -O- -o/dev/null'
+# else
+# print "wget is not available, but mandatory for ${PN}. Aborting."
+# fi
+## Looking for i.e.`copy('http://tinyurl.com/7efkze')' in TinyURL's HTML code.
+# search='copy\(?http://tinyurl.com/[[:alnum:]]##*'
+# result=${(M)${${${(f)"$(${=grabber} ${tiny}${url})"}[(fr)${search}*]}//[()\';]/}%%http:*}
+## TinyURL provides the rather new feature preview for more confidence. <http://tinyurl.com/preview.php>
+# preview='http://preview.'${result#http://}
+#
+# printf '%s\n\n' "${PN} - Shrinking long URLs via webservice TinyURL <http://tinyurl.com>."
+# printf '%s\t%s\n\n' 'Given URL:' ${url}
+# printf '%s\t%s\n\t\t%s\n' 'TinyURL:' ${result} ${preview}
+# else
+# return 1
+# fi
+#}
+
+#f2# Find history events by search pattern and list them by date.
+whatwhen() {
+ emulate -L zsh
+ local usage help ident format_l format_s first_char remain first last
+ usage='USAGE: whatwhen [options] <searchstring> <search range>'
+ help='Use `whatwhen -h'\'' for further explanations.'
+ ident=${(l,${#${:-Usage: }},, ,)}
+ format_l="${ident}%s\t\t\t%s\n"
+ format_s="${format_l//(\\t)##/\\t}"
+ # Make the first char of the word to search for case
+ # insensitive; e.g. [aA]
+ first_char=[${(L)1[1]}${(U)1[1]}]
+ remain=${1[2,-1]}
+ # Default search range is `-100'.
+ first=${2:-\-100}
+ # Optional, just used for `<first> <last>' given.
+ last=$3
+ case $1 in
+ ("")
+ printf '%s\n\n' 'ERROR: No search string specified. Aborting.'
+ printf '%s\n%s\n\n' ${usage} ${help} && return 1
+ ;;
+ (-h)
+ printf '%s\n\n' ${usage}
+ print 'OPTIONS:'
+ printf $format_l '-h' 'show help text'
+ print '\f'
+ print 'SEARCH RANGE:'
+ printf $format_l "'0'" 'the whole history,'
+ printf $format_l '-<n>' 'offset to the current history number; (default: -100)'
+ printf $format_s '<[-]first> [<last>]' 'just searching within a give range'
+ printf '\n%s\n' 'EXAMPLES:'
+ printf ${format_l/(\\t)/} 'whatwhen grml' '# Range is set to -100 by default.'
+ printf $format_l 'whatwhen zsh -250'
+ printf $format_l 'whatwhen foo 1 99'
+ ;;
+ (\?)
+ printf '%s\n%s\n\n' ${usage} ${help} && return 1
+ ;;
+ (*)
+ # -l list results on stout rather than invoking $EDITOR.
+ # -i Print dates as in YYYY-MM-DD.
+ # -m Search for a - quoted - pattern within the history.
+ fc -li -m "*${first_char}${remain}*" $first $last
+ ;;
+ esac
+}
+
+# mercurial related stuff
+if check_com -c hg ; then
+ # gnu like diff for mercurial
+ # http://www.selenic.com/mercurial/wiki/index.cgi/TipsAndTricks
+ #f5# GNU like diff for mercurial
+ hgdi() {
+ emulate -L zsh
+ for i in $(hg status -marn "$@") ; diff -ubwd <(hg cat "$i") "$i"
+ }
+
+ # build debian package
+ #a2# Alias for \kbd{hg-buildpackage}
+ 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
+ #f5# Diffstat for specific version of a mercurial repos
+ hgstat() {
+ emulate -L zsh
+ [[ -n "$1" ]] && hg diff -r $1 -r tip | diffstat || hg export tip | diffstat
+ }
+
+fi # end of check whether we have the 'hg'-executable
+
+# some useful commands often hard to remember - let's grep for them
+# actually use our zg() function now. :)
+
+# Work around ion/xterm resize bug.
+#if [[ "$SHLVL" -eq 1 ]]; then
+# if check_com -c resize ; then
+# eval `resize </dev/null`
+# fi
+#fi
+
+# enable jackd:
+# /usr/bin/jackd -dalsa -dhw:0 -r48000 -p1024 -n2
+# now play audio file:
+# alsaplayer -o jack foobar.mp3
+
+# send files via netcat
+# on sending side:
+# send() {j=$*; tar cpz ${j/%${!#}/}|nc -w 1 ${!#} 51330;}
+# send dir* $HOST
+# alias receive='nc -vlp 51330 | tar xzvp'
+
+# debian stuff:
+# dh_make -e foo@localhost -f $1
+# dpkg-buildpackage -rfakeroot
+# lintian *.deb
+# dpkg-scanpackages ./ /dev/null | gzip > Packages.gz
+# dpkg-scansources . | gzip > Sources.gz
+# grep-dctrl --field Maintainer $* /var/lib/apt/lists/*
+
+# other stuff:
+# convert -geometry 200x200 -interlace LINE -verbose
+# ldapsearch -x -b "OU=Bedienstete,O=tug" -h ldap.tugraz.at sn=$1
+# ps -ao user,pcpu,start,command
+# gpg --keyserver blackhole.pca.dfn.de --recv-keys
+# xterm -bg black -fg yellow -fn -misc-fixed-medium-r-normal--14-140-75-75-c-90-iso8859-15 -ah
+# nc -vz $1 1-1024 # portscan via netcat
+# wget --mirror --no-parent --convert-links
+# pal -d `date +%d`
+# autoload -U tetris; zle -N tetris; bindkey '...' ; echo "press ... for playing tennis"
+#
+# modify console cursor
+# see http://www.tldp.org/HOWTO/Framebuffer-HOWTO-5.html
+# print $'\e[?96;0;64c'
+
+# grml-small cleanups
+
+# The following 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), set
+# $GRMLSMALL_SPECIFIC to 0 in your .zshrc.pre file (which this configuration
+# sources if it is there).
+
+if (( GRMLSMALL_SPECIFIC > 0 )) && isgrmlsmall ; then
+
+ unset abk[V]
+ unalias 'V' &> /dev/null
+ unfunction vman &> /dev/null
+ unfunction viless &> /dev/null
+ unfunction 2html &> /dev/null
+
+ # manpages are not in grmlsmall
+ unfunction manzsh &> /dev/null
+ unfunction man2 &> /dev/null
+
+fi
+
+zrclocal
+
+## genrefcard.pl settings
+
+### doc strings for external functions from files
+#m# f5 grml-wallpaper() Sets a wallpaper (try completion for possible values)