From: Peter Stephenson <p.w.stephenson@ntlworld.com>
To: zsh-workers@sunsite.dk (Zsh hackers list)
Subject: Re: PATCH: sticky emulation
Date: Wed, 11 Feb 2009 20:28:40 +0000 [thread overview]
Message-ID: <20090211202840.000b37aa@pws-pc> (raw)
In-Reply-To: <090210191804.ZM7110@torch.brasslantern.com>
On Tue, 10 Feb 2009 19:18:04 -0800
Bart Schaefer <schaefer@brasslantern.com> wrote:
> On Feb 10, 11:03pm, Peter Stephenson wrote:
> } Subject: PATCH: sticky emulation
> }
> } This is how I envision (and have already described, at least briefly)
> } sticky emulation for functions working.
>
> This all seems quite reasonable to me, particularly because the
> implementation appears to be a straightforward change to the code --
> tends to imply that it fits naturally into the existing semantics.
>
> Nit-pick: The patch to Src/hashtable.c is a no-op.
Yes, that's been lying around for ages waiting for an excuse to commit
it.
> } Note that sticky emulation is not propagated to autoloaded functions,
> } neither when the autoload is set up nor when they are loaded
>
> What about zcompiled functions? Obviously there's no special case for
> them, but their treatment may be worth explanation at doc time.
I've done that.
Here's the documentation. I'll submit the lot and it can be modified
later if necessary.
Index: Doc/Zsh/builtins.yo
===================================================================
RCS file: /cvsroot/zsh/zsh/Doc/Zsh/builtins.yo,v
retrieving revision 1.118
diff -u -r1.118 builtins.yo
--- Doc/Zsh/builtins.yo 8 Feb 2009 08:09:19 -0000 1.118
+++ Doc/Zsh/builtins.yo 11 Feb 2009 20:28:11 -0000
@@ -356,10 +356,6 @@
)\
.
-If tt(-c) tt(arg) is given, evaluate tt(arg) after temporary setting
-requested emulation. Emulation and all options will be restored to their
-original values before tt(emulate) returns.
-
If the tt(-R) option is given, all options
are reset to their default value corresponding to the specified emulation
mode, except for certain options describing the interactive
@@ -370,6 +366,62 @@
tt(trap) commands to be local to the immediately surrounding shell
function, if any; normally these options are turned off in all emulation
modes except tt(ksh). The tt(-L) and tt(-c) are mutually exclusive.
+
+If tt(-c) tt(arg) is given, evaluate tt(arg) while the requested
+emulation is temporarily in effect. The emulation and all options will
+be restored to their original values before tt(emulate) returns. The
+tt(-R) flag may be used.
+
+Use of tt(-c) enables `sticky' emulation mode for functions defined
+within the evaluated expression: the emulation mode is associated
+thereafter with the function so that whenever the function is executed
+the emulation (respecting the tt(-R) flag, if present) and all
+options are set before entry to the function, and restored after exit.
+If the function is called when the sticky emulation is already in
+effect, either within an `tt(emulate) var(shell) tt(-c)' expression or
+within another function with the same sticky emulation, entry and exit
+from the function do not cause options to be altered (except due to
+standard processing such as the tt(LOCAL_OPTIONS) option).
+
+For example:
+
+example(emulate sh -c 'fni+LPAR()RPAR() { setopt cshnullglob; }
+fno+LPAR()RPAR() { fni; }'
+fno
+)
+
+The two functions tt(fni) and tt(fno) are defined with sticky tt(sh)
+emulation. tt(fno) is then executed, causing options associated
+with emulations to be set to their values in tt(sh). tt(fni) then
+calls tt(fno); because tt(fno) is also marked for sticky tt(sh)
+emulation, no option changes take place on entry to or exit from it.
+Hence the option tt(cshnullglob), turned off by tt(sh) emulation, will
+be turned on within tt(fni) and remain on on return to tt(fno). On exit
+from tt(fno), the emulation mode and all options will be restored to the
+state they were in before entry to the temporary emulation.
+
+The documentation above is typically sufficient for the intended
+purpose of executing code designed for other shells in a suitable
+environment. More detailed rules follow.
+startsitem()
+sitem(1.)(The sticky emulation environment provided by `tt(emulate)
+var(shell) tt(-c)' is identical to that provided by entry to
+a function marked for sticky emulation as a consequence of being
+defined in such an environment. Hence, for example, the sticky
+emulation is inherited by subfunctions defined within functions
+with sticky emulation.)
+sitem(2.)(No change of options takes place on entry to or exit from
+functions that are not marked for sticky emulation, other than those
+that would normally take place, even if those functions are called
+within sticky emulation.)
+sitem(3.)(No special handling is provided for functions marked for
+tt(autoload) nor for functions present in wordcode created by
+the tt(zcompile) command.)
+sitem(4.)(The presence or absence of the tt(-R) flag to tt(emulate)
+corresponds to different sticky emulation modes, so for example
+`tt(emulate sh -c)', `tt(emulate -R sh -c)' and `tt(emulate csh -c)'
+are treated as three distinct sticky emulations.)
+endsitem()
)
findex(enable)
cindex(enabling commands)
--
Peter Stephenson <p.w.stephenson@ntlworld.com>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/
next prev parent reply other threads:[~2009-02-11 20:29 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-10 23:03 Peter Stephenson
2009-02-11 3:18 ` Bart Schaefer
2009-02-11 20:28 ` Peter Stephenson [this message]
2009-02-11 23:37 ` Bart Schaefer
2009-02-12 9:44 ` Peter Stephenson
2009-02-12 10:10 ` Oliver Kiddle
2009-02-12 15:30 ` Peter Stephenson
2009-02-12 15:41 ` Bart Schaefer
2009-02-12 15:32 ` Bart Schaefer
2009-02-12 2:23 ` Bart Schaefer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090211202840.000b37aa@pws-pc \
--to=p.w.stephenson@ntlworld.com \
--cc=zsh-workers@sunsite.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).