I’ve been on the lookout for a bash replacement for a while. After seeing a small discussion about ksh and the closed and open implementation in #illumos, my interest got reinvigorated.

After playing with both csh, ksh and zsh for a while, zsh clearly won.
I won’t bore you with the details of how this selection went, but I will share with you my .zshrc.

Most of you probably don’t know but I have a wiki for my personal documentation, some of it is public like the article on z shell.

Screenshot
Screenshot of zsh terminal

Features

  • Auto-update (checked at login, max 1x per day)
  • Directory change shorthand enabled
  • Extra globbing
  • Colorization support for linux, solaris and mac os x (Or as good as I could get it)
  • Per host customizations (See example for Axion, my mac with macports)
  • Keybinds that work in xterm, putty, iterm, terminal.app and sun-color
  • Auto completion
    • kill menu
    • killall menu
  • ssh host completion with auto .ssh/config setup
  • ssh user completion, stripped most comon system users to keep the list short
  • Multiple prompts (double, minimal, gentoo and gentoo-server)
    • minimal and double themes have a UTF-8 check mark/cross character (with fallback)

There is a small caveat, I use a custom font with PuTTY so check mark can still be screwed up in PuTTY.

Configuration

## .zshrc
# by Jorge Schrauwen <jorge@blackdot.be>
# Version 20170501001
#         YYYYMMDD###

# How to install
# curl -sk "https://docu.blackdot.be/getRaw.php?onlyCode=true&id=configuration:zsh" -o ~/.zshrc 
#
# Change Log
# - 20170501: --- - disabled auto update
# - 20160621: --- - optimizations
# - 20160621: fix - if .aliases is missing initial exit indicator was fasle
# - 20160320: fix - color ls on SmartOS, drop obd support
# - 20160219: fix - fix vncviewer alias
# - 20151128: --- - cleanup and removal of old code
# - 20151001: fix - support new pkgsrc layout on OSX
# - 20141225: new - added 'developer' theme (same as dual but with git helpers)
# - 20141225: new - switched to promptinit, converted themes and renamed minimal
# - 20141225: new - added CMD_SAFE_WRAP (defaults to 1)
# - 20141225: --- - switch to selective nocorrect/noglob
# - 20141225: new - enable dirstack, enable auto rehash, extra MacOSX helpers
# - 20141225: --- - set NOFANCY_PROMPT to disable UTF-8 prompt
# - 20141225: fix - broken dual and gentoo-server themes
# - 20141225: --- - reworked flow
# - 20141225: new - NZSHRC override via .zopts
# - 20141225: new - local option override (.zopts)
# - 20141225: fix - updated automatic update function
# - 20141223: new - disabled beep
# - 20141223: fix - disabled homedir autocomplete
# - 20141008: new - SmartOS support LX brand /native
# - 20141003: new - OpenBSD pkg_add helper
# - 20141002: --- - Solaris re-order PATH/MANPATH
# - 20141002: --- - avoid double sourcing, .zprofile -> .zlocal
# - 20140820: fix - MacOSX Yosemite ctr+r works
# - 20140727: fix - Solaris zshenable works
# - 20140727: fix - don't butcher EDITOR
# - 20140726: new - SmartOS zone support
# - 20140629: new - MacOSX pkgsrc on OSX (http://saveosx.org)
# - 20140421: new - OpenBSD color ls
# - 20131013: new - Solaris zfs compatible rsync alias
# - 20131010: --- - path cleanup
# - 20131009: new - Solaris path tweaks + colorls
# - 20130730: fix - OmniOS manpages
# - 20130716: fix - Solaris sbin handling
# - 20130629: new - OmniOS obd repository support
# - 20130625: fix - OmniOS fixed broken isaexec
# - 20130621: fix - OmniOS add sbin only when staff
# - 20130520: new - OmniOS support
# - 20120823: new - automatic update
# - 20120821: new - disable UTF-8 check-mark with .znofancy

