summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zsh/zshrc/90_profiles92
1 files changed, 89 insertions, 3 deletions
diff --git a/.zsh/zshrc/90_profiles b/.zsh/zshrc/90_profiles
index dca3a5f..57e5315 100644
--- a/.zsh/zshrc/90_profiles
+++ b/.zsh/zshrc/90_profiles
@@ -4,14 +4,19 @@
#
# http://michael-prokop.at/blog/2009/05/30/directory-specific-shell-configuration-with-zsh
#
+# chpwd_profiles taken from grml zshrc
+#
# Copyright © 2010 Tobias Klauser <tklauser@distanz.ch>
# Released under the terms of the Artistic Licence 2.0
#
# Source repository: git://git.distanz.ch/dotfiles/zsh.git
+#
-zstyle ':chpwd:profiles:/home/tklauser/src/nios2-linux(|/|/*)' profile nios2linux
-zstyle ':chpwd:profiles:/home/tklauser/projects/sinet(|/|/*)' profile sinet
-zstyle ':chpwd:profiles:/home/tklauser/src/linux-2.6(|/|/*)' profile linux26
+CHPWD_PROFILE='default'
+
+zstyle ':chpwd:profiles:/home/tklauser/src/nios2-linux(|/|/*)' profile nios2linux
+zstyle ':chpwd:profiles:/home/tklauser/projects/sinet(|/|/*)' profile sinet
+zstyle ':chpwd:profiles:/home/tklauser/src/linux-2.6(|/|/*)' profile linux26
chpwd_profile_nios2linux()
{
@@ -49,4 +54,85 @@ chpwd_profile_linux26()
export GIT_COMMITTER_EMAIL="tklauser@distanz.ch"
}
+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 matches (read: no profile is detected) the profile is
+ # set to 'default', which means chpwd_profile_default is attempted to
+ # be called.
+ #
+ # A word about the context (the ':chpwd:profiles:*' stuff in the zstyle
+ # command) which is used: The third part in the context is matched against
+ # ${PWD}. That's why using a pattern such as /foo/bar(|/|/*) makes sense.
+ # Because that way the profile is detected for all these values of ${PWD}:
+ # /foo/bar
+ # /foo/bar/
+ # /foo/bar/baz
+ # So, if you want to make double damn sure a profile works in /foo/bar
+ # and everywhere deeper in that tree, just use (|/|/*) and be happy.
+ #
+ # 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'.
+ #
+ # Version requirement:
+ # This feature requires zsh 4.3.3 or newer.
+ # If you use this feature and need to know whether it is active in your
+ # current shell, there are several ways to do that. Here are two simple
+ # ways:
+ #
+ # a) If knowing if the profiles feature is active when zsh starts is
+ # good enough for you, you can put the following snippet into your
+ # .zshrc.local:
+ #
+ # (( ${+functions[chpwd_profiles]} )) && print "directory profiles active"
+ #
+ # b) If that is not good enough, and you would prefer to be notified
+ # whenever a profile changes, you can solve that by making sure you
+ # start *every* profile function you create like this:
+ #
+ # function chpwd_profile_myprofilename() {
+ # [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1
+ # print "chpwd(): Switching to profile: $profile"
+ # ...
+ # }
+ #
+ # That makes sure you only get notified if a profile is *changed*,
+ # not everytime you change directory, which would probably piss
+ # you off fairly quickly. :-)
+ #
+ # 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 )
+
+
# vim:ft=zsh