mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-06-08 06:12:10 +02:00
34734: further aliasing adjustments and doc
restrict token aliasing (34641) to global aliases; tighten up POSIX_ALIASES to better match spec; update Aliasing doc to cover this and clarify older behavior 2015-03-18 Peter Stephenson <p.stephenson@samsung.com> * 34723: configure.ac: turn off fixed site function directory if
This commit is contained in:
parent
0b00462644
commit
32b4cb0e73
4 changed files with 35 additions and 13 deletions
|
@ -1,3 +1,10 @@
|
|||
2015-03-18 Barton E. Schaefer <schaefer@zsh.org>
|
||||
|
||||
* 34734: Doc/Zsh/grammar.yo, Src/lex.c, Test/A02alias.ztst:
|
||||
restrict token aliasing (34641) to global aliases; tighten
|
||||
up POSIX_ALIASES to better match spec; update Aliasing doc
|
||||
to cover this and clarify older behavior
|
||||
|
||||
2015-03-18 Peter Stephenson <p.stephenson@samsung.com>
|
||||
|
||||
* 34723: configure.ac: turn off fixed site function directory if
|
||||
|
|
|
@ -538,8 +538,7 @@ If so, it is replaced by the text of the alias if it is in command
|
|||
position (if it could be the first word of a simple command),
|
||||
or if the alias is global.
|
||||
If the replacement text ends with a space, the next word in the shell input
|
||||
is treated as though it were in command position for purposes of alias
|
||||
expansion.
|
||||
is always eligible for purposes of alias expansion.
|
||||
findex(alias, use of)
|
||||
cindex(aliases, global)
|
||||
An alias is defined using the tt(alias) builtin; global aliases
|
||||
|
@ -555,22 +554,32 @@ itemiz(Any parameter reference or command substitution)
|
|||
itemiz(Any series of the foregoing, concatenated without whitespace or
|
||||
other tokens between them)
|
||||
itemiz(Any reserved word (tt(case), tt(do), tt(else), etc.))
|
||||
itemiz(With global aliasing, any command separator, any redirection
|
||||
operator, and `tt(LPAR())' or `tt(RPAR())' when not part of a glob pattern)
|
||||
enditemize()
|
||||
|
||||
Reserved words are not eligible for aliasing when tt(POSIX_ALIASES) is set.
|
||||
The tt(alias) builtin does not reject ineligible aliases, but they are not
|
||||
expanded.
|
||||
It is not presently possible to alias the `tt(LPAR()LPAR())' token that
|
||||
introduces arithmetic expressions, because until a full statement has been
|
||||
parsed, it cannot be distinguished from two consecutive `tt(LPAR())'
|
||||
tokens introducing nested subshells.
|
||||
|
||||
When tt(POSIX_ALIASES) is set, only plain unquoted strings are eligible
|
||||
for aliasing. The tt(alias) builtin does not reject ineligible aliases,
|
||||
but they are not expanded.
|
||||
|
||||
Alias expansion is done on the shell input before any other expansion
|
||||
except history expansion. Therefore, if an alias is defined for the
|
||||
word tt(foo), alias expansion may be avoided by quoting part of the
|
||||
word, e.g. tt(\foo). Any form of quoting works, although there is
|
||||
nothing to prevent an alias being defined for the quoted form such as
|
||||
tt(\foo) as well. For use with completion, which would remove an
|
||||
initial backslash followed by a character that isn't special, it may be
|
||||
more convenient to quote the word by starting with a single quote,
|
||||
i.e. tt('foo); completion will automatically add the trailing single
|
||||
quote.
|
||||
tt(\foo) as well. Also, if a separator such as tt(&&) is aliased,
|
||||
tt(\&&) turns into the two tokens tt(\&) and tt(&), each of which may
|
||||
have been aliased separately. Similarly for tt(\<<), tt(\>|), etc.
|
||||
|
||||
For use with completion, which would remove an initial backslash followed
|
||||
by a character that isn't special, it may be more convenient to quote the
|
||||
word by starting with a single quote, i.e. tt('foo); completion will
|
||||
automatically add the trailing single quote.
|
||||
|
||||
There is a commonly encountered problem with aliases
|
||||
illustrated by the following code:
|
||||
|
|
10
Src/lex.c
10
Src/lex.c
|
@ -1740,12 +1740,13 @@ checkalias(void)
|
|||
|
||||
if (!noaliases && isset(ALIASESOPT) &&
|
||||
(!isset(POSIXALIASES) ||
|
||||
!reswdtab->getnode(reswdtab, zshlextext))) {
|
||||
(tok == STRING && !reswdtab->getnode(reswdtab, zshlextext)))) {
|
||||
char *suf;
|
||||
|
||||
an = (Alias) aliastab->getnode(aliastab, zshlextext);
|
||||
if (an && !an->inuse &&
|
||||
((an->node.flags & ALIAS_GLOBAL) || incmdpos || inalmore)) {
|
||||
((an->node.flags & ALIAS_GLOBAL) ||
|
||||
(incmdpos && tok == STRING) || inalmore)) {
|
||||
inpush(an->text, INP_ALIAS, an);
|
||||
if (an->text[0] == ' ' && !(an->node.flags & ALIAS_GLOBAL))
|
||||
aliasspaceflag = 1;
|
||||
|
@ -1784,6 +1785,8 @@ exalias(void)
|
|||
if (!tokstr) {
|
||||
zshlextext = tokstrings[tok];
|
||||
|
||||
if (tok == NEWLIN)
|
||||
return 0;
|
||||
return checkalias();
|
||||
} else {
|
||||
VARARR(char, copy, (strlen(tokstr) + 1));
|
||||
|
@ -1791,6 +1794,9 @@ exalias(void)
|
|||
if (has_token(tokstr)) {
|
||||
char *p, *t;
|
||||
|
||||
if (isset(POSIXALIASES))
|
||||
return 0;
|
||||
|
||||
zshlextext = p = copy;
|
||||
for (t = tokstr;
|
||||
(*p++ = itok(*t) ? ztokens[*t++ - Pound] : *t++););
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
0:Alias expansion works at the end of parsed strings
|
||||
>foo
|
||||
|
||||
alias '&&=(){ return $?; } && '
|
||||
alias -g '&&=(){ return $?; } && '
|
||||
alias not_the_print_command=print
|
||||
eval 'print This is output
|
||||
&& print And so is this
|
||||
|
|
Loading…
Reference in a new issue