# {{{ updater
    NZSHRC="https://docu.blackdot.be/getRaw.php?onlyCode=true&id=configuration:zsh"
    CHECK_UPDATE=0
    AUTO_UPDATE=0
# }}}

# {{{ options
    ## change directory 
    setopt auto_cd
    
    ## enable command correction
    setopt correct
    #setopt correct_all  

    ## prevent file overwrite
    setopt no_clobber

    ## pound sign in interactive prompt
    setopt interactive_comments 

    ## superglobs
    unsetopt case_glob
    
    ## expansions performed in prompt
    setopt prompt_subst
    setopt magic_equal_subst

    ## prompt about background jobs on exit
    setopt check_jobs

    ## notify on job complete
    setopt notify
    
    ## disable beep
    unsetopt beep
    setopt no_beep
    
    ## automatic rehash
    setopt nohashdirs
    
    ## make some commands safer
    CMD_SAFE_WRAP=0
    setopt mark_dirs

    ## include local options
    [[ -e ~/.zopts ]] && source ~/.zopts
# }}}

# {{{ history
    # history file
    HISTFILE=~/.zhistory
    HISTSIZE=10000
    SAVEHIST=10000

    # share history file
    setopt share_history
    setopt inc_append_history

    # ignore duplicates
    setopt hist_ignore_all_dups
    
    # ignore entries starting with a space
    setopt hist_ignore_space
# }}}

# {{{ dirstack
    DIRSTACKSIZE=20
    setopt autopushd pushdsilent pushdtohome pushdminus
    setopt pushdignoredups # ignore dups
# }}}

# {{{ keybindings
    # generic
    bindkey "\e[1~" beginning-of-line # Home
    bindkey "\e[4~" end-of-line # End
    bindkey "\e[5~" beginning-of-history # PageUp
    bindkey "\e[6~" end-of-history # PageDown
    bindkey "\e[2~" quoted-insert # Ins
    bindkey "\e[3~" delete-char # Del
    bindkey "\e[5C" forward-word
    bindkey "\eOc" emacs-forward-word
    bindkey "\e[5D" backward-word
    bindkey "\eOd" emacs-backward-word
    bindkey "\e\e[C" forward-word
    bindkey "\e\e[D" backward-word
    bindkey "\e[Z" reverse-menu-complete # Shift+Tab
    bindkey '^R' history-incremental-search-backward
    bindkey ' ' magic-space # becasue I am lazy

    # for rxvt
    bindkey "\e[7~" beginning-of-line # Home
    bindkey "\e[8~" end-of-line # End

    # for non RH/Debian xterm, can't hurt for RH/Debian xterm
    bindkey "\eOH" beginning-of-line
    bindkey "\eOF" end-of-line

    # for freebsd/darwin console
    bindkey "\e[H" beginning-of-line
    bindkey "\e[F" end-of-line
# }}}

