]> ruderich.org/simon Gitweb - config/dotfiles.git/blobdiff - zsh/rc
zsh/rc: Add fallback completer to ^F which always completes files.
[config/dotfiles.git] / zsh / rc
diff --git a/zsh/rc b/zsh/rc
index e29219af05bfa5d838054800abf923e1b9634b44..bda2c6e347fb38ecec97af7e38cc67b3e805d4b6 100644 (file)
--- a/zsh/rc
+++ b/zsh/rc
@@ -165,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.
@@ -241,34 +238,64 @@ if [[ $ZSH_VERSION == (4.3.<9->|4.<4->*|<5->*) ||
     }
     add-zsh-hook chpwd prompt_chpwd
 
-    # 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.
-    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
+    # 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 username 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.
-PROMPT="$green%B%m%b$default:$blue%B%~%b$default \
-%(1j.$yellow%j$default.)%# \
+#
+# 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
+
+    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
+
+    # 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%) )"
 
-unset red blue green yellow 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.
@@ -346,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
 
@@ -398,6 +428,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
 
 
@@ -453,6 +487,13 @@ zstyle ':completion:*' ignore-line yes
 # complete to the same and change it.
 zstyle ':completion:*:(mv|cp):*' ignore-line no
 
+# 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