Rework of my prompt
authorJoerg Jaspert <joerg@debian.org>
Mon, 11 Mar 2013 00:09:50 +0000 (01:09 +0100)
committerJoerg Jaspert <joerg@debian.org>
Mon, 11 Mar 2013 00:09:50 +0000 (01:09 +0100)
.zsh/20_Prompts.zsh
.zsh/functions/precmd

index cc00c25..035c8eb 100644 (file)
 # -*- mode: sh;-*-
 
-# how often should the periodic function be called? I take every 30seconds here.
-# Important: The periodic function is only called when
-#   - the defined time $PERIOD elapsed
-# *AND*
-#   - the prompt gets displayed again!
-# Its not cron-like "execute this really every 30s in the background"!
-#
-# But for sanity reasons - make this conditional on existance of tools, but never
-# overwrite existing values
-if which yacpi > /dev/null; then
-        (( ${+PERIOD} )) || export PERIOD=30
-        LAPTOP=yacpi
-elif which ibam > /dev/null; then
-        (( ${+PERIOD} )) || export PERIOD=30
-        LAPTOP=ibam
+# Harr. "Borrowing" from the grml zshell config, this now supports
+# a much nicer prompt setup, should zsh be recent enough to support it.
+# That is, anything >= 4.3.7, the older ones keep using my old way.
+if is437; then
+    if zrcautoload promptinit && promptinit 2>/dev/null ; then
+         zstyle ':prompt:ganneff' vcs_info true
+         zstyle ':prompt:ganneff' colors true
+         zstyle ':prompt:ganneff' nicelines true
+         zstyle ':prompt:ganneff' battery none
+         zstyle ':prompt:ganneff:right:setup' use-rprompt true
+         zstyle ':prompt:ganneff:left:full:setup' items \
+             ulcorner line openbracket user at host pts closebracket line history \
+             flexline openbracket path closebracket line urcorner newline \
+             llcorner line rc openbracket time closebracket line vcs line change-root pipe space
+         zstyle ':prompt:ganneff:right:full:setup' items \
+             pipe line openbracket date closebracket line lrcorner
+         zstyle ':prompt:ganneff:left:small:setup' items \
+             ulcorner line openbracket user at host closebracket line openbracket path closebracket newline \
+             llcorner line rc openbracket time closebracket line vcs line pipe space
+
+         prompt ganneff
+    fi
 else
-        (( ${+PERIOD} )) || unset PERIOD
-        unset LAPTOP
-fi
+# And the old way
+    # how often should the periodic function be called? I take every 30seconds here.
+    # Important: The periodic function is only called when
+    #   - the defined time $PERIOD elapsed
+    # *AND*
+    #   - the prompt gets displayed again!
+    # Its not cron-like "execute this really every 30s in the background"!
+    #
+    # But for sanity reasons - make this conditional on existance of tools, but never
+    # overwrite existing values
+    if which yacpi > /dev/null; then
+            (( ${+PERIOD} )) || export PERIOD=30
+            LAPTOP=yacpi
+    elif which ibam > /dev/null; then
+            (( ${+PERIOD} )) || export PERIOD=30
+            LAPTOP=ibam
+    else
+            (( ${+PERIOD} )) || unset PERIOD
+            unset LAPTOP
+    fi
 
-# the following is for prompt and gets modified in periodic()
-typeset -A ACPIDISPLAY
-# I know, this stuff is currently made only for my laptop. But right now i cant be bothered
-# to make it more generic
-PR_SLASH='${PR_YELLOW}/${PR_RED}'
-TOOLONG=0
+    # the following is for prompt and gets modified in periodic()
+    typeset -A ACPIDISPLAY
+    # I know, this stuff is currently made only for my laptop. But right now i cant be bothered
+    # to make it more generic
+    PR_SLASH='${PR_YELLOW}/${PR_RED}'
+    TOOLONG=0
 
-# I call periodic here one time to have all the variables it sets initialized. Or 
-# the first prompt would look ugly.
-periodic
+    # I call periodic here one time to have all the variables it sets initialized. Or
+    # the first prompt would look ugly.
+    periodic
 
-# gather version control information for inclusion in a prompt
-# we will only be using one variable, so let the code know now.
-if is439 && zrcautoload vcs_info && vcs_info; then
-    zstyle ':vcs_info:*' max-exports 1
-    zstyle ':vcs_info:*' disable cdv darcs mtn tla hg fossil p4
-    zstyle ':vcs_info:*' use-prompt-escapes
-    zstyle ':vcs_info:*' use_simple
-    zstyle ':vcs_info:*' stagedstr      "!"
-    zstyle ':vcs_info:*' unstagedstr    "?"
-    zstyle ':vcs_info:*' check-for-changes true
+    # gather version control information for inclusion in a prompt
+    # we will only be using one variable, so let the code know now.
+    if is439 && zrcautoload vcs_info && vcs_info; then
+        zstyle ':vcs_info:*' max-exports 1
+        zstyle ':vcs_info:*' disable cdv darcs mtn tla hg fossil p4
+        zstyle ':vcs_info:*' use-prompt-escapes
+        zstyle ':vcs_info:*' use_simple
+        zstyle ':vcs_info:*' stagedstr      "!"
+        zstyle ':vcs_info:*' unstagedstr    "?"
+        zstyle ':vcs_info:*' check-for-changes true
 
