Hello Alejandro,

Alejandro Colomar wrote on Thu, Aug 21, 2025 at 09:45:25PM +0200:

> I somehow understand you.  I've seen a lot of low-quality pages.  I've
> had to improve the quality of the sources I maintain a lot, even though
> they were already above average.
> 
> On the other hand, it's sad that I can't get many of mandoc(1)'s
> diagnostics.  I'm really interested in several of them, as we've
> discussed in the past.
> 
> Would you consider a knob for pedantic people like me that want the
> quality of their sources to be on par with mdoc(7) documents, if not
> higher?  Like maybe -Wpedantic or -Weverything?

An *additional* knob?  No, not really.  Too many knobs is what makes
message systems unusable.  The mandoc message system has been designed
very carefully to have the following properties:

 1. It is one-dimensional, or expressed more mathematically, the
    warning options form a totally ordered set.  That improves
    usability by making sure it is always trivial to figure
    out how to get more messages (crank the level up by one)
    or fewer messages (push the level down by one).  The user
    never has to wonder in which of more than two directions
    to change the message settings or which message
    class/group/category/option/whatever to enable or disable.
    There are also very deliberately no additional message flags of
    any kind that are in any way orthogonal to the main -W setting,
    thus avoiding any kind of complication.

 2. Each level has a well-defined meaning that relates to the
    qualitative severity of the potential consequences of the
    issue.  These meanings are the same for all supported
    languages - mdoc(7), man(7), tbl(7), eqn(7), roff(7) -
    so users do not need to learn language-specific quirks.

 3. The number of levels is intentionally very small:
    base, style, warning, error, unsupp.
    See: https://man.openbsd.org/mandoc#DIAGNOSTICS
    Adding another level is not really an option:
    What would be the logical significance of such a level?


