- personal
- snipets
- openbsd
- linux
- solaris
- configuration
This is an old revision of the document!
I recently (201207) switched to zsh from bash. Although I liked bash I did find it lacking at times. I poked at some other shells before but never really invested time in one.
Recently a friend did show me her cool zsh configuration, so I though it may be worth some of my time.
Here you will find a few screenshots and my commented .zshrc.
User prompt, showing of the exit code indicated and auto completion.
Root prompt, same as user but with red brackets.
Custom hostname color for Axion.
## .zshrc # by Jorge Schrauwen <jorge@blackdot.be> # Version 20141225006 # YYYYMMDD### # How to install # curl -sk "https://docu.blackdot.be/getRaw.php?onlyCode=true&id=configuration:zsh" -o ~/.zshrc # # Change Log # - 20141225: moved some sections around to make for more logical flow # - 20141225: added .zopts to locally overwrite options # - 20141225: moved sourcing of local aliases file to after the global ones # - 20141225: fix auto update # - 20141223: only autocomplete commands not arguments # - 20141223: disabled beep # - 20141223: disable homedir autocomplete, at request of some people # - 20141008: support lx branded zones # - 20141003: make pkg_add on openbsd a bit easier # - 20141002: updated zshenable for solaris # - 20141002: fixed broken WANT_SBIN # - 20141002: fixed PATH/MANPATH order for Solaris # - 20141002: rename .zprofile to .zlocal to avoid double sourcing # - 20140820: fixed Yosemite broken ctr+r # - 20140727: fixes for EDITOR and solaris zshenable # - 20140726: added support for smartos zones # - 20140629: added support for pkgsrc on OSX (http://saveosx.org) # - 20140421: added support for openbsd colorls # - 20131013: add rsync aliasses for solaris with ACL preservation # - 20131010: cleanup of paths before updating # - 20131010: fix tar aliased to rm # - 20131009: move gnu and sfw in PATH for solaris and enable colorize # - 20130730: fixed manpages on OmniOS # - 20130717: add alias for pyedit # - 20130716: cleaner sbin handling on solaris # - 20130629: support for omnios.blackdot.be # - 20130625: revert some OmniOS stuff due to better understanding of isaexec # - 20130621: check if staff group on omnios and add sbin to path # - 20130615: parse .zprofile # - 20130520: added some stuff for OmniOS # - 20120308: fixed some mac stuff # - 20120823: automatic update # - 20120821: add support to disable UTF-8 checkmark with .znofancy # {{{ updater NZSHRC="https://docu.blackdot.be/getRaw.php?onlyCode=true&id=configuration:zsh" CHECK_UPDATE=1 AUTO_UPDATE=1 # }}} # {{{ options ## change directory setopt auto_cd # drop cd ## enable command correction setopt correct #setopt correct_all ## prevent file overwrite setopt no_clobber ## pound sign in interactive prompt setopt interactive_comments ## superglobs #setopt extended_glob 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 # include local options [[ -e ~/.zopts ]] && source ~/.zopts # }}} # {{{ prompt # enable colors module autoload -U colors && colors # utf8 checkmarks PROMPT_CO='.' PROMPT_CE='!' case $LANG in *UTF-8) case $TERM in (xterm*) if [ ! -f ~/.znofancy ]; then PROMPT_CO='✓' PROMPT_CE='✗' fi ;; esac ;; esac [[ -z $THEME ]] && THEME=minimal case $THEME in gentoo) PROMPT='%(!.%{$fg_bold[red]%}.%{$fg_bold[green]%}%n@)%m %{$fg_bold[blue]%}%(!.%1~.%~) %#%{$reset_color%} ' ;; gentoo_server) PROMPT='%(!.%{$fg_bold[red]%}.%{$fg_bold[yellow]%}%n@)%m %{$fg_bold[blue]%}%(!.%1~.%~) %#%{$reset_color%} ' ;; minimal) 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%}' ;; dual) 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%} ' ;; esac unset THEME # }}} # {{{ 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 # }}} # {{{ 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 # }}} # {{{ auto completion ## base autoload -U compinit && compinit ## complete from withing word setopt complete_in_word ## complete aliases setopt complete_aliases ## 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 ## Ignore completions for commands that we dont have zstyle ':completion:*:functions' ignored-patterns '_*' ## enable case-insensitive completion zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' ## enable caching zstyle ':completion::complete:*' use-cache on zstyle ':completion::complete:*' cache-path ~/.zcache ## Prevent re-suggestion zstyle ':completion:*:rm:*' ignore-line yes zstyle ':completion:*:scp:*' ignore-line yes zstyle ':completion:*:ls:*' ignore-line yes ## enable killall menu 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 zstyle ':completion:*:kill:*' command 'ps -u $(whoami) -o pid,pcpu,pmem,cmd' 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 ## enable make completion compile=(all clean compile disclean install remove uninstall) compctl -k compile make ## ssh host 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::*:ssh:*:hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })' zstyle ':completion:*:ssh:*' group-order hosts-domain hosts-host users hosts-ipaddr ## ssh user completion cleanup zstyle ':completion:*:ssh:*:users' ignored-patterns \ adm alias apache at bin cron cyrus daemon distcache exim ftp games gdm \ guest gopher haldaemon halt mail man messagebus mysql named news nobody nut \ nfsnobody lp operator portage postfix postgres postmaster qmaild qmaill qmailp \ qmailq qmailr qmails rpmbuild rpc rpcuser shutdown smmsp squid sshd sync saslauth \ uucp vcsa vpopmail xfs # }}} # {{{ 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 } # }}} # {{{ variables # preferences which nano &> /dev/null ; [ $? -eq 0 ] && export EDITOR='nano' 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='ls -l' alias lr='ls -R' case $OSTYPE in solaris*) alias zfs_rsync='rsync -avAPh' alias zfs_rsync+='rsync -avAPh --delete' ;; esac # include local aliases [[ -e ~/.aliasses ]] && mv ~/.aliasses ~/.aliases [[ -e ~/.aliases ]] && source ~/.aliases # }}} # {{{ advanced ## 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 [ -f /etc/DIR_COLORS ] && eval $(dircolors -b /etc/DIR_COLORS) [ -f ~/.dir_colors ] && eval $(dircolors -b ~/.dir_colors) if [ -n "${LS_COLORS}" ]; then export ZLSCOLORS="${LS_COLORS}" alias ls='ls --color=auto' alias grep='grep --color=auto' fi # LX BrandZ [ -d /native/usr/bin ] && export PATH=$PATH:/native/usr/bin [ -d /native/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=$PATH:/native/sbin [ -d /native/usr/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=$PATH:/native/usr/sbin ;; 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') [ -d /usr/gnu/bin ] && export PATH=$PATH:/usr/gnu/bin [ -d /usr/gnu/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=$PATH:/usr/gnu/sbin # check for obd repository (omnios) export PATH=$(echo $PATH | /bin/sed -r 's#/opt/obd/s?bin:##g') export MANPATH=$(echo $MANPATH | /bin/sed -r 's#/opt/obd/share/man:##g') [ -d /opt/obd/bin ] && export PATH=$PATH:/opt/obd/bin [ -d /opt/obd/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=$PATH:/opt/obd/sbin [ -d /opt/obd/share/man ] && export MANPATH=$MANPATH:/opt/obd/share/man # check for pkgsrc (smartos) export PATH=$(echo $PATH | /bin/sed -r 's#/opt/local/s?bin:##g') [ -d /opt/local/bin ] && export PATH=/opt/local/bin:$PATH [ -d /opt/local/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=/opt/local/sbin:$PATH [ -d /opt/local/man ] && export MANPATH=/opt/local/man:$MANPATH # 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') [ -d /opt/omni/bin ] && export PATH=$PATH:/opt/omni/bin [ -d /opt/omni/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=$PATH:/opt/omni/sbin [ -d /opt/omni/share/man ] && export MANPATH=$MANPATH:/opt/omni/share/man # check for sfw export PATH=$(echo $PATH | /bin/sed -r 's#:/usr/sfw/s?bin##g') [ -d /usr/sfw/bin ] && export PATH=$PATH:/usr/sfw/bin # check for local export PATH=$(echo $PATH | /bin/sed -r 's#/usr/local/s?bin:##g') [ -d /usr/local/bin ] && export PATH=/usr/local/bin:$PATH [ -d /usr/local/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=/usr/local/sbin:$PATH # check for opencsw export PATH=$(echo $PATH | /bin/sed -r 's#:/opt/csw/s?bin##g') [ -d /opt/csw/bin ] && export PATH=$PATH:/opt/csw/gnu:/opt/csw/bin [ -d /opt/csw/sbin ] && [[ -n $WANT_SBIN ]] && export PATH=$PATH:/opt/csw/sbin # colorization [ "$(which ls)" = "/usr/bin/ls" ] && alias ls='ls --color' # selective gnu / colorization [ "$(which ls)" = "/usr/gnu/bin/ls" ] && alias ls='/usr/gnu/bin/ls --color=auto' [ -e /usr/gnu/bin/grep ] && alias grep='/usr/gnu/bin/grep --color=auto' [ -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' ;; 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 /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 ;; esac # zsh shortcuts case $OSTYPE in linux*|darwin*|openbsd*) alias zshenable='chsh -s $(which zsh)' alias zshdisable='chsh -s $(which bash)' ;; esac case $OSTYPE in solaris*) alias zshenable='pfexec /usr/sbin/usermod -s $(which zsh) $(id -n -u)' alias zshdisable='pfexec /usr/sbin/usermod -s $(which bash) $(id -n -u)' ;; esac ## host specific case ${HOST:r} in (axion*|tachyon*) # add a little info banner if [[ $SHLVL -eq 1 ]] ; then clear echo print -P "\e[1;33m Welcome to: \e[1;34m%m" print -P "\e[1;33m Running: \e[1;34m`uname -srm`\e[1;33m on \e[1;34m%l" print -P "\e[1;33m It is:\e[1;34m %D{%r} \e[1;33m on \e[1;34m%D{%A %b %f %G}" echo tput sgr0 fi # proper UTF-8 export LANG=en_US.UTF-8 # host color PROMPT_HOST_COLOR=green ;; (artemis*|monolith*) PROMPT_HOST_COLOR=red ;; *) # default host color PROMPT_HOST_COLOR=blue ;; esac ## local configuration [[ -e ~/.zlocal ]] && source ~/.zlocal # }}}