On Wed, Feb 07, 2018 at 07:28:42PM +0100, Ingo Schwarze wrote:
> Hi,
> 
> while trying to fix the documentation of screen splitting in the vi(1)
> manual page, jmc@ suggested to stop documenting it at all.  I like
> the idea because splitting is useless and confusing and the already
> excessively large documentation profits from simplification.
> 
> Rationale:
> 
>  1. vi screen splitting is confusing and poorly thought out.
>     Just as one example, try the following:
> 
>     $ for f in 1 2 3; do echo content$f > test$f; done
>     $ vi test[123]
>     :N
>     # Now you have split screen mode with test1 and test2.
>     :N  # again
>     # Only results in an error message: No more files to edit.
>     <control-W>
>     # Now you are in the upper, test1 screen.
>     :N  # again
>     # Now you have two copies of test2 open at the same time, with no warning.
>     A changed text <escape> :w
>     # Results in error message: Read-only file, not written; use ! to 
> override.
>     <control-W> A different change <escape> :wq
>     # Writes the change normally, with no warning.
>     <control-W> :n
>     # That opens test2 again in the upper screen, even though you
>     # already opened it earlier with :N in the lower screen.
>     :N
>     # Now you have test3 open, so the behaviour of :N (and :n) depends
>     # on which screen you are in, but it is quirky and confusing
>     # in each of the cases as soon as you use more than one screen.

I normaly use :Vi or :E for screen splitting. They have less issues than
:N (:n and :prev are funky anyway)
 
>  2. It is useless in 2018.  There are so many more standard ways to
>     do the same: Multiple xterms, multiple shells in one terminal
>     window, tmux(1), even standard shell job control with multiple
>     vi processes...

I don't agree with 2. Especially if you want to copy paste between to
files using the screen splitting is nice since you can yank a block in on
window and paste it in the other.
 
> Here is a comprehensive diff removing the related clutter from
> the manual page and from :exusage and :viusage.
> 
> OK?

I don't like this.