# {{{ functions
    # update .zshrc
    zshupdate() { 
        # main
        if [ -z "`which curl`" ]; then
            echo 'Please install curl!'
            exit
        fi
        NV=`curl -sk ${NZSHRC} | head -n3 | tail -n1 | awk '{ print $3 }'`
        OV=`cat ~/.zshrc | head -n3 | tail -n1 | awk '{ print $3 }'`
        [ -z "${NV}" ] && NV=0
        
        if [ ${NV} -gt ${OV} ]; then
            echo -n "[>>] Updating from ${OV} to ${NV} ...\r"
            mv ~/.zshrc ~/.zshrc.old
            curl -sk ${NZSHRC} -o ~/.zshrc
            source ~/.zshrc
            echo '[OK]'
        else
            echo "[OK] No update needed."
        fi
    }

    # auto update check
    if [ ${CHECK_UPDATE} -gt 0 ]; then
        if [ `find ~/.zshrc -mmin +1440` ]; then
            touch ~/.zshrc
            NV=`curl -sk -m 3 ${NZSHRC} | head -n3 | tail -n1 | awk '{ print $3 }'`
            OV=`cat ~/.zshrc | head -n3 | tail -n1 | awk '{ print $3 }'`
            [ -z "${NV}" ] && NV=0
        
            if [ ${NV} -gt ${OV} ]; then
                if [ ${AUTO_UPDATE} -gt 0 ]; then
                    zshupdate
                else
                    echo "Please run zshupdate to update .zshrc to version ${NV}!"
                fi
            fi
        fi
    fi

    # remove ssh known_hosts key
    delete_sshhost() {
        if [[ -z "$1" ]] ; then
            echo "usage: \e[1;36mdelete_sshhost \e[1;0m< host >"
            echo "       Removes the specified host from ssh known host list"
        else
            sed -i -e "/$1/d" $HOME/.ssh/known_hosts
        fi
    }
    
    # zshenable helper
    zshenable() {
        case $OSTYPE in 
            linux*|darwin*|openbsd*)
                chsh -s $(which zsh)
            ;;
            solaris*)
                pfexec /usr/sbin/usermod -s $(which zsh) $(id -n -u)
            ;;
            *)
                echo "No zshenable implemented for $OSTYPE."
            ;;
        esac
    }
    
    # zshdisable helper
    zshdisable() {
        case $OSTYPE in 
            linux*|darwin*|openbsd*)
                chsh -s $(which bash)
            ;;
            solaris*)
                pfexec /usr/sbin/usermod -s $(which bash) $(id -n -u)
            ;;
            *)
                echo "No zshdisable implemented for $OSTYPE."
            ;;
        esac
    }
# }}}

