diff --git a/zsh/bundler b/zsh/bundler new file mode 100644 index 0000000..253a6d9 --- /dev/null +++ b/zsh/bundler @@ -0,0 +1,34 @@ +# bundler +bundled_commands=(annotate cap capify cucumber foreman guard heroku nanoc rackup rainbows rake rspec ruby shotgun spec spork thin unicorn unicorn_rails irb rails pry) + +_bundler-installed() { + which bundle > /dev/null 2>&1 +} + +_within-bundled-project() { + local check_dir=$PWD + while [ "$(dirname $check_dir)" != "/" ]; do + [ -f "$check_dir/Gemfile" ] && return + check_dir="$(dirname $check_dir)" + done + false +} + +_run-with-bundler() { + if _bundler-installed && _within-bundled-project; then + bundle exec $@ + else + $@ + fi +} + +for cmd in $bundled_commands; do + eval "function bundled_$cmd () { _run-with-bundler $cmd \$@}" + alias $cmd=bundled_$cmd + + if which _$cmd > /dev/null 2>&1; then + compdef _$cmd bundled_$cmd=$cmd + fi +done + +# vim: ft=zsh diff --git a/zsh/completion b/zsh/completion new file mode 100644 index 0000000..6550be0 --- /dev/null +++ b/zsh/completion @@ -0,0 +1,28 @@ +# Use modern completion system +autoload -Uz compinit +compinit + +# git completion speed boost +__git_files () { + _wanted files expl 'local files' _files +} + +zstyle ':completion:*' auto-description 'specify: %d' +zstyle ':completion:*' completer _expand _complete _correct _approximate +zstyle ':completion:*' format 'Completing %d' +zstyle ':completion:*' group-name '' +zstyle ':completion:*' menu select=2 +which dircolors >/dev/null && eval "$(dircolors -b)" +zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} +zstyle ':completion:*' list-colors '' +zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s +zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*' +zstyle ':completion:*' menu select=long +zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s +zstyle ':completion:*' use-compctl false +zstyle ':completion:*' verbose true + +zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' +zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd' + +# vim: ft=zsh diff --git a/zsh/history b/zsh/history new file mode 100644 index 0000000..beed1d1 --- /dev/null +++ b/zsh/history @@ -0,0 +1,9 @@ +# ignore sequential duplicates +setopt hist_ignore_dups + +# keep 1000 lines of history within the shell and save it to ~/.zsh_history: +HISTSIZE=1000 +SAVEHIST=1000 +HISTFILE=~/.zsh_history + +# vim: ft=zsh diff --git a/zsh/import_inputrc b/zsh/import_inputrc new file mode 100644 index 0000000..f8910a6 --- /dev/null +++ b/zsh/import_inputrc @@ -0,0 +1,4 @@ +# bind special keys according to readline configuration +eval "$(sed -n 's/#.*//; s/^/bindkey /; s/: / /p' ~/.inputrc)" + +# vim: ft=zsh diff --git a/zsh/keybindings b/zsh/keybindings new file mode 100644 index 0000000..2677e1e --- /dev/null +++ b/zsh/keybindings @@ -0,0 +1,9 @@ +# Use emacs keybindings even if our EDITOR is set to vi +bindkey -e + +# bind some more keys, zsh only +bindkey "\e[Z" reverse-menu-complete # Shift+Tab + +source $DOTFILES_ZSH_DIR/import_inputrc + +# vim: ft=zsh diff --git a/zsh/prompt b/zsh/prompt new file mode 100644 index 0000000..3d89d33 --- /dev/null +++ b/zsh/prompt @@ -0,0 +1,16 @@ +source $DOTFILES_ZSH_DIR/prompt_vcs + +set_rprompt() { + vcs_info + if [[ -n $vcs_info_msg_0_ ]]; then + RPROMPT="$vcs_info_msg_0_" + else + RPROMPT="%F{green}%~%f" + fi + RPROMPT="%(?..%B[%?]%b ) $RPROMPT" +} + +PROMPT="%(?.%F{blue}›.%F{red}?)%f%n@%m%F{blue}>%f " +prompt_opts=(cr percent) + +# vim: ft=zsh diff --git a/zsh/prompt_vcs b/zsh/prompt_vcs new file mode 100644 index 0000000..2ae099c --- /dev/null +++ b/zsh/prompt_vcs @@ -0,0 +1,9 @@ +autoload -Uz vcs_info +zstyle ':vcs_info:*' enable git hg +zstyle ':vcs_info:*' stagedstr "%F{red}±%f" +zstyle ':vcs_info:*' unstagedstr "%F{yellow}≠%f" +zstyle ':vcs_info:*' check-for-changes true +zstyle ':vcs_info:*' formats "%c%u %F{green}%S%f‹%F{blue}%b%f‹%F{yellow}%r%f" +zstyle ':vcs_info:*' actionformats "%F{red}%a%f %c%u %F{green}%S%f‹%F{blue}%b%f‹%F{yellow}%r%f" + +# vim: ft=zsh diff --git a/zsh/rc b/zsh/rc index 0356a99..4168445 100644 --- a/zsh/rc +++ b/zsh/rc @@ -1,141 +1,24 @@ # zshrc, called for interactive shells -# Set up the prompt +source $DOTFILES_ZSH_DIR/term_title +set_term_title # call it right now -# Set terminal title -set_term_title() { - [[ -o interactive ]] || return - # Bubble information up to the terminal - case $TERM_PROGRAM in - Apple_Terminal) - local SEARCH=' ' - local REPLACE='%20' - local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}" - printf '\e]7;%s\a' "$PWD_URL" - ;; - *) - # NOOP - ;; - esac - case $TERM in - screen*) - #print -Pn "\ek%n@%m: %~\e\\" #breaks tmux - print -Pn "\e]2;%n@%m: %~\a" - ;; - xterm*|*rxvt*) - print -Pn "\e]2;%n@%m: %~\a" - ;; - *) - # NOOP - ;; - esac -} - -set_term_title # call in right now - -# Use emacs keybindings even if our EDITOR is set to vi -bindkey -e - -# bind special keys according to readline configuration -eval "$(sed -n 's/#.*//; s/^/bindkey /; s/: / /p' ~/.inputrc)" - -# bind some more keys, zsh only -bindkey "\e[Z" reverse-menu-complete # Shift+Tab - -# Keep 1000 lines of history within the shell and save it to ~/.zsh_history: -HISTSIZE=1000 -SAVEHIST=1000 -HISTFILE=~/.zsh_history - -# Use modern completion system -autoload -Uz compinit -compinit - -# bundler -bundled_commands=(annotate cap capify cucumber foreman guard heroku nanoc rackup rainbows rake rspec ruby shotgun spec spork thin unicorn unicorn_rails irb rails pry) - -_bundler-installed() { - which bundle > /dev/null 2>&1 -} - -_within-bundled-project() { - local check_dir=$PWD - while [ "$(dirname $check_dir)" != "/" ]; do - [ -f "$check_dir/Gemfile" ] && return - check_dir="$(dirname $check_dir)" - done - false -} - -_run-with-bundler() { - if _bundler-installed && _within-bundled-project; then - bundle exec $@ - else - $@ - fi -} - -## Main program -for cmd in $bundled_commands; do - eval "function bundled_$cmd () { _run-with-bundler $cmd \$@}" - alias $cmd=bundled_$cmd - - if which _$cmd > /dev/null 2>&1; then - compdef _$cmd bundled_$cmd=$cmd - fi -done - -# git completion speed boost -__git_files () { - _wanted files expl 'local files' _files -} - -zstyle ':completion:*' auto-description 'specify: %d' -zstyle ':completion:*' completer _expand _complete _correct _approximate -zstyle ':completion:*' format 'Completing %d' -zstyle ':completion:*' group-name '' -zstyle ':completion:*' menu select=2 -which dircolors >/dev/null && eval "$(dircolors -b)" -zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS} -zstyle ':completion:*' list-colors '' -zstyle ':completion:*' list-prompt %SAt %p: Hit TAB for more, or the character to insert%s -zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*' -zstyle ':completion:*' menu select=long -zstyle ':completion:*' select-prompt %SScrolling active: current selection at %p%s -zstyle ':completion:*' use-compctl false -zstyle ':completion:*' verbose true - -zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' -zstyle ':completion:*:kill:*' command 'ps -u $USER -o pid,%cpu,tty,cputime,cmd' - -autoload -Uz vcs_info -zstyle ':vcs_info:*' enable git hg -zstyle ':vcs_info:*' stagedstr "%F{red}±%f" -zstyle ':vcs_info:*' unstagedstr "%F{yellow}≠%f" -zstyle ':vcs_info:*' check-for-changes true -zstyle ':vcs_info:*' formats "%c%u %F{green}%S%f‹%F{blue}%b%f‹%F{yellow}%r%f" -zstyle ':vcs_info:*' actionformats "%F{red}%a%f %c%u %F{green}%S%f‹%F{blue}%b%f‹%F{yellow}%r%f" +source $DOTFILES_ZSH_DIR/history +source $DOTFILES_ZSH_DIR/keybindings +source $DOTFILES_ZSH_DIR/completion +source $DOTFILES_ZSH_DIR/prompt +source $DOTFILES_ZSH_DIR/bundler precmd() { psvar=() - set_term_title - vcs_info - if [[ -n $vcs_info_msg_0_ ]]; then - RPROMPT="$vcs_info_msg_0_" - else - RPROMPT="%F{green}%~%f" - fi - RPROMPT="%(?..%B[%?]%b ) $RPROMPT" + set_rprompt } preexec() { set_term_title } -PROMPT="%(?.%F{blue}›.%F{red}?)%f%n@%m%F{blue}>%f " -prompt_opts=(cr percent) - chpwd() { set_term_title } diff --git a/zsh/term_title b/zsh/term_title new file mode 100644 index 0000000..de1bf30 --- /dev/null +++ b/zsh/term_title @@ -0,0 +1,30 @@ +# Set terminal title +set_term_title() { + [[ -o interactive ]] || return + # Bubble information up to the terminal + case $TERM_PROGRAM in + Apple_Terminal) + local SEARCH=' ' + local REPLACE='%20' + local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}" + printf '\e]7;%s\a' "$PWD_URL" + ;; + *) + # NOOP + ;; + esac + case $TERM in + screen*) + #print -Pn "\ek%n@%m: %~\e\\" #breaks tmux + print -Pn "\e]2;%n@%m: %~\a" + ;; + xterm*|*rxvt*) + print -Pn "\e]2;%n@%m: %~\a" + ;; + *) + # NOOP + ;; + esac +} + +# vim: ft=zsh