Hi,

Marc Chantreux wrote on Mon, Mar 02, 2020 at 11:49:31AM +0100:

> coming from linux, i'm used to read manpages
> in a vi buffer so i can do much more than
> reading the content.

I have no idea what the "much more" refers to.  The main effect is to
lose tagging functionality.  That is, compared to man(1) with the
default pager, you cannot use the :t functionality to move to the
place where a word is defined.

> i basically use
> 
>     :r !man ls
>     or
>     !!sh (when the line content is "man ls")

Yikes.  I had no idea what either of these are doing and had to
try them out.  vi(1) contains so much bloat that is never really
needed and doesn't belong in a text editor at all.

> under openbsd, it seems man doesn't if stdout
> is a tty.

You mean, man(1) doesn't *imply col -b* if stdout is *not* a tty?

> i digged the man manual a little bit
> without finding a solution so i worked the
> things around:
> 
>     :r !man ls|fmt

As others said, the normal way to strip backspace formatting is

   $ man ls | col -b

It is documented in man(1) below the -c option and below EXAMPLES,
and in mandoc(1) below "ASCII Output":

  https://man.openbsd.org/man.1#c
  https://man.openbsd.org/man.1#EXAMPLES
  https://man.openbsd.org/mandoc.1#ASCII_Output

You find such stuff as follows:

   $ man -k 'Xr=col(1)'
  man(1) - display manual pages
  mandoc(1) - format manual pages

The advantage of col(1) over fmt(1) is that it is guaranteed to not
mess up line breaks.

> now i would like a poor version of keyword
> feature in openbsd vi. the linux version
> 
>     map K yw:E /tmp/vi.keyword.$$p!!xargs man

You don't say what that is supposed to do.

Under Debian Jessie, if i start "vim", then type

  :map K yw:E /tmp/vi.keyword.$$p!!xargs man   <ENTER>
  als   <ESC>
  K   <ENTER>

i get:

  Error detected while processing function 
netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore..netrw#Explore:
  line   30:
  E132: Function call depth is higher than 'maxfuncdepth'
  Press ENTER or type command to continue

That doesn't seem useful to me.

I also tried the same with OpenBSD vi(1) and it resulted in

  Usage: e[dit][!] [+cmd] [file].

So, no idea what you are trying to do.

> becomes
> 
>     map K yw:E /tmp/vi.keyword.$$p!!xargs -IX sh -c 'man X|fmt'
> 
> which doesn't work as | separates 2 vi commands.
> 
> i really would like to know one or the two of these:
> 
> * is there a way to ask man to deliver pure (non-formatted) text ?

In 2014, i already wrote a patch to do that because the question
came up repeatedly.  But demand wasn't that high after all, so i
never committed it.  Now, i updated the patch to -current, see
below.

On the one hand, the UNIX phlosophy is to have each tool do one
thing well, then use pipes to connect tools as needed.  Then again,
arguably, you maybe shouldn't need another tool to just revert
something that the first tool does.  Why would *not* adding backspace
formatting require a pipe to another program, rather than not adding
it in the first place?

Also, the patch that would be required is very small and straightforward.

So, what do people think?  Should i test the patch below in more
depth and commit it?  Or do people consider this bloat?

Yours,
  Ingo


Index: main.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/main.c,v
retrieving revision 1.247
diff -u -p -r1.247 main.c
--- main.c      24 Feb 2020 21:15:05 -0000      1.247
+++ main.c      2 Mar 2020 17:06:53 -0000
@@ -158,6 +158,7 @@ main(int argc, char *argv[])
        /* Search options. */
 
        memset(&conf, 0, sizeof(conf));
+       conf.output.backspace = -1;
        conf_file = NULL;
        defpaths = auxpaths = NULL;
 
@@ -373,6 +374,9 @@ main(int argc, char *argv[])
                        return mandoc_msg_getrc();
                }
        }
+
+       if (conf.output.backspace == -1)
+               conf.output.backspace = 1;
 
        /* Parse arguments. */
 