>   Ingo
> 
> 
> Index: docs/USD.doc/vi.man/vi.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/docs/USD.doc/vi.man/vi.1,v
> retrieving revision 1.74
> diff -u -p -r1.74 vi.1
> --- docs/USD.doc/vi.man/vi.1  22 Aug 2017 20:27:18 -0000      1.74
> +++ docs/USD.doc/vi.man/vi.1  7 Feb 2018 18:12:51 -0000
> @@ -689,10 +689,6 @@ If this is the first
>  .Aq Cm control-U
>  command, scroll half the number of lines in the current screen.
>  .Pp
> -.It Aq Cm control-W
> -Switch to the next lower screen in the window,
> -or to the first screen if there are no lower screens in the window.
> -.Pp
>  .It Xo
>  .Op Ar count
>  .Aq Cm control-Y
> @@ -1737,11 +1733,6 @@ The input text is appended after the spe
>  .It Cm ar Ns Op Cm gs
>  Display the argument list.
>  .Pp
> -.It Cm bg
> -.Nm vi
> -only.
> -Background the current screen.
> -.Pp
>  .It Xo
>  .Op Ar range
>  .Cm c Ns Op Cm hange Ns
> @@ -1788,24 +1779,16 @@ Delete the lines from the file.
>  .It Xo
>  .Cm di Ns Op Cm splay
>  .Cm b Ns Oo Cm uffers Oc |
> -.Cm s Ns Oo Cm creens Oc |
>  .Cm t Ns Op Cm ags
>  .Xc
> -Display buffers, screens or tags.
> +Display buffers or tags.
>  .Pp
>  .It Xo
> -.Op Cm Ee Ns
> -.Op Cm dit Ns
> +.Cm e Ns Op Cm dit Ns | Ns Cm x Ns
>  .Op Cm !\&
>  .Op Ar +cmd
>  .Op Ar file
>  .Xc
> -.It Xo
> -.Op Cm Ee Ns
> -.Cm x Ns Op Cm !\&
> -.Op Ar +cmd
> -.Op Ar file
> -.Xc
>  Edit a different file.
>  .Pp
>  .It Xo
> @@ -1823,15 +1806,6 @@ command.
>  Display and optionally change the file name.
>  .Pp
>  .It Xo
> -.Op Cm Ff Ns
> -.Cm g
> -.Op Ar name
> -.Xc
> -.Nm vi
> -mode only.
> -Foreground the specified screen.
> -.Pp
> -.It Xo
>  .Op Ar range
>  .Cm g Ns Op Cm lobal
>  .No / Ns Ar pattern Ns /
> @@ -1880,9 +1854,9 @@ Display the lines unambiguously.
>  .Cm map Ns Op Cm !\&
>  .Op Ar lhs rhs
>  .Xc
> -Define or display maps (for
>  .Nm vi
> -only).
> +only.
> +Define or display maps.
>  .Pp
>  .It Xo
>  .Op Ar line
> @@ -1912,8 +1886,7 @@ Write the abbreviations, editor options 
>  .Ar file .
>  .Pp
>  .It Xo
> -.Op Cm Nn Ns
> -.Op Cm ext Ns
> +.Cm n Ns Op Cm ext Ns
>  .Op Cm !\&
>  .Op Ar file ...
>  .Xc
> @@ -1933,11 +1906,7 @@ Save the file in a form that can later b
>  .Fl r
>  option.
>  .Pp
> -.It Xo
> -.Op Cm \&Pp Ns
> -.Cm rev Ns Op Cm ious Ns
> -.Op Cm !\&
> -.Xc
> +.It Cm prev Ns Oo Cm ious Oc Ns Op Cm !\&
>  Edit the previous file from the argument list.
>  .Pp
>  .It Xo
> @@ -1960,6 +1929,8 @@ Append buffer contents to the current li
>  .Op Cm !\&
>  .Xc
>  End the editing session.
> +This command can also be used to get out of the intentionally
> +undocumented, non-standard, split-screen mode.
>  .Pp
>  .It Xo
>  .Op Ar line
> @@ -1978,15 +1949,6 @@ Recover
>  if it was previously saved.
>  .Pp
>  .It Xo
> -.Cm res Ns Op Cm ize
> -.Op Cm + Ns | Ns Cm - Ns
> -.Ar size
> -.Xc
> -.Nm vi
> -mode only.
> -Grow or shrink the current screen.
> -.Pp
> -.It Xo
>  .Cm rew Ns Op Cm ind Ns
>  .Op Cm !\&
>  .Xc
> @@ -2132,8 +2094,7 @@ character is usually
>  .Aq control-Z .
>  .Pp
>  .It Xo
> -.Op Cm Tt Ns
> -.Cm a Ns Op Cm g Ns
> +.Cm ta Ns Op Cm g Ns
>  .Op Cm !\&
>  .Ar tagstring
>  .Xc
> @@ -2195,19 +2156,18 @@ editor.
>  .Op Ar flags
>  .Xc
>  .Nm ex
> -mode only.
> +only.
>  Enter
>  .Nm vi .
>  .Pp
>  .It Xo
> -.Op Cm Vi Ns
> -.Cm i Ns Op Cm sual Ns
> +.Cm vi Ns Op Cm sual Ns
>  .Op Cm !\&
>  .Op Ar +cmd
>  .Op Ar file
>  .Xc
>  .Nm vi
> -mode only.
> +only.
>  Edit a new file.
>  .Pp
>  .It Xo
> @@ -2231,19 +2191,23 @@ command.
>  .Op Cm !\&
>  .Op Ar file
>  .Xc
> +Write the file.
> +.Pp
>  .It Xo
>  .Op Ar range
>  .Cm wn Ns Op Cm !\&
>  .Op >>
>  .Op Ar file
>  .Xc
> +Write the file and edit the next file from the argument list.
> +.Pp
>  .It Xo
>  .Op Ar range
>  .Cm wq Ns Op Cm !\&
>  .Op >>
>  .Op Ar file
>  .Xc
> -Write the file.
> +Write the file and exit the editor.
>  .Pp
>  .It Xo
>  .Op Ar range
> Index: ex/ex_cmd.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/ex/ex_cmd.c,v
> retrieving revision 1.10
> diff -u -p -r1.10 ex_cmd.c
> --- ex/ex_cmd.c       19 Nov 2015 07:53:31 -0000      1.10
> +++ ex/ex_cmd.c       7 Feb 2018 18:12:52 -0000
> @@ -111,7 +111,7 @@ EXCMDLIST const cmds[] = {
>       {"bg",          ex_bg,          E_VIONLY,
>           "",
>           "bg",
> -         "put a foreground screen into the background"},
> +         "put the current screen into the background"},
>  /* C_CHANGE */
>       {"change",      ex_change,      E_ADDR2|E_ADDR_ZERODEF,
>           "!ca",
> @@ -150,12 +150,12 @@ EXCMDLIST const cmds[] = {
>  /* C_EDIT */
>       {"edit",        ex_edit,        E_NEWSCREEN,
>           "f1o",
> -         "[Ee][dit][!] [+cmd] [file]",
> +         "e[dit][!] [+cmd] [file]",
>           "begin editing another file"},
>  /* C_EX */
>       {"ex",          ex_edit,        E_NEWSCREEN,
>           "f1o",
> -         "[Ee]x[!] [+cmd] [file]",
> +         "ex[!] [+cmd] [file]",
>           "begin editing another file"},
>  /* C_EXUSAGE */
>       {"exusage",     ex_usage,       0,
> @@ -170,7 +170,7 @@ EXCMDLIST const cmds[] = {
>  /* C_FG */
>       {"fg",          ex_fg,          E_NEWSCREEN|E_VIONLY,
>           "f1o",
> -         "[Ff]g [file]",
> +         "fg [file]",
>           "bring a backgrounded screen into the foreground"},
>  /* C_GLOBAL */
>       {"global",      ex_global,      E_ADDR2_ALL,
> @@ -225,7 +225,7 @@ EXCMDLIST const cmds[] = {
>  /* C_NEXT */
>       {"next",        ex_next,        E_NEWSCREEN,
>           "!fN",
> -         "[Nn][ext][!] [+cmd] [file ...]",
> +         "n[ext][!] [+cmd] [file ...]",
>           "edit (and optionally specify) the next file"},
>  /* C_NUMBER */
>       {"number",      ex_number,      E_ADDR2|E_CLRFLAG,
> @@ -250,7 +250,7 @@ EXCMDLIST const cmds[] = {
>  /* C_PREVIOUS */
>       {"previous",    ex_prev,        E_NEWSCREEN,
>           "!",
> -         "[Pp]rev[ious][!]",
> +         "prev[ious][!]",
>           "edit the previous file in the file argument list"},
>  /* C_PUT */
>       {"put",         ex_put, 
> @@ -331,7 +331,7 @@ EXCMDLIST const cmds[] = {
>  /* C_TAG */
>       {"tag",         ex_tag_push,    E_NEWSCREEN,
>           "!w1o",
> -         "[Tt]a[g][!] [string]",
> +         "ta[g][!] [string]",
>           "edit the file containing the tag"},
>  /* C_TAGNEXT */
>       {"tagnext",     ex_tag_next,    0,
> @@ -386,7 +386,7 @@ EXCMDLIST const cmds[] = {
>  /* C_VISUAL_VI */
>       {"visual",      ex_edit,        E_NEWSCREEN,
>           "f1o",
> -         "[Vv]i[sual][!] [+cmd] [file]",
> +         "vi[sual][!] [+cmd] [file]",
>           "edit another file (from vi mode only)"},
>  /* C_VIUSAGE */
>       {"viusage",     ex_viusage,     0,
> @@ -412,7 +412,7 @@ EXCMDLIST const cmds[] = {
>       {"xit",         ex_xit,         E_ADDR2_ALL|E_ADDR_ZERODEF,
>           "!f1o",
>           "[line [,line]] x[it][!] [file]",
> -         "exit"},
> +         "write if modified and exit"},
>  /* C_YANK */
>       {"yank",        ex_yank,        E_ADDR2,
>           "bca",
> Index: ex/ex_usage.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/ex/ex_usage.c,v
> retrieving revision 1.8
> diff -u -p -r1.8 ex_usage.c
> --- ex/ex_usage.c     12 Nov 2014 04:28:41 -0000      1.8
> +++ ex/ex_usage.c     7 Feb 2018 18:12:52 -0000
> @@ -58,7 +58,7 @@ ex_usage(SCR *sp, EXCMD *cmdp)
>       ARGS *ap;
>       EXCMDLIST const *cp;
>       int newscreen;
> -     char *name, *p, nb[MAXCMDNAMELEN + 5];
> +     char *p;
>  
>       switch (cmdp->argc) {
>       case 1:
> @@ -97,28 +97,13 @@ ex_usage(SCR *sp, EXCMD *cmdp)
>               break;
>       case 0:
>               for (cp = cmds; cp->name != NULL && !INTERRUPTED(sp); ++cp) {
> -                     /*
> -                      * The ^D command has an unprintable name.
> -                      *
> -                      * XXX
> -                      * We display both capital and lower-case versions of
> -                      * the appropriate commands -- no need to add in extra
> -                      * room, they're all short names.
> -                      */
> -                     if (cp == &cmds[C_SCROLL])
> -                             name = "^D";
> -                     else if (F_ISSET(cp, E_NEWSCREEN)) {
> -                             nb[0] = '[';
> -                             nb[1] = toupper(cp->name[0]);
> -                             nb[2] = cp->name[0];
> -                             nb[3] = ']';
> -                             for (name = cp->name + 1,
> -                                 p = nb + 4; (*p++ = *name++) != '\0';);
> -                             name = nb;
> -                     } else
> -                             name = cp->name;
> -                     (void)ex_printf(sp,
> -                         "%*s: %s\n", MAXCMDNAMELEN, name, cp->help);
> +                     if (cp == &cmds[C_BG] || cp == &cmds[C_FG] ||
> +                         cp == &cmds[C_RESIZE])
> +                             continue;
> +                     (void)ex_printf(sp, "%*s: %s\n", MAXCMDNAMELEN,
> +                         /* The ^D command has an unprintable name. */
> +                         cp == &cmds[C_SCROLL] ? "^D" : cp->name,
> +                         cp->help);
>               }
>               break;
>       default:
> Index: vi/v_cmd.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/vi/vi/v_cmd.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 v_cmd.c
> --- vi/v_cmd.c        13 Mar 2016 18:30:43 -0000      1.5
> +++ vi/v_cmd.c        7 Feb 2018 18:12:52 -0000
> @@ -108,9 +108,7 @@ VIKEYS const vikeys [MAXVIKEY + 1] = {
>           "^V",
>           "^V input a literal character"},
>  /* 027  ^W */
> -     {v_screen,      0,
> -         "^W",
> -         "^W move to next screen"},
> +     {v_screen,      0,      NULL,   NULL},
>  /* 030  ^X */
>       {NULL},
>  /* 031  ^Y */
> 

-- 
:wq Claudio

Reply via email to