1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-09-23 17:01:05 +02:00

35350: extend "fc -I" to cover listing of "internal" history events only

This commit is contained in:
Barton E. Schaefer 2015-06-06 12:31:47 -07:00
parent 2abba7243a
commit 229bc3cc74
4 changed files with 66 additions and 55 deletions

View file

@ -1,3 +1,9 @@
2015-06-06 Barton E. Schaefer <schaefer@zsh.org>
* 35350: Completion/Zsh/Command/_fc, Doc/Zsh/builtins.yo,
Src/builtin.c: extend "fc -I" to cover listing of "internal"
history events only
2015-06-05 Peter Stephenson <p.stephenson@samsung.com>
* 35386: Doc/Zsh/builtins.yo, Doc/Zsh/contrib.yo,

View file

@ -12,8 +12,10 @@ words=( "${(@)words[1,CURRENT-1]:#*=*}" "${(@)words[CURRENT,-1]}" )
fc_common=(
-s -S
'(-A -R -W -I -p -P)-r[reverse order of the commands]'
'(-A -R -W -I -e -p -P)-n[suppress line numbers]'
'(-A -R -W -p -P)-I[include internal (new) events only]'
'(-A -R -W -p -P)-L[include local events only]'
'(-A -R -W -p -P)-r[reverse order of the events]'
'(-A -R -W -e -p -P)-n[suppress line numbers]'
)
if [[ -n ${words[(r)-[pa](|[ap])]} ]]; then
@ -32,20 +34,20 @@ else
fi
fc_hist=(
'(-A -R -W -I -a -p -P 2)-m[treat argument as a pattern]'
'(-A -R -W -I -e -f -E -i -t -a -p -P)-d[print time-stamps]'
'(-A -R -W -I -e -d -E -i -t -a -p -P)-f[mm/dd/yyyy format time-stamps]'
'(-A -R -W -I -e -d -f -i -t -a -p -P)-E[dd.mm.yyyy format time-stamps]'
'(-A -R -W -I -e -d -f -E -t -a -p -P)-i[yyyy-mm-dd format time-stamps]'
'(-A -R -W -I -e -d -f -E -i -a -p -P)-t[print time-stamps in specified format]:date format'
'(-A -R -W -I -e -a -p -P)-D[print elapsed times]'
'(-A -R -W -a -p -P 2)-m[treat argument as a pattern]'
'(-A -R -W -e -f -E -i -t -a -p -P)-d[print time-stamps]'
'(-A -R -W -e -d -E -i -t -a -p -P)-f[mm/dd/yyyy format time-stamps]'
'(-A -R -W -e -d -f -i -t -a -p -P)-E[dd.mm.yyyy format time-stamps]'
'(-A -R -W -e -d -f -E -t -a -p -P)-i[yyyy-mm-dd format time-stamps]'
'(-A -R -W -e -d -f -E -i -a -p -P)-t[print time-stamps in specified format]:date format'
'(-A -R -W -e -a -p -P)-D[print elapsed times]'
'(-A -R -W -I -e -d -f -i -l -m -n -r -D -E -t -P)-a[with -p, automatically pop history on function return]'
'(-A -R -W -I -e -d -f -i -l -m -n -r -D -E -t -P)-p[push current history to stack]'
'(- *)-P[pop history from stack]'
)
fc_r='(-A -R -W -I -e)-l[list resulting commands on stdout]'
fc_r='(-A -R -W -e)-l[list resulting commands on stdout]'
case $service in
history)
@ -56,12 +58,11 @@ case $service in
;;
*)
_arguments "$fc_common[@]" "$fc_hist[@]" "$fc_r" \
'(-A -R -W -I -a -l -n -d -f -E -i -r -t -D -p -P)-e+[specify editor to invoke]:editor to invoke:_command_names -e' \
'(-a -l -m -e -r -n -d -f -t -E -i -R -D -A -W -p -P *)-'{\
'(-A -R -W -a -l -n -d -f -E -i -r -t -D -p -P)-e+[specify editor to invoke]:editor to invoke:_command_names -e' \
'(-a -l -L -m -e -r -n -d -f -t -E -i -R -D -A -W -p -P *)-'{\
'R[read history from file]',\
'A[append history to file]',\
'W[write history to file]',\
'I[read/write new events only]'} && ret=0
'W[write history to file]'} && ret=0
;;
esac

