]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - zsh/rc
Simplify configuration setup.
[config/dotfiles.git] / zsh / rc
diff --git a/zsh/rc b/zsh/rc
index 23f936935f5a8acbb78450c3468237d6824aaa77..e0bf4c76a737f9aeb105b796c5eb4e1635c87ef5 100644 (file)
--- a/zsh/rc
+++ b/zsh/rc
@@ -1,7 +1,7 @@
 # Zsh configuration file.
 
 
-source_debug "sourcing ~/.zsh/rc"
+source_debug ". ~/.zsh/rc"
 
 # MISCELLANEOUS SETTINGS
 
@@ -238,36 +238,61 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ||
     }
     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
 
-# 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.
+# Set the prompt. A two line prompt is used. On the top left the current
+# working directory is displayed, on the right vcs_info (if available). On the
+# bottom left current user name and host is shown, 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.
+#
+# Thanks to Adam's prompt for the basic idea of this prompt.
 prompt_precmd() {
+    # Regex to remove elements which take no space. Used to calculate the
+    # width of the top prompt. Thanks to Bart's and Adam's prompt code in
+    # Functions/Prompts/prompt_*_setup.
+    local zero='%([BSUbfksu]|([FB]|){*})'
+
     # Call vcs_info before every prompt.
     if [[ -n $RUN_VCS_INFO ]]; then
         vcs_info
+    else
+        vcs_info_msg_0_=
+    fi
 
-        # 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 <ft@bewatermyfriend.org> for it.
-        else
-            RPROMPT="${vcs_info_msg_0_:- }"
-        fi
+    local width width_left width_right
+    local top_left top_right
+
+    # Display vcs_info (if used) on the right in the top prompt.
+    top_right="${vcs_info_msg_0_}"
+    width_right=${#${(S%%)top_right//$~zero/}}
+    # Remove vcs_info if it would get too long.
+    if [[ $(( COLUMNS - 4 - 1 - width_right )) -lt 0 ]]; then
+        top_right=
+        width_right=0
     fi
 
-    PROMPT="$green%B%m%b$default:$blue%B%~%b$default \
-%(1j.$yellow%j$default.)%# \
+    # Display current directory on the left in the top prompt. Truncate the
+    # directory if necessary.
+    width=$(( COLUMNS - 4 - 1 - width_right ))
+    top_left=".-$default%b($yellow%$width<..<%~%<<$default)%B$blue"
+
+    # Calculate the width of the top prompt to fill the middle with "-".
+    width_left=${#${(S%%)top_left//$~zero/}}
+    width_right=${#${(S%%)top_right//$~zero/}}
+    width=$(( COLUMNS - width_left - width_right ))
+
+    PROMPT="$blue%B$top_left${(l:$width::-:)}%b$default$top_right
+$blue%B'%b$default\
+$green%B%n%b$default@$green%B%m%b$default %(1j.$yellow%j$default.)%# \
 %(?..($red%B%?%b$default%) )"
+
 }
 add-zsh-hook precmd prompt_precmd
 
@@ -348,6 +373,9 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then
             # in the term/outer screen.
             if [[ $program_name == @screen ]]; then
                 program_name="@:${$(hostname)//.*/}"
+            # Use "@:!hostname" for root screens.
+            elif [[ $program_name == @!screen ]]; then
+                program_name="@:!${$(hostname)//.*/}"
             fi
         fi
 
@@ -383,14 +411,16 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then
         window_reset=
     }
 
-    # Sets the window title. Works with screen, xterm and rxvt.
+    # Sets the window title. Works with screen, xterm and rxvt. (V) escapes
+    # all non-printable characters. Thanks to Mikachu in #zsh on Freenode
+    # (2010-08-07 17:09 CEST).
     if [[ $TERM == screen* ]]; then
         window_title() {
-            print -n "\ek$1\e\\"
+            print -n "\ek${(V)1}\e\\"
         }
     elif [[ $TERM == xterm* || $TERM == rxvt* ]]; then
         window_title() {
-            print -n "\e]2;$1\e\\"
+            print -n "\e]2;${(V)1}\e\\"
         }
     else
         # Fallback if another TERM is used.
@@ -400,6 +430,10 @@ if [[ $TERM == screen* || $TERM == xterm* || $TERM == rxvt* ]]; then
     # Add the preexec() and precmd() hooks.
     add-zsh-hook preexec window_preexec
     add-zsh-hook precmd window_precmd
+else
+    # Fallback if another TERM is used, necessary to run screen (see below in
+    # "RUN COMMANDS").
+    window_preexec() { }
 fi
 
 
@@ -454,6 +488,16 @@ 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
+# Don't complete ./config.* files, this makes running ./configure much
+# simpler. Thanks to Nomexous in #zsh on Freenode (2010-03-16 01:54)
+zstyle ':completion:*:*:-command-:*' ignored-patterns './config.*'
+
+# Provide a fallback completer which always completes files. Useful when Zsh's
+# completion is too "smart". Thanks to Frank Terbeck <ft@bewatermyfriend.org>
+# (http://www.zsh.org/mla/users/2009/msg01038.html).
+zle -C complete-files complete-word _generic
+zstyle ':completion:complete-files:*' completer _files
+bindkey '^F' complete-files
 
 
 # CUSTOM ALIASES AND FUNCTIONS
@@ -475,12 +519,12 @@ TRAPINT() {
     return $1
 }
 
-# Colorize stderr. Very useful when looking for errors. Thanks to
+# Colorize stderr in red. Very useful when looking for errors. Thanks to
 # http://gentoo-wiki.com/wiki/Zsh for the basic script and Mikachu in #zsh on
 # Freenode (2010-03-07 04:03) for some improvements (-r, printf). It's not yet
 # perfect and doesn't work with su and git for example, but it can handle most
-# interactive output quite well (even with no trailing new line) and in those
-# cases the E alias can be used as workaround.
+# interactive output quite well (even with no trailing new line) and in cases
+# it doesn't work, the E alias can be used as workaround.
 exec 2>>(while read -r -k -u 0 line; do
     printf '\e[91m%s\e[0m' "$line";
     print -n $'\0';
@@ -569,8 +613,7 @@ fi
 
 # LOAD ADDITIONAL CONFIGURATION FILES
 
-# Load rc file for current hostname (first part before a dot) or rc.local.
-source_config ~/.zsh host rc ${$(hostname)//.*/}
+source_config ~/.zsh.rc.local
 
 
 # RUN COMMANDS
@@ -594,6 +637,6 @@ if [[ $TERM != dumb && -z $STY ]]; then
 fi
 
 
-source_debug "finished sourcing ~/.zsh/rc"
+source_debug ". ~/.zsh/rc (done)"
 
 # vim: ft=zsh