# {{{ advanced
    ## cleanup aliases
    noglob unalias -m cd cp ls mv rm 

    ## fix url quote's
    if [[ ${ZSH_VERSION//\./} -ge 420 ]] ; then
         autoload -U url-quote-magic
         zle -N self-insert url-quote-magic
    fi

    ## os specific
    case $OSTYPE in linux*)
        # detect root or staff
        [ $UID -eq 0 ] && WANT_SBIN=1
        [ $(groups | grep -c sudo) -gt 0 ] && WANT_SBIN=1
        [ $(groups | grep -c wheel) -gt 0 ] && WANT_SBIN=1
  
        # colorization
        eval $(dircolors)
        [ -f /etc/DIR_COLORS ] && eval $(dircolors -b /etc/DIR_COLORS)
        [ -f ~/.dir_colors ] && eval $(dircolors -b ~/.dir_colors)

        alias ls="ls --group-directories-first"
        if [ -n "${LS_COLORS}" ]; then
            export ZLSCOLORS="${LS_COLORS}"
            alias ls="${aliases[ls]:-ls} --color=auto"
            alias grep="${aliases[grep]:-grep} --color=auto"
        fi
  
        # LX BrandZ
        if [ -d /native ]; then
            export PATH=$PATH:/native/usr/bin
            if [ -n $WANT_SBIN ]; then
                export PATH=$PATH:/native/sbin
                export PATH=$PATH:/native/usr/sbin
            fi
        fi
    ;; esac
    case $OSTYPE in solaris*)
        # detect root or staff
        [ $UID -eq 0 ] && WANT_SBIN=1
        [ $(groups | grep -c staff) -gt 0 ] && WANT_SBIN=1
        [ $(groups | grep -c sysadmin) -gt 0 ] && WANT_SBIN=1
        export MANPATH=/usr/share/man

        # add /usr/sbin if wanted
        [ $(echo $PATH | grep -c '/usr/sbin:')  -eq 0 ] && 
            [ -n $WANT_SBIN ] && export PATH=$PATH:/usr/sbin

        # check for gnu
        export PATH=$(echo $PATH | /bin/sed -r 's#:/usr/gnu/s?bin##g')
        if [ -d /usr/gnu ]; then
            export PATH=$PATH:/usr/gnu/bin
            [ -n $WANT_SBIN ] && export PATH=$PATH:/usr/gnu/sbin

            # selective gnu / colorization
            [ -e /usr/gnu/bin/sed ] && alias sed='/usr/gnu/bin/sed'
            [ -e /usr/gnu/bin/diff ] && alias diff='/usr/gnu/bin/diff'
            [ -e /usr/gnu/bin/tar ] && alias tar='/usr/gnu/bin/tar'
            [ -e /usr/gnu/bin/rm ] && alias rm='/usr/gnu/bin/rm'
        fi
  
        # check for pkgsrc (smartos)
        export PATH=$(echo $PATH | /bin/sed -r 's#/opt/local/s?bin:##g')
        export MANPATH=$(echo $MANPATH | /bin/sed -r 's#/opt/local/man:##g')
        if [ -d /opt/local ]; then
            export MANPATH=/opt/local/man:$MANPATH
            export PATH=/opt/local/bin:$PATH
            [ -n $WANT_SBIN ] && export PATH=/opt/local/sbin:$PATH
        fi

        # check for omniti repository (omnios)
        export PATH=$(echo $PATH | /bin/sed -r 's#/opt/omni/s?bin:##g')
        export MANPATH=$(echo $MANPATH | /bin/sed -r 's#/opt/omni/share/man:##g')
        if [ -d /opt/local ]; then
            export MANPATH=$MANPATH:/opt/omni/share/man
            export PATH=$PATH:/opt/omni/bin
            [ -n $WANT_SBIN ] && export PATH=$PATH:/opt/omni/sbin
        fi

        # check for local
        export PATH=$(echo $PATH | /bin/sed -r 's#/usr/local/s?bin:##g')
        if [ -d /usr/local ]; then
            export PATH=/usr/local/bin:$PATH
            [ -n $WANT_SBIN ] && export PATH=/usr/local/sbin:$PATH
        fi

        # check for opencsw
        export PATH=$(echo $PATH | /bin/sed -r 's#:/opt/csw/s?bin##g')
        if [ -d /opt/csw ]; then
            export PATH=$PATH:/opt/csw/gnu:/opt/csw/bin
            [ -n $WANT_SBIN ] && export PATH=$PATH:/opt/csw/sbin
        fi

        # colorization
        case $(which ls) in
          /opt/local/bin/ls) alias ls='ls --color' ;;
          /usr/bin/ls) alias ls='ls --color' ;;
          /usr/gnu/bin/ls) ls='ls --color=auto' ;;
        esac
        case $(which grep) in
          /opt/local/bin/grep) alias grep='grep --color=auto' ;;
          /usr/gnu/bin/grep) alias grep='grep --color=auto' ;;
        esac
    ;; esac
    case $OSTYPE in openbsd*)
        # set PKG_PATH
        export PKG_PATH=http://ftp.openbsd.org/pub/OpenBSD/`uname -r`/packages/`uname -m`/  

        # colorization
        [ -e /usr/local/bin/colorls ] && alias ls='/usr/local/bin/colorls -G'
    ;; esac
    case $OSTYPE in darwin*)
        # colorization
        export CLICOLOR=1
        alias ls='ls -G'

        # macports (with gnu)
        if [ -e /opt/local/bin/port ]; then
            export PATH=/opt/local/libexec/gnubin:/opt/local/bin:/opt/local/sbin:$PATH
            export MANPATH=/opt/local/share/man:$MANPATH
            if [ -f ~/.dir_colors ]; then
                eval $(dircolors -b ~/.dir_colors)
                export ZLSCOLORS="${LS_COLORS}"
                unalias ls &> /dev/null
                alias ls='ls --color=auto'
            fi
            if [ -e /opt/local/bin/python2 ]; then
                alias python='/opt/local/bin/python2'
            fi
        fi
  
        # pkgsrc
        if [ -e /opt/pkg/bin/pkgin ]; then
            export PATH=/opt/pkg/gnu/bin:/opt/pkg/bin:/opt/pkg/sbin:$PATH
            export MANPATH=/opt/pkg/man:$MANPATH
            if [ -f ~/.dir_colors ]; then
                eval $(dircolors -b ~/.dir_colors)
                export ZLSCOLORS="${LS_COLORS}"
                unalias ls &> /dev/null
                alias ls='ls --color=auto'
            fi
            alias pkgin='sudo pkgin'
        elif [ -e /usr/pkg/bin/pkgin ]; then
            export PATH=/usr/pkg/gnu/bin:/usr/pkg/bin:/usr/pkg/sbin:$PATH
            export MANPATH=/usr/pkg/man:$MANPATH
            if [ -f ~/.dir_colors ]; then
                eval $(dircolors -b ~/.dir_colors)
                export ZLSCOLORS="${LS_COLORS}"
                unalias ls &> /dev/null
                alias ls='ls --color=auto'
            fi
            alias pkgin='sudo pkgin'
        fi
        
        ## helpers        
        function vnc() {
            which vncviewer &> /dev/null
            if [ $? -eq 0 ]; then
                vncviewer $@
            else
                open vnc://$@
            fi
        }
    ;; esac

    ## host specific
    case ${HOST:r} in
        (axion*|tachyon*|photon*)
            # proper UTF-8
            export LANG=en_US.UTF-8

            # host color
            PROMPT_HOST_COLOR=green
        ;;
        (exosphere*|crust*)
            PROMPT_HOST_COLOR=red
        ;;
        *)
            # default host color
            PROMPT_HOST_COLOR=blue
        ;;  
    esac
  
    ## local configuration
    [[ -e ~/.zlocal ]] && source ~/.zlocal
