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.