-    # change vcs_info formats for the prompt
-    if [[ "$TERM" == dumb ]]; then
-        zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] "
-              zstyle ':vcs_info:*' formats       "(%s%)-[%b] "
-    else
-        # these are the same, just with a lot of colours:
-        #      zstyle ':vcs_info:*' actionformats "$%s${PR_YELLOW})${PR_CYAN}-${PR_YELLOW}[${PR_GREEN}%b${PR_YELLOW}|${PR_RED}%a${PR_YELLOW}]${PR_NO_COLOUR}"
-              zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b%{$fg[red]%}:%{$fg[yellow]%}%r"
-           zstyle ':vcs_info:git*' formats "%{$fg[yellow]%}%s %{$reset_color%} %{$fg[green]%}%b%{$reset_color%}%m%u%c%{$reset_color%} "
-           zstyle ':vcs_info:git*' actionformats "%{$fg[yellow]%}%s%{$reset_color%} %{$fg[green]%}%b%{$reset_color%} $fg[red]%}(%a)%{$reset_color%} %m%u%c%{$reset_color%} "
+        # change vcs_info formats for the prompt
+        if [[ "$TERM" == dumb ]]; then
+            zstyle ':vcs_info:*' actionformats "(%s%)-[%b|%a] "
+               zstyle ':vcs_info:*' formats       "(%s%)-[%b] "
+        else
+            # these are the same, just with a lot of colours:
+            #  zstyle ':vcs_info:*' actionformats "$%s${PR_YELLOW})${PR_CYAN}-${PR_YELLOW}[${PR_GREEN}%b${PR_YELLOW}|${PR_RED}%a${PR_YELLOW}]${PR_NO_COLOUR}"
+               zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat "%b%{$fg[red]%}:%{$fg[yellow]%}%r"
+               zstyle ':vcs_info:git*' formats "%{$fg[yellow]%}%s %{$reset_color%} %{$fg[green]%}%b%{$reset_color%}%m%u%c%{$reset_color%} "
+               zstyle ':vcs_info:git*' actionformats "%{$fg[yellow]%}%s%{$reset_color%} %{$fg[green]%}%b%{$reset_color%} $fg[red]%}(%a)%{$reset_color%} %m%u%c%{$reset_color%} "
+        fi
     fi
-fi
 
-PR_BARLENGTH=0
+    PR_BARLENGTH=0
 
-setprompt
+    setprompt
 
-# See if our (effective) group has changed at all.  (For instance, we're
-# in a subshell that is setgid.)  This happens when i type "newgrp group"
-# for whatever reason
-# I haven't put this in the precmd function because I don't expect
-# my effective group to change over the life of the shell.  It can if
-# I'm running with root privileges, but I deliberately don't use zsh for
-# root in any case, because that encourages me to not use root for
-# anything I don't have to use it for. 
-if [[ "$ORIGGID" != "$EGID" ]]; then
-  # Set for either normal prompt and xterm title bars.
-    GNAME=$(grpname $EGID)
-    if [[ "$TERM" = "xterm" ]]; then
-        psvar[5]=":$GNAME"
+    # See if our (effective) group has changed at all.  (For instance, we're
+    # in a subshell that is setgid.)  This happens when i type "newgrp group"
+    # for whatever reason
+    # I haven't put this in the precmd function because I don't expect
+    # my effective group to change over the life of the shell.  It can if
+    # I'm running with root privileges, but I deliberately don't use zsh for
+    # root in any case, because that encourages me to not use root for
+    # anything I don't have to use it for.
+    if [[ "$ORIGGID" != "$EGID" ]]; then
+      # Set for either normal prompt and xterm title bars.
+        GNAME=$(grpname $EGID)
+        if [[ "$TERM" = "xterm" ]]; then
+            psvar[5]=":$GNAME"
+        else
+            psvar[5]="g[$GNAME] "
+        fi
     else
-        psvar[5]="g[$GNAME] "
+        psvar[5]=
     fi
-else
-    psvar[5]=
 fi
index 9124fc0..589a676 100644 (file)
@@ -1,7 +1,7 @@
 # -*- mode:sh -*-
 
 # update VCS information
-is439 && vcs_info
+is439 && vcs_info
 
 # set variable debian_chroot if running in a chroot with /etc/debian_chroot
 if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
