On Sat, Jul 13, 2019 at 12:37:29AM +0200, Ingo Schwarze wrote:
> Hi Jason,
> 
> Jason McIntyre wrote on Sun, Jul 07, 2019 at 08:56:43PM +0100:
> 
> > this is getting silly - we're mixing talking about how /re/ and ?re?
> > work as addresses and as regular expressions in other places. dropping
> > the trailing [/?] does not apply to regular expressions everywhere.
> 
> Actually, it does, though you are right in so far as the three
> cases (addresses, global searches, and replacements) differ in
> subtle ways.
> 
> > even if i have this wrong (to be fair, not that unlikely), we should
> > just concentrate on one thing at a time.
> 
> We have now taken care of the case of addresses.
> 
> The case of replacements is already described correctly:
> 
> > regarding how dropping two delimiters works in an 's' command, although
> > i'm not sure really of the reason, you can do:
> >     1,$s/re
> > which effectively drops /replacement/
> 
> Yes, this is described as follows:
> 
>    If one or two of the last delimiters is omitted, then the last line
>    affected is printed as though the print suffix p were specified.
> 
> Admittedly, the grammar is awkward ("two of things is omitted"),
> and it is not said explicitly that omitting both delimiters implies
> deleting the re without a replacement - but one could argue that
> is implicitly to be expected because omitting the middle delimiter
> implies that the replacement can only be empty.  If you think this
> should be improved, we can polish it later.
> 
> 
> So what remains to be decsribed is the case of global searches (gGvV).
> 
> Here is what POSIX says about those:
> 
>   If the closing delimiter of an RE or of a replacement string (for
>   example, '/' ) in a g, G, s, v, or V command would be the last
>   character before a <newline>, that delimiter can be omitted, in
>   which case the addressed line shall be written.
> 
> Our implementation appears to comply.
> 
> While documenting this, also fix a few glitches in the vicinity:
> 
>  * The wording "the current address is set to the last line affected
>    by command-list" can easily be misunderstood.  The temporal sense
>    of "last" is intended, but it can easily be read as the last (i.e.
>    highest numbered) line in the file.  So let's better talk about
>    the "last command executed", not about the "last line".
>    You can easily see that this is correct with a command like
> 
>      g/.../+p\
>      -p
>      .
> 
>    which, for each matching line, first prints the following line,
>    then the matching line itself, and leaves the matching line
>    (printed by the last command) as the current line, not the
>    following line, even though the following line was also "affected"
>    and comes later in the file.
> 
>  * Avoid the confusing wording "a newline alone in command-list".
>    The newline is not *in* the command list, but it comes after
>    the command list, terminating it.
> 
>  * For G, explicitly say that an empty command list has a different
>    effect compared to g: for g, it does the same as p, whereas for G,
>    it does nothing at all.
> 
> There is nothing to do for v and V, which mostly point to g and G only.
> 
> OK for the patch below?
> 
> Yours,
>   Ingo
> 

hi.

yes, ok by me.
jmc

> 
> Index: ed.1
> ===================================================================
> RCS file: /cvs/src/bin/ed/ed.1,v
> retrieving revision 1.72
> diff -u -p -r1.72 ed.1
> --- ed.1      12 Jul 2019 19:28:48 -0000      1.72
> +++ ed.1      12 Jul 2019 22:17:47 -0000
> @@ -377,7 +377,7 @@ The current address is set to the line c
>  command-list is executed.
>  At the end of the
>  .Ic g
> -command, the current address is set to the last line affected by 
> command-list.
> +command, the current address remains as set by the last command executed.
>  If no lines were matched,
>  the current line number remains unchanged.
>  .Pp
> @@ -392,22 +392,26 @@ Any commands are allowed, except for
>  .Ic v ,
>  and
>  .Ic V .
> -A newline alone in command-list is equivalent to a
> +An empty
> +.Ar command-list
> +is equivalent to a
>  .Ic p
>  command.
> +In this case, the trailing slash can be omitted.
>  .Sm off
>  .It (1,$) Ic G No / Ar re No /
>  .Sm on
>  Interactively edits the addressed lines matching a regular expression
>  .Ar re .
> +The trailing slash after
> +.Ar re
> +can be omitted.
>  For each matching line, the line is printed, the current address is set,
>  and the user is prompted to enter a
>  .Ar command-list .
>  At the end of the
>  .Ic G
> -command, the current address is set to the last line affected by
> -.Pq the last
> -command-list.
> +command, the current address remains as set by the last command executed.
>  If no lines were matched,
>  the current line number remains unchanged.
>  .Pp
> @@ -415,11 +419,10 @@ The format of
>  .Ar command-list
>  is the same as that of the
>  .Ic g
> -command.
> -A newline alone acts as a null command list.
> +command, but an empty command list does nothing.
>  A single
>  .Sq &
> -repeats the last non-null command list.
> +repeats the last non-empty command list.
>  .It Ic H
>  Toggles the printing of error explanations.
>  By default, explanations are not printed.

Reply via email to