# zshrc/90_profiles # # set up directory specific variables and options # # http://michael-prokop.at/blog/2009/05/30/directory-specific-shell-configuration-with-zsh # # chpwd_profiles taken from grml zshrc # # Copyright © 2010-2017 Tobias Klauser # Released under the terms of the Artistic Licence 2.0 # # Source repository: git://git.distanz.ch/dotfiles/zsh.git # CHPWD_PROFILE='default' zstyle ':chpwd:profiles:/home/tklauser/go(|/|/*)' profile distanz zstyle ':chpwd:profiles:/home/tobiask/go(|/|/*)' profile distanz zstyle ':chpwd:profiles:/home/tklauser/src(|/|/*)' profile distanz zstyle ':chpwd:profiles:/home/tobiask/src(|/|/*)' profile distanz zstyle ':chpwd:profiles:*locomotor-primitives*' profile uzh zstyle ':chpwd:profiles:/home/tobiask/zi(|/|/*)' profile zhinst chpwd_profile_distanz() { [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1 print "chpwd(): Switching to profile: $profile" export GIT_AUTHOR_EMAIL="tklauser@distanz.ch" export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL" } chpwd_profile_uzh() { [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1 print "chpwd(): Switching to profile: $profile" export GIT_AUTHOR_EMAIL="tobias.klauser@uzh.ch" export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL" } chpwd_profile_zhinst() { [[ ${profile} == ${CHPWD_PROFILE} ]] && return 1 print "chpwd(): Switching to profile: $profile" export GIT_AUTHOR_EMAIL="tobias.klauser@zhinst.com" export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL" } 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