+# Complete arguments and fix spelling mistakes when possible.
+zstyle ':completion:*' completer _complete _match _correct _approximate
+
+# Make sure the list of possible completions is displayed after pressing <TAB>
+# the first time.
+setopt nolistambiguous
+# Allow completions in the middle of a text, i.e. "/usr/bin/<TAB>whatever"
+# completes like "/usr/bin/<TAB>". Useful when adding new options to commands.
+bindkey "^I" expand-or-complete-prefix
+# Try uppercase if the currently typed string doesn't match. This allows
+# typing in lowercase most of the time and completion fixes the case.
+zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}'
+
+# Use ls like colors for completions.
+zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
+
+# Make completion lists scrollable so "do you wish to see all n possibilities"
+# is no longer displayed.
+zstyle ':completion:*' list-prompt '%p'
+# Display group name (like 'external command', 'alias', etc.) when there are
+# multiple matches in bold.
+zstyle ':completion:*' format ' %B%d%b:'
+# Display different types of matches separately.
+zstyle ':completion:*' group-name ''
+
+# Ignore completion functions.
+zstyle ':completion:*:functions' ignored-patterns '_*'
+# Ignore parent directory.
+zstyle ':completion:*:(cd|mv|cp):*' ignore-parents parent pwd
+# When unsetting variables make sure every variable name is only suggested
+# once.
+zstyle ':completion:*:unset:*' ignore-line yes
+# When working with Mercurial and Git don't complete the same file multiple
+# times. Very useful when completing file names.
+zstyle ':completion:*:(hg|git)*:*' ignore-line yes
+
+
+# CUSTOM ALIASES AND FUNCTIONS
+
+# If ^C is pressed while typing a command, add it to the history so it can be
+# easily retrieved later and then abort like ^C normally does. This is useful
+# when I want to abort an command to do something in between and then finish
+# typing the command.
+#
+# Thanks to Vadim Zeitlin <vz-zsh@zeitlins.org> for a fix (--) so lines
+# starting with - don't cause errors.
+TRAPINT() {
+ # Store the current buffer in the history.
+ zle && print -s -- $BUFFER
+
+ # Return the default exit code so zsh aborts the current command.
+ return $1
+}
+
+# Colorize stderr. Very useful when looking for errors. Thanks to
+# http://gentoo-wiki.com/wiki/Zsh for the basic script and Mikachu in #zsh on
+# Freenode (2010-03-07 04:03) for some improvements (-r, printf). It's not yet
+# perfect and doesn't work with some interactive stderr output, but in those
+# cases the E alias can be used as workaround.
+exec 2>>(while read -r line; do
+ printf '\e[91m%s\e[0m\n' "$line"
+ print -n $'\0';
+done &)
+
+# Make sure aliases are expanded when using sudo.
+alias sudo='sudo '
+
+# Global aliases for often used commands in the command line.
+alias -g E='2>&1'
+alias -g L='E | less'
+alias -g D='E | colordiff L'
+alias -g G='| grep'
+alias -g S='| sort'
+alias -g U='| uniq'
+
+# Make going up directories simple.
+alias -g ...='../..'
+alias -g ....='../../..'
+alias -g .....='../../../..'
+
+# Shortcuts for often used programs.
+alias c='clear'
+alias e='elinks'
+alias g='git'
+alias m='mutt'
+alias v='vim'
+alias vi='vim'
+
+# Improved ls which displays the files in columns (-C), visualizes
+# directories, links and other special files (-F) and pages everything through
+# less (L).
+#
+# If available use GNU ls with colorized output. If it isn't available use
+# normal ls which needs CLICOLOR_FORCE so it displays colors when used with a
+# pager.
+ls --color &> /dev/null
+if [[ $? -eq 0 ]]; then
+ alias ls='ls --color'
+else
+ alias ls='CLICOLOR_FORCE=1 ls -G'
+fi
+# Main ls function.
+function ls() {
+ command ls -C -F $* L
+}
+# Helper function to list all files.
+function la() {
+ ls -a $*
+}
+# Helper function to list all files in list format with access rights, etc.
+function ll() {
+ la -l $*
+}
+
+# If the window naming feature is used (see above) then use ".zsh" (leading
+# dot) as title name after running clear so it's clear to me that the window
+# is empty. I open so much windows that I don't know in which I have something
+# important. This helps me to remember which windows are empty (I run clear
+# after I finished my work in a window).
+if [[ -n $window_reset ]]; then
+ alias clear='clear; window_reset=yes; window_precmd reset'
+fi
+
+# I sometimes confuse editor and shell, print a warning to prevent I exit the
+# shell.
+alias :q='echo "This is not Vim!" >&2'
+
+# Automatically use unified diffs.
+alias diff='diff -u'
+
+# Display all files and use human readable sizes.
+alias du='du -sh'
+
+# Use human readable sizes.
+alias df='df -h'
+
+# Edit the mercurial patch queue series file for the current mercurial
+# repository in Vim. Also change Vim's pwd to the patches directory so other
+# patches can easily be opened.
+alias vqs='vim -c "cd $(hg root)/.hg/patches/" "$(hg root)/.hg/patches/series"'
+
+# Display all branches (except stash) in gitk but only 200 commits as this is
+# much faster. Also put in the background and disown. Thanks to sitaram in
+# #git on Freenode (2009-04-20 15:51).
+gitk() {
+ command gitk \
+ --max-count=200 \
+ $(git rev-parse --symbolic-full-name --remotes --branches) \
+ $@ &
+ disown %command
+}
+# Same for tig (except the disown part as it's no GUI program).
+tig() {
+ command tig \
+ --max-count=200 \
+ $(git rev-parse --symbolic-full-name --remotes --branches) \
+ $@
+}
+
+
+# RUN COMMANDS
+
+# If not already in screen reattach to a running session or create a new one.
+#
+# screen* is necessary as `screen` uses screen.linux for example for a linux
+# console which would otherwise cause an infinite loop.
+if [[ $TERM != screen* && $TERM != 'dumb' ]]; then
+ # Get running detached sessions.
+ session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }')
+ # Create a new session if none is running.
+ if [[ -z $session ]]; then
+ screen
+ # Reattach to a running session.
+ else
+ screen -r $session
+ fi
+fi
+
+
+# OS SPECIFIC SETTINGS
+
+if [[ $(uname) == Linux ]]; then
+ # Settings when creating Debian packages.
+ DEBEMAIL=simon@ruderich.org
+ export DEBEMAIL
+ DEBFULLNAME="Simon Ruderich"
+ export DEBFULLNAME
+
+elif [[ $(uname) == Darwin ]]; then # Mac OS X
+ # Store the current clipboard in CLIPBOARD before every command so it can
+ # be used in commands.
+ os_darwin_preexec() {
+ export CLIPBOARD="$(pbpaste)"
+ }
+ # Add the function as preexec hook.
+ add-zsh-hook preexec os_darwin_preexec
+
+ # Initialize CLIPBOARD so it's available for completion directly after
+ # startup.
+ CLIPBOARD=""
+ export CLIPBOARD
+
+ # Fetch current URL in clipboard with wget.
+ alias wnc='wget --no-proxy $CLIPBOARD'
+fi
+
+
+# Load rc file for current hostname (first part before a dot) or rc.local.
+source_config ~/.zsh host rc ${$(hostname)//.*/}
+
+source_debug "finished sourcing ~/.zsh/rc"
+
+# vim: ft=zsh