However, i should likely reconsider my stance of man(7) leaning more
to the silent side than mdoc(7), for four reasons.

 a) It never aligned very well with design principle 2 above.
    For example, if something is bad style, logically, it ought
    to cause a style message, even if the particular style issue
    is widespread in practice.

 b) Even leaning towards terseness, mandoc -T lint gets quite
    chatty on typical man(7) corpusses anyway.  For example, in
    OpenBSD-current base:

       $ mandoc -T lint /usr/share/man/man3p/*.3p | wc -l
      9097

    Adding a few more is not going to create any serious practical
    problem, at least none that isn't already there.
    Even i am rarely linting the whole OpenBSD manual tree at
    once these days, and certainly not including the legacy
    man(7) pages it still contains.

 c) People who use mandoc a lot (for example, *BSD users) tend
    to use man(7) rarely, and mandoc -man -T lint even less
    because they don't maintain their own docs in man(7), and
    why would they lint other people's stuff?
    So making -man -T lint a bit more chatty is unlikely to
    impact many people negatively.

 d) And most importantly, one thing has changed compaged to
    fifteen years ago, when the decision to make -man -T lint
    more silent was made.  Back then, basically nobody at all
    cared about man(7) code quality.  Now, there are at least
    two people actively working on the subject (Branden and you).

Making the feature more useful for those who actually want it
without substantially impacting anyone who doesn't care sounds
like a win overall.

I just committed the "blank line in fill mode" warning for man(7),
see the committed patch below.

When you feel specific other warnings are missing, please speak up,
even if you already brought them up in the past and got rejected:
maybe they are acceptable with the now modified policy of
warning in man(7) where it logically makes sense, even when
the issue is still widespread in low-quality manuals.

In many cases, adding a warning is not particularly difficult.

Yours,
  Ingo


CVSROOT:        /cvs
Module name:    src
Changes by:     schwa...@cvs.openbsd.org        2025/08/22 07:08:21

Modified files:
        usr.bin/mandoc : man.c mandoc.1
        regress/usr.bin/mandoc/roff/cond: close.out_lint if.out_lint
        regress/usr.bin/mandoc/man/blank: line.out_lint

Log message:
Warn about blank lines in man(7) just like it is already done in mdoc(7).
Feature suggested by Alejandro Colomar <a...@kernel.org> on <groff@gnu.org>.


Index: usr.bin/mandoc/man.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/man.c,v
diff -u -p -r1.137 man.c
--- usr.bin/mandoc/man.c        16 Aug 2022 22:59:48 -0000      1.137
+++ usr.bin/mandoc/man.c        22 Aug 2025 13:04:07 -0000
@@ -132,6 +132,7 @@ man_ptext(struct roff_man *man, int line
                        *ep = '\0';
                        return 1;
                }
+               mandoc_msg(MANDOCERR_FI_BLANK, line, i, NULL);
                roff_elem_alloc(man, line, offs, ROFF_sp);
                man->next = ROFF_NEXT_SIBLING;
                return 1;
Index: usr.bin/mandoc/mandoc.1
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/mandoc.1,v
diff -u -p -r1.198 mandoc.1
--- usr.bin/mandoc/mandoc.1     9 Jul 2025 13:45:15 -0000       1.198
+++ usr.bin/mandoc/mandoc.1     22 Aug 2025 13:04:07 -0000
@@ -1002,14 +1002,14 @@ macro that could be represented using
 or
 .Ic \&Dx .
 .It Sy "errnos out of order"
-.Pq mdoc, Nx
+.Pq mdoc , Nx
 The
 .Ic \&Er
 items in a
 .Ic \&Bl
 list are not in alphabetical order.
 .It Sy "duplicate errno"
-.Pq mdoc, Nx
+.Pq mdoc , Nx
 A
 .Ic \&Bl
 list contains two consecutive
@@ -1150,7 +1150,7 @@ The
 argument is used as provided anyway.
 Consider checking whether the file name or the argument need a correction.
 .It Sy "missing date, using \(dq\(dq"
-.Pq mdoc, man
+.Pq mdoc , man
 The document was parsed as
 .Xr mdoc 7
 and it has no
@@ -1732,7 +1732,7 @@ or
 macro contains an opening or closing parenthesis; that's probably wrong,
 parentheses are added automatically.
 .It Sy "unknown library name"
-.Pq mdoc, not on Ox
+.Pq mdoc , not on Ox
 An
 .Ic \&Lb
 macro has an unknown name argument and will be rendered as
@@ -1790,7 +1790,7 @@ The last character is mapped to the blan
 .Ss "Warnings related to plain text"
 .Bl -ohang
 .It Sy "blank line in fill mode, using .sp"
-.Pq mdoc
+.Pq mdoc , man
 The meaning of blank input lines is only well-defined in non-fill mode:
 In fill mode, line breaks of text input lines are not supposed to be
 significant.
@@ -1800,6 +1800,8 @@ are formatted like
 requests.
 To request a paragraph break, use
 .Ic \&Pp
+or
+.Ic \&PP
 instead of a blank line.
 .It Sy "tab in filled text"
 .Pq mdoc , man
Index: regress/usr.bin/mandoc/roff/cond/close.out_lint
===================================================================
RCS file: /cvs/src/regress/usr.bin/mandoc/roff/cond/close.out_lint,v
diff -u -p -r1.8 close.out_lint
--- regress/usr.bin/mandoc/roff/cond/close.out_lint     3 Aug 2020 10:52:39 
-0000       1.8
+++ regress/usr.bin/mandoc/roff/cond/close.out_lint     22 Aug 2025 13:04:07 
-0000
@@ -1,3 +1,5 @@
+mandoc: close.in:42:9: WARNING: blank line in fill mode, using .sp
 mandoc: close.in:65:1: ERROR: escaped character not allowed in a name: BR\&
+mandoc: close.in:68:9: WARNING: blank line in fill mode, using .sp
 mandoc: close.in:68:2: ERROR: appending missing end of block: if
 mandoc: close.in:68:9: WARNING: skipping paragraph macro: sp after PP
Index: regress/usr.bin/mandoc/roff/cond/if.out_lint
===================================================================
RCS file: /cvs/src/regress/usr.bin/mandoc/roff/cond/if.out_lint,v
diff -u -p -r1.6 if.out_lint
--- regress/usr.bin/mandoc/roff/cond/if.out_lint        4 Dec 2018 02:53:45 
-0000       1.6
+++ regress/usr.bin/mandoc/roff/cond/if.out_lint        22 Aug 2025 13:04:07 
-0000
@@ -1,4 +1,7 @@
+mandoc: if.in:8:6: WARNING: blank line in fill mode, using .sp
 mandoc: if.in:15:2: WARNING: conditional request controls empty scope: if
 mandoc: if.in:17:2: WARNING: conditional request controls empty scope: if
+mandoc: if.in:17:7: WARNING: blank line in fill mode, using .sp
+mandoc: if.in:43:9: WARNING: blank line in fill mode, using .sp
 mandoc: if.in:42:2: WARNING: skipping paragraph macro: br before sp
 mandoc: if.in:71:2: WARNING: skipping paragraph macro: br after br
Index: regress/usr.bin/mandoc/man/blank/line.out_lint
===================================================================
RCS file: /cvs/src/regress/usr.bin/mandoc/man/blank/line.out_lint,v
diff -u -p -r1.7 line.out_lint
--- regress/usr.bin/mandoc/man/blank/line.out_lint      1 Jul 2025 20:17:13 
-0000       1.7
+++ regress/usr.bin/mandoc/man/blank/line.out_lint      22 Aug 2025 13:04:07 
-0000
@@ -1,3 +1,12 @@
+mandoc: line.in:16:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:49:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:51:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:55:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:57:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:61:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:63:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:66:1: WARNING: blank line in fill mode, using .sp
+mandoc: line.in:67:1: WARNING: blank line in fill mode, using .sp
 mandoc: line.in:2:2: WARNING: skipping paragraph macro: br before first SH
 mandoc: line.in:19:2: WARNING: skipping paragraph macro: br after br
 mandoc: line.in:25:2: WARNING: skipping paragraph macro: br after PP

Reply via email to