@@ -9,54 +9,56 @@ if [[ -z "$debian_chroot" ]] && [[ -r /etc/debian_chroot ]] ; then
 fi
 ###
 
-local TERMWIDTH
-(( TERMWIDTH = ${COLUMNS} - 1 ))
+if ! is437; then
+    local TERMWIDTH
+    (( TERMWIDTH = ${COLUMNS} - 1 ))
 
-# Truncate the path if it's too long.
-PR_FILLBAR=""
-PR_PWDLEN=""
+    # Truncate the path if it's too long.
+    PR_FILLBAR=""
+    PR_PWDLEN=""
 
-local promptsize=${#${(%):---(%n@%m:%l)---()--}}
-local pwdsize=${#${(%):-%~}}
-# for whatever reason this works better if set to 3 on systems where no acpi info is in prompt
-local apmsize=3
+    local promptsize=${#${(%):---(%n@%m:%l)---()--}}
+    local pwdsize=${#${(%):-%~}}
+    # for whatever reason this works better if set to 3 on systems where no acpi info is in prompt
+    local apmsize=3
 
-# Finally see how long the acpi related prompt is
-PR_APM_TEMP=${PR_APM//\${\(e\)PR_SLASH}/#}
-PR_APM_LENGTH=${(e)PR_APM_TEMP//\${PR_(LIGHT|)(RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE)}/}
+    # Finally see how long the acpi related prompt is
+    PR_APM_TEMP=${PR_APM//\${\(e\)PR_SLASH}/#}
+    PR_APM_LENGTH=${(e)PR_APM_TEMP//\${PR_(LIGHT|)(RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE)}/}
 
-# The info i collect for my laptop is - well. long. As I usually have my terms in full screen
-# mode that doesnt matter, there is enough space. But for some cases I may want smaller
-# windows, so deal with it and make the acpi line smaller by dropping parts of it.
+    # The info i collect for my laptop is - well. long. As I usually have my terms in full screen
+    # mode that doesnt matter, there is enough space. But for some cases I may want smaller
+    # windows, so deal with it and make the acpi line smaller by dropping parts of it.
 
-(( apmsize=${(e)#PR_APM_LENGTH} - 2 ))
+    (( apmsize=${(e)#PR_APM_LENGTH} - 2 ))
 
-while [[ "$promptsize + $pwdsize + $apmsize" -gt $TERMWIDTH ]]; do
-       (( TOOLONG=$TOOLONG + 1 ))
+    while [[ "$promptsize + $pwdsize + $apmsize" -gt $TERMWIDTH ]]; do
+        (( TOOLONG=$TOOLONG + 1 ))
 
-       if [[ "$TOOLONG" -gt 5 ]]; then
-               break
-       fi
-       periodic
-       (( apmsize=${(e)#PR_APM_LENGTH} - 2 ))
-done
+        if [[ "$TOOLONG" -gt 5 ]]; then
+               break
+        fi
+        periodic
+        (( apmsize=${(e)#PR_APM_LENGTH} - 2 ))
+    done
 
-if [[ ${(e)#PR_APM_LENGTH} -gt 10 ]]; then
-       (( apmsize=${(e)#PR_APM_LENGTH} - 2 ))
-else
-       apmsize=3
-fi
+    if [[ ${(e)#PR_APM_LENGTH} -gt 10 ]]; then
+        (( apmsize=${(e)#PR_APM_LENGTH} - 2 ))
+    else
+        apmsize=3
+    fi
 
-if [[ "$promptsize + $pwdsize + $apmsize" -gt $TERMWIDTH ]]; then
-       ((PR_PWDLEN=$TERMWIDTH - $promptsize - $apmsize ))
-else
-       PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $pwdsize + $apmsize)))..${PR_HBAR}.)}"
-fi
+    if [[ "$promptsize + $pwdsize + $apmsize" -gt $TERMWIDTH ]]; then
+        ((PR_PWDLEN=$TERMWIDTH - $promptsize - $apmsize ))
+    else
+        PR_FILLBAR="\${(l.(($TERMWIDTH - ($promptsize + $pwdsize + $apmsize)))..${PR_HBAR}.)}"
+    fi
 
-if [[ "$PR_BARLENGTH" -lt "${#${(e)PR_FILLBAR}}" ]]; then
-       (( TOOLONG=$TOOLONG - 1 ))
-       if [[ "$TOOLONG" -lt 0 ]]; then
-               TOOLONG=0
-       fi
+    if [[ "$PR_BARLENGTH" -lt "${#${(e)PR_FILLBAR}}" ]]; then
+        (( TOOLONG=$TOOLONG - 1 ))
+        if [[ "$TOOLONG" -lt 0 ]]; then
+               TOOLONG=0
+        fi
+    fi
+    PR_BARLENGTH=${#${(e)PR_FILLBAR}}
 fi
-PR_BARLENGTH=${#${(e)PR_FILLBAR}}