View file

@ -662,8 +662,8 @@ findex(fc)
cindex(history, editing)
cindex(editing history)
redef(SPACES)(0)(tt(ifztexi(NOTRANS(@ @ @ @ @ @ ))ifnztexi( )))
xitem(tt(fc) [ tt(-e) var(ename) ] [-L] [ tt(-m) var(match) ] [ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
xitem(tt(fc -l )[ tt(-LnrdfEiD) ] [ tt(-t) var(timefmt) ] [ tt(-m) var(match) ])
xitem(tt(fc) [ tt(-e) var(ename) ] [ tt(-LI) ] [ tt(-m) var(match) ] [ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
xitem(tt(fc -l )[ tt(-LI) ] [ tt(-nrdfEiD) ] [ tt(-t) var(timefmt) ] [ tt(-m) var(match) ])
xitem(SPACES()[ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
xitem(tt(fc -p )[ tt(-a) ] [ var(filename) [ var(histsize) [ var(savehistsize) ] ] ])
xitem(tt(fc) tt(-P))
@ -674,31 +674,24 @@ shell is interactive. Usually this is detected automatically, but
it can be forced by setting the tt(interactive) option when starting the
shell.
Select a range of commands from var(first) to var(last) from the
history list.
The arguments var(first) and var(last) may be specified as a
number or as a string. A negative number is used as an offset
to the current history event number.
A string specifies the most recent event beginning with the given string.
All substitutions var(old)tt(=)var(new), if any, are then performed
on the commands.
The first two forms of this command select a range of events from
var(first) to var(last) from the history list. The arguments var(first)
and var(last) may be specified as a number or as a string. A negative
number is used as an offset to the current history event number. A string
specifies the most recent event beginning with the given string. All
substitutions var(old)tt(=)var(new), if any, are then performed on the
text of the events.
If the tt(-L) flag is given, only the local history is considered (see
In addition to the the number range,
startsitem()
sitem(tt(-I))(restricts to only internal events (not from tt($HISTFILE)))
sitem(tt(-L))(restricts to only local events (not from other shells, see
tt(SHARE_HISTORY) in ifzman(zmanref(zshoptions))\
ifnzman(noderef(Description of Options))).
If the tt(-m) flag is given, the first argument is taken as a
pattern (should be quoted) and only the history events matching this
pattern are considered.
When the tt(-l) flag is given, the resulting commands are listed on
standard output.
Otherwise the editor program var(ename) is invoked on a file containing
these history events. If var(ename) is not given, the value
of the parameter tt(FCEDIT) is used; if that is not set the value of the
parameter tt(EDITOR) is used; if that is not set a builtin default, usually
`tt(vi)' is used. If var(ename) is `tt(-)',
no editor is invoked. When editing is complete, the edited
command is executed.
ifnzman(noderef(Description of Options)) -- note that tt($HISTFILE) is
considered local when read at startup))
sitem(tt(-m))(takes the first argument as a pattern (should be quoted) and
only the history events matching this pattern are considered)
endsitem()
If var(first) is not specified, it will be set to -1 (the most recent
event), or to -16 if the tt(-l) flag is given.
@ -708,12 +701,20 @@ However, if the current event has added entries to the history with
`tt(print -s)' or `tt(fc -R)', then the default var(last) for tt(-l)
includes all new history entries since the current event began.
The flag tt(-r) reverses the order of the commands and the
flag tt(-n) suppresses command numbers when listing.
When the tt(-l) flag is given, the resulting events are listed on
standard output. Otherwise the editor program var(ename) is invoked on a
file containing these history events. If var(ename) is not given, the
value of the parameter tt(FCEDIT) is used; if that is not set the value of
the parameter tt(EDITOR) is used; if that is not set a builtin default,
usually `tt(vi)' is used. If var(ename) is `tt(-)', no editor is invoked.
When editing is complete, the edited command is executed.
The flag tt(-r) reverses the order of the events and the
flag tt(-n) suppresses event numbers when listing.
Also when listing,
startsitem()
sitem(tt(-d))(prints timestamps for each command)
sitem(tt(-d))(prints timestamps for each event)
sitem(tt(-f))(prints full time-date stamps in the US
`var(MM)tt(/)var(DD)tt(/)var(YY) var(hh):var(mm)' format)
sitem(tt(-E))(prints full time-date stamps in the European
@ -725,15 +726,14 @@ var(fmt) is formatted with the strftime function with the zsh extensions
described for the tt(%D{)var(string)tt(}) prompt format in
ifzman(the section EXPANSION OF PROMPT SEQUENCES in zmanref(zshmisc))\
ifnzman(noderef(Prompt Expansion)). The resulting formatted string must be
no more than 256 characters or will not be printed.
no more than 256 characters or will not be printed
)
sitem(tt(-D))(prints elapsed times; may be combined with one of the
options above.)
options above)
endsitem()
cindex(history, stack)
cindex(stack, history)
`tt(fc -p)' pushes the current history list onto a stack and switches to a
new history list. If the tt(-a) option is also specified, this history list
will be automatically popped when the current function scope is exited, which

View file

@ -104,7 +104,7 @@ static struct builtin builtins[] =
BUILTIN("pushd", BINF_SKIPINVALID | BINF_SKIPDASH | BINF_DASHDASHVALID, bin_cd, 0, 2, BIN_PUSHD, "qsPL", NULL),
BUILTIN("pushln", 0, bin_print, 0, -1, BIN_PRINT, NULL, "-nz"),
BUILTIN("pwd", 0, bin_pwd, 0, 0, 0, "rLP", NULL),
BUILTIN("r", 0, bin_fc, 0, -1, BIN_R, "nrlL", NULL),
BUILTIN("r", 0, bin_fc, 0, -1, BIN_R, "IlLnr", NULL),
BUILTIN("read", 0, bin_read, 0, -1, 0, "cd:ek:%lnpqrst:%zu:AE", NULL),
BUILTIN("readonly", BINF_PLUSOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "AE:%F:%HL:%R:%TUZ:%afghi:%lptux", "r"),
BUILTIN("rehash", 0, bin_hash, 0, 0, 0, "df", "r"),
@ -1435,10 +1435,6 @@ bin_fc(char *nam, char **argv, Options ops, int func)
unqueue_signals();
return 0;
}
if (OPT_ISSET(ops,'I')) {
zwarnnam(nam, "-I requires one of -R/-W/-A");
return 1;
}
if (zleactive) {
zwarnnam(nam, "no interactive history within ZLE");
@ -1672,7 +1668,7 @@ static int
fclist(FILE *f, Options ops, zlong first, zlong last,
struct asgment *subs, Patprog pprog, int is_command)
{
int fclistdone = 0;
int fclistdone = 0, xflags = 0;
zlong tmp;
char *s, *tdfmt, *timebuf;
Histent ent;
@ -1722,11 +1718,19 @@ fclist(FILE *f, Options ops, zlong first, zlong last,
tdfmt = timebuf = NULL;
}
/* xflags exclude events */
if (OPT_ISSET(ops,'L')) {
xflags |= HIST_FOREIGN;
}
if (OPT_ISSET(ops,'I')) {
xflags |= HIST_READ;
}
for (;;) {
if (!OPT_ISSET(ops,'L') || !(ent->node.flags & HIST_FOREIGN))
s = dupstring(ent->node.nam);
else
if (ent->node.flags & xflags)
s = NULL;
else
s = dupstring(ent->node.nam);
/* this if does the pattern matching, if required */
if (s && (!pprog || pattry(pprog, s))) {
/* perform substitution */
@ -1782,7 +1786,7 @@ fclist(FILE *f, Options ops, zlong first, zlong last,
if (!fclistdone) {
if (subs)
zwarnnam("fc", "no substitutions performed");
else if (OPT_ISSET(ops,'L') || pprog)
else if (xflags || pprog)
zwarnnam("fc", "no matching events found");
return 1;
}