zshrc: Add directory based profiles
[grml-etc-core.git] / etc / zsh / zshrc
index ef2cced..cce0859 100644 (file)
@@ -448,6 +448,7 @@ xunfunction() {
 # this allows us to stay in sync with grml's zshrc and put own
 # modifications in ~/.zshrc.local
 zrclocal() {
+    xsource "/etc/zsh/zshrc.local"
     xsource "${HOME}/.zshrc.local"
     return 0
 }
@@ -457,8 +458,7 @@ zrclocal() {
 # locale setup {{{
 xsource "/etc/default/locale"
 
-export LANG=${LANG:-en_US.iso885915}
-for var in LC_ALL LC_MESSAGES ; do
+for var in LANG LC_ALL LC_MESSAGES ; do
     [[ -n ${(P)var} ]] && export $var
 done
 
@@ -1031,6 +1031,55 @@ chpwd() {
 
 # }}}
 
+# directory based profiles {{{
+
+CHPWD_PROFILE='default'
+function chpwd_profiles() {
+    # Say you want certain settings to be active in certain directories.
+    # This is what you want.
+    #
+    # zstyle ':chpwd:profiles:/usr/src/grml(|/|/*)'   profile grml
+    # zstyle ':chpwd:profiles:/usr/src/debian(|/|/*)' profile debian
+    #
+    # When that's done and you enter a directory that matches the pattern
+    # in the third part of the context, a function called chpwd_profile_grml,
+    # for example, is called (if it exists).
+    #
+    # If no pattern patches (read: no profile is detected) the profile is
+    # set to 'default', which means chpwd_profile_default is attempted to
+    # be called.
+    #
+    # The name of the detected profile will be available in a variable called
+    # 'profile' in your functions. You don't need to do anything, it'll just
+    # be there.
+    #
+    # Then there is the parameter $CHPWD_PROFILE is set to the profile, that
+    # was is currently active. That way you can avoid running code for a
+    # profile that is already active, by running code such as the following
+    # at the start of your function:
+    #
+    # function chpwd_profile_grml() {
+    #     [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
+    #   ...
+    # }
+    #
+    # The initial value for $CHPWD_PROFILE is 'default'.
+    #
+    # There you go. Now have fun with that.
+    local -x profile
+
+    zstyle -s ":chpwd:profiles:${PWD}" profile profile || profile='default'
+    if (( ${+functions[chpwd_profile_$profile]} )) ; then
+        chpwd_profile_${profile}
+    fi
+
+    CHPWD_PROFILE="${profile}"
+    return 0
+}
+chpwd_functions=( ${chpwd_functions} chpwd_profiles )
+
+# }}}
+
 # {{{ display battery status on right side of prompt via running 'BATTERY=1 zsh'
 if [[ $BATTERY -gt 0 ]] ; then
     if ! check_com -c acpi ; then
@@ -1999,7 +2048,7 @@ preexec () {
 # adjust title of xterm
     [[ ${NOTITLE} -gt 0 ]] && return 0
     case $TERM in
-        (xterm*|rxvt)
+        (xterm*|rxvt*)
             print -Pn "\e]0;%n@%m: $1\a"
             ;;
     esac
@@ -2960,10 +3009,6 @@ exit 0;
 for color in BLUE RED GREEN CYAN YELLOW MAGENTA WHITE ; unset $color
 # }}}
 
-# source another config file if present {{{
-xsource "/etc/zsh/zshrc.local"
-# }}}
-
 # "persistent history" {{{
 # just write important commands you always need to ~/.important_commands
 if [[ -r ~/.important_commands ]] ; then