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.
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...
Here is a comprehensive diff removing the related clutter from
the manual page and from :exusage and :viusage.
OK?
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 */