X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=zsh%2Frc;h=48f12fc4b0b0b70fc7866d03d6c1f4661889d0ed;hb=b1fdce6a314b77279469fb660668143bef080577;hp=dea48042bb4ee6ff80c5bc56b1acbcad5e75e700;hpb=abffe4a5d42482508709c25797961e1760f3bcc3;p=config%2Fdotfiles.git diff --git a/zsh/rc b/zsh/rc index dea4804..48f12fc 100644 --- a/zsh/rc +++ b/zsh/rc @@ -19,6 +19,11 @@ source_debug '. ~/.zsh/rc' +# Warn when creating global variables from inside a function. Needs to be set +# before declaring a function. +setopt warn_create_global + + # HELPER FUNCTIONS # Return the name of the program which is called in the foreground with `fg`. @@ -229,16 +234,18 @@ if [[ $ZSH_VERSION == (4.3.<9->*|4.<4->*|<5->*) || if [[ $ZSH_VERSION == (4.3.<11->*|4.<4->*|<5->*) || -d ~/.zsh/functions/vcs_info ]]; then zstyle ':vcs_info:*' formats \ - "($green%b%u%c$default:$blue%s$default)" + "(${green}%b%u%c${default}:${blue}%s${default}%m)" \ + "${green}%u%c${default}" zstyle ':vcs_info:*' actionformats \ - "($green%b%u%c$default/$red%a$default:$blue%s$default)" + "(${green}%b%u%c${default}/${red}%a${default}:${blue}%s${default}%m)" \ + "${green}%u%c${default}" else # In older versions %u and %c are not defined yet and are not # correctly expanded. zstyle ':vcs_info:*' formats \ - "($green%b$default:$blue%s$default)" + "(${green}%b${default}:${blue}%s${default})" zstyle ':vcs_info:*' actionformats \ - "($green%b$default/$red%a$default:$blue%s$default)" + "(${green}%b${default}/${red}%a${default}:${blue}%s${default})" fi # Set style for formats/actionformats when unstaged (%u) and staged (%c) # changes are detected in the repository; check-for-changes must be set to @@ -281,6 +288,26 @@ if [[ $ZSH_VERSION == (4.3.<9->*|4.<4->*|<5->*) || esac } + # Display number of WIP stashes (this excludes manually named commits + # which might be used for something else), thanks to + # http://eseth.org/2010/git-in-zsh.html (viewed on 2013-04-27) for the + # idea to display the stash count. + function +vi-git-stashes() { + if [[ -s ${hook_com[base]/.git/refs/stash} ]]; then + local -a stashes + # Thanks to Valodim in #zsh on Freenode (2013-07-01 14:14 CEST) + # for the solution to "grep" the output with (M) and :#(...). + stashes=${#${(M)${(f)"$(git stash list 2>/dev/null)"}:#(*WIP*)}} + + if [[ $stashes -gt 0 ]]; then + hook_com[misc]+=" ${yellow}${stashes}s${default}" + fi + fi + } + + # Apply hooks to Git. + zstyle ':vcs_info:git*+set-message:*' hooks git-stashes + # Must run vcs_info when changing directories. prompt_chpwd() { zshrc_force_run_vcs_info=1 @@ -362,6 +389,7 @@ zshrc_prompt_precmd() { vcs_info else vcs_info_msg_0_= + vcs_info_msg_1_= fi # Setup. Create variables holding the formatted content. @@ -369,6 +397,9 @@ zshrc_prompt_precmd() { # Current directory in yellow, truncated if necessary (WIDTH is replaced # below). local directory="${yellow}%WIDTH<..<%~%<<${default}" + # Minimal information about the VCS, only displayed if there are + # unstaged/staged changes. + local vcs_staged="${vcs_info_msg_1_}" # Information about the VCS in this directory. local vcs="${vcs_info_msg_0_}" @@ -395,20 +426,25 @@ zshrc_prompt_precmd() { # Combine them to create the prompt. + local top_left="${vcs_staged}" local top_right="${vcs}(${seconds})" local width_top_prefix=${#${(S%%)top_prefix//$~zero/}} + local width_top_left=${#${(S%%)top_left//$~zero/}} local width_top_right=${#${(S%%)top_right//$~zero/}} # Calculate the maximum width of ${top_left}. -2 are the braces of # ${top_left}, -1 is one separator from ${top_separator} (we want at least # one between left and right parts). local top_left_width_max=$(( - COLUMNS - $width_top_prefix - 2 - 1 - $width_top_right + COLUMNS - $width_top_prefix + - $width_top_left - 2 + - 1 + - $width_top_right )) # Truncate directory if necessary. - local top_left="(${directory/WIDTH/${top_left_width_max}})" - local width_top_left=${#${(S%%)top_left//$~zero/}} + top_left="(${directory/WIDTH/${top_left_width_max}})${top_left}" + width_top_left=${#${(S%%)top_left//$~zero/}} # Calculate the width of the top prompt to fill the middle with "-". local width=$(( @@ -444,10 +480,6 @@ 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. zshrc_window_reset=yes - # Is set to a non empty value when the shell is running as root. - if [[ $UID -eq 0 ]]; then - zshrc_window_root=yes - fi zshrc_window_preexec() { # Get the program name with its arguments. @@ -492,7 +524,7 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then # Add an exclamation mark at the beginning if running with sudo or if # running zsh as root. - if [[ -n $program_sudo || -n $zshrc_window_root ]]; then + if [[ -n $program_sudo || $UID -eq 0 ]]; then program_name=!$program_name fi @@ -531,7 +563,7 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then fi # Prepend prefixes like in window_preexec(). - if [[ -n $zshrc_window_root ]]; then + if [[ $UID -eq 0 ]]; then name="!$name" fi if [[ -n $SSH_CONNECTION ]]; then