# 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 } # check if this is an interactive session # (tests if stdout is a tty) function is_interactive() { [ -t 1 ] } # 1. Environment Vars # =================== [ -d /usr/local/riak ] && export RIAK=/usr/local/riak # Android SDK export ANDROID_SDK='/usr/local/android/sdk' export ANDROID_TARGET='18' 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 RACK_PORT=4001 export NODE_ENV="development" 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 if command_exists vim; then export EDITOR="vim" export VISUAL="vim" else export EDITOR="vi" export VISUAL="vi" fi # Set Apple Terminal.app resume directory if [[ $TERM_PROGRAM == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]] { function chpwd { local SEARCH=' ' local REPLACE='%20' local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}" printf '\e]7;%s\a' "$PWD_URL" } chpwd } # 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=2000000 # huge internal buffer export SAVEHIST=2000000 # 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 # 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 # 3.9. Auto quote pasted URLs # --------------------------- autoload -U url-quote-magic zle -N self-insert url-quote-magic # 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 e='mate' alias ev="$EDITOR ~/config/vimrc" alias ez="$EDITOR $ZDOTDIR/zshrc && source $ZDOTDIR/zshrc" alias rz="source $ZDOTDIR/zshrc" 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' # ls Aliases # ---------------- if command_exists ls-comma; then alias ls='ls-comma' fi 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 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 # 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) bindkey -e # emacs style key bindings # 10. SSH Keychain # ================ #if is_interactive && command_exists keychain && [[ -d ~/.ssh ]]; then # keychain --nogui ~/.ssh/id_rsa*~*.pub(N) # 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