Index: manconf.h
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/manconf.h,v
retrieving revision 1.7
diff -u -p -r1.7 manconf.h
--- manconf.h   22 Nov 2018 11:30:15 -0000      1.7
+++ manconf.h   2 Mar 2020 17:06:54 -0000
@@ -1,6 +1,6 @@
 /*     $OpenBSD: manconf.h,v 1.7 2018/11/22 11:30:15 schwarze Exp $ */
 /*
- * Copyright (c) 2011, 2015, 2017, 2018 Ingo Schwarze <schwa...@openbsd.org>
+ * Copyright (c) 2011,2015,2017,2018,2020 Ingo Schwarze <schwa...@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <krist...@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -33,6 +33,7 @@ struct        manoutput {
        char     *tag;
        size_t    indent;
        size_t    width;
+       int       backspace;
        int       fragment;
        int       mdoc;
        int       noval;
Index: mandoc.1
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/mandoc.1,v
retrieving revision 1.166
diff -u -p -r1.166 mandoc.1
--- mandoc.1    15 Feb 2020 15:28:01 -0000      1.166
+++ mandoc.1    2 Mar 2020 17:06:55 -0000
@@ -284,6 +284,13 @@ The following
 .Fl O
 arguments are accepted:
 .Bl -tag -width Ds
+.It Cm format Ns = Ns Cm none
+No back-spaced encoding is used, neither for bold face and underlining
+nor for character overstrikes.  Only the last character of each
+overstrike group is printed.
+This has the same effect as piping the output through
+.Xr col 1
+.Fl bx .
 .It Cm indent Ns = Ns Ar indent
 The left margin for normal text is set to
 .Ar indent
Index: manpath.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/manpath.c,v
retrieving revision 1.28
diff -u -p -r1.28 manpath.c
--- manpath.c   10 Feb 2020 14:42:03 -0000      1.28
+++ manpath.c   2 Mar 2020 17:06:57 -0000
@@ -1,6 +1,6 @@
 /*     $OpenBSD: manpath.c,v 1.28 2020/02/10 14:42:03 schwarze Exp $ */
 /*
- * Copyright (c) 2011,2014,2015,2017-2019 Ingo Schwarze <schwa...@openbsd.org>
+ * Copyright (c) 2011,2014,2015,2017-2020 Ingo Schwarze <schwa...@openbsd.org>
  * Copyright (c) 2011 Kristaps Dzonsons <krist...@bsd.lv>
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -226,7 +226,7 @@ manconf_output(struct manoutput *conf, c
 {
        const char *const toks[] = {
            "includes", "man", "paper", "style", "indent", "width",
-           "tag", "fragment", "mdoc", "noval", "toc"
+           "format", "tag", "fragment", "mdoc", "noval", "toc"
        };
        const size_t ntoks = sizeof(toks) / sizeof(toks[0]);
 
@@ -247,11 +247,11 @@ manconf_output(struct manoutput *conf, c
                }
        }
 
-       if (tok < 6 && *cp == '\0') {
+       if (tok < 7 && *cp == '\0') {
                mandoc_msg(MANDOCERR_BADVAL_MISS, 0, 0, "-O %s=?", toks[tok]);
                return -1;
        }
-       if (tok > 6 && tok < ntoks && *cp != '\0') {
+       if (tok > 7 && tok < ntoks && *cp != '\0') {
                mandoc_msg(MANDOCERR_BADVAL, 0, 0, "-O %s=%s", toks[tok], cp);
                return -1;
        }
@@ -308,22 +308,43 @@ manconf_output(struct manoutput *conf, c
                    "-O width=%s is %s", cp, errstr);
                return -1;
        case 6:
+               switch (conf->backspace) {
+               case 0:
+                       oldval = mandoc_strdup("none");
+                       break;
+               case 1:
+                       oldval = mandoc_strdup("backspace");
+                       break;
+               default:
+                       if (strcmp(cp, "none") == 0) {
+                               conf->backspace = 0;
+                               return 0;
+                       } else if (strcmp(cp, "backspace") == 0) {
+                               conf->backspace = 1;
+                               return 0;
+                       }
+                       mandoc_msg(MANDOCERR_BADVAL_BAD, 0, 0,
+                           "-O format=%s", cp);
+                       return -1;
+               }
+               break;
+       case 7:
                if (conf->tag != NULL) {
                        oldval = mandoc_strdup(conf->tag);
                        break;
                }
                conf->tag = mandoc_strdup(cp);
                return 0;
-       case 7:
+       case 8:
                conf->fragment = 1;
                return 0;
-       case 8:
+       case 9:
                conf->mdoc = 1;
                return 0;
-       case 9:
+       case 10:
                conf->noval = 1;
                return 0;
-       case 10:
+       case 11:
                conf->toc = 1;
                return 0;
        default:
Index: term.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/term.c,v
retrieving revision 1.141
diff -u -p -r1.141 term.c
--- term.c      3 Jun 2019 20:23:39 -0000       1.141
+++ term.c      2 Mar 2020 17:07:04 -0000
@@ -1,7 +1,7 @@
 /*     $OpenBSD: term.c,v 1.141 2019/06/03 20:23:39 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <krist...@bsd.lv>
- * Copyright (c) 2010-2019 Ingo Schwarze <schwa...@openbsd.org>
+ * Copyright (c) 2010-2020 Ingo Schwarze <schwa...@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -795,24 +795,26 @@ encode1(struct termp *p, int c)
        f = (c == ASCII_HYPH || c > 127 || isgraph(c)) ?
            p->fontq[p->fonti] : TERMFONT_NONE;
 
-       if (p->flags & TERMP_BACKBEFORE) {
-               if (p->tcol->buf[p->col - 1] == ' ' ||
-                   p->tcol->buf[p->col - 1] == '\t')
-                       p->col--;
-               else
+       if (p->backspace) {
+               if (p->flags & TERMP_BACKBEFORE) {
+                       if (p->tcol->buf[p->col - 1] == ' ' ||
+                           p->tcol->buf[p->col - 1] == '\t')
+                               p->col--;
+                       else
+                               p->tcol->buf[p->col++] = '\b';
+                       p->flags &= ~TERMP_BACKBEFORE;
+               }
+               if (f == TERMFONT_UNDER || f == TERMFONT_BI) {
+                       p->tcol->buf[p->col++] = '_';
                        p->tcol->buf[p->col++] = '\b';
-               p->flags &= ~TERMP_BACKBEFORE;
-       }
-       if (f == TERMFONT_UNDER || f == TERMFONT_BI) {
-               p->tcol->buf[p->col++] = '_';
-               p->tcol->buf[p->col++] = '\b';
-       }
-       if (f == TERMFONT_BOLD || f == TERMFONT_BI) {
-               if (c == ASCII_HYPH)
-                       p->tcol->buf[p->col++] = '-';
-               else
-                       p->tcol->buf[p->col++] = c;
-               p->tcol->buf[p->col++] = '\b';
+               }
+               if (f == TERMFONT_BOLD || f == TERMFONT_BI) {
+                       if (c == ASCII_HYPH)
+                               p->tcol->buf[p->col++] = '-';
+                       else
+                               p->tcol->buf[p->col++] = c;
+                       p->tcol->buf[p->col++] = '\b';
+               }
        }
        if (p->tcol->lastcol <= p->col || (c != ' ' && c != ASCII_NBRSP))
                p->tcol->buf[p->col] = c;
@@ -839,7 +841,9 @@ encode(struct termp *p, const char *word
                adjbuf(p->tcol, p->col + 2 + (sz * 5));
 
        for (i = 0; i < sz; i++) {
-               if (ASCII_HYPH == word[i] ||
+               if (p->backspace == 0 && word[i] == '\b')
+                       p->col--;
+               else if (word[i] == ASCII_HYPH ||
                    isgraph((unsigned char)word[i]))
                        encode1(p, word[i]);
                else {
Index: term.h
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/term.h,v
retrieving revision 1.75
diff -u -p -r1.75 term.h
--- term.h      4 Jan 2019 03:20:44 -0000       1.75
+++ term.h      2 Mar 2020 17:07:04 -0000
@@ -1,7 +1,7 @@
 /*     $OpenBSD: term.h,v 1.75 2019/01/04 03:20:44 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <krist...@bsd.lv>
- * Copyright (c) 2011-2015, 2017, 2019 Ingo Schwarze <schwa...@openbsd.org>
+ * Copyright (c) 2011-2015,2017,2019,2020 Ingo Schwarze <schwa...@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -73,6 +73,7 @@ struct        termp {
        size_t            viscol;       /* Chars on current line. */
        size_t            trailspace;   /* See term_flushln(). */
        size_t            minbl;        /* Minimum blanks before next field. */
+       int               backspace;    /* Use \b in output. */
        int               synopsisonly; /* Print the synopsis only. */
        int               mdocstyle;    /* Imitate mdoc(7) output. */
        int               ti;           /* Temporary indent for one line. */
Index: term_ascii.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/term_ascii.c,v
retrieving revision 1.50
diff -u -p -r1.50 term_ascii.c
--- term_ascii.c        19 Jul 2019 21:45:37 -0000      1.50
+++ term_ascii.c        2 Mar 2020 17:07:04 -0000
@@ -1,7 +1,7 @@
 /*     $OpenBSD: term_ascii.c,v 1.50 2019/07/19 21:45:37 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011 Kristaps Dzonsons <krist...@bsd.lv>
- * Copyright (c) 2014, 2015, 2017, 2018 Ingo Schwarze <schwa...@openbsd.org>
+ * Copyright (c) 2014, 2015, 2017-2020 Ingo Schwarze <schwa...@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -112,6 +112,8 @@ ascii_init(enum termenc enc, const struc
                }
        }
 
+       if (outopts->backspace)
+               p->backspace = 1;
        if (outopts->mdoc) {
                p->mdocstyle = 1;
                p->defindent = 5;

Reply via email to