1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-10-27 04:40:59 +01:00

26546, 26556: sticky emulation for functions defined in emulate ... -c ...

environments, plus documentation
This commit is contained in:
Peter Stephenson 2009-02-11 20:42:15 +00:00
parent 0d02cf343e
commit c7d8b0dfb8
16 changed files with 322 additions and 69 deletions

View file

@ -356,10 +356,6 @@ noderef(Compatibility)
)\
.
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 @@ well, causing the effects of the tt(emulate) command and any tt(setopt) and
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)