X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=80178e0cdc57194f6c66d6db910b97055ec68e04;hb=acfeea45e718eeecec36fea55f0ea8037ee6aef5;hp=ef32525f23f4c19cb147d40a9a70006c1ed6e340;hpb=22247354cceff65512811106f28f81861c49a62c;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index ef32525..80178e0 100644 --- a/zsh/rc +++ b/zsh/rc @@ -145,23 +145,14 @@ bindkey -a '^N' history-beginning-search-forward # Use colorized output, necessary for prompts and completions. autoload -U colors && colors -# Some shortcuts for colors. +# Some shortcuts for colors. The %{...%} tells zsh that the data in between +# doesn't need any space, necessary for correct prompt draw. local red="%{${fg[red]}%}" local blue="%{${fg[blue]}%}" local green="%{${fg[green]}%}" local yellow="%{${fg[yellow]}%}" local default="%{${fg[default]}%}" -# 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. -# -# 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="$green%B%m%b$default:$blue%B%~%b$default \ -%(1j.$yellow%j$default.)%# \ -%(?..($red%B%?%b$default%) )" - # vcs_info was added in 4.3.9 but it works in earlier versions too. So load it # if the necessary files are available in ~/.zsh/functions/vcs_info (often a # symbolic link to current checkout of Zsh's sources). @@ -174,9 +165,6 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || $fpath) fi - # 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. @@ -211,24 +199,79 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) || zstyle ':vcs_info:*' unstagedstr '¹' zstyle ':vcs_info:*' stagedstr '²' - # Call vcs_info as precmd before every prompt. - prompt_precmd() { - vcs_info + # Default to running vcs_info. If possible we prevent running it later for + # speed reasons. If set to a non empty value vcs_info is run. + FORCE_RUN_VCS_INFO=1 + + # Cache system inspired by Bart Trojanowski + # (http://jukie.net/~bart/blog/pimping-out-zsh-prompt). + #zstyle ':vcs_info:*+pre-get-data:*' hooks pre-get-data + +vi-pre-get-data() { + # Only Git and Mercurial support and need caching. Abort if any other + # VCS is used. + [[ "$vcs" != git && "$vcs" != hg ]] && return + + # If the shell just started up or we changed directories (or for other + # custom reasons) we must run vcs_info. + if [[ -n $FORCE_RUN_VCS_INFO ]]; then + FORCE_RUN_VCS_INFO= + return + fi + + # Don't run vcs_info by default to speed up the shell. + ret=1 + # If a git/hg command was run then run vcs_info as the status might + # need to be updated. + case "$(fc -ln $(($HISTCMD-1)))" in + git* | g\ *) + ret=0 + ;; + hg*) + ret=0 + ;; + esac } - add-zsh-hook precmd prompt_precmd - - # Display the VCS information in the right prompt. - if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then - RPROMPT='${vcs_info_msg_0_}' - # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when - # ${vcs_info_msg_0_} is empty. Provide a workaround for those versions, - # thanks to Frank Terbeck for it. - else - RPROMPT='${vcs_info_msg_0_:- }' - fi + + # Must run vcs_info when changing directories. + prompt_chpwd() { + FORCE_RUN_VCS_INFO=1 + } + add-zsh-hook chpwd prompt_chpwd + + # Used by prompt code below to determine if vcs_info should be run. + RUN_VCS_INFO=1 +else + RUN_VCS_INFO= fi -unset red blue green yellow default +# 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. +# +# 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_precmd() { + # Call vcs_info before every prompt. + if [[ -n $RUN_VCS_INFO ]]; then + vcs_info + + # Display the VCS information in the right prompt. + if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ]]; then + RPROMPT="${vcs_info_msg_0_}" + # There is a bug in Zsh below 4.3.9 which displays a wrong symbol when + # ${vcs_info_msg_0_} is empty. Provide a workaround for those + # versions, thanks to Frank Terbeck for it. + else + RPROMPT="${vcs_info_msg_0_:- }" + fi + fi + + PROMPT="$green%B%m%b$default:$blue%B%~%b$default \ +%(1j.$yellow%j$default.)%# \ +%(?..($red%B%?%b$default%) )" +} +add-zsh-hook precmd prompt_precmd + # When screen, xterm or rxvt is used set the name of the window to the # currently running program. @@ -244,6 +287,9 @@ unset red blue green yellow default # screen is running on the remote machine instead of @screen @:hostname # (hostname replaced by the machine's hostname) is displayed. This only works # if the .zshrc on the server also uses this command. +# +# screen* is necessary as `screen` uses screen.linux for example for a linux +# console. if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # Is set to a non empty value to reset the window name in the next # precmd() call. @@ -283,7 +329,7 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then m) program_name=mutt ;; - v|vi) + v) program_name=vim ;; esac @@ -401,12 +447,14 @@ zstyle ':completion:*' group-name '' zstyle ':completion:*:functions' ignored-patterns '_*' # Ignore parent directory. zstyle ':completion:*:(cd|mv|cp):*' ignore-parents parent pwd -# 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 +# Always complete one value (file name) only once in the current line. This +# makes it easy to complete multiple values because I can just press tab to +# get all possible values. Otherwise I would have to skip the first value +# again and again. +zstyle ':completion:*' ignore-line yes +# Except for mv and cp, because I often want to use to similar names, so I +# complete to the same and change it. +zstyle ':completion:*:(mv|cp):*' ignore-line no # CUSTOM ALIASES AND FUNCTIONS @@ -417,10 +465,12 @@ zstyle ':completion:*:(hg|git)*:*' ignore-line yes # typing the command. # # Thanks to Vadim Zeitlin for a fix (--) so lines -# starting with - don't cause errors. +# starting with - don't cause errors; and to Nadav Har'El +# for a fix (-r) to handle whitespace/quotes +# correctly, both on the Zsh mailing list. TRAPINT() { # Store the current buffer in the history. - zle && print -s -- $BUFFER + zle && print -s -r -- $BUFFER # Return the default exit code so Zsh aborts the current command. return $1 @@ -490,14 +540,16 @@ tig() { # OS SPECIFIC SETTINGS -if [[ $(uname) == Linux ]]; then +local uname=$(uname) + +if [[ $uname == Linux ]]; then # Settings when creating Debian packages. DEBEMAIL=simon@ruderich.org export DEBEMAIL DEBFULLNAME='Simon Ruderich' export DEBFULLNAME -elif [[ $(uname) == Darwin ]]; then # Mac OS X +elif [[ $uname == Darwin ]]; then # Mac OS X # Store the current clipboard in CLIPBOARD before every command so it can # be used in commands. os_darwin_preexec() { @@ -525,18 +577,20 @@ source_config ~/.zsh host rc ${$(hostname)//.*/} # RUN COMMANDS # If not already in screen reattach to a running session or create a new one. -# -# screen* is necessary as `screen` uses screen.linux for example for a linux -# console which would otherwise cause an infinite loop. -if [[ $TERM != screen* && $TERM != 'dumb' ]]; then +# This also starts screen one a remote server when connecting through ssh. +if [[ $TERM != dumb && -z $STY ]]; then # Get running detached sessions. session=$(screen -list | grep 'Detached' | awk '{ print $1; exit }') + + # As we exec later we have to set the title here. + window_preexec "screen" + # Create a new session if none is running. if [[ -z $session ]]; then - screen + exec screen # Reattach to a running session. else - screen -r $session + exec screen -r $session fi fi