Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: emulate zsh *except* pushd related options
On Tue, Dec 22, 2015 at 08:57:47PM -0800, Bart Schaefer wrote:
> On Dec 22, 9:30am, Dominik Vogt wrote:
> }
> } Is there a (safe!) way to say "emulate zsh but don't touch certain options"?
>
> The "emulate" command accepts the same "-o optionn_name" (or "+o") as
> shell startup, so you can do
>
> emulate -L zsh -o shwordsplit ...
Unfortunately my zsh is too old for that.
> For your specific use case, the current state of the pushd and cd options
> can be enumerated this way:
>
> ${(Oa)${${(kv)options[(I)*pushd*|cd*|*cd]/off/+o}/on/-o}}
>
> That won't work in general because some options have "on" as a substring
> of the option name.
>
> So if your autoloaded function begins with:
>
> emulate -L zsh -o shwordsplit \
> ${(Oa)${${(kv)options[(I)*pushd*|cd*|*cd]/off/+o}/on/-o}}
>
> you should get what you want.
So I'll do something like this:
PRESERVE_OPTS=($(setopt | grep "\(^cd\)\|\(cd$\)\|\(pushd\)"))
emulate zsh
setopt shwordsplit "$PRESERVE_OPTS[@]"
I tried to get rid of the grep with parameter expansion but failed
to understand the syntax. As far as I understand, this should do
the job, but it doesn't:
pat='^(*pushd|cd*|*cd)'; PRESERVED_OPTS=(${~$(setopt)//${~pat}/})
It deletes *all* words, not just the ones not matching
(*pushd|cd*|*cd). (Actually the parentheses seem not to work as
described for filename generation at all.)
Ciao
Dominik ^_^ ^_^
--
Dominik Vogt
IBM Germany
Messages sorted by:
Reverse Date,
Date,
Thread,
Author