# contents: zsh(1) user RC file. # this file is sourced by all interactive shells # 1. Environment Vars # =================== export LC_ALL="en_CA.UTF-8" export LANG="en_CA.UTF-8" cdpath=(~) function linux() { [[ `uname -s` = "Linux" ]] && true } function mac() { [[ `uname -s` = "Darwin" ]] && true } HOSTNAME=`hostname -s` KEYCHAIN_HOST=`hostname` export PAGER=`which less` # most has great colours for man pages if which most >/dev/null 2>&1; then export MANPAGER=`which most` fi # default editors if mac; then export EDITOR="emacsclient" export VISUAL="emacsclient" elif linux; then export EDITOR="emacs -nw" export VISUAL="emacs" fi # 2. Limits # ========= #limit coredumpsize 30m # limit core dumps to 30mb limit stacksize 8m # limit stack to 8mb # 3. Shell Options # ================ # 3.1. Parameters and Shell Functionality # --------------------------------------- #setopt ignoreeof # ignore EOF ('^D') (i.e. don't log out on it) setopt braceccl # {a-d} expands to a b c d setopt noclobber # don't overwrite existing files w/ > output redir setopt hist_allow_clobber # C-p or UP and command has >| now, ready to go # 3.2. Changing Directories # ------------------------- setopt autocd # automatically cd to a directory if not cmd setopt autopushd # automatically pushd directories on dirstack setopt nopushdsilent # print dirstack after each cd/pushd setopt pushdignoredups # don't push dups on stack # need to find out the difference between these two, just the export? setopt autonamedirs # % export h=/home/sjs; cd ~h; pwd # => /home/sjs setopt cdablevars # blah=~/media/movies; cd blah; pwd => ~/media/movies # 3.3. Shell Completion # --------------------- setopt correct # try to correct spelling... setopt no_correctall # ...only for commands, not filenames setopt no_listbeep # don't beep on ambiguous listings setopt listpacked # variable col widths (takes up less space) # 3.4. Shell Expansion and Globbing # --------------------------------- setopt extendedglob # use extended globbing (#, ~, ^) # 3.5. History and History Expansion # ---------------------------------- export HISTFILE="$ZDOTDIR/zhistory" # save history export HISTSIZE=200000 # huge internal buffer export SAVEHIST=200000 # huge history file setopt extendedhistory # save timestamps in history setopt no_histbeep # don't beep for erroneous history expansions setopt histignoredups # ignore consecutive dups in history setopt histfindnodups # backwards search produces diff result each time setopt histreduceblanks # compact consecutive white space chars (cool) setopt histnostore # don't store history related functions setopt incappendhistory # incrementally add items to HISTFILE # this is very annoying #setopt histverify # confirm !: or ^ command results before execution # 3.6. Job Control # ---------------- setopt longlistjobs # list jobs in long format # 3.7. Shell Prompt # ----------------- setopt promptsubst # allow paramater, command, so on in prompt setopt transient_rprompt # hide RPROMPT after cmdline is executed # 3.8. ZLE # -------- setopt no_beep # don't beep on errors (in ZLE) # when completing and then typing | > etc. don't delete # the preceding space self-insert-redir() { integer l=$#LBUFFER zle self-insert (( $l >= $#LBUFFER )) && LBUFFER[-1]=" $LBUFFER[-1]" } zle -N self-insert-redir for op in \| \< \> \& do bindkey "$op" self-insert-redir done # 4. Terminal Settings # ==================== function precmd { rehash } autoload -U colors # we need the colors for some formats below colors # 5. ZLE Keybindings # ================== bindkey '\ep' history-beginning-search-backward # 6. Prompt Subsystem # =================== # define some colours to use in english instead of ANSI # notation: # -background is black unless the var is named colourOnBlue # -prefix of b, e.g. bGreen means bright green none='%{\e[0m%}' red='%{\e[40;31m%}' green='%{\e[40;32m%}' yellow='%{\e[40;33m%}' blue='%{\e[40;34m%}' purple='%{\e[40;35m%}' cyan='%{\e[40;36m%}' white='%{\e[40;37m%}' grey='%{\e[1;40;30m%}' bRed='%{\e[1;40;31m%}' bGreen='%{\e[1;40;32m%}' bYellow='%{\e[1;40;33m%}' bBlue='%{\e[1;40;34m%}' bPurple='%{\e[1;40;35m%}' bCyan='%{\e[1;40;36m%}' bWhite='%{\e[1;40;37m%}' whiteOnRed='%{\e[41;37m%}' whiteOnBlue='%{\e[44;37m%}' bWhiteOnRed='%{\e[1;41;37m%}' # PROMPT SUBTITUTION # ------------------ # %l - tty %M - full machine hostname # %m - hostname %n - USERNAME # %y - tty w/ prefix %# - # or % # %? - last exit code %d,%/ - PWD # %~ - ~ for home etc %h,%! - history event # # %j - # of jobs # # %B - bold %E - clear to EOL # %U - underline %S - standout # # %([n]x.true.false) '.' is arbitrary # 'x' can be: # ! - running with privs # # - effective uid is 'n' # ? exit status was 'n' # C # / - PWD has >= 'n' elements # c # . # ~ - PWD with prefix replacements has >= 'n' elements # D - month = 'n' (jan = 0) # d - day of month = 'n' # g - gid is 'n' # j - # jobs >= 'n' # l - 'n' chars already printed on line # T - hours = 'n' # t - minutes = 'n' # w - day of week = 'n' (sun = 0) # looks like: # user@host% [~] # # non-zero exit code: # -1- user@host% [~] # # jobs running: # [1] user@host% [~] eval exitCode='%(0?..${bWhiteOnRed}-%?-${none} )' eval dirpath='${bGreen}%(4~!.../%3~!%~)${none}' eval job='%(1j.${bYellow}[%j] .)' #hist="${whiteOnBlue}%5h${none}|" eval user='%(0#.${bRed}.${bBlue})%n${none}' eval at='${grey}@${none}' case $HOSTNAME in macbook) host="${cyan}" ;; samis-hackintosh) host="${bWhite}" ;; slick) host="${bRed}" ;; *) host="${bGreen}" ;; esac eval host='${host}%m${none}' # moved dir to rprompt #PROMPT=`echo -n "${hist}${exitCode}${job}${user}${at}${host}${grey}:${none}${dirpath}${bWhite}%#${none} "` if [[ "x$INSIDE_EMACS" != "x" ]] || [[ "$EMACS" = "t" ]]; then export PROMPT="%d %% " export PAGER=cat export MANPAGER=cat else PROMPT=`echo -n "${exitCode}${job}${user}${at}${host}${bWhite}%#${none} "` RPROMPT=`echo -n "${blue}[${dirpath}${blue}]${none} %t"` eval export PROMPT=$'${PROMPT}' fi # PROMPT=`echo -n "${exitCode}${job}${user}${at}${host}${bWhite}%#${none} "` # eval export PROMPT=$'${PROMPT}' # RPROMPT=`echo -n "${blue}[${dirpath}${blue}]${none} %t"` # 7. Aliases # =========== # 7.1. Convenience Aliases/Macros # -------------------------------- #alias burn='cdrecord -dao -driveropts=burnfree -dev=ATA:1,1,0 -v' alias bgd='bg; disown %1' alias cp='nocorrect cp' # don't correct spelling for 'cp' alias cron='crontab -e' #alias dispatch-conf='sudo dispatch-conf' alias ec="$EDITOR ~/config/" alias ev="$EDITOR ~/config/vim/vimrc" alias ez="$EDITOR ~/config/zsh/zshrc" alias hide='sudo /Developer/Tools/SetFile -a VP' alias mkdir='nocorrect mkdir' # don't correct spelling for 'mkdir' alias mv='nocorrect mv' # don't correct spelling for 'mv' #alias ns='newscript' #alias perldoc='LC_ALL=en_US perldoc' #alias reboot='sudo shutdown -r now' #alias shutdown='sudo shutdown -h now' #alias ssh='ssh -X' alias u='cd ..' alias uu='cd ../..' alias uuu='cd ../../..' alias uuuu='cd ../../../..' alias u2='uu' alias u3='uuu' alias u4='uuuu' # ruby alias irb='irb --readline -r irb/completion' alias rii='ri -Tf ansi' # rails alias ss='./script/server' alias sc='./script/console' alias km='kill `cat tmp/pids/mongrel.pid`' # svn alias sup='svn update' alias sst='svn status -u' alias scom='svn commit' alias slog='svn log | less' # git alias a='git add' alias c='git commit' alias g='git' alias b='git branch' alias co='git checkout' alias d='git diff' alias dc='git diff --cached' alias g='git grep' alias m='git merge' alias s='git status' function svnst() { tmpfile=/tmp/svn-stat.$$ [[ -f $tmpfile ]] && rm -f $tmpfile svn stat svn diff > $tmpfile typeset -i added deled delta added=`grep '^+' $tmpfile | wc -l` deled=`grep '^-' $tmpfile | wc -l` delta=$((added - deled)) if [[ delta -gt 0 ]]; then delta_w=added delta_sym='+' else delta_w=deleted delta_sym='-' delta=$((0 - delta)) fi echo " + ${added} lines" echo " - ${deled} lines" echo "= ${delta_sym} ${delta} lines" rm -f $tmpfile } function e() { "$EDITOR" "$@" &! } alias et="$EDITOR . >/dev/null &!" # global aliases - work anywhere on line alias -g C='|wc' alias -g CL='|wc -l' alias -g L='|less' alias -g H='|head' alias -g T='|tail' alias -g G='|grep' alias -g SH='>/dev/null 2>&1' alias -g BGD='& disown %1' # suffix aliases, 'alias -s ps=gv' makes '*.ps' expand to 'gv *.ps' # (globbing done after alias expansion!) #alias -s c=gvim #alias -s h=gvim #alias -s py=gvim #alias -s html=gvim #alias -s css=gvim function cd () { if [[ -f $1 ]]; then builtin cd $1:h else builtin cd $1 fi } function cl () { cd $1 ls } # 7.2. ls Aliases # ---------------- if mac; then alias ls='ls -BF' alias la='ls -AF' else alias ls='ls -BF --color=auto' alias la='ls -AF --color=auto' fi alias ll='ls -l' alias lsd='ls -d' alias lld='ls -dl' function like(){ print -l **/*${1}*{,/**} } # 8. Unsorted (new) stuff # ======================= # if commands takes more than 60 seconds tell me how long it took export REPORTTIME=60 # use less instead of the default more when no cmd is specified export READNULLCMD=less # set shell options setopt no_badpattern # supress err msgs setopt cbases # 0xFF instead of 16#FF setopt globsubst # parameter expns eligible for filename expn & generation setopt interactivecomments # comments allowed in interactive shells setopt no_hup # leave bg tasks running (a la nohup) #setopt magicequalsubst # performs filename expansion on 'arg' part of # foo=arg parameters. bindkey -e # emacs style key bindings bindkey '^I' complete-word # complete on tab, leave expansion to _expand # default in linux is backspace sends ^H, emacs no likey #stty erase '^?' TERMINFO=$HOME/.terminfo function keep { setopt localoptions nomarkdirs nonomatch nocshnullglob nullglob kept=() # Erase old value in case of error on next line kept=($~*) if [[ ! -t 0 ]]; then local line while read line; do kept+=( $line ) # += is a zsh 4.2+ feature done fi print -Rc - ${^kept%/}(T) } alias keep='noglob keep ' # if [ -r "$HOME/.ruby/lib/sjs.rb" ]; then # export RUBYLIB="$HOME/.ruby/lib" # export RUBYOPT="rsjs" # fi # 9. Completion # ============= # more verbose completion prompt zstyle ':completion:*' format '%SCompleting %U%d%u%s' zstyle :completion::complete:cd:: tag-order \ local-directories path-directories # The following lines were added by compinstall zstyle ':completion:*' auto-description 'specify %d:' zstyle ':completion:*' completer _expand _complete _files zstyle ':completion:*' expand prefix #zstyle ':completion:*' format 'Complete %d:' zstyle ':completion:*' group-name '' zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s zstyle ':completion:*' list-suffixes true zstyle ':completion:*' matcher-list 'r:|[._-]=* r:|=*' 'r:|[._-]=* r:|=*' 'r:|[._-]=* r:|=*' 'r:|[._-]=* r:|=*' #zstyle ':completion:*' max-errors 2 zstyle ':completion:*' menu select=0 zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s zstyle ':completion:*' verbose true zstyle :compinstall filename "$ZDOTDIR/zshrc" autoload -Uz compinit compinit # End of lines added by compinstall # 10. SSH Keychain # ================ if which keychain >/dev/null 2>&1; then keychain ~/.ssh/id_rsa source ~/.keychain/${KEYCHAIN_HOST}-sh > /dev/null else echo ">>> You need to install keychain." if mac; then echo "try: sudo port install keychain" elif linux; then echo "try: sudo aptitude install keychain" fi fi