
Frank Terbeck ft@grml.org:
Richard Hartmann richih.mailinglist@gmail.com:
On Thu, Jul 24, 2008 at 14:58, Frank Terbeck ft@grml.org wrote:
- Don't touch the current zshrc at all. It works fine and should be left intact unmodified.
We'll need to stop the normal zshrc from sourcing, so something like:
If there _is_ no normal zshrc, zsh-newuser-install will run. As we can easily replace this function, ZSH does the handling of this for free.
As I said, I would not want to touch /etc/zsh/zshrc. It will always be there. Hence, the catch is needed.
I also do not want to touch ~/.zshrc. It should always be there. If we can set ZDOTDIR before zsh is run, we do have means to support the *full* range of zsh config files. No need to touch ~/.zshrc at all.
I really would prefer to keep grml's zsh config like it is now, and if you want to switch, you use a function, say 'zmode <whateverrc>' to spawn a differently set up shell.
You can even write the current mode into a file, so that subsequently opened shells automatically use that setup.
No need to fiddle with newuser-install, at all.
[...]
Do NOT source ~/.zshrc in that case (set $ZDOTDIR to ~/.zshrc.$ZSHRC_ALT - that would make ~/.zshrc.$ZSHRC_ALT/.zshrc to be sourced; standard zsh mechanism.)
We should touch a .zshrc in there if a given configuration does not provide one in order to avoid the newuser-module-dialog.
I would rather have a ~/.zshrc that simply uses $ZDOTDIR to source everything. Solves two problems in one go.
That's not what $ZDOTDIR is meant for at all. It is meant for switching to alternate configurations.
If $ZDOTDIR is unset, the value of $HOME is used. Hence $HOME/.zshrc is used in normal environments.
Is $ZDOTDIR is /foo/bar/, /foo/bar/.zshrc is used. No matter what $HOME is set to.
[...]
So, maybe a bit of code makes things clearer:
[snip] diff -r f344eeb49c9f etc/zsh/zshenv --- a/etc/zsh/zshenv Fri May 30 14:59:34 2008 +0200 +++ b/etc/zsh/zshenv Thu Jul 24 22:32:19 2008 +0200 @@ -103,5 +103,51 @@ # MAKEDEV should be usable on udev as well by default: export WRITE_ON_UDEV=yes
+if [[ -o interactive ]] ; then + + function zmode() { + mode=$1 ; shift + + typeset -g ZSHRC_ALT="${mode}" + print ${mode} > /var/run/zsh.${USER}.mode + if [[ -o login ]] ; then + exec zsh -l + else + exec zsh + fi + } + + [[ -z ${ZSHRC_ALT} ]] && [[ -e /var/run/zsh.${USER}.mode ]] && ZSHRC_ALT=$(</var/run/zsh.${USER}.mode) + + if [[ -n ${ZSHRC_ALT} ]] ; then + if [[ -e /etc/zsh/rcs/zshrc.${ZSHRC_ALT} ]] \ + && [[ -d /etc/zsh/rcs/${ZSHRC_ALT}.d ]]; then + + setopt extendedglob + + fpath=( + /etc/zsh/rcs/${ZSHRC_ALT}.d + /etc/zsh/functions.d + /etc/zsh/completion.d + $fpath + ) + + for func in /etc/zsh/functions.d/[^_]*[^~] ; do + autoload -Uz ${func:t} + done + + ZDOTDIR="$HOME/.zshrc.${ZSHRC_ALT}" + [[ ! -d ${ZDOTDIR} ]] && mkdir ${ZDOTDIR} + [[ ! -e ${ZDOTDIR}/.zshrc ]] && touch ${ZDOTDIR}/.zshrc + + setopt noextendedglob + + else + unset ZSHRC_ALT + fi + fi + +fi + ## END OF FILE ################################################################# # vim:filetype=zsh foldmethod=marker autoindent expandtab shiftwidth=4 diff -r f344eeb49c9f etc/zsh/zshrc --- a/etc/zsh/zshrc Fri May 30 14:59:34 2008 +0200 +++ b/etc/zsh/zshrc Thu Jul 24 22:32:19 2008 +0200 @@ -84,6 +84,11 @@ # exactly the same as @@INSERT-aliases-default@@. If you want a list of # *all* aliases, for example, use @@INSERT-aliases-all@@. #}}} + +if [[ -n ${ZSHRC_ALT} ]] ; then + source /etc/zsh/rcs/zshrc.${ZSHRC_ALT} + return +fi
# zsh profiling {{{ # just execute 'ZSH_PROFILE_RC=1 zsh' and run 'zprof' to get the details [snap]
I didn't test this at all. But I think it implements most of the needed mechanisms.
I do not think a releasable version would be a lot more complex. And IMO this is quite simple.
Regards, Frank