[Grml] A scheme to manage several ZSH config file collections?

Frank Terbeck ft at grml.org
Thu Jul 24 21:07:40 CEST 2008

Richard Hartmann <richih.mailinglist at gmail.com>:
> On Thu, Jul 24, 2008 at 14:58, Frank Terbeck <ft at grml.org> wrote:
> >>  1. 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.

> >>  4. add /etc/zsh/rcs/richih.d/ at the *beginning* be $fpath so that
> >>     colliding functions are not taken from the default dir, but from
> >>     the dir that is part of the config, that is in action.
> [[ -n $ZSHRC_ALT ]] && . /etc/zsh/rcs/$ZSHRC_ALT.d
> in all zshrcs would mean you can fork and otherwise mangle them
> without needing to touch anything in the actual file.

With '/etc/zsh/rcs/$ZSHRC_ALT.d' being a directory, that would
certainly lead to funny results.

It should be a directory that holds the function files specific for
the configuration in question. And in order to overwrite same-named
functions from /etc/zsh/functions.d it *must* be put at the start of

> >>     Do NOT source /etc/zsh/zshrc in that case.
> This should exist and overwrite the normal zsh-newuser-install.

It shou

> >>     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.

This is (besides the obvious need to set $ZSHRC_ALT, and the
previously explained need for setting $fpath) the reason for my point
no. 5.

> >>  5. Do the handling of $ZSHRC_ALT, $ZDOTDIR and $fpath in the global
> >>     zshenv (/etc/zsh/zshenv) in a
> >>
> >>         if [[ -o interactive ]] ; then
> >>         fi
> >>
> >>     Block;
> Would also be solved by the above, so make that three.

It wouldn't. IMHO. See above.

Regards, Frank

In protocol design, perfection has been reached not when there is
nothing left to add, but when there is nothing left to take away.
                                                  -- RFC 1925

More information about the Grml mailing list