1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-11-21 00:51:07 +01:00

28025: (D) parameter flag

This commit is contained in:
Peter Stephenson 2010-06-11 20:08:01 +00:00
parent 48fe737779
commit 64d431d98b
4 changed files with 65 additions and 21 deletions

View file

@ -1,3 +1,8 @@
2010-06-11 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 28025: Doc/Zsh/expn.yo, Src/subst.c, Src/utils.c: (D)
parameter flag to abbreviate directories.
2010-06-09 Peter Stephenson <pws@csr.com> 2010-06-09 Peter Stephenson <pws@csr.com>
* Haakon Riiser: 28009: Completion/Unix/Command/_ffmpeg: new. * Haakon Riiser: 28009: Completion/Unix/Command/_ffmpeg: new.
@ -13267,5 +13272,5 @@
***************************************************** *****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL * This is used by the shell to define $ZSH_PATCHLEVEL
* $Revision: 1.4997 $ * $Revision: 1.4998 $
***************************************************** *****************************************************

View file

@ -771,6 +771,13 @@ Capitalize the resulting words. `Words' in this case refers to sequences
of alphanumeric characters separated by non-alphanumerics, em(not) to words of alphanumeric characters separated by non-alphanumerics, em(not) to words
that result from field splitting. that result from field splitting.
) )
item(tt(D))(
Assume the string or array elements contain directories and attempt
to substitute the leading part of these by names. This is the reverse
of `tt(~)' substitution: see
ifnzman(noderef(Filename Expansion))\
ifzman(the section FILENAME EXPANSION below).
)
item(tt(e))( item(tt(e))(
Perform em(parameter expansion), em(command substitution) and Perform em(parameter expansion), em(command substitution) and
em(arithmetic expansion) on the result. Such expansions can be em(arithmetic expansion) on the result. Such expansions can be
@ -1199,40 +1206,43 @@ item(tt(13.) em(Quote application))(
Any quoting or unquoting using tt((q)) and tt((Q)) and related flags Any quoting or unquoting using tt((q)) and tt((Q)) and related flags
is applied. is applied.
) )
item(tt(14.) em(Visibility enhancment))( item(tt(14.) em(Directory naming))(
Any directory name substitution using tt((D)) flag is applied.
)
item(tt(15.) em(Visibility enhancment))(
Any modifications to make characters visible using the tt((V)) flag Any modifications to make characters visible using the tt((V)) flag
are applied. are applied.
) )
item(tt(15.) em(Forced Splitting))( item(tt(16.) em(Forced Splitting))(
If one of the `tt((s))', `tt((f))' or `tt((z))' flags are present, or the `tt(=)' If one of the `tt((s))', `tt((f))' or `tt((z))' flags are present, or the `tt(=)'
specifier was present (e.g. tt(${=)var(var)tt(})), the word is split on specifier was present (e.g. tt(${=)var(var)tt(})), the word is split on
occurrences of the specified string, or (for tt(=) with neither of the two occurrences of the specified string, or (for tt(=) with neither of the two
flags present) any of the characters in tt($IFS). flags present) any of the characters in tt($IFS).
) )
item(tt(16.) em(Shell Word Splitting))( item(tt(17.) em(Shell Word Splitting))(
If no `tt((s))', `tt((f))' or `tt(=)' was given, but the word is not If no `tt((s))', `tt((f))' or `tt(=)' was given, but the word is not
quoted and the option tt(SH_WORD_SPLIT) is set, the word is split on quoted and the option tt(SH_WORD_SPLIT) is set, the word is split on
occurrences of any of the characters in tt($IFS). Note this step, too, occurrences of any of the characters in tt($IFS). Note this step, too,
takes place at all levels of a nested substitution. takes place at all levels of a nested substitution.
) )
item(tt(17.) em(Uniqueness))( item(tt(18.) em(Uniqueness))(
If the result is an array and the `tt((u))' flag was present, duplicate If the result is an array and the `tt((u))' flag was present, duplicate
elements are removed from the array. elements are removed from the array.
) )
item(tt(18.) em(Ordering))( item(tt(19.) em(Ordering))(
If the result is still an array and one of the `tt((o))' or `tt((O))' flags If the result is still an array and one of the `tt((o))' or `tt((O))' flags
was present, the array is reordered. was present, the array is reordered.
) )
item(tt(19.) em(Re-Evaluation))( item(tt(20.) em(Re-Evaluation))(
Any `tt((e))' flag is applied to the value, forcing it to be re-examined Any `tt((e))' flag is applied to the value, forcing it to be re-examined
for new parameter substitutions, but also for command and arithmetic for new parameter substitutions, but also for command and arithmetic
substitutions. substitutions.
) )
item(tt(20.) em(Padding))( item(tt(21.) em(Padding))(
Any padding of the value by the `tt(LPAR()l.)var(fill)tt(.RPAR())' or Any padding of the value by the `tt(LPAR()l.)var(fill)tt(.RPAR())' or
`tt(LPAR()r.)var(fill)tt(.RPAR())' flags is applied. `tt(LPAR()r.)var(fill)tt(.RPAR())' flags is applied.
) )
item(tt(21.) em(Semantic Joining))( item(tt(22.) em(Semantic Joining))(
In contexts where expansion semantics requires a single word to In contexts where expansion semantics requires a single word to
result, all words are rejoined with the first character of tt(IFS) result, all words are rejoined with the first character of tt(IFS)
between. So in `tt(${LPAR()P)tt(RPAR()${LPAR()f)tt(RPAR()lines}})' between. So in `tt(${LPAR()P)tt(RPAR()${LPAR()f)tt(RPAR()lines}})'
@ -1241,7 +1251,7 @@ joined again before the tt(P) flag can be applied.
If a single word is not required, this rule is skipped. If a single word is not required, this rule is skipped.
) )
item(tt(22.) em(Empty argument removal))( item(tt(23.) em(Empty argument removal))(
If the substitution does not appear in double quotes, any resulting If the substitution does not appear in double quotes, any resulting
zero-length argument, whether from a scalar or an element of an array, zero-length argument, whether from a scalar or an element of an array,
is elided from the list of arguments inserted into the command line. is elided from the list of arguments inserted into the command line.

View file

@ -1459,14 +1459,16 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
*/ */
int quotemod = 0, quotetype = QT_NONE, quoteerr = 0; int quotemod = 0, quotetype = QT_NONE, quoteerr = 0;
/* /*
* (V) flag: fairly straightforward, except that as with so * Various fairly straightforward modifications, except that as with so
* many flags it's not easy to decide where to put it in the order. * many flags it's not easy to decide where to put them in the order.
* bit 0: (D) flag.
* bit 1: (V) flag.
*/ */
int visiblemod = 0; int mods = 0;
/* /*
* The (z) flag, nothing to do with SH_WORD_SPLIT which is tied * The (z) flag, nothing to do with SH_WORD_SPLIT which is tied
* spbreak, see above; fairly straighforward in use but c.f. * spbreak, see above; fairly straighforward in use but c.f.
* the comment for visiblemod. * the comment for mods.
*/ */
int shsplit = 0; int shsplit = 0;
/* /*
@ -1514,7 +1516,7 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
*/ */
int aspar = 0; int aspar = 0;
/* /*
* The (%) flag, c.f. visiblemod again. * The (%) flag, c.f. mods again.
*/ */
int presc = 0; int presc = 0;
/* /*
@ -1678,8 +1680,11 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
indord = 1; indord = 1;
break; break;
case 'D':
mods |= 1;
break;
case 'V': case 'V':
visiblemod++; mods |= 2;
break; break;
case 'q': case 'q':
@ -2954,18 +2959,25 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
} }
/* /*
* Transform special characters in the string to make them * Transform special characters in the string to make them
* printable. * printable, or to show directories, or possibly even both.
*/ */
if (visiblemod) { if (mods) {
if (isarr) { if (isarr) {
char **ap; char **ap;
if (!copied) if (!copied)
aval = arrdup(aval), copied = 1; aval = arrdup(aval), copied = 1;
for (ap = aval; *ap; ap++) for (ap = aval; *ap; ap++) {
if (mods & 1)
*ap = substnamedir(*ap);
if (mods & 2)
*ap = nicedupstring(*ap); *ap = nicedupstring(*ap);
}
} else { } else {
if (!copied) if (!copied)
val = dupstring(val), copied = 1; val = dupstring(val), copied = 1;
if (mods & 1)
val = substnamedir(val);
if (mods & 2)
val = nicedupstring(val); val = nicedupstring(val);
} }
} }

View file

@ -766,6 +766,23 @@ fprintdir(char *s, FILE *f)
} }
} }
/*
* Substitute a directory using a name.
* If there is none, return the original argument.
*/
/**/
char *
substnamedir(char *s)
{
Nameddir d = finddir(s);
if (!d)
return s;
return zhtricat("~", d->node.nam, s + strlen(d->dir));
}
/* Returns the current username. It caches the username * /* Returns the current username. It caches the username *
* and uid to try to avoid requerying the password files * * and uid to try to avoid requerying the password files *
* or NIS/NIS+ database. */ * or NIS/NIS+ database. */