# sniff out the platform uname=`uname -s` function linux() { [[ "$uname" = "Linux" ]] } function mac() { [[ "$uname" = "Darwin" ]] } # check if a command is available function command_exists() { which "$1" >/dev/null 2>/dev/null } # 1. Environment Vars # =================== [ -d /usr/local/riak ] && export RIAK=/usr/local/riak if mac; then # for riak and possibly building javascriptcore export COMMAND_MODE=unix2003 # Don't pollute tar archives with ._ files (Apple double files) export COPYFILE_DISABLE=true # Develop on Mac export RACK_ENV="development" export NODE_ENV="development" fi if linux; then # Deploy on Linux export RACK_ENV="production" export NODE_ENV="production" fi cdpath=(~) HOSTNAME=`hostname -s` if [[ "x$INSIDE_EMACS" != "x" ]] || [[ "$EMACS" = "t" ]]; then export PAGER=cat export MANPAGER=cat else export PAGER='less' # most rocks if command_exists most; then export MANPAGER='most' fi fi if [[ -r "$HOME/.pythonrc" ]]; then export PYTHONSTARTUP="$HOME/.pythonrc" fi if [[ -d /usr/local/lib/python ]]; then export PYTHONPATH="/usr/local/lib/python" fi # default editors if mac; then # wtf, you must be kidding, doesn't even work in many cases. really fucking lame! function emacsclient() { /Users/sjs/Applications/Emacs.app/Contents/MacOS/bin/emacsclient -s $(find /var/folders -name server -type s -uid $(id -u) 2>| /dev/null | grep emacs) $* } export EDITOR="vim" if command_exists mate; then export EDITOR="mate -w" export VISUAL="mate -w" else export VISUAL="vim" fi elif linux && command_exists emacs; then export EDITOR="emacs -nw" export VISUAL="emacs" else export EDITOR=vi export VISUAL=vi fi if command_exists rmate; then export RMATE_HOST="h.samhuri.net" 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 setopt pushdminus # pushd -N goes to Nth dir in stack export DIRSTACKSIZE=8 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 # =================== # Load the prompt theme system autoload -U promptinit promptinit # Use my prompt theme, based on wunjo (zsh-git) prompt sjs # 7. Aliases # =========== # 7.1. Convenience Aliases/Macros # -------------------------------- alias bgd='bg; disown %1' alias cp='nocorrect cp' # don't correct spelling for 'cp' #alias dispatch-conf='sudo dispatch-conf' alias ev="$EDITOR ~/config/vim/vimrc" alias ez="$EDITOR $ZDOTDIR/zshrc && source $ZDOTDIR/zshrc" alias rz="source $ZDOTDIR/zshrc" if mac; then alias hide='sudo /Developer/Tools/SetFile -a VP' fi 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 myip='curl icanhazip.com' alias rhino='java org.mozilla.javascript.tools.shell.Main' # ls Aliases # ---------------- if mac; then gls_path=`which gls` if [[ -x "$gls_path" ]]; then alias ls='$gls_path -BF --color=auto' alias la='$gls_path -AF --color=auto' else alias ls='ls -BF' alias la='ls -AF' fi 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' # ruby alias irb='irb --readline -r irb/completion' alias rii='ri -Tf ansi' # git if command_exists git; then if command_exists hub; then alias git='hub' fi alias a='git add' alias b='git branch' alias c='git commit' alias cam='git commit -a -m' alias co='git checkout' alias chp='git cherry-pick' alias d='git diff' alias dc='git diff --cached' alias ds='git diff --stat' alias f='git fetch' alias gl='git log' alias glo='git log --oneline --decorate' alias gls='git log --stat' alias m='git merge' alias rbi='git rebase -i --autosquash' alias rbiom='git rebase -i --autosquash origin/master' GIT_VERSION="$(git --version | head -n1 | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')" GIT_VERSION_MAJOR="${GIT_VERSION%%.*}" GIT_VERSION_MINOR="${${GIT_VERSION%.*}#*.}" GIT_VERSION_REVISION="${GIT_VERSION##*.}" if [ "$GIT_VERSION_MINOR" -ge 7 ] && [ "$GIT_VERSION_REVISION" -ge 1 ]; then alias s='git status -sb' else alias s='git status' fi fi function e() { $EDITOR "$@" >/dev/null } alias em='emacsclient' # `cd /path/to/a/file` does `cd /path/to/a` function cd () { if [[ -f "$1" ]]; then builtin cd "${1:h}" elif [[ "$1" = "" ]]; then builtin cd else builtin cd "$1" fi } # 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 # curl convenience functions # ========================== curl=`which curl` if [[ -x "$curl" ]]; then # get function get { $curl -i -H 'x-requested-with: XMLHttpRequest' "$1" } # put function put { $curl -i -X PUT -H 'x-requested-with: XMLHttpRequest' -H 'content-type: application/json' -d "$2" "$1" } # post function post { $curl -i -X POST -H 'x-requested-with: XMLHttpRequest' -H 'content-type: application/json' -d "$2" "$1" } # delete function delete { $curl -i -X DELETE -H 'x-requested-with: XMLHttpRequest' "$1" } 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:*' group-name '' 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:*' 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 # ================ # OS X includes keychain now, cool. if command_exists keychain; then if [[ -f ~/.ssh/id_rsa ]]; then keychain --nogui ~/.ssh/id_rsa fi if [[ -f ~/.ssh/id_rsa-dreamhost ]]; then keychain --nogui ~/.ssh/id_rsa-dreamhost fi KEYCHAINFILE="$HOME/.keychain/$(hostname)-sh" if [[ -f $KEYCHAINFILE ]]; then source $KEYCHAINFILE >/dev/null fi fi # 11. rbenv # ========= if command_exists rbenv; then eval "$(rbenv init -)" fi