# }}}

# {{{ auto completion
    ## base
    autoload -U compinit && compinit

    ## complete from withing word
    setopt complete_in_word
    setopt always_to_end

    ## complete aliases
    setopt complete_aliases

    ## enable caching
    zstyle ':completion::complete:*' use-cache on
    zstyle ':completion::complete:*' cache-path ~/.zcache
    
    ## enable case-insensitive completion
    zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
    
    ## various tweaks
    zstyle '*' single-ignored show
    
    zstyle ':completion:*' completer _complete _match _approximate
    zstyle ':completion:*:match:*' original only
    zstyle ':completion:*:approximate:*' max-errors 1 numeric
    
    zstyle -e ':completion:*:approximate:*' max-errors 'reply=($((($#PREFIX+$#SUFFIX)/3))numeric)'
    
    ## history
    zstyle ':completion:*:history-words' stop yes
    zstyle ':completion:*:history-words' remove-all-dups yes
    zstyle ':completion:*:history-words' list false
    zstyle ':completion:*:history-words' menu yes
    
    ## directories
    zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
    zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories
    zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
    zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand'
    zstyle ':completion:*' squeeze-slashes true
    
    ## ignore completions for commands that we dont have
    zstyle ':completion:*:functions' ignored-patterns '(_*|pre(cmd|exec))'
    
    ## array completion
    zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
    
    ## group matches and describe
    zstyle ':completion:*:*:*:*:*' menu select
    zstyle ':completion:*:matches' group 'yes'
    zstyle ':completion:*:options' description 'yes'
    zstyle ':completion:*:options' auto-description '%d'
    zstyle ':completion:*:corrections' format ' %F{green}-- %d (errors: %e) --%f'
    zstyle ':completion:*:descriptions' format ' %F{yellow}-- %d --%f'
    zstyle ':completion:*:messages' format ' %F{purple} -- %d --%f'
    zstyle ':completion:*:warnings' format ' %F{red}-- no matches found --%f'
    zstyle ':completion:*:default' list-prompt '%S%M matches%s'
    zstyle ':completion:*' format ' %F{yellow}-- %d --%f'
    zstyle ':completion:*' group-name ''
    zstyle ':completion:*' verbose yes
    
    ## pretty menu's
    zstyle ':completion:*' menu select=1
    zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
    setopt auto_menu    # show menu on 2nd <tab>
    setopt list_rows_first  # use row list if possible

    ## prevent re-suggestion
    zstyle ':completion:*:(scp|rm|kill|diff):*' ignore-line yes
    #zstyle ':completion:*:rm:*' file-patterns '*:all-files'

    ## enable killall menu (linux)
    zstyle ':completion:*:processes-names' command 'ps -u $(whoami) -o comm='
    zstyle ':completion:*:processes-names' menu yes select
    zstyle ':completion:*:processes-names' force-list always    

    ## enable kill menu (linux)   
    case $OSTYPE in 
        linux*|darwin*|openbsd*)
            if [ $(id -u) -eq 0 ]; then
                zstyle ':completion:*:*:*:*:processes' command 'ps -A -o pid,user,pcpu,pmem,args -w'
            else
                zstyle ':completion:*:*:*:*:processes' command 'ps -u $(whoami) -o pid,user,pcpu,pmem,args -w'
            fi
        ;;
        solaris*)
            if [ $(id -u) -eq 0 ]; then
                zstyle ':completion:*:*:*:*:processes' command 'ps -A -o pid,user,pcpu,pmem,args'
            else
                zstyle ':completion:*:*:*:*:processes' command 'ps -u $(whoami) -o pid,user,pcpu,pmem,args'
            fi
        ;;
    esac
    zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;32'
    zstyle ':completion:*:*:kill:*' menu yes select
    zstyle ':completion:*:*:kill:*' force-list always
    zstyle ':completion:*:*:kill:*' insert-ids single
    
    ## simple pargs complete
    case $OSTYPE in 
        solaris*)
            compdef _pids pargs
            zstyle ':completion:*:*:pargs:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;32'
            zstyle ':completion:*:*:pargs:*' menu yes select
            zstyle ':completion:*:*:pargs:*' force-list always
            zstyle ':completion:*:*:pargs:*' insert-ids single
        ;;
    esac
    
    ## man pages
    zstyle ':completion:*:manuals' separate-sections true
    zstyle ':completion:*:manuals.(^1*)' insert-sections true

    ## enable make completion
    compile=(all clean compile disclean install remove uninstall)
    compctl -k compile make
    
    ## user completion cleanup
    zstyle ':completion:*:*:*:users' ignored-patterns \
        adm amanda apache avahi backup beaglidx bin cacti canna clamav daemon \
        dladm dbus distcache dovecot fax ftp games gdm gkrellmd gopher gnats \
        hacluster haldaemon halt hsqldb ident junkbust ldap lp irc list libuuid \
        listen mdns mail mailman mailnull mldonkey mysql man messagebus \
        netadm netcfg nagios noaccess nobody4 nuucp \
        named netdump news nfsnobody nobody nscd ntp nut nx openvpn openldap \
        operator pcap pkg5srv postfix postgres proxy privoxy pulse pvm quagga radvd \
        rpc rpcuser rpm shutdown statd squid sshd sync sys syslog uucp vcsa \
        smmsp svctag upnp unknown webservd www-data xfs xvm zfssnap '_*'
        
    ## hostname completion
    if [ ! -f ~/.ssh/config ]; then
        [ -f ~/.ssh/known_hosts ] && rm ~/.ssh/known_hosts
        mkdir -p ~/.ssh
        echo "HashKnownHosts no" >>! ~/.ssh/config
        chmod 0600 ~/.ssh/config
    fi
    zstyle -e ':completion:*:hosts' hosts 'reply=(
        ${=${=${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) 2>/dev/null)"}%%[#| ]*}//\]:[0-9]*/ }//,/ }//\[/ }
        ${=${(f)"$(cat /etc/hosts(|)(N) <<(ypcat hosts 2>/dev/null))"}%%\#*}
        ${=${${${${(@M)${(f)"$(cat ~/.ssh/config 2>/dev/null)"}:#Host *}#Host }:#*\**}:#*\?*}}
    )'

    ## ssh/scp/rsync
    zstyle ':completion:*:(scp|rsync):*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *'
    zstyle ':completion:*:(scp|rsync):*' group-order users files all-files hosts-domain hosts-host hosts-ipaddr
    zstyle ':completion:*:ssh:*' tag-order 'hosts:-host:host hosts:-domain:domain hosts:-ipaddr:ip\ address *'
    zstyle ':completion:*:ssh:*' group-order users hosts-domain hosts-host users hosts-ipaddr
    zstyle ':completion:*:(ssh|scp|rsync):*:hosts-host' ignored-patterns '*(.|:)*' loopback ip6-loopback localhost ip6-localhost ip6-allnodes ip6-allrouters ip6-localnet ip6-mcastprefix broadcasthost
    zstyle ':completion:*:(ssh|scp|rsync):*:hosts-domain' ignored-patterns '<->.<->.<->.<->' '^[-[:alnum:]]##(.[-[:alnum:]]##)##' '*@*'
    zstyle ':completion:*:(ssh|scp|rsync):*:hosts-ipaddr' ignored-patterns '^(<->.<->.<->.<->|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.<->' '255.255.255.255' '::1' 'fe80::*' 'fe00::*' 'ff00::*' 'ff02::*'
# }}}

# {{{ auto correction
    ## disable auto correct
    alias cd='nocorrect cd'
    alias cp='nocorrect cp'
    alias gcc='nocorrect gcc'
    alias grep='nocorrect grep'
    alias ln='nocorrect ln'
    alias man='nocorrect man'
    alias mkdir='nocorrect mkdir'
    alias mv='nocorrect mv'
    alias rm="nocorrect ${aliases[rm]:-rm}"
    which sshpass &> /dev/null ; [ $? -eq 0 ] && alias sshpass='nocorrect sshpass'
    
    ## disable globbing.
    alias find='noglob find'
    alias ftp='noglob ftp'
    alias history='noglob history'
    alias locate='noglob locate'
    alias rsync='noglob rsync'
    alias scp='noglob scp'
    alias sftp='noglob sftp'
    alias ssh='noglob ssh'
# }}}

# {{{ safe command wrap
    if [ ${CMD_SAFE_WRAP} -gt 0 ]; then
        alias rm="${aliases[rm]:-rm} -i"
        alias mv="${aliases[mv]:-mv} -i"
        alias cp="${aliases[cp]:-cp} -i"
        alias ln="${aliases[ln]:-ln} -i"
        alias mkdir="${aliases[mkdir]:-mkdir} -p"
    fi
# }}}

# {{{ prompt
    ## enable colors and prompt module
    autoload -U colors && colors
    autoload -Uz promptinit && promptinit

    ## checkmarks
    PROMPT_CO='.'
    PROMPT_CE='!'

    ## create themes
    prompt_gentoo_setup() {
        PROMPT='%(!.%{$fg_bold[red]%}.%{$fg_bold[green]%}%n@)%m %{$fg_bold[blue]%}%(!.%1~.%~) %#%{$reset_color%} '
        RPROMPT=''
    }
    prompt_themes=($prompt_themes gentoo)
    
    prompt_gentoo_server_setup() {
        PROMPT='%(!.%{$fg_bold[red]%}.%{$fg_bold[yellow]%}%n@)%m %{$fg_bold[blue]%}%(!.%1~.%~) %#%{$reset_color%} '
        RPROMPT=''
    }
    prompt_themes=($prompt_themes gentoo_server)

    prompt_compact_setup() {
        PROMPT=$'%{$fg_bold[grey]%}-(%{$reset_color%}%{$fg_bold[white]%}%1~%{$reset_color%}%{$fg_bold[grey]%})-[%{$reset_color%}%(?,%{$fg_bold[green]%}$PROMPT_CO%{$reset_color%},%{$fg_bold[red]%}$PROMPT_CE%{$reset_color%})%{$fg_bold[grey]%}]-%{$reset_color%}%(!.%{$fg_bold[red]%}.%{$fg_bold[yellow]%}){%{$reset_color%} '
        RPROMPT=$'%(!.%{$fg_bold[red]%}.%{$fg_bold[yellow]%})}%{$reset_color%}%{$fg_bold[grey]%}-(%{$reset_color%}%{$fg_bold[$PROMPT_HOST_COLOR]%}%n@%m%{$reset_color%}%{$fg_bold[grey]%})-%{$reset_color%}'
    }
    prompt_themes=($prompt_themes compact)
    
    prompt_dual_setup() {
        PROMPT=$'%{$fg_bold[grey]%}[%{$fg_bold[$PROMPT_HOST_COLOR]%}%m %{$fg_bold[grey]%}:: %(!.%{$fg_bold[red]%}.%{$fg_bold[green]%})%n%{$fg_bold[grey]%}][%{$fg_bold[white]%}%~%{$fg_bold[grey]%}]\n[%(?,%{$fg_bold[green]%}$PROMPT_CO%{$reset_color%},%{$fg_bold[red]%}$PROMPT_CE%{$reset_color%})%{$fg_bold[grey]%}]%(!.%{$fg_bold[red]%}#.%{$fg_bold[green]%}$)%{$reset_color%} '
        RPROMPT=''
    }   
    prompt_themes=($prompt_themes dual)
    
    prompt_developer_setup() {
        _developer_git() { 
            git status 2> /dev/null > /dev/null
            if [ $? -eq 0 ]; then
                BRANCH=${$(git symbolic-ref HEAD 2> /dev/null)#refs/heads/}
                if [[ -n $BRANCH ]]; then
                    STATUS=$(git status --porcelain 2> /dev/null | tail -n1)
                    if [[ -n $STATUS ]]; then
                        git_color=$fg_bold[red]
                    else
                        git_color=$fg_bold[green]
                    fi
                    echo "%{$fg_bold[grey]%} :: %{$fg_bold[white]%}${BRANCH}%{${git_color}#%{$fg_bold[grey]%}"
                fi
            fi
        }
    
        PROMPT=$'%{$fg_bold[grey]%}[%{$fg_bold[$PROMPT_HOST_COLOR]%}%m %{$fg_bold[grey]%}:: %(!.%{$fg_bold[red]%}.%{$fg_bold[green]%})%n%{$fg_bold[grey]%}][%{$fg_bold[white]%}%~%{$fg_bold[grey]%}$(_developer_git)]\n[%(?,%{$fg_bold[green]%}$PROMPT_CO%{$reset_color%},%{$fg_bold[red]%}$PROMPT_CE%{$reset_color%})%{$fg_bold[grey]%}]%(!.%{$fg_bold[red]%}#.%{$fg_bold[green]%}$)%{$reset_color%} '
        RPROMPT=''
    }   
    prompt_themes=($prompt_themes developer)
    
    ## enable theme
    [[ -z $THEME ]] && THEME=compact
    prompt $THEME
    unset THEME
# }}}

# {{{ variables
    # preferences
    which nano &> /dev/null ; [ $? -eq 0 ] && export EDITOR='nano'
    which vi &> /dev/null ; [ $? -eq 0 ] && export EDITOR='vi'
    which vim &> /dev/null ; [ $? -eq 0 ] && export EDITOR='vim'
    export PAGER='less'
# }}}

# {{{ aliases
    # nano wrapping
    which nano &> /dev/null ; [ $? -eq 0 ] && alias nano='nano -w'

    # default for ls
    alias ll="${aliases[ls]:-ls} -l"

    case $OSTYPE in solaris*)
        alias zfs_rsync='rsync -aviAPh'
        alias zfs_rsync+='rsync -aviAPh --delete'
    ;; esac

    # include local aliases
    [[ -e ~/.aliases ]] && source ~/.aliases || true
# }}}

Enjoy