about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBarton E. Schaefer <schaefer@zsh.org>2015-06-06 12:31:47 -0700
committerBarton E. Schaefer <schaefer@zsh.org>2015-06-06 12:31:47 -0700
commit229bc3cc74bfa8d6c23a02a3e0e89d7f08467dd1 (patch)
tree5d000d4a5e824bb36789e694f30c9d90c39f935d
parent2abba7243a736a2fc626f3cc917d8a67014d4d20 (diff)
downloadzsh-229bc3cc74bfa8d6c23a02a3e0e89d7f08467dd1.tar.gz
zsh-229bc3cc74bfa8d6c23a02a3e0e89d7f08467dd1.tar.xz
zsh-229bc3cc74bfa8d6c23a02a3e0e89d7f08467dd1.zip
35350: extend "fc -I" to cover listing of "internal" history events only
-rw-r--r--ChangeLog6
-rw-r--r--Completion/Zsh/Command/_fc29
-rw-r--r--Doc/Zsh/builtins.yo62
-rw-r--r--Src/builtin.c24
4 files changed, 66 insertions, 55 deletions
diff --git a/ChangeLog b/ChangeLog
index b6c233d8c..012c0bb3b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,
diff --git a/Completion/Zsh/Command/_fc b/Completion/Zsh/Command/_fc
index c2987211e..15892440b 100644
--- a/Completion/Zsh/Command/_fc
+++ b/Completion/Zsh/Command/_fc
@@ -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
 
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index 53b668214..12a13caa0 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -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
diff --git a/Src/builtin.c b/Src/builtin.c
index 0d1d00ec3..643b8c61a 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -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;
     }