# Zsh configuration file. # MISCELLANEOUS SETTINGS # Use Vi(m) style key bindings. bindkey -v # Be paranoid, new files are readable/writable by me only. umask 077 # Make sure core dumps are created. ulimit -c unlimited # Prevent overwriting existing files with '> filename', use '>| filename' # (or >!) instead. setopt noclobber # Entering the name of a directory (if it's not a command) will automatically # cd to that directory. setopt autocd # When entering a nonexistent command name automatically try to find a similar # one. setopt correct # Enable zsh's extended glob abilities. setopt extendedglob # Don't exit if is pressed. setopt ignoreeof # HISTORY SETTINGS # Use history and store it in ~/.zsh/history. HISTSIZE=1000 SAVEHIST=1000 HISTFILE=~/.zsh/history # Append to the history file instead of overwriting it and do it immediately # when a command is executed. setopt appendhistory setopt incappendhistory # If the same command is run multiple times store it only once in the history. setopt histignoredups # Vim like completions of previous executed commands. bindkey "^P" history-beginning-search-backward bindkey "^N" history-beginning-search-forward # PROMPT SETTINGS # Autoload add-zsh-hook to add/remove zsh hook functions easily. autoload -Uz add-zsh-hook # Use colorized output, necessary for prompts and completions. autoload -U colors && colors # Set the default prompt. The current host and working directory is displayed, # the exit code of the last command if it wasn't 0, the number of running jobs # if not 0 and a + if this shell is running inside another shell. # The prompt is in green and blue to make easily detectable, the error exit # code in red and bold and the job count in yellow. PROMPT="%{${fg[green]}%}%B%m%b%{${fg[default]}%}:\ %{${fg[blue]}%}%B%~%b%{${fg[default]}%} \ %(1j.%{${fg[yellow]}%}%j%{${fg[default]}%}.)%(2L.+.)%# \ %(?..(%{${fg[red]}%}%B%?%b%{${fg[default]}%}%) )" # Allow substitutions and expansions in the prompt, necessary for vcs_info. setopt promptsubst # Load vcs_info to display information about version control repositories. autoload -Uz vcs_info # Only look for git and mercurial repositories; the only I use. zstyle ':vcs_info:*' enable git hg # Set style of vcs_info display. The current branch (green) and vcs (blue) is # displayed. If there is an special action going on (merge, rebase) it's also # displayed (red). zstyle ':vcs_info:*' formats \ "(%{${fg[green]}%}%b%{${fg[default]}%}:\ %{${fg[blue]}%}%s%{${fg[default]}%})" zstyle ':vcs_info:*' actionformats \ "(%{${fg[green]}%}%b%{${fg[default]}%}/\ %{${fg[red]}%}%a%{${fg[default]}%}:\ %{${fg[blue]}%}%s%{${fg[default]}%})" # Call vcs_info as precmd before every prompt. prompt_precmd() { vcs_info } add-zsh-hook precmd prompt_precmd # Display the vcs information in the right prompt. RPROMPT='${vcs_info_msg_0_}' # When screen is used set the name of the window to the currently running # program. # # When a program is started preexec() sets the window's name to it; when it # stops precmd() resets the windows' name to 'zsh'. if [[ $TERM == screen ]]; then # Set to a non empty value to reset the window name in the next precmd() # call. screen_name_reset=yes screen_preexec() { # Get the application name excluding any arguments. local program_name=${1%% *} # Ignore often used commands which are only running for a very short # time. This prevents a "blinking" name when it's changed to "cd" for # example and then some milliseconds later back to "zsh". [[ $program_name == (cd*|ls|la|ll|clear) ]] && return # Set the window name to the currently running program. print -n "\ek$program_name\e\\" # Tell precmd() to reset the window name when the program stops. screen_name_reset=yes } screen_precmd() { # Abort if no window name reset is necessary. [[ -z $screen_name_reset ]] && return # Reset the window name to 'zsh'. print -n "\ekzsh\e\\" # Just reset the name, so no screen reset necessary for the moment. screen_name_reset= } # Add the preexec() and precmd() hooks. add-zsh-hook preexec screen_preexec add-zsh-hook precmd screen_precmd fi # COMPLETION SETTINGS # Use new completion system. autoload -U compinit && compinit # Load the complist module which provides additions to completion lists # (coloring, scrollable). zmodload zsh/complist # Make sure the list of possible completions is displayed after pressing # the first time. setopt nolistambiguous # Allow completions in the middle of a text, i.e. "/usr/bin/whatever" # completes like "/usr/bin/". Useful when adding new options to commands. bindkey "^I" expand-or-complete-prefix # Use cache to speed up completions. zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache # Try uppercase if the currently typed string doesn't match. This allows # typing in lowercase most of the time and completion fixes the case. zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' # Ignore completion functions. zstyle ':completion:*:functions' ignored-patterns '_*' # Ignore parent directory. zstyle ':completion:*:(cd|mv|cp):*' ignore-parents parent pwd # Use ls like colors for completions. zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} # Make completion lists scrollable so "do you wish to see all n possibilities" # is no longer displayed. zstyle ':completion:*' list-prompt '%p' # When unsetting variables make sure every variable name is only suggested # once. zstyle ':completion:*:unset:*' ignore-line yes # When working with Mercurial and Git don't complete the same file multiple # times. Very useful when completing file names. zstyle ':completion:*:(hg|git)*:*' ignore-line yes # ALIAS AND FUNCTION SETTINGS # Simplify calls to less, automatically redirects all output. alias -g L='2>&1 | less' # Simplify calls to colordiff, output is also piped through less. alias -g D='2>&1 | colordiff L' # Simplify calls to grep. alias -g G='| grep' # Automatically use unified diffs. alias diff='diff -u' # Display all files and use human readable sizes. alias du='du -sh' # Multiple files given to Vim are opened in tabs. alias vim='vim -p' # Shortcuts for Vim. alias v='vim' alias vi='vim' # Exit binding like in Vim. alias :q='exit' # Edit the mercurial patch queue series file for the current mercurial # repository in Vim. Also change Vim's pwd to the patches directory so other # patches can easily be opened. alias vqs='vim -c "cd $(hg root)/.hg/patches/" "$(hg root)/.hg/patches/series"' # Make going up directories simple. alias -g ...='../..' alias -g ....='../../..' # Improved ls which displays the files in columns (-C), visualizes directories, # links and other special files (-F) and pages everything through less (L). # # If available use GNU ls with colorized output. If it isn't available use # normal ls which needs CLICOLOR_FORCE so it displays colors when used with a # pager. ls --color &> /dev/null if [[ $? -eq 0 ]]; then alias ls='ls --color' else alias ls='CLICOLOR_FORCE=1 ls -G' fi # Main ls function. function ls() { command ls -C -F $* L } # Helper function to list all files. function la() { ls -a $* } # Helper function to list all files in list format with access rights, etc. function ll() { la -l $* } # If ^C is pressed while typing a command, add it to the history so it can be # easily retrieved later and then abort like ^C normally does. This is useful # when I want to abort an command to do something in between and then finish # typing the command. TRAPINT() { # Store the current buffer in the history. zle && print -s $BUFFER # Return the default exit code so zsh aborts the current command. return $1 } # Execute all periodic functions every hour. PERIOD=3600 # Display TODOs stored in ~/.todo if this file exists. Run every hour to make # clear they should be completed ;-). todo() { if [[ -f ~/.todo ]]; then cat ~/.todo | $PAGER fi } add-zsh-hook periodic todo # Load rc file for current OS. source_config ~/.zsh os rc $(uname) nolocal # Load rc file for current hostname (first part before a dot) or rc.local. source_config ~/.zsh host rc ${$(hostname)//.*/}