Hi Ingo, On Fri, Jun 06, 2025 at 02:46:32AM +0200, Ingo Schwarze wrote: > Alejandro Colomar wrote on Fri, Jun 06, 2025 at 01:16:27AM +0200: > > > Talking about this, I've now finished my changes, and was trying to > > pass the usual linters. mandoc(1) is complaining: > > > > alx@devuan:~/tmp$ cat pp.man > > .TH A 7 2025-06-06 f > > .SH g > > foo > > .P > > .SY foo > > bar > > baz > > .YS > > alx@devuan:~/tmp$ mandoc -Tlint -man pp.man > > mandoc: pp.man:4:2: WARNING: skipping paragraph macro: PP empty > > I can confirm that still happens with mandoc -current and i think > it's correct to throw that warning, for the following reason. > > Your example formats byte-by-byte identically with mandoc > and with groff-1.23.0, with a single blank line between the two foos.
Yep.
>
> If i delete the .P macro from your example, it still formats
> byte-by-byte identically with mandoc and with groff-1.23.0,
> still with a single blank line between the two foos, completely
> unchanged.
Ahhh, I see why we have different understandings. I'm using groff-HEAD,
which behaves differently than groff-1.23.0 (and mandoc(1)).
alx@devuan:~/tmp$ cat nop.man
.TH A 7 2025-06-06 f
.SH g
foo
.SY foo
bar
baz
.YS
alx@devuan:~/tmp$ groff -man -Tutf8 nop.man
A(7) Miscellaneous Information Manual
A(7)
g
foo foo bar baz
f 2025‐06‐06
A(7)
alx@devuan:~/tmp$ mandoc -man nop.man
A(7) Miscellaneous Information Manual
A(7)
g
foo
foo bar baz
f 2025-06-06
A(7)
alx@devuan:~/tmp$ /usr/bin/groff -man -Tutf8 nop.man
grotty:<standard input>:6: warning: unrecognized X command 'sgr 0'
ignored
A(7) Miscellaneous Information Manual
A(7)
g
foo
foo bar baz
f 2025‐06‐06
A(7)
>
> Consequently, the warning is correct. Whatever the author hoped
> that .P macro might do, it is not doing anything, and the author
> should be warned that he is trying something that has no effect.
Yeah, now it makes sense; it had no effect prior to groff(1) from HEAD.
Since I'm using groff(1) from HEAD, it has an effect to me, which is why
I was wondering what the diagnostic was doing there.
> > I'm considering the following commit:
> >
> > commit a2524028e0cb358356f6c8574a4e8d3ded451a72
> > Author: Alejandro Colomar <[email protected]>
> > Date: Fri Jun 6 01:11:06 2025 +0200
> >
> > share/mk/lint/man/mandoc.ignore.grep: Ignore false positive
> >
> > It seems mandoc(1) considers a paragraph that consists
> > solely of SY/YS
>
> That phrase is totally nonsensical. In stark contrast to the mdoc(7)
> language, the man(7) language does *not* have any concept of nesting
> blocks.
>
> > to be empty. It is not empty.
>
> It absolutely is empty because the .SY block terminates the .P block.
> That is a very fundamental aspect of the syntax of the man(7) language:
Okay, now that I understand why the diagnostic is there, I'll rewrite
the commit message to explain the situation. I'm thinking of something
like
This diagnostic refers to the behavior of groff-1.23.0 (and
all versions of mandoc(1)), where .SY would imply a new
paragraph. This behavior has been changed to not start new
paragraphs in what will become groff-1.24, and we break our
paragraphs explicitly to accomodate to this new behavior, which
is nicer, because it allows us to have several related commands
or functions in the same paragraph, to have a better
organization of the SYNOPSIS.
> > Let's ignore mandoc(1).
>
> ???
>
> When you do that, you are almost certainly misunderstanding something.
> While some other linters throw substantial amounts of warnings,
> including occasionally false positives, i'm very careful to avoid
> false positives in mandoc(1), and even more defensively for man(7)
> than for mdoc(7).
>
> > +++ b/share/mk/lint/man/mandoc.ignore.grep
> > @@ -6,5 +6,6 @@ STYLE: referenced manual not found: Xr
> > UNSUPP: ignoring macro in table:
> > WARNING: empty block: UR
> > WARNING: missing date, using "": TH
> > +WARNING: skipping paragraph macro: PP empty
> > WARNING: undefined escape, printing literally: \\\\
> > WARNING: cross reference to self: Xr
>
> Whoa, what the hell? Why are you running -T lint at all just to
> throw tons of stuff away? These are all very serious mistakes
> that should definitely be fixed, maybe with the exception of
> the first one, which could be regarded as a missing feature in
> mandoc(1) - though such an exceedingly difficult feature that
> it won't get done any time soon, so probably manual pages
> should back away from doing that kind of stuff, too.
Yeah, I want to get rid at least of a large amount of macros in tables,
since TBL has ways to mark stuff as bold and italics without using
macros. Some will remain, but not all.
I'll try to explain why I ignore all of those WARNINGs:
- WARNING: empty block: UR
Sometimes, I just want to format a URL without a nice name.
That's perfectly supported by groff. For example, see BUGS
in memusagestat(1):
$ mansect BUGS man1/memusagestat.1;
.lf 1 man1/memusagestat.1
.TH memusagestat 1 (date) "Linux man-pages (unreleased)"
.SH BUGS
To report bugs, see
.UR http://www.gnu.org/software/libc/bugs.html
.UE
$ mansect BUGS man1/memusagestat.1 | man /dev/stdin | cat;
memusagestat(1) General Commands Manual
memusagestat(1)
BUGS
To report bugs, see
http://www.gnu.org/software/libc/bugs.html
Linux man‐pages (unreleased) (date)
memusagestat(1)
- WARNING: missing date, using "": TH
The one for the missing date is because I have a few manual
pages which are imported from tzdb, and which don't carry a
date with them. Since I'm pretty confident my own pages
don't have that bug, I just turned it off. But I do like
that diagnostic.
$ grep -rn '^\.TH' | grep '""'
man8/tzselect.8:3:.TH tzselect 8 "" "Time Zone Database"
man8/zic.8:3:.TH zic 8 "" "Time Zone Database"
man8/zdump.8:3:.TH zdump 8 "" "Time Zone Database"
man5/tzfile.5:3:.TH tzfile 5 "" "Time Zone Database"
- WARNING: undefined escape, printing literally: \\\\
This is again because of the tzdb pages. If I turn it on,
I only see the following pages trigger it:
$ make -R -k lint-man 2>/dev/null
MANDOC .tmp/man/man5/tzfile.5.lint-man.mandoc.touch
MANDOC .tmp/man/man8/zdump.8.lint-man.mandoc.touch
Considering that I'm aware that I should never write that
code, I feel relatively safe ignoring it.
- WARNING: cross reference to self: Xr
This one doesn't trigger anything if I turn it on. I don't
remember why I introduced it. git-blame(1) points to
commit c76a587148d9b69667852311ece53403b1458844
Author: Alejandro Colomar <[email protected]>
Date: Sat Apr 22 16:47:51 2023 +0200
*.mk: lint, lint-mdoc, lint-mdoc-mandoc: Support mdoc(7)
pages
Signed-off-by: Alejandro Colomar <[email protected]>
That must be from when I was linting someone else's pages,
and it probably used Xr notation even for referring to a
function or command in its own page, which isn't too bad,
IMO.
Have a lovely day!
Alex
>
> Yours,
> Ingo
--
<https://www.alejandro-colomar.es/>
signature.asc
Description: PGP signature
