BSD 4_3_Tahoe development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Sun, 10 Jun 1984 16:56:40 +0000 (08:56 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Sun, 10 Jun 1984 16:56:40 +0000 (08:56 -0800)
Work on file usr/src/ucb/ex/TODO

Synthesized-from: CSRG/cd2/4.3tahoe

usr/src/ucb/ex/TODO [new file with mode: 0644]

diff --git a/usr/src/ucb/ex/TODO b/usr/src/ucb/ex/TODO
new file mode 100644 (file)
index 0000000..1dda1b4
--- /dev/null
@@ -0,0 +1,2036 @@
+From gbergman@UCBBRAHMS Mon Jul 25 16:21:43 1983
+Date: 25 Jul 83 16:16:52 PDT (Mon)
+From: gbergman@UCBBRAHMS (George Mark Bergman)
+Subject: Re:  editor bugs etc.
+Message-Id: <8307252316.AA22776@UCBBRAHMS.ARPA>
+Received: by UCBBRAHMS.ARPA (3.342/3.7)
+       id AA22776; 25 Jul 83 16:16:52 PDT (Mon)
+Received: from UCBBRAHMS.ARPA by UCBERNIE.ARPA (3.336/3.7)
+       id AA13678; 25 Jul 83 16:21:17 PDT (Mon)
+To: mckusick@UCBERNIE
+Status: R
+
+The following are (i) a short note from Mark Horton
+in reply to a note of mine saying I'd been keeping notes
+on editor bugs, had heard he had a new version, was
+interested in hearing about it and perhaps sending
+him notes on bugs not mentioned as corrected; (ii)
+a long letter from me in which I do list bugs, features
+I think would be desirable etc., (iii) an addendum I
+sent the next day, (iv) brief jottings not yet sent.
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+>From mark@cbosgd.UUCP Thu Jul 21 12:31:55 1983
+
+The new version of vi isn't very different to the user.
+The internals use terminfo instead of termcap, but the
+user interface isn't affected by this (except that it
+starts up faster).  The major new features are
+       set showmode
+               will cause an indication on the status line when
+               you are in input mode
+       vedit
+               is a new invocation of vi for novices
+       more function keys now work
+       function keys work in both command and input mode
+Of course, there are a few bug fixes too.
+
+There is a binary in ~mark/bin/vi on ucbarpa.  It requires the
+/etc/term heirarchy (there is no file called /etc/terminfo) which
+was on ucbarpa once but might be gone now.  If you want to grab
+them from whereever they still exist, please feel free to try them.
+       Mark
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+Sent to Mark Horton  23/7/83, about 11AM
+
+Dear Mark,
+
+     Well, your note didn't say you wanted me to send my comments
+on editor bugs and suggestions, but you didn't say I shouldn't,
+so I decided to do so.  I've tried to organize it into some sort
+of sections.  I'd be interested to know which of the bugs mentioned
+here you have already found and corrected.  (I may soon find out for
+myself; the person in charge of this machine says he'll try to get a
+copy of version 3.9 from UCBARPA if they still have it, and get it
+running for me.  If you have any helpful information for him, he
+is robert@brahms, Robert Gross.)
+     Vedit sounds like a great idea.
+     I should mention that throughout this letter, I have
+avoided using actual control-characters, but faked them,
+e.g. used ^ and H to get the appearance of ^H, since files with
+real control-characters can be confusing when looked at in mail,
+more, etc.  But this means that if you want to try any commands I
+refer to that use them, you won't be able to yank and source them,
+unless you replace my fakes with real control characters.
+     The version I am using is 3.7.
+
+
+PROBLEMS WITH COUNTS
+
+     Some  vi operations that logically ought to be able to take
+counts do not, while others misbehave with counts.  In this section,
+``N'' will always denote a positive integer placed as a count before
+a vi operation.
+     The most gross case of misbehavior is that of N^B!
+The effect is to redraw the screen 23N-44 lines further advanced.
+(Probably the numbers depend on the screen-size of the terminal;
+this is on a Z19, using termcap h19u.)  When N=1, this does indeed
+move you a screenful backward, but for higher N it moves the window
+forward some amount!  Further, whatever controls are supposed to
+monitor whether the command would land one at an acceptable line-
+number seem to have a different idea of what it is doing:  If you
+aren't already familiar with these weird effects, try setting the
+cursor near the end of a file that is more than 4 screenfuls long,
+and hitting 3^B.  (You might then try an insert at the place you get
+to, and a :f^] .)
+     N/pattern/ would be useful, but is not allowed.
+     ND would be a natural synonym for dN$, by analogy with NC for cN$,
+but it doesn't work that way; it just ignores the N.
+     Finally, if N is precisely the number of lines
+from the current line to the end of the file,  N$  will still correctly
+carry one to the last character of the file, but cN$, NC, dN$ and yN$
+refuse to do anything!  (NY does work, not being a synonym for yN$.)
+The failure of NC is particularly annoying; often when I am composing
+something, I go back to somewhere in the middle of the next-to-
+last line, say, and want to rewrite the rest of the sentence;
+2cc would kill not only the part I want to rewrite but also the OK
+beginning of the line, and 2C or 2c$ won't work.  I realize that I
+could get around this by keeping an empty line at the end of the file,
+but that should not be necessary.
+
+
+PROBLEMS REGARDING SOURCE, MACROS, MAPPINGS
+     These are enormously useful, but seem to have all kinds of hidden
+restrictions.
+
+     The Appendix to the Ex Reference Manual, "List of Changes from
+Version 3.5 to Version 3.6" says ``A bug which prevented the source
+command from working...from visual has been fixed''.  It is true that
+one can now use  :so  from vi, but it still has a bug:  When
+the scriptfile invoked contains a global command
+and some other command(s) after it, everything after the first global
+command is ignored.  The same appears to be true of scripts in named
+buffers invoked from vi-bottom-line by  @x.
+
+     (It is, perhaps, unexpected that one can invoke scripts with
+multiline commands using @x from vi's bottom-line at all, since such
+commands will not work if typed on vi's bottom line directly.
+A script like
+       s/$/a\
+       b
+invoked as @x will indeed work.  But strangely, if one tries to
+invoke from the regular mode of vi the script
+       :s/$/a\
+       b
+by putting it in buffer x and doing  @x, only the first line
+will take effect.)
+     Another serious restriction is that the command ``vi'' appears to
+be ignored in sourced ex-scripts, and though the command Q in macros of
+various flavors in vi (mapped characters, map!ed characters that contain
+``...^V^[...Q...'';  @x scripts) does take one into ex, any ex
+commands after it are ignored.
+     I assume you are aware of whatever restrictions lead to the
+error-message ``Cannot yank inside global/macro'', since you must
+have written it, though ``inside'' seems to here have the peculiar
+meaning ``after a text-changing operation of the macro.''
+     The error-message ``Can't undo in global commands'' is more
+mysterious, since I get it when I have a global command after
+a text-changing command in an @x script (though not in a sourced file).
+     Anyway, the fewer such restrictions these operations were subject
+to, the more useful they would be!
+
+     Although nested source commands are allowed (and I find them
+useful), they leave the editor in a ``noprompt'' state.  This
+can be gotten around by including ``se prompt'' as a line in the
+outermost scriptfile, but I would hope the problem causing it could
+be cured.
+
+     When one tries to ``:unmap!'' a ``:map!'' command whose
+right-hand-side begins with ^H (entered as ^V^H, of course), one
+gets the message ``That macro wasn't mapped''.  (One can get around
+this by using :unmap! ^V[character].)
+
+     Certain termcaps apparently produce automatic mappings, which
+unfortunately may interfere with useful vi commands.  In particular,
+on a tvi, ^L gets mapped to a movement command, which makes it
+unavailable for redrawing the screen, unless unmapped.
+
+
+PROBLEMS WITH DIAGNOSTICS
+
+"Hit return to continue" -- It took me a long time to realize that
+when I got this diagnostic there was an alternative to hitting
+return.  I suggest it be reworded
+       "Hit Return or :"
+However, the behavior of the editor when this diagnostic is given
+seems to be inconsistent.  In particular, when the last of a serious
+of commands is
+       :e otherfile
+and I get "Hit return to continue", then hitting : usually
+has no different effect from hitting return (or any other
+key), namely the screen is redrawn; yet I think that sometimes
+in this situation it has brought me directly to the bottom line
+as desired.  Very confusing.
+     Would it be possible to have other alternatives than : and return
+available, such as /pattern ?  Or, more simply, when one would presently
+be given the diagnostic "Hit return to continue", why not just put the
+editor into the state it would have if one then hit :, since one would
+then still have the option of hitting return and getting into vi
+proper, but it would not require the extra keystroke : to
+begin a bottom-line command, nor would one go through the frequent
+frustrating experience of absentmindedly starting to write a
+bottom-line command, or a pattern-search, and then having to wait
+while the screen was redrawn because one had hit a key other than :.
+
+"Using open mode"
+Again, it took me a long time to learn that when I tried to enter
+vi and got this diagnostic, it meant that the system had somehow
+lost the termcap for the terminal I was on, and that I would have
+to do something to get the correct termcap into the environment.
+Till I realized this, I generally ended up either struggling along
+frustrated in open mode, or logging out and logging back in.  I suggest
+that when someone calls for vi and the termcap is not appropriate,
+the editor should not be invoked in any form, but instead, a message
+be given such as:
+     ``Your environment does not show a termcap entry permitting
+the use of the visual editor.  If you are working on a terminal not
+supporting vi (in particular, a device with no addressable cursor),
+you may enter one of the other modes of the editor with the command
+"open filename" or "ex filename".  If you are working on a terminal
+that should support vi, your environment entries are incorrect and
+should be corrected.  They presently show:
+     TERM=....
+     TERMCAP=....
+If you know the correct name or abbreviation for your terminal-
+type, type it at the end of the next line; if not hit return:
+     % setenv TERM ''
+     If the user typed an acceptable terminal-name, the message would
+continue, telling how to get the appropriate termcap.  If the user
+instead typed return, the message would ask him or her to type the
+name of the manufacturer shown on the terminal, not
+worrying about upper/lower-case distinctions, and a list of possible
+terminal names and abbreviations would be given... .  This whole
+program would not be part of the editor, so there would
+be no problem of space within the existing crowded confines of
+the editor code.
+
+"No such file or directory" -- I think there should be a distinction
+between these two cases, because of the important distinction in the
+consequences when the user tries to quit the editor:
+If the directory exists, the file is created, but
+if not, the results are more complicated -- I seem to recall on one
+occasion simply losing what I had written on my second try
+at quitting; though I just now did an experiment and this time
+repeated ZZ's and :x's simply gave repeated error messages.
+
+"File already exists..." -- The ``List of changes from 3.5 to 3.6'' says
+``If you get I/O errors, the file is considered "not edited"... .''
+I presume that this correction is somehow the cause of the fact that
+I frequently get the above message when trying to leave the editor
+on a machine with version 3.7, and have to use
+      :w! %|q
+to exit.  But I've never seen any evidence that there were I/O errors;
+it mainly seems to happen when I've written some lines to another
+file in the process of editing.  So the criteria the editor is using
+to decide when there have been ``I/O errors'' should be rechecked.
+
+"no such command from open/visual" -- This confused me in my first
+few days of using the editor, when I didn't understand that one
+couldn't use i and a (in either their vi or ex senses) from the bottom
+line of vi.  A message "i -- no such command from open/visual"
+was perplexing because I knew that "i" was indeed a vi command.
+Perhaps it should say  "no such command from open/visual bottom line".
+
+MISCELLANEOUS PROBLEMS
+
+     In ex search and replacement patterns, \\ is supposed to represent
+a real \-character, but something goes wrong when this occurs
+at the end of a global command.  E.g., though
+     :s/^/\\
+works OK (in vi or ex), the variant
+     :.g/^/s//\\
+definitely does not.  In vi it turns everything off, in ex it seems to
+behave as though there were just a single \, and in a scriptfile,
+it -- does something still different, which you can discover if you
+don't know!
+
+The Ex Reference Manual says, ``For sanity with use from within
+visual mode, ex ignores a ":" preceding any command.''  But it
+ignores it in the wrong place! -- not at the beginning of the
+command line, but just before the command letter itself.  I.e.,
+it accepts 1,3:s/^/     /, but not :1,3s/^/    /.
+
+SUGGESTIONS FOR MINOR ADDED CAPABILITIES
+
+   In a multiline substitute command with the "c" option, when
+each line is displayed one has three choices: y, n or break.  There
+are some further options that would be useful.  One would be "p" --
+at present, "p" can only be included on the command line, which
+means that one has a choice between seeing the result of every
+substitution or none.  In practice, one would generally like to see
+the results of the first few cases to make sure that the command one has
+written does what one meant it to, and maybe a few tricky cases that
+come up; but not every case!   Another might be "u" -- to undo the last
+case for which one gave a "y".  Still another might be an option that
+would mean ``undo the "c" option -- I see that the substitute command
+is doing what I wanted, go ahead and finish it without me.''
+    In a command  g/pattern/p,  the pattern in question is occasionally
+such that it takes a while to figure out where on the line it occurs.
+For this purpose, an option that ``pointed out'' the instance of the
+pattern, in the same manner that the pattern to be replaced is pointed
+out in substitute command with option c, would be desirable.
+    When  g/pattern/p  gives more than a screenful of lines, it would
+be nice to have it piped through the equivalent of ``more''.
+
+    ex has the command line option "-", which ``is useful in processing
+editor scripts''.  But if one wants to use a script in the course of
+an otherwise interactive editing session, it would be desirable to have
+a corresponding resettable option ``:se -'' (or ``:se nofb'').
+
+     In strings in pattern-searches, it would be useful to have
+^ and $ retain their ``magic'', so that /x[a$]/ could
+search for all occurrences of  x  before an  a  or a newline.
+(Of course, one would then have to decide whether  /x[^y]/ should
+include the case of  x  followed by a newline or not.)
+
+    Just as ex allows the command :vi, so I think that vi should
+have some bottom-line command equivalent to the regular-mode
+command  Q.  When one has done some text-changing bottom-line
+commands, and realizes one wants to go into ex, it can be time-
+consuming to hit return and then Q, and wait for the screen to be
+redrawn for vi before one gets the ex prompt.
+
+     The option of putting several commands on one line, separated
+by, "|" is particularly useful in the vi bottom-line mode, because
+it avoids having the screen redrawn several times.  It would be
+useful to be able sometimes do the same thing with non-bottom-line
+commands, e.g. in editing a troff file at a low baud rate on a dumb
+terminal one might like to be able to do  i\fI^]3Ea\fR^]  without
+watching the line get redrawn twice.  Perhaps some key that would
+cause any sequence of commands to be ``held'' until some complementary
+key was hit would be useful.
+     It would also be desirable to have a sequence of commands that had
+been given in this way available as one unit to be repeated by ``.'',
+if desired.
+
+     The parenthesis-matching facility with % might be extended
+to match ` with ' and <  with  >.
+
+     I will mention one facility that I discovered by surprize is
+possessed by  ed  but not  ex  --  sequences such as  \1  can be used
+within  ed  search-patterns.  E.g. (for the most trivial case)
+     /\(.\)\1/
+will search for doubled letters.
+
+
+DEBATABLE SUGGESTIONS
+     I will mention here some possible changes which have the
+difficulty that they would change the meaning of existing commands,
+so that it could be argued that the disadvantage of users having
+to change their habits might outweigh the advantages.
+
+     First, one might try to resolve, one way or another, the
+contradiction between the count arguments taken by the join commands
+in  vi and  ex:  In ex, jN joins N+1 lines; in vi, NJ joins N lines
+(except if N=1).
+
+     Second, the movement commands  tx  and  Tx  of vi (x any character)
+seem poorly defined.  Just as fx will ignore the character on which
+the cursor is presently sitting, even if it is an  x,  and move to the
+next occurrence, so I would think that  tx  should ignore the character
+immediately after the cursor, and  Tx  the character immediately before
+the cursor.  The point is that when one does  Nfx,  and finds that one
+had failed to count one occurrence of  x  and fallen short of where one
+wanted to go, one can hit  ;  and get there.  Likewise, on doing  Ntx
+and finding one has fallen short, one should be able to hit  ;  and get
+to the the next occurrence; but at present, hitting  ;  leaves
+the cursor in the same position; one must hit  ``2;''  to get any
+further.  In effect,  Ntx  is presently defined as  Nfxh;  I am
+suggesting that it be defined as  lNfxh.
+
+     The sequences  cw, dw  and  yw  are presently violations of the
+principle that  c[movement],  d[movement]  and  y[movement]  change,
+delete, or yank everything from the current cursor position through
+the endpoint of the movement command.  cw does what one would expect of
+ce (in fact, they seem to be synonyms), while there is no way to get
+the effect which  cw  would have if it were treated ``consistently''.
+(E.g., if I have a line beginning  ``And if'', and I want to change it
+to ``If'', I cannot just put the cursor on the A and hit  cwI^].)  dw
+and  yw  delete up to the character immediately before the point to
+which ``w'' would take the cursor.  I would have to agree that this
+behavior of dw and  yw  is more useful than that which a literal
+interpretation of the movement rule would lead to; but perhaps it
+would become still more useful if when applied to the last word on
+a line, it deleted or yanked the space immediately before the word
+along with the word... .  On the other hand, one could argue for
+making a distinction between  cw  and  ce.
+
+     Though I see the motivation for the above definitions,
+I see no sensible reason why  Y  should be equivalent to  yy,  when
+C  and  D  are equivalent to  c$  and  d$.  I would vote for changing
+Y  to mean  y$.
+
+RADICAL SUGGESTIONS
+
+     Is there any reason for maintaining the distinction between
+the ``:'' state of vi, and  ex  itself?  At present, there are
+relative advantages that lead one to choose to go into one or the
+other for a given operation:  From the vi-: state, it is easier
+to return to the regular vi state; from ex, one has a more powerful
+range of commands; and it is easier to give a series of commands
+because each carriage-return gives one a new prompt.  My suggestion
+is that from vi, ``:'' should carry you directly to ex, and when you
+are in ex, carriage-return (^M) after a command should give you a new
+prompt, while ^] should put you into vi.  Conceivably, things might be
+simplified even further, and carriage return rather than : could
+be the key that would carry one from the regular mode of vi into ex:
+
+                        .-------.      .-------.
+       .-------. a,i... | basic |  ^M  |       |
+       |  vi   |<------ |       |----->|  ex   |<---.
+       | insert|        |   vi  |      |       |    |^M
+       |  mode | ------>|       |<-----| mode  | ---'
+       `-------'  ^]    |  mode |   ^] |       |
+                        `-------'      `-------'
+
+(Of course, ^M presently has a meaning in vi, but
+it has a synonym +.)  Clearly, there would also be no need for a
+special "Hit return to continue" state.
+     I have not distinguished vi and open in the above diagram.
+My idea here is that ^] would actually return you to either vi
+or open, whichever you had last been in, and that to switch
+to the other, you could enter ex and type vi^] or o^] respectively.
+(Or you could type  vi^M, respectively o^M, and further ex commands,
+and the mode would be saved for the next time you hit a ^].)  Or
+alternatively, these could be made settable options: se visual
+respectively se novisual.
+     Having gotten used to the editor as it now exists, I admit that
+I feel uneasy about the above idea -- the sense of knowing that
+I am ``still in vi'' when I hit :, and not that ``other land'' of ex, 
+represents a kind of of orientation that it is disconcerting
+to abandon.  But I can't see any logical disadvantage in making
+such a change.  Can you?  Certainly, there would be things that
+would have to be thought out, such as what happens to bottom-line
+vi pattern-searches.  My thought would be that ``/'' from vi should
+give :/ (i.e., put one in ex at the start of a pattern-search),
+and ^] after a pattern-search should put one into vi at the appropriate
+character on the line, in contrast to ^M after a pattern search,
+which would leave one in ex at the appropriate line.  In general,
+I think such changes would lead to greater simplicity and learnability
+of the editor.
+     I would also hope that excursions between vi and ex and back
+could be allowed in scriptfiles.  It might also be desirable for
+ex to have, in addition to a concept of ``current line'', one of
+``current cursor position''... .
+
+     Well, on to another subject.  One of the inconveniences I
+found very vexing when first learning to use the editor was that
+when in either vi insert mode, or ex/vi-bottom-line, it was very hard
+to edit what I was doing.  Within insert mode the only ``editing''
+I could do, without escaping, was with the three operations ^H,
+^W and the kill character.  And on a slow line with a dumb terminal,
+escaping to make changes could be very time-consuming because large
+parts of the screen would insist on being redrawn.  Perhaps some
+other control-character could serve as
+a modified escape, that allowed one to edit what one had entered
+in the current insertion without having everything below it redrawn,
+and then return to it.  Obviously, if carried to its logical
+limit this idea could lead to ridiculous nests of
+editing operations; but there would be no need to carry it to its
+logical limit.
+     Anyway, the problem of editing ex-style commands
+was even worse, because there was no way to ``escape and
+revise''.  I eventually learned enough to realize that the solution
+was to edit complicated commands in another file and source it.
+But it is sometimes very useful to have the text on which the
+commands are to act in front of you when composing them (e.g., you can
+yank and modify various pieces), which led to the variant of writing
+command lines within the file I was editing, and then writing
+those lines into another file and sourcing that, without ever leaving
+the current file.  But this is distracting to deal with
+when concentrating on the editing task itself, which led me
+to divise a scriptfile which would handle the writing-to-another-file-
+and-sourcing for me.  Or actually, several such files:  One for
+single-line commands to be used essentially once; one for single-line
+commands that I would want to use on the same file during various
+editing sessions, and so would want to keep available in that
+file, and one for multi-line commands (to be used once).  When
+I first got the idea, I thought one scriptfile would be enough, and
+I would call it ``do'', so that the command to execute a script I
+had written in a file I was editing would be ``:so do''.  The
+file it would write to and source would be ``do.again'', so that
+if I wanted to reuse it, I could ``:so do.again''.  When I realized
+the need for several versions, ``do'' became a directory.  Here,
+for your amusement, are the three files.  (Re the lines ``se prompt'',
+cf. my comment on that under PROBLEMS WITH SOURCE etc.):
+
+  do/1  (for 1-time use of 1-line commands)
+       .w! ~/do/again
+       d
+       so #
+       se prompt
+
+  do/1+  (like above, without deleting the command)
+       .w! ~/do/again
+       so #
+       se prompt
+
+  do/:  (to use this, write a multi-line command script, put : at
+  the beginning of the first line, put the cursor on the last
+  line of the script, and then source the following:)
+       ?^:?s/:/
+       ,''w! ~/do/again
+       ,''d
+       so #
+       se prompt
+
+(I also created another version to use in case the script had
+to have an internal line beginning with ``:'', so that this couldn't
+unambiguously mark the beginning of the script.  This used
+a line which explicitly specified the address-range of the script.
+But I have never had a need for it, so I will not bother you with it.)
+    Finally, having gotten an account on a machine with a version 3
+editor recently, I have divised still another way of doing this.  I
+have put in my EXINIT the command
+
+       'map ^A "ayy:@a^M'
+
+and now, gratifyingly, the single stroke ^A has essentially the effect
+of ``:so do/1+''  -- except for the restrictions to which vi ``map''
+commands are subject.  But I've only been using this for a
+couple of weeks; so I have yet to learn how chafing those restrictions
+will or won't be.
+     Anyway, it might be worth thinking about whether some of these
+things that I've done with macros should be incorporated in some form
+into the editor itself; or else whether these macros might be written
+up in the documentation (or some tutorials) on the editor.
+
+     Next subject: Complicated pattern-searches in long files
+can be time-consuming.  I have seen the point mentioned
+that if a pattern-description can be begun with "^",
+this can speed up the search -- since the pattern-comparisons need
+only be begun at beginnings of lines.  In some cases, this might
+not be possible, but the user might be aware of some other
+character or character-sequence in the search-pattern
+that will occur relatively rarely in the file.  In such cases it would
+be desirable if the user could specify one spot from which the pattern
+search should start, working forward and backward from there, to
+minimize false starts.  E.g., if for some reason one wants to
+delete every word containing the letter m, the script
+       %s/[^ ]*m[^ ]*//
+would become much less time-consuming if one could mark the point
+at which to begin, say writing
+       %s/[^ ]*\!m[^ ]*//
+so as to instruct the editor to search for m's, and each time
+one was found, to find the longest possible strings of non-space
+characters before and after it, and delete these.   (This is a silly
+example, but I think the idea is clear.)
+
+     Something that I've seriously felt the need for is the
+capability of searching for lines that satisfy more than one
+condition.  If one just wants to locate such lines, one can
+of course leave the editor and do a pipeline of two or
+more greps; but it would be nice to be able to perform global
+commands on such lines.
+
+    Finally, any possibility of introducing the capability of searching
+for patterns including embedded newlines, a la sed?  Multiple windows,
+a la emacs?
+
+ADDENDA
+     I logged in this morning on an adm3a at 300 baud to go over this
+letter once more before sending it, and ran into another bug!  I had
+done 15^D to get a large scroll despite the low speed, and at one point
+I saw a line with a typo scrolling up.  So I noted its line-number, 402
+and without waiting for the screen to stop moving typed something like
+402Gfsrd.  What happened was that the change was made on line 407 rather
+than 402 -- presumably the cursor was sent to where 402 had been when
+the command was received... .
+     Editing this letter this morning reminded me of another feature I
+have thought would be desirable for editing on dumb terminals at low
+speeds:  An option that would cause lines read from a file or typed
+in at the bottom of the screen to appear double spaced, with @ signs
+@
+between them, such as one gets when one deletes a line on such a
+@
+terminal.  (I have faked this effect here, though the fake will not be
+@
+very successful if you have  se nu  or  se list  on.)  The point is that
+@
+editing operations that presently cause painfully slow screen-redrawings
+would simply put material in in place of these fillers -- as happens
+now when one is lucky enough to be adding material just above a place
+where material was previously deleted.
+
+               -  *  -  *  -  *  -  *  -  *  -
+
+    I hope you've found some things of interest in this hodgepodge.
+
+                               Yours,
+                               George (gbergman@brahms)
+
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+23/7/83, about 8PM
+
+     Maybe thinking about the editor while writing my previous
+``note'' to you has made me more conscious of these things,
+but for some reason, I've discovered several more peculiarities of
+the the Version 3.7 editor today!
+
+     First, the abbreviation feature has a strange bug (feature?)
+involving the backslash:  If some string X is the abbreviation
+for a string Y, and if X is typed (following a space etc)
+immediately followed by a \ and another character c, the
+result is not Y\c by cY\.  The case where I discovered this
+was a doubly complicated one: I had an abbreviation of
+the form
+       :ab x x\yZ
+where x and  y  were characters and Z was a string of characters.  
+So when I typed  x,  it presumably first expanded it as x\yZ,
+then performed the transformation I just described on the x\y
+turning it into  yx\yZ\, and thus giving the result yx\yZ\Z.
+This turns out to be one of the cases that can't be unmapped
+without doing :una ^Vx.  Further, I just tried a similar case
+with x replaced by a string of more than one character
+(namely, :ab if if\pq)  and I find I can't unmap that at all.
+     I also find that an abbreviated string containing | (which
+must be inserted using ^V|, of course) is difficult to unmap.
+
+     Second, some peculiarities about where the cursor ends
+up after a yank.  If the yank involved a forward movement,
+the cursor stays where it is, which is the beginning
+of the yanked segment.  If the yank involves a backwards
+movement, the place where the cursor originally was is not
+the same as the beginning of the yanked segment, and there
+seems to be some confusion as to which principle is followed:
+y- or yk moves the cursor up, while yb leaves it fixed.
+Unfortunately, there is a snake in the grass with yb: If
+you hit p after it, the yanked word will not appear after
+the position where the cursor has remained, but
+after the position to which it would have gone if it had moved
+to the beginning of the yanked segment!  Likewise if you
+you hit an x... .
+     (You have no idea how much trouble I'm
+having with those "if"'s.  Of course, I could quit the editor
+and come back in, and I would lose that crazy abbreviation
+that way.)
+
+     I also notice that if the cursor is at the end of a word
+or between words, 2e behaves the same as e!
+
+     Finally, I note that d^, when the cursor is before the first
+nonwhite character, is another exception to the principle that
+d[motion] deletes everything through the endpoint of [motion].
+Similarly with c^ and y^.
+
+- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *
+discovered next day (not yet sent):
+
+error with yb does not just concern p and x: any command is
+executed as though cursor is at destination of backward in-line
+yank.
+
+N^B does not work consistently?  (Not on a medium-length file in Kim)
+
+Can get endless-loop mapping if abbreviation forms word within
+abbreviated.  E.g. :ab x ( x )
+``word'' must be delimited on left by space, tab,
+newline, start-of-insert; on right by any punctuation.  Why
+special ``no tail recursion'' rule?
+     Things like that ``if'' abbreviation can be undone using
+:una i^Vf!
+
+Mention desirability of Np
+
+copies sent to ralph@ucbarpa, lindahl@topaz 25/7/83
+
+From gbergman@UCBCARTAN Mon Aug  1 14:19:27 1983
+Date: 1 Aug 83 14:14:06 PDT (Mon)
+From: gbergman@UCBCARTAN (George Mark Bergman)
+Subject: Re:  editor
+Message-Id: <8308012114.AA00627@UCBCARTAN.ARPA>
+Received: by UCBCARTAN.ARPA (3.342/3.7)
+       id AA00627; 1 Aug 83 14:14:06 PDT (Mon)
+Received: from UCBCARTAN.ARPA by UCBERNIE.ARPA (3.336/3.7)
+       id AA19324; 1 Aug 83 14:19:12 PDT (Mon)
+To: mckusick@UCBERNIE
+Status: R
+
+Here's Mark Horton's reply to my letter on bugs
+
+>From mark@cbosgd.UUCP Thu Jul 28 14:38:55 1983
+
+Sorry this has taken so long, but your note was too long to digest
+in the cracks between the other stuff I do.  Anyway, you've clearly
+put a great deal of thought into this, and I appreciate your input.
+I'll reply individually to your thoughts, and keep them on file
+for use (someday) when vi gets rewritten.  Some of them are just
+plain bugs that ought to be fixed soon anyway.
+
+       PROBLEMS WITH COUNTS
+
+            The most gross case of misbehavior is that of N^B!
+       The effect is to redraw the screen 23N-44 lines further advanced.
+       (Probably the numbers depend on the screen-size of the terminal;
+       this is on a Z19, using termcap h19u.)  When N=1, this does indeed
+       move you a screenful backward, but for higher N it moves the window
+       forward some amount!  Further, whatever controls are supposed to
+       monitor whether the command would land one at an acceptable line-
+       number seem to have a different idea of what it is doing:  If you
+       aren't already familiar with these weird effects, try setting the
+       cursor near the end of a file that is more than 4 screenfuls long,
+       and hitting 3^B.  (You might then try an insert at the place you get
+       to, and a :f^] .)
+This is a known bug, and was fixed in 3.8.  The count is supposed to subtract
+(LINES-1)*N from the line number, but there's + that should be a -, so it
+goes forward instead.  The check is correct, so it's possible to go off
+the end of the buffer.
+            N/pattern/ would be useful, but is not allowed.
+N/pattern/ resets the window size (silly but true) to N.
+            ND would be a natural synonym for dN$, by analogy with NC for cN$,
+       but it doesn't work that way; it just ignores the N.
+            Finally, if N is precisely the number of lines
+       from the current line to the end of the file,  N$  will still correctly
+       carry one to the last character of the file, but cN$, NC, dN$ and yN$
+       refuse to do anything!  (NY does work, not being a synonym for yN$.)
+       The failure of NC is particularly annoying; often when I am composing
+       something, I go back to somewhere in the middle of the next-to-
+       last line, say, and want to rewrite the rest of the sentence;
+       2cc would kill not only the part I want to rewrite but also the OK
+       beginning of the line, and 2C or 2c$ won't work.  I realize that I
+       could get around this by keeping an empty line at the end of the file,
+       but that should not be necessary.
+While you're making valid observations here, are you aware that you can delete
+the current sentence with d} ?  I think that's what you really want.
+
+
+       PROBLEMS REGARDING SOURCE, MACROS, MAPPINGS
+            These are enormously useful, but seem to have all kinds of hidden
+       restrictions.
+
+            The Appendix to the Ex Reference Manual, "List of Changes from
+       Version 3.5 to Version 3.6" says ``A bug which prevented the source
+       command from working...from visual has been fixed''.  It is true that
+       one can now use  :so  from vi, but it still has a bug:  When
+       the scriptfile invoked contains a global command
+       and some other command(s) after it, everything after the first global
+       command is ignored.  The same appears to be true of scripts in named
+       buffers invoked from vi-bottom-line by  @x.
+Sounds like a bug.
+
+            (It is, perhaps, unexpected that one can invoke scripts with
+       multiline commands using @x from vi's bottom-line at all, since such
+       commands will not work if typed on vi's bottom line directly.
+       A script like
+               s/$/a\
+               b
+       invoked as @x will indeed work.  But strangely, if one tries to
+       invoke from the regular mode of vi the script
+               :s/$/a\
+               b
+       by putting it in buffer x and doing  @x, only the first line
+       will take effect.)
+In 3.7 (or 3.8, I'm not sure), you can say
+       :s/$/a^V^Mb
+to get a newline on the RHS.  Of course, this doesn't mean there isn't
+a bug in scripts.
+        
+            Another serious restriction is that the command ``vi'' appears to
+       be ignored in sourced ex-scripts, and though the command Q in macros of
+       various flavors in vi (mapped characters, map!ed characters that contain
+       ``...^V^[...Q...'';  @x scripts) does take one into ex, any ex
+       commands after it are ignored.
+The internals of getting a character from the tty are completely different
+in ex and vi.  Pushing input for one doesn't affect the other.  So there
+isn't much hope of changing this situation.
+        
+            I assume you are aware of whatever restrictions lead to the
+       error-message ``Cannot yank inside global/macro'', since you must
+       have written it, though ``inside'' seems to here have the peculiar
+       meaning ``after a text-changing operation of the macro.''
+            The error-message ``Can't undo in global commands'' is more
+       mysterious, since I get it when I have a global command after
+       a text-changing command in an @x script (though not in a sourced file).
+            Anyway, the fewer such restrictions these operations were subject
+       to, the more useful they would be!
+It's the way undo is done - the text for undo is saved in the "last deleted"
+buffer, and yank puts text there too.  Couple this with the fact that globals
+and macros can be undone as a unit (they save their state before the first change)
+and you'll see that the two notions can't coexist.  Of course, you can always
+yank into a named buffer, even inside a macro.
+
+            Although nested source commands are allowed (and I find them
+       useful), they leave the editor in a ``noprompt'' state.  This
+       can be gotten around by including ``se prompt'' as a line in the
+       outermost scriptfile, but I would hope the problem causing it could
+       be cured.
+Bug, I guess.
+
+            When one tries to ``:unmap!'' a ``:map!'' command whose
+       right-hand-side begins with ^H (entered as ^V^H, of course), one
+       gets the message ``That macro wasn't mapped''.  (One can get around
+       this by using :unmap! ^V[character].)
+Bug, I guess.
+
+            Certain termcaps apparently produce automatic mappings, which
+       unfortunately may interfere with useful vi commands.  In particular,
+       on a tvi, ^L gets mapped to a movement command, which makes it
+       unavailable for redrawing the screen, unless unmapped.
+Well, there's no way for vi to tell the difference between ^L that the
+user typed as ^L and ^L that the user typed as right arrow.  However, there
+are a number of terminals that are upward compatible with the adm3a and use
+^L for right arrow.  Vi has a special case for these built in - if the
+terminal has insert/delete line, and ^L is right arrow, then ^R will redraw
+the screen.
+
+
+       PROBLEMS WITH DIAGNOSTICS
+
+       "Hit return to continue" -- It took me a long time to realize that
+       when I got this diagnostic there was an alternative to hitting
+       return.  I suggest it be reworded
+               "Hit Return or :"
+       However, the behavior of the editor when this diagnostic is given
+       seems to be inconsistent.  In particular, when the last of a serious
+       of commands is
+               :e otherfile
+       and I get "Hit return to continue", then hitting : usually
+       has no different effect from hitting return (or any other
+       key), namely the screen is redrawn; yet I think that sometimes
+       in this situation it has brought me directly to the bottom line
+       as desired.  Very confusing.
+            Would it be possible to have other alternatives than : and return
+       available, such as /pattern ?  Or, more simply, when one would presently
+       be given the diagnostic "Hit return to continue", why not just put the
+       editor into the state it would have if one then hit :, since one would
+       then still have the option of hitting return and getting into vi
+       proper, but it would not require the extra keystroke : to
+       begin a bottom-line command, nor would one go through the frequent
+       frustrating experience of absentmindedly starting to write a
+       bottom-line command, or a pattern-search, and then having to wait
+       while the screen was redrawn because one had hit a key other than :.
+There is an internal difference between "ex mode" (where it doesn't keep a
+screen image) and "vi mode" (where it does).  Any : command that outputs more
+than 1 line puts you into "ex mode", requiring "hit return to continue"
+before clearing the screen and redrawing it with known stuff.  There is no
+hope of this changing - the code is too spaghetti-ized already.  In the worst
+case, the ! command scribbles on the screen and there's nothing vi can do
+to know what the command did.
+
+What you really want is for vi to check for typeahead and avert the refresh
+when it's going to have to redo it anyway.  My curses does this, but I simply
+don't have time to rewrite vi to use it.  This would also solve the other
+problem you mention where macros ought to redraw the screen only once.
+If you saw the insides of the code, you'd see it needs a rewrite to do this.
+Each command knows the screen things to do to fix the screen.
+
+What most of us do is hit DEL when the screen is being drawn with something
+we don't want to see.  This aborts the update and leaves junk on the screen.
+Then you move the cursor where you want it, and if the screen is still
+garbaged, hit ^L.  Ugly but effective.
+
+       "Using open mode"
+       Again, it took me a long time to learn that when I tried to enter
+       vi and got this diagnostic, it meant that the system had somehow
+       lost the termcap for the terminal I was on, and that I would have
+       to do something to get the correct termcap into the environment.
+       Till I realized this, I generally ended up either struggling along
+       frustrated in open mode, or logging out and logging back in.  I suggest
+       that when someone calls for vi and the termcap is not appropriate,
+       the editor should not be invoked in any form, but instead, a message
+       be given such as:
+            ``Your environment does not show a termcap entry permitting
+       the use of the visual editor.  If you are working on a terminal not
+       supporting vi (in particular, a device with no addressable cursor),
+       you may enter one of the other modes of the editor with the command
+       "open filename" or "ex filename".  If you are working on a terminal
+       that should support vi, your environment entries are incorrect and
+       should be corrected.  They presently show:
+            TERM=....
+            TERMCAP=....
+       If you know the correct name or abbreviation for your terminal-
+       type, type it at the end of the next line; if not hit return:
+            % setenv TERM ''
+            If the user typed an acceptable terminal-name, the message would
+       continue, telling how to get the appropriate termcap.  If the user
+       instead typed return, the message would ask him or her to type the
+       name of the manufacturer shown on the terminal, not
+       worrying about upper/lower-case distinctions, and a list of possible
+       terminal names and abbreviations would be given... .  This whole
+       program would not be part of the editor, so there would
+       be no problem of space within the existing crowded confines of
+       the editor code.
+This, of course, doesn't belong in vi, but in login or tset.  In fact,
+tset is much friendlier these days.  Vi will print a better diagnostic
+if it knows you're on a "generic" terminal type such as "dialup" - in
+terminfo there's a capability to indicate this, so it can print
+       I don't know what kind of terminal you have - all I have is "patchboard"
+3.7 can't do this because it can't tell the difference between a generic
+terminal and a hardcopy terminal.
+
+       "No such file or directory" -- I think there should be a distinction
+       between these two cases, because of the important distinction in the
+       consequences when the user tries to quit the editor:
+The kernel doesn't distinguish, so it's hard for vi to.  This is just a perror
+string.
+       If the directory exists, the file is created, but
+       if not, the results are more complicated -- I seem to recall on one
+       occasion simply losing what I had written on my second try
+       at quitting; though I just now did an experiment and this time
+       repeated ZZ's and :x's simply gave repeated error messages.
+Well, if it can't be reproduced, it doesn't stand much chance of getting fixed.
+(Not that it would if you could reproduce it, of course.)
+
+       "File already exists..." -- The ``List of changes from 3.5 to 3.6'' says
+       ``If you get I/O errors, the file is considered "not edited"... .''
+       I presume that this correction is somehow the cause of the fact that
+       I frequently get the above message when trying to leave the editor
+       on a machine with version 3.7, and have to use
+             :w! %|q
+Ick!  Most of us just type
+       :wq!
+which is equivalent and much shorter.
+       to exit.  But I've never seen any evidence that there were I/O errors;
+       it mainly seems to happen when I've written some lines to another
+       file in the process of editing.  So the criteria the editor is using
+       to decide when there have been ``I/O errors'' should be rechecked.
+Actually, if you get ANY error (e.g. :foo<cr>) it resets the "buffer modified"
+condition.  I have finally been convinced this is not right.  For a while, I
+considered it a necessary evil in case your /tmp/Ex* file got an I/O error.
+
+       "no such command from open/visual" -- This confused me in my first
+       few days of using the editor, when I didn't understand that one
+       couldn't use i and a (in either their vi or ex senses) from the bottom
+       line of vi.  A message "i -- no such command from open/visual"
+       was perplexing because I knew that "i" was indeed a vi command.
+       Perhaps it should say  "no such command from open/visual bottom line".
+OK.
+
+       MISCELLANEOUS PROBLEMS
+
+            In ex search and replacement patterns, \\ is supposed to represent
+       a real \-character, but something goes wrong when this occurs
+       at the end of a global command.  E.g., though
+            :s/^/\\
+       works OK (in vi or ex), the variant
+            :.g/^/s//\\
+       definitely does not.  In vi it turns everything off, in ex it seems to
+       behave as though there were just a single \, and in a scriptfile,
+       it -- does something still different, which you can discover if you
+       don't know!
+Backslash is special at the end of a line in global.  You need more \\'s.
+
+       The Ex Reference Manual says, ``For sanity with use from within
+       visual mode, ex ignores a ":" preceding any command.''  But it
+       ignores it in the wrong place! -- not at the beginning of the
+       command line, but just before the command letter itself.  I.e.,
+       it accepts 1,3:s/^/     /, but not :1,3s/^/    /.
+Hmm.
+
+       SUGGESTIONS FOR MINOR ADDED CAPABILITIES
+
+          In a multiline substitute command with the "c" option, when
+       each line is displayed one has three choices: y, n or break.  There
+       are some further options that would be useful.  One would be "p" --
+       at present, "p" can only be included on the command line, which
+       means that one has a choice between seeing the result of every
+       substitution or none.  In practice, one would generally like to see
+       the results of the first few cases to make sure that the command one has
+       written does what one meant it to, and maybe a few tricky cases that
+       come up; but not every case!   Another might be "u" -- to undo the last
+       case for which one gave a "y".  Still another might be an option that
+       would mean ``undo the "c" option -- I see that the substitute command
+       is doing what I wanted, go ahead and finish it without me.''
+If I were going to do something this involved (I didn't know anybody used the
+c option anymore - most people use "n" and "." in vi) I would do query-replace
+ala EMACS right.
+           In a command  g/pattern/p,  the pattern in question is occasionally
+       such that it takes a while to figure out where on the line it occurs.
+       For this purpose, an option that ``pointed out'' the instance of the
+       pattern, in the same manner that the pattern to be replaced is pointed
+       out in substitute command with option c, would be desirable.
+           When  g/pattern/p  gives more than a screenful of lines, it would
+       be nice to have it piped through the equivalent of ``more''.
+Nice but unlikely.  Unless, of course, you have page mode in your tty driver,
+like we do, in which case you get it for free.
+
+           ex has the command line option "-", which ``is useful in processing
+       editor scripts''.  But if one wants to use a script in the course of
+       an otherwise interactive editing session, it would be desirable to have
+       a corresponding resettable option ``:se -'' (or ``:se nofb'').
+Seems like a good idea.
+
+            In strings in pattern-searches, it would be useful to have
+       ^ and $ retain their ``magic'', so that /x[a$]/ could
+       search for all occurrences of  x  before an  a  or a newline.
+       (Of course, one would then have to decide whether  /x[^y]/ should
+       include the case of  x  followed by a newline or not.)
+This sounds pretty hard to do.
+
+           Just as ex allows the command :vi, so I think that vi should
+       have some bottom-line command equivalent to the regular-mode
+       command  Q.  When one has done some text-changing bottom-line
+       commands, and realizes one wants to go into ex, it can be time-
+       consuming to hit return and then Q, and wait for the screen to be
+       redrawn for vi before one gets the ex prompt.
+This would be ugly, since the ex command routine would have to return an
+indication to the vi routine to exit back to the top level ex command.
+But I suppose it could be done.
+
+            The option of putting several commands on one line, separated
+       by, "|" is particularly useful in the vi bottom-line mode, because
+       it avoids having the screen redrawn several times.  It would be
+       useful to be able sometimes do the same thing with non-bottom-line
+       commands, e.g. in editing a troff file at a low baud rate on a dumb
+       terminal one might like to be able to do  i\fI^]3Ea\fR^]  without
+       watching the line get redrawn twice.  Perhaps some key that would
+       cause any sequence of commands to be ``held'' until some complementary
+       key was hit would be useful.
+            It would also be desirable to have a sequence of commands that had
+       been given in this way available as one unit to be repeated by ``.'',
+       if desired.
+See above.  And get yourself a terminal with insert/delete char!
+
+            The parenthesis-matching facility with % might be extended
+       to match ` with ' and <  with  >.
+OK.
+
+            I will mention one facility that I discovered by surprize is
+       possessed by  ed  but not  ex  --  sequences such as  \1  can be used
+       within  ed  search-patterns.  E.g. (for the most trivial case)
+            /\(.\)\1/
+       will search for doubled letters.
+This surprises me.
+
+
+       DEBATABLE SUGGESTIONS
+            I will mention here some possible changes which have the
+       difficulty that they would change the meaning of existing commands,
+       so that it could be argued that the disadvantage of users having
+       to change their habits might outweigh the advantages.
+
+            First, one might try to resolve, one way or another, the
+       contradiction between the count arguments taken by the join commands
+       in  vi and  ex:  In ex, jN joins N+1 lines; in vi, NJ joins N lines
+       (except if N=1).
+Yeah, ex should be N, not N+1.
+
+            Second, the movement commands  tx  and  Tx  of vi (x any character)
+       seem poorly defined.  Just as fx will ignore the character on which
+       the cursor is presently sitting, even if it is an  x,  and move to the
+       next occurrence, so I would think that  tx  should ignore the character
+       immediately after the cursor, and  Tx  the character immediately before
+       the cursor.  The point is that when one does  Nfx,  and finds that one
+       had failed to count one occurrence of  x  and fallen short of where one
+       wanted to go, one can hit  ;  and get there.  Likewise, on doing  Ntx
+       and finding one has fallen short, one should be able to hit  ;  and get
+       to the the next occurrence; but at present, hitting  ;  leaves
+       the cursor in the same position; one must hit  ``2;''  to get any
+       further.  In effect,  Ntx  is presently defined as  Nfxh;  I am
+       suggesting that it be defined as  lNfxh.
+Agreed.
+
+            The sequences  cw, dw  and  yw  are presently violations of the
+       principle that  c[movement],  d[movement]  and  y[movement]  change,
+       delete, or yank everything from the current cursor position through
+       the endpoint of the movement command.  cw does what one would expect of
+       ce (in fact, they seem to be synonyms), while there is no way to get
+       the effect which  cw  would have if it were treated ``consistently''.
+       (E.g., if I have a line beginning  ``And if'', and I want to change it
+       to ``If'', I cannot just put the cursor on the A and hit  cwI^].)  dw
+       and  yw  delete up to the character immediately before the point to
+       which ``w'' would take the cursor.  I would have to agree that this
+       behavior of dw and  yw  is more useful than that which a literal
+       interpretation of the movement rule would lead to; but perhaps it
+       would become still more useful if when applied to the last word on
+       a line, it deleted or yanked the space immediately before the word
+       along with the word... .  On the other hand, one could argue for
+       making a distinction between  cw  and  ce.
+This is to make the user interface friendlier, and is a fact of life.
+If I wanted to change "And if" to "If", I'd type "dw~".
+
+            Though I see the motivation for the above definitions,
+       I see no sensible reason why  Y  should be equivalent to  yy,  when
+       C  and  D  are equivalent to  c$  and  d$.  I would vote for changing
+       Y  to mean  y$.  
+The users wouldn't stand for such a change.  Too many are used to it like it is.
+But you could always map it.
+
+       RADICAL SUGGESTIONS
+
+            Is there any reason for maintaining the distinction between
+       the ``:'' state of vi, and  ex  itself?  At present, there are
+       relative advantages that lead one to choose to go into one or the
+       other for a given operation:  From the vi-: state, it is easier
+       to return to the regular vi state; from ex, one has a more powerful
+       range of commands; and it is easier to give a series of commands
+       because each carriage-return gives one a new prompt.  My suggestion
+       is that from vi, ``:'' should carry you directly to ex, and when you
+       are in ex, carriage-return (^M) after a command should give you a new
+       prompt, while ^] should put you into vi.  Conceivably, things might be
+       simplified even further, and carriage return rather than : could
+       be the key that would carry one from the regular mode of vi into ex:
+The basic problem here is that if : put you into ex mode, you'd have to redraw
+the screen when you hit return.  The motivation for : commands is that you
+don't have to go through a conceptually hard mode change and wait for a
+screen redraw.
+
+                                .-------.      .-------.
+               .-------. a,i... | basic |  ^M  |       |
+               |  vi   |<------ |       |----->|  ex   |<---.
+               | insert|        |   vi  |      |       |    |^M
+               |  mode | ------>|       |<-----| mode  | ---'
+               `-------'  ^]    |  mode |   ^] |       |
+                                `-------'      `-------'
+
+       (Of course, ^M presently has a meaning in vi, but
+       it has a synonym +.)  Clearly, there would also be no need for a
+       special "Hit return to continue" state.
+            I have not distinguished vi and open in the above diagram.
+       My idea here is that ^] would actually return you to either vi
+       or open, whichever you had last been in, and that to switch
+       to the other, you could enter ex and type vi^] or o^] respectively.
+       (Or you could type  vi^M, respectively o^M, and further ex commands,
+       and the mode would be saved for the next time you hit a ^].)  Or
+       alternatively, these could be made settable options: se visual
+       respectively se novisual.
+            Having gotten used to the editor as it now exists, I admit that
+       I feel uneasy about the above idea -- the sense of knowing that
+       I am ``still in vi'' when I hit :, and not that ``other land'' of ex, 
+       represents a kind of of orientation that it is disconcerting
+       to abandon.  But I can't see any logical disadvantage in making
+       such a change.  Can you?  Certainly, there would be things that
+       would have to be thought out, such as what happens to bottom-line
+       vi pattern-searches.  My thought would be that ``/'' from vi should
+       give :/ (i.e., put one in ex at the start of a pattern-search),
+       and ^] after a pattern-search should put one into vi at the appropriate
+       character on the line, in contrast to ^M after a pattern search,
+       which would leave one in ex at the appropriate line.  In general,
+       I think such changes would lead to greater simplicity and learnability
+       of the editor.
+            I would also hope that excursions between vi and ex and back
+       could be allowed in scriptfiles.  It might also be desirable for
+       ex to have, in addition to a concept of ``current line'', one of
+       ``current cursor position''... .
+
+            Well, on to another subject.  One of the inconveniences I
+       found very vexing when first learning to use the editor was that
+       when in either vi insert mode, or ex/vi-bottom-line, it was very hard
+       to edit what I was doing.  Within insert mode the only ``editing''
+       I could do, without escaping, was with the three operations ^H,
+       ^W and the kill character.  And on a slow line with a dumb terminal,
+       escaping to make changes could be very time-consuming because large
+       parts of the screen would insist on being redrawn.  Perhaps some
+       other control-character could serve as
+       a modified escape, that allowed one to edit what one had entered
+       in the current insertion without having everything below it redrawn,
+       and then return to it.  Obviously, if carried to its logical
+       limit this idea could lead to ridiculous nests of
+       editing operations; but there would be no need to carry it to its
+       logical limit.
+Why not just get a terminal with insert char?  You're paying in performance
+for having an obsolete terminal.
+            Anyway, the problem of editing ex-style commands
+       was even worse, because there was no way to ``escape and
+       revise''.  I eventually learned enough to realize that the solution
+       was to edit complicated commands in another file and source it.
+This is a standard complaint about a moded editor.  It couldn't be fixed
+without taking away the property of ESC ending command lines.  Besides,
+allowing editing on the bottom line would really break a lot of code.
+       But it is sometimes very useful to have the text on which the
+       commands are to act in front of you when composing them (e.g., you can
+       yank and modify various pieces), which led to the variant of writing
+       command lines within the file I was editing, and then writing
+       those lines into another file and sourcing that, without ever leaving
+       the current file.  But this is distracting to deal with
+       when concentrating on the editing task itself, which led me
+       to divise a scriptfile which would handle the writing-to-another-file-
+       and-sourcing for me.  Or actually, several such files:  One for
+       single-line commands to be used essentially once; one for single-line
+       commands that I would want to use on the same file during various
+       editing sessions, and so would want to keep available in that
+       file, and one for multi-line commands (to be used once).  When
+       I first got the idea, I thought one scriptfile would be enough, and
+       I would call it ``do'', so that the command to execute a script I
+       had written in a file I was editing would be ``:so do''.  The
+       file it would write to and source would be ``do.again'', so that
+       if I wanted to reuse it, I could ``:so do.again''.  When I realized
+       the need for several versions, ``do'' became a directory.  Here,
+       for your amusement, are the three files.  (Re the lines ``se prompt'',
+       cf. my comment on that under PROBLEMS WITH SOURCE etc.):
+
+         do/1  (for 1-time use of 1-line commands)
+               .w! ~/do/again
+               d
+               so #
+               se prompt
+
+         do/1+  (like above, without deleting the command)
+               .w! ~/do/again
+               so #
+               se prompt
+
+         do/:  (to use this, write a multi-line command script, put : at
+         the beginning of the first line, put the cursor on the last
+         line of the script, and then source the following:)
+               ?^:?s/:/
+               ,''w! ~/do/again
+               ,''d
+               so #
+               se prompt
+
+       (I also created another version to use in case the script had
+       to have an internal line beginning with ``:'', so that this couldn't
+       unambiguously mark the beginning of the script.  This used
+       a line which explicitly specified the address-range of the script.
+       But I have never had a need for it, so I will not bother you with it.)
+           Finally, having gotten an account on a machine with a version 3
+       editor recently, I have divised still another way of doing this.  I
+       have put in my EXINIT the command
+
+               'map ^A "ayy:@a^M'
+
+       and now, gratifyingly, the single stroke ^A has essentially the effect
+       of ``:so do/1+''  -- except for the restrictions to which vi ``map''
+       commands are subject.  But I've only been using this for a
+       couple of weeks; so I have yet to learn how chafing those restrictions
+       will or won't be.
+            Anyway, it might be worth thinking about whether some of these
+       things that I've done with macros should be incorporated in some form
+       into the editor itself; or else whether these macros might be written
+       up in the documentation (or some tutorials) on the editor.
+
+            Next subject: Complicated pattern-searches in long files
+       can be time-consuming.  I have seen the point mentioned
+       that if a pattern-description can be begun with "^",
+       this can speed up the search -- since the pattern-comparisons need
+       only be begun at beginnings of lines.  In some cases, this might
+       not be possible, but the user might be aware of some other
+       character or character-sequence in the search-pattern
+       that will occur relatively rarely in the file.  In such cases it would
+       be desirable if the user could specify one spot from which the pattern
+       search should start, working forward and backward from there, to
+       minimize false starts.  E.g., if for some reason one wants to
+       delete every word containing the letter m, the script
+               %s/[^ ]*m[^ ]*//
+       would become much less time-consuming if one could mark the point
+       at which to begin, say writing
+               %s/[^ ]*\!m[^ ]*//
+       so as to instruct the editor to search for m's, and each time
+       one was found, to find the longest possible strings of non-space
+       characters before and after it, and delete these.   (This is a silly
+       example, but I think the idea is clear.)
+Isn't worth doing - this is fast enough for most people in most cases.
+
+            Something that I've seriously felt the need for is the
+       capability of searching for lines that satisfy more than one
+       condition.  If one just wants to locate such lines, one can
+       of course leave the editor and do a pipeline of two or
+       more greps; but it would be nice to be able to perform global
+       commands on such lines.
+You want the PWB "or" operator.  This is hard to put in - their code
+is really convoluted.
+
+           Finally, any possibility of introducing the capability of searching
+       for patterns including embedded newlines, a la sed?
+Newlines aren't stored - the data structure is an array of lines.
+So this is nearly impossible.
+       Multiple windows, a la emacs?
+Would be easy after a rewrite, but impossible with current code.
+What you really want is a window manager, anyway, most of the time.
+
+       ADDENDA
+            I logged in this morning on an adm3a at 300 baud to go over this
+       letter once more before sending it, and ran into another bug!  I had
+       done 15^D to get a large scroll despite the low speed, and at one point
+       I saw a line with a typo scrolling up.  So I noted its line-number, 402
+       and without waiting for the screen to stop moving typed something like
+       402Gfsrd.  What happened was that the change was made on line 407 rather
+       than 402 -- presumably the cursor was sent to where 402 had been when
+       the command was received... .
+Knowing the internals of vi, I'd say this is impossible.  It probably just
+screwed up your screen from line noise (or your terminal isn't truly full
+duplex), or you got the wrong line number.
+            Editing this letter this morning reminded me of another feature I
+       have thought would be desirable for editing on dumb terminals at low
+       speeds:  An option that would cause lines read from a file or typed
+       in at the bottom of the screen to appear double spaced, with @ signs
+       @
+       between them, such as one gets when one deletes a line on such a
+       @
+       terminal.  (I have faked this effect here, though the fake will not be
+       @
+       very successful if you have  se nu  or  se list  on.)  The point is that
+       @
+       editing operations that presently cause painfully slow screen-redrawings
+       would simply put material in in place of these fillers -- as happens
+       now when one is lucky enough to be adding material just above a place
+       where material was previously deleted.
+Again, it would cost less to buy a real terminal.  You can get one for $500
+or so now from Falco or Liberty or Zenith.
+
+Thanks again for the input.
+
+       Mark
+
+
+From gbergman@UCBCARTAN Fri Jul 29 16:07:10 1983
+Date: 29 Jul 83 16:02:06 PDT (Fri)
+From: gbergman@UCBCARTAN (George Mark Bergman)
+Subject: editor
+Message-Id: <8307292302.AA09635@UCBCARTAN.ARPA>
+Received: by UCBCARTAN.ARPA (3.342/3.7)
+       id AA09635; 29 Jul 83 16:02:06 PDT (Fri)
+Received: from UCBCARTAN.ARPA by UCBERNIE.ARPA (3.336/3.7)
+       id AA06658; 29 Jul 83 16:07:04 PDT (Fri)
+To: cc-03@ucbcory, danh@kim, lindahl@topaz, mckusick@ernie, ralph@ucbarpa
+Status: RO
+
+29/7/83
+    I got a reply from Horton: a copy of my (first) letter,
+annotated with comments that this should indeed be fixed, that
+would be impossible, etc..  I'll send a copy to anyone who'd
+like (or a copy of his comment on some specific bug they're
+interested in).  Meanwhile, I'll send you my reply to him, since
+it discusses still more bugs and possible improvements.
+
+Dear Mark,
+     Got your comments on my first letter!  Did you get the second,
+shorter one?  Glad to see that some things, at least, can be fixed.
+     Robert has put version 3.9 on this machine and I'm using it.
+Using movement arrows within insert mode is amusing; though when there
+is documentation, there should be a warning to the user that these
+prevent ``u'' from undoing anything before those commands.  But
+the first thing there needs to be documentation for is vedit!  Is
+any being written?
+     In your comment on ``Can't yank inside global/macro'' you said
+that one can, of course, always yank to a named buffer.  I checked,
+in the case of @a scripts, and the answer is yes and no:  The yank
+works, but one still gets that diagnostic, and anything else in the
+sequence of commands is aborted.
+     And concerning the diagnostic ``Can't undo in global commands'' --
+I understand what you say about why one can't, but it still seems an
+unenlightening and perhaps inappropriate diagnostic to get when one has
+done  @a  and buffer  a  contains say
+       x:g/foo/s//bar
+Here the initial ``x'', deleting the character the cursor was on when
+the command was given, creates the text-modified condition which,
+as I mention, seems to cause globals in @-scripts to give this
+diagnostic.  I've just tested the above script -- several times,
+because I found it hard to believe what was happening -- and it did
+indeed give the diagnostic in question, but instead of replacing foo's
+with bar's, it replaced the first line containing a foo with a copy of
+the last line of the file! I leave it to you to figure that one out!
+(This is on version 3.9.  Incidentally, I've used a true ^M in that
+script, so it is ready for you to try.)
+
+     Further observations on some of the bugs I mentioned in my
+second letter:  The business with  yb  is both more general and more
+complicated than I realized.  The general fact seems to be that when
+one does a yank to a position earlier on the same line, the cursor does
+not move, but the editor thinks it has, so that any subsequent command,
+e.g. a movement, a delete, etc., has the effect that it would if it had
+been done with the cursor starting from the new position.  The
+complication is that yanks to named buffers don't behave the same as
+simple yanks: They also leave the cursor unmoved, but what they actually
+yank into the buffer is the text from the cursor location to the end of
+the line; and whether they cause the editor to consider the cursor to
+be in a different location from where it really is seems to depend on
+the movement in question:  with "ayNb, no, with "ayN|, yes (where N
+again stands for a positive integer).  So what I called a snake in the
+grass seems to be a can of worms!
+     In experimenting with this, incidentally, I've found that, while a
+put from a named buffer can be undone with u, if one attempts the
+command U, ``undo all changes made since coming onto this line'', only
+changes made since the last named-buffer-put are undone.
+     I mentioned various abbreviations that were hard to unabbreviate,
+but could be done with the help of ^V -- but that I had found no way
+to undo
+       :ab if if\pq
+To be precise, I had found that  :una ^Vif,  :una ^V^Vif,  and
+:una    ^Vif  where each ^V represents two ^V's typed in, didn't work.
+I've finally found something that does:  :una i^Vf.
+
+     I find the diagnostic ``No tail recursion'' strange,
+since the occurrence of an abbreviation at the end of the item
+abbreviated shouldn't cause a recursive loop; while circumstances that
+do cause such a loop, namely the occurrence of the abbreviation within
+the item abbreviated, preceded by a space and followed by punctuation,
+are not censored, e.g. :ab x ( x ), or with more subtle effect,
+:ab x x sup 2.
+     It seems that if one has :ab x word,  then the abbreviation works
+when x is preceded by a beginning-of-insert, a space, a tab, or a
+newline, and followed by most any nonalphabetic character.  For
+word-processing use, it would be natural to allow it to also be
+preceeded by (, ", `, [, perhaps even a user-specified set of
+characters.
+
+     To my list of vi commands which I think should be able to take
+counts, add p and P.  I often want to put in a large number of copies of
+one or more lines, as ``forms'' in which I will enter various kinds of
+additional data, and it would be convenient to be able to do compose
+such a line and then duplicate it the desired number of times all at
+once.  What I currently do is produce a copy and then go
+yypk2yypk4yyp... till I have enough.
+
+     Two more commands I think would be useful:  (1) One which "puts" to
+the screen (in the sense of g/pattern/p, i.e. without affecting the
+buffer) the contents, or the first lines in cases that are longer than
+one line, of all nonempty buffers, named or numbered, with an
+indication, of course, of which each was.  (Ideally one would like to
+be able to specify some subset of the buffers, whether one wants the
+first line, or everything, or some specified number of lines, etc..) 
+(2) One which would show the script of the command stored to be used as
+``.''.  (And perhaps ditto with the last search pattern.)
+     Oh, yes: it would also be nice to have a way to give commands
+without having them displace the one specified to be repeated by ``.'',
+e.g. if one wants to do a certain change time after time at various
+points in the file (using ``n'' and ``.'') but occasionally sees other
+changes to be made along the way.  An alternative to the above would be
+a way to read the command stored to be used as ``.'' into a named
+buffer, so that one can give other commands and then return to
+that one.  This would also allow one to reread the text of the command:
+useful if it isn't behaving as one meant it to.
+     
+     You might as well send any future mail to me here as
+gbergman@cartan -- I was using brahms while cartan's terminals were
+being moved but I'll probably be using cartan more from now on.  But
+I'll check mail on both.  (However, I'll be on vacation in New York
+State from the 3d to the 16th of August.)
+                                               Best regards,
+                                               George
+
+From gbergman@ucbcartan Fri Sep 23 13:57:06 1983
+Date: Fri, 23 Sep 83 13:53:36 PDT
+From: gbergman@ucbcartan (George Mark Bergman)
+Message-Id: <8309232053.AA02960@ucbcartan.ARPA>
+Received: by ucbcartan.ARPA (4.6/3.7)
+       id AA02960; Fri, 23 Sep 83 13:53:36 PDT
+Received: from ucbcartan.ARPA by UCBERNIE.ARPA (3.336/3.7)
+       id AA20684; 23 Sep 83 13:57:01 PDT (Fri)
+To: cc-03@ucbcory, danh@kim, lindahl@topaz, mckusick@ucbernie, ralph@ucbarpa
+Status: RO
+
+Latest letter on ex~vi to Horton:
+
+Dear Mark,
+
+     I hope I can assume that after my long letter to which you
+replied, you did get my two shorter notes (one sent the same day,
+the other about a week later); and that you've simply been to busy
+to think about them or reply.
+     However, since I have had bad experiences with Mail, I am worried
+that either you may never have gotten them or that you may have replied
+and your replies not reached me.  I hope you can send me a one-liner to
+relieve my doubts.
+
+     Not many bugs to report this time, but I will modify or discuss
+a few of the suggestions I've made before.
+
+     One that I want to modify is my suggestion that % should also
+match < with > and ` with '.  All right in itself, but terrible if it
+would also mean that with  :set match,  every time one typed a > or a '
+the cursor would look for the last occurrence of < or `, since <, >, and
+' can occur in ways that have nothing to do with matching.  So I think
+that making matchable pairs user-specifiable would be much more useful.
+Faith Fich (who send her regards -- she and Mike were our neighbors till
+a month ago, but have left for their new jobs at U. Seattle) suggested
+that user-settable matches would be particularly useful for those
+like herself who use distinct opening and closing delimiters with eqn.
+Actually, on further thought this isn't quite right, since eqn
+delimiters behave differently from parentheses -- if I want to use =
+as my delimiter to enter equation mode, and & as my delimiter to leave
+it, then eqn will not give any special treatment to &'s in text mode or
+='s in equation mode; so perhaps a different kind of matching for
+that kind of use might be desirable; one would set  :set dmatch =&
+for the delimiters suggested above; or :set dmatch $$  if one uses  $
+for both delimiters as in the eqn tutorials.  I know checkeq is
+supposed to serve this function; but it would certainly be convenient
+to have it in the editor; and anyway, my experience was that checkeq
+didn't understand that one could have distinct opening and closing
+delimiters.  (But this is a disinterested suggestion; I haven't used
+eqn for a long time; I put in my equations in raw troff.)
+
+     The suggestion in my long original letter about an alternative to
+the diagnostic "using open mode" was based on a misunderstanding -- but
+one that might be worth making a reality.  I had been assuming,
+since tutorials referred to the "three states" ex, vi, and open, and
+since I knew one could enter the editor by typing  % ex filename or
+% vi filename, that a third way to enter the editor was by typing
+% open filename, and that this is what one should do when editing
+with a device not having an addressable cursor (which I had never done).
+So I supposed that the diagnostic "using open mode" would only be
+received if one were trying to use the wrong mode of the editor for the
+tty type shown in  one's environment.  Perhaps one should indeed have
+special way to enter the editor when one intended to edit in "open
+mode".  (If "open" has other uses as a command, the command might be
+"vo" or "op".)  Then if a user gave the command vi and his
+environment did not indicate a device with an addressable cursor, it
+would indeed be appropriate to give a diagnostic informing him that his
+environment was not compatible with this command.  I suggest this
+because of the frustrating experiences I had as a beginner, of
+being put into open mode (because my tty type had somehow been lost)
+and not knowing what I could do about it.
+
+     I am somewhat confused by your explanation that editor scripts
+that would go back and forth between ex and vi modes (using the :vi
+and Q commands) are impossible because "The internals of getting a
+character from the tty are completely different in ex and vi.  Pushing
+input for one doesn't affect the other."  A vi "script" (i.e. a mapping
+or a macro called by @x) can presently include bottom-line commands
+called with ":".  I would suppose that the way such commands get
+characters from the terminal is about the same as the way ex does.
+You also write that "Any : command that outputs more than 1 line puts
+you into "ex mode"," -- is this a different sense of "ex mode"?  If
+not, what happens when a vi script does this?
+     I mentioned that the :so command from vi ignored anything after
+any global command in the sourced file.  I also find that it will not
+accept the ex commands i and a; I realize that a prohibition against
+these is part of the way vi's bottom line differs from genuine ex.
+I've just done some experimenting, and I find that a script sourced
+from the bottom line of vi also interprets the command vi as a command
+to edit another file.  Do we really want script files to be interpreted
+so differently when sourced from ex mode and from the bottom line of vi?
+Or if these differences are inevitable, can't the vi version at least
+have the positive difference of being able to go to visual mode with
+^M^M or something, and continue following the script, interpreting
+characters as screen mode commands, just as a mapping or @x macro will
+if it has gone down to the bottom line with ":" and come back again?
+     I am also still reluctant to give up the idea of a version of the
+editor in which there is no difference between the line-oriented mode
+and the bottom line of the visual mode.  Suppose you took the editor as
+it exists now, and modified it so that in visual mode, ":" was
+interpreted as "Q", and in ex mode, ^[ was interpreted as ^Mvi.  The one
+obvious disadvantage would be that it would insist on redrawing the
+screen after minor editing operations in ex mode.  So suppose you made
+it remember the previous state of the screen every time it entered ex
+mode, and make the necessary adjustments on return to visual mode if the
+editing done was fairly trivial -- using the same criteria it now uses
+after bottom-line commands.  What would be the problem?
+     Of course, I know I am quite ignorant of what is involved, and what
+I am suggesting as possible may be quite impossible, or may have to wait
+for that far-off day when you rewrite the editor.
+
+     You write that some of the restrictions on global commands are due
+to the fact that the state of the buffer before the command is stored in
+the "last deleted" buffer.  But couldn't this situation be modified?
+Let's call the "last deleted" buffer buffer 0, since material from it
+seems to progress up to 1, 2, etc. with successive changes made.
+Suppose things were set up so that during the operation of a global or
+macro, deleted material, yanked material, etc. went by default into
+buffer 1 instead of 0...?  Or alternatively, that the state before the
+global were saved in buffer 9, and this was then set outside of the
+chain of buffers into which material got pushed with successive
+deletions, during the operation of the global?  Would this eliminate
+the objection to nested globals as well?  Presumably, in a global within
+a global, the previous state would be stored in buffer 1, and new yanks
+put by default in buffer 2 (if the first of the above suggestions were
+followed).
+     You mention in your comments to my letter that the difficulty of
+editing command lines "is a standard complaint about a moded editor"
+that would be hard to fix.  But I point out in that same letter how
+appropriate macros or script-files can overcome that difficulty.  (My
+files "do/1", "do/:" and the "map ^A ..." in my EXINIT.)  It should be
+possible to introduce commands that would have the
+same effects as those macros.  (Or at least, to describe such macros
+in the documentation.  I have realized, by the way, that ^A was a poor
+choice of character for me to map, because it occurs in the output of
+function keys on a lot of terminals.)
+
+     It would be nice to extend the kinds of "regular expressions"
+allowed in searches, e.g. a la egrep.  Sometimes I also want to indicate
+something like "a substring of precisely 40 characters".  This can be
+rendered as "........................................" at present,
+but things like that can easily lead to commands that
+exceed length limits.  (Suppose one wants to look for a string of
+40 successive characters other than whitespace.  [^ ][^ ][^ ] ... is
+too long.)  Have you checked out what I mentioned in my first long
+letter, that ed allows you to search for (e.g.) successive
+identical characters as \(.\)\1?
+
+     Let me pass on a suggestion made recently in a system message by
+someone named nye.  He was worried about what would happen
+if while one person was editing a file, someone else with write
+permission for that file also began editing it.  Presumably, whoever
+did a "write" last would overwrite the other person's work.  He
+suggested that there be a diagnostic "file has been changed since last
+write" for such a situation.  (In particular, he wondered what would
+happen if he got his mail by editing /usr/spool/mail/name, rather than
+by using Mail -- which is certainly tempting if one is more comfortable
+with the editor than with Mail -- and if unbeknownst to him new mail
+arrived while he was editing.)
+
+     I have discovered the hard way that when one has done a
+vi -r filename  and decided one was satisfied with the version that
+was saved, ZZ or :x are  n o t  the same as  :wq  -- the first two
+discard the saved file, and only the last one writes it over the
+previous version.  (I actually haven't checked this out on version 3.9.
+I tried to, and found that robert hadn't brought
+/usr/lib/ex3.9{preserve,recover}, if that's what they're still
+called, from arpa along with the rest of 3.9.  But he's getting them for
+me.)  If you don't want to make  ZZ  and  :x  actually equivalent to
+:wq, you might at least make them give error messages forcing the
+user to make the explicit choice of :wq to keep the saved version, or :q
+to discard it.
+
+     I've been having fun using recursive "map" commands from time to
+time.  For example, a file of mailing addresses of Math Departments is
+being prepared, for use with a new Computer Services command "label".
+This requires that each address constitute one line of the file, with
+the intended lines of each label separated by
+semicolons rather than newlines, each being no longer than 34
+characters.  At present, the lines in the file are of the form
+[university-name];[city-state-zip]
+and I wanted to find cases where the university name the secretaries
+had typed in was over 34 characters long.  So I did
+:map ^A +36^V|F;^A0
+Then, when I hit ^A, the cursor went bopping down the file, passing
+through each line at which it could find a ";" before the 36th position,
+but stopping when it hit a line where it could not.  When I had
+corrected such a line, by abbreviating a long word or whatever, I could
+hit ^A again and find the next case.  The "0" at the end of the map
+command is to prevent the "No tail recursion" rule from aborting my
+mapping.  It has no other effect, because it is never reached.
+     Of course, the above example of a recursive mapping is guaranteed
+to stop eventually, if only by reaching the end of the file.  But I find
+that mappings that can go on indefinitely are very hard to stop.  E.g.
+:map q ax^[q0
+I've tried some like that, and sometimes hitting <break> or whatever
+enough times successfully stops them (often leaving a bit of a mess --
+characters that ought to have come after the string of x's embedded
+among them), while other times the only thing I can do is to go to
+another terminal and kill the editing process.  Maybe it is to prevent
+things like that that you put in the "No tail recursion" rule --
+though clearly it can be gotten around.  Might it not be better to
+somehow make the editor not quite so deaf to <break>s during such a
+process?
+
+     I will mention one curious experience which I have not been able to
+reproduce.  I use :set nu.  After a delete near the beginning of a file,
+I found myself looking at a screen with line-numbers beginning around
+-2!  The lines with nonpositive numbers were blank, if I recall; lines
+1, 2, etc. were as they should be.  I mentioned this to someone
+who said he'd had the same thing had happened at times, but had
+never been able to figure out what conditions caused it.
+
+                                       Best regards,
+                                       George
+
+From gbergman@ucbcartan Thu Nov  3 22:32:01 1983
+Received: from ucbcartan.ARPA by ucbernie.ARPA (4.17/4.13)
+       id AA25163; Thu, 3 Nov 83 22:31:44 pst
+Date: Thu, 3 Nov 83 22:28:11 PST
+From: gbergman@ucbcartan (George Mark Bergman)
+Message-Id: <8311040628.AA06097@ucbcartan.ARPA>
+Received: by ucbcartan.ARPA (4.6/3.7)
+       id AA06097; Thu, 3 Nov 83 22:28:11 PST
+To: cc-03@BERKELEY, danh@kim, lindahl@topaz, mckusick@ucbernie, ralph@ucbarpa
+Status: R
+
+Latest letter to Mark Horton re editor bugs etc.:
+
+copies sent to
+cc-03@ucbcory
+ralph@ucbarpa, lindahl@topaz, mckusick@ucbernie 25/7/83
+danh@kim  26/7
+Mark Horton's reply: anderson@kim 30/7/83
+
+Dear Mark,
+     I got your reply to my last letter, but you don't say
+whether you got the two preceding ones -- in particular, I'm
+curious as to what you'd say about the peculiar behavior of
+abbreviations terminated by \[character].  (E.g., suppose
+someone did :ab ac artistic, and then, supposing the file was for
+troffing, typed ac\fP. -- Try it!)  And likewise, about what
+happens if you hit  @x,  when register  "x  contains
+       x:g/foo/s//bar
+(To see this wierd effect, you have to have a file with
+an occurrence of ``foo'', and a distinctive  l a s t  line.)
+
+     In an earlier letter I commented that the mapping that
+the editor sets up to enable the tvi's right-arrow key makes
+^L unavailable for refreshing the screen.  You replied that,
+of course, the editor could not distinguish a ^L generated by
+the arrow key from one typed as <ctrl>-L by the user.  True,
+but some users, such as myself, are quite happy using hjkl
+to move around the screen (I use them completely by reflex)
+and so have no wish to enable special arrow keys, but do
+want to have ^L available to redraw the screen when
+a message or something messes it up.
+     The problem with ^L occurred in using a tvi; now, using
+a Z29 (in h19 mode), another version of the problem arises.
+It has arrow keys that transmit things like ^]A, ^]B, etc.,
+and version 3.9 not only maps these sequences, but also
+map!s them.  What I found happening is that if in typing
+I made a change somewhere in the body of a line and then
+wanted to add something at the end of the line, I would often
+type a  ^]  to end the first change and then an  A  to
+begin the second, with less than a second between them, and
+this sequence would then be map!ed into  ^]ka  or
+something, landing me in a different place from the one
+I wanted.  Aside from this major problem, there is the minor
+inconvenience that the  map!  mechanism apparently waits
+a second every time I type an  ^]  from insert mode to see
+whether this is going to be one of the map!ed sequences, and
+this makes exiting from insert mode sluggish.  My temporary
+solution has been to write a file of the form
+       unmap ^]A| unmap ^]B| ...|unmap! ^]A| unmap! ^]B| 
+which I source every time I go into vi on the Z29.  I
+guess what I should do is create simplified termcaps that
+leave out the arrow keys for my own use when in version 3.7.
+Kevin Layer tells me that when he puts 3.9 on all systems here,
+there will be documentation on how to create terminfo files;
+so I will be able to avoid these inconveniences in 3.9 as well.
+     What would be better, for these two-or-more character sequences,
+though, would be if the "timeout" feature on mappings
+could involve a variable interval, which could be set in the
+millisecond range for terminal-generated sequences (I suppose
+it would have to depend on the baud rate), and longer
+for user-mapped sequences.  The likelihood of the user
+accidentally typing in one of the special sequences so fast
+is negligible.
+     Incidentally, I notice that when I type :map  to look
+at the automatic mappings, these are labeled "up", "down" etc.,
+though for mappings that I create the corresponding position
+just shows a repeat of the mapped sequence.  Is there
+any way the user can put mnemonics in with his own mappings?
+
+     Two other minor points:
+
+     In your reply to my first letter, where I suggested that
+N/pattern should take one to the Nth occurrence of /pattern,
+you said that N/pattern actually resets the window size to N
+while carrying one to /pattern.  The tutorial says the same,
+I believe, but nonetheless, it doesn't work!
+     When one has pulled a command into a buffer,
+say "x, and invoked it with @x, if one then tries to get
+a copy of this command by doing "xp, it doesn't seem to work.
+The way I've found to make it work is to do any other
+yank-and-put (using, say, the last-deleted
+buffer).  This somehow unfreezes the mechanism, and (after undoing
+this last put, unless one wanted it), one can then successfully
+do "xp.
+                               Yours,
+                                       George
+
+(Message inbox:32)
+Date: Sun, 10 Jun 84 16:29:50 pdt
+From: gbergman@ucbcartan (George Mark Bergman)
+To: cc-03@ucbcory, danh@kim, decvax!tarsa, gbergman@ucbcartan,
+        hplabs!intelca!omsvax!isosvax!root, ihnp4!burl!we13!ltuxa!jab,
+        leblanc@ucbdali, lindahl@topaz, mckusick@ucbernie, priili@Ardc.ARPA,
+        ralph@ucbarpa, reiser@ruby, romine@seismo.ARPA, unisoft!eryk,
+        uw-beaver!ubc-vision!mprvaxa!sonnens
+Subject: more editor bugs & ideas
+
+     Here's another letter of comments on the editor that I'm
+sending to Mark Horton (mark@cbosgd).
+     If any of you to whom I'm sending this aren't interested in
+staying on this mailing list, just let me know.
+     Horton replied to an earlier letter by saying he had no idea
+when he'd have any time to work on the editor again, so I don't
+expect replies from him to this and further such letters in the near
+future.
+     For those who are not familiar with the subject of item "A."
+below, modeline is a feature that he added without publicizing it much,
+whereby if any line in the vicinity of the top or bottom of the file
+(top and bottom 10 lines?  I don't remember) contains the string
+vi: or ex: and then another :, everything between these is
+interpreted as a command and executed when this file is read by the
+editor.  There was a big squall in net.news when someone discovered
+it by chance (an accidental string of this sort occurred in their
+/etc/password; fortunately the "command" was meaningless, and evoked
+a diagnostic from the editor).  Some serious dangers of this
+feature were pointed out by various contributors, one of whom described
+for all who were interested how to eliminate it from the source file.
+
+Dear Mark,
+     Here's another few month's collection of comments...
+
+A.  Modeline
+     I presume that in following the net.news discussion of the
+``MAJOR BUG (modeline)'' you saw my two contributions; but I'll
+summarize the relevant points (not in the order I made them):
+
+1)  One possible feature that would be about as convenient as
+the modeline, and would avoid the dangers that people have pointed
+out, would be `enhanced tags', in which the 3d entry of a line of the
+tags file could be not merely a pattern search, but an arbitrary
+command line.
+
+2)  I described (both in net.news and in an earlier letter to you) a
+mapping in my EXINIT which makes one keystroke yank the current line
+(or the next N lines if preceded by a count) to a named buffer
+and then execute that buffer.  If one keeps a set of initializing
+commands within a file to which they are to apply, one can then
+easily execute them on beginning an editing session, which gives
+almost the convenience of the modeline feature, without the dangers,
+and has an enormous range of other uses.  So I think the modeline
+feature could be dropped.
+
+     Let me add to those points:
+
+3)  A modeline
+       vi:r %:
+leads to an infinite recursion!  Fortunately, ^C cuts it off.
+
+4)  I agree with others' comments in net.news that if the modeline
+feature is not dropped altogether, it should be a settable option
+with default ``nomodeline''.
+
+5)  It should certainly be off when ``novice'' is set!
+
+B.  Tags
+     Having mentioned these in point A(1), I will give some other
+comments I have:  One of your update documents mentions the fixing
+of a bug that left ``nomagic'' set if the file named in the tags
+file did not exist.  Very good, but one still ends up with ``nomagic''
+if the file exists but the pattern-search is unsuccessful!
+     It would also be nice if the tags file could include file addresses
+of the form ~user/filename, in particular ~/filename, and if the
+command :set tags= recognized the same.  (I suppose this makes no
+difference to people who get their tags from ctags, but for me, the
+tags file is maintained as a collection of items I have been working on
+recently, or mean to soon, and entries are put in or removed by
+hand regularly.)
+
+C.  Reversal of n and N
+     I also mentioned in one of my net.news comments a peculiar behavior
+that often seems to occur after I've been using my yank-and-execute
+mapping a lot, in which, after a command-line pattern-search :/pattern
+(rather than simply /pattern), the screen-mode commands n and N give
+searches in the reverse of the expected direction, with ? and /
+respectively instead of vice versa.  Perhaps you can figure out what
+causes this; if not, would it help for me to do something like make
+a core dump of the editor when it is happening and send it to you?
+(I don't know how to send a nonascii file, though... .)
+     A few more observations on this behavior:  Though I commonly
+discover it when I am using my yank-and-execute mapping, it has
+happened on at least one occasion when I hadn't use that at all,
+so far as I could recall.  It may actually happen quite frequently,
+but people just don't notice it because they usually use /pattern
+instead of :/pattern.  (My mapping makes it more convenient for
+me to use the latter when the pattern is complicated, or I want to
+store it for repeated use.)
+
+D.  Update on dangerous recursions
+     Discovering that ^C interrupted the recursive modeline led me
+to test it out on a recursive mapping, :ab x ( x ).  It interrupts
+it OK.  Problem solved courtesy of 4.2BSD, I guess.
+
+     I will collect under the next heading my usual list of:
+
+E.  Minor bugs and modest suggestions
+
+     ye and yE yank one character less than they should.
+
+     If the command Ne (N a count) would land one on a 1-letter
+word, one generally lands at the end of the next word instead
+(even if it is also a 1-letter word.  Exception: if one starts
+at or after the end of the preceding word, e behaves as it should.)
+
+     Note also that in the line
+       Sentence... .  Sentence
+if the cursor is on the second S, the command ( causes no motion
+at all.
+
+     I suggest that the motion commands { and } should accept indented
+lines as paragraph-starts, or at least that there should be some
+way of requesting this in the ":set para=" command.  After all, these
+motions shouldn't be useful only to people writing troff files!
+
+     In general, the command NC (where N is a count) changes material
+from the cursor position to the end of the Nth line, leaving material
+before the cursor on the current line unchanged.  But if the line
+is indented, and the cursor is on or before the first nonwhite
+character, the preceding white text (spaces and tabs) is lost.
+
+     It should be possible to use
+       :unmap #1       :unmap! #1      :unab #1
+when function-keys have been mapped.
+
+     Sometimes a noisy phone-line, termcap padding errors, etc.
+cause just one or two lines of the screen to be messed up, and one
+may only wish to refresh those lines.  Could a command be introduced
+which would do this?  Ironically, on a dumb terminal one can generally
+do this by moving the cursor over the line, but not on a smart terminal.
+Another way one can do it is ddP, but I would sometimes feel uneasy
+about unnecessarily modifying the text.  I would
+suggest that the form of the command be 1^L (2^L for 2 lines, etc.).
+Currently, ^L apparently ignores counts.  (Actually, I'm writing at
+the moment on a tvi, so I've verified this for ^R rather than ^L.)
+
+     If one uses the source command, and the file sourced contains
+a command
+       :e newfile
+where newfile does not already exist, the diagnostic ``No such file
+or directory'' aborts the sourcing process.  One ought to be able to
+use such commands in a sourced file.
+
+     In vi screen command mode, ^[ is supposed to ``cancel partially
+formed commands'' and generally does so without protesting, but if the
+partially formed command is a count (e.g., if one has typed 110 instead
+of 10 and wishes to start over) it feeps, which depending on one's
+terminal can be a minor or a major annoyance.  (Also depending on
+whether someone is trying to sleep in the next room.)
+
+     The diagnostic, ``First address exceeds second'' should not be
+needed with one-address commands!  The case where a series of addresses
+before a command, of which the first may exceed the second, is most
+useful is when the last address is a pattern-search preceded
+by a ";", e.g.
+       :$;?^\.PP?-r otherfile
+but let me give simpler examples; of the two commands
+       :3,1,2ka        :1,3,2ka
+the first correctly marks line 2, but the second is aborted by the
+diagnostic quoted.
+
+F.  A feature that would be very desirable, and might or might not
+be easy to implement.
+
+     In general, when one is inserting text on a smart terminal in vi,
+the context below the text being added is pushed downward, line by line,
+till none is left on the screen.  I would like a settable option that
+kept a certain number of lines of following context on the screen
+during additions.  The point is that one should see the material that
+what one is writing will have to mesh with.  What would be involved in
+implementing this would, of course, depend on terminal capabilities.
+If it would be difficult to keep an arbitrary number of lines,
+would it at least be possible to have an option that would keep one
+line, using the special bottom-line feature of some terminals?
+
+G.  More radical suggestions (wishlist).
+
+1)  Editing text with _\bu_\bn_\bd_\be_\br_\bl_\bi_\bn_\bi_\bn_\bg.
+     Although one of the valuable features of vi is the explicitness
+with which most nonprinting characters are shown, this can be annoying
+when one wants to deal with text in which many characters
+are ``emphasized'' using the sequence _^H; e.g. nroff output.  I
+suggest a settable option under which such sequences would be shown as
+with ul.
+     I realize that this would involve working out a great number
+of details, e.g. would motion commands treat _^Hx as one
+character or as three?  How would the nth column be defined?  How
+would one place the cursor on one of the elements of the string
+_^Hx for editing purposes?  What would be done with _^H^A or _^H_^H....?
+     I think the best solution would be to treat _^Hx as a single
+character for the purposes of motion commands, definition of nth
+column, deletions, etc. when this option was set.  In terms of placing
+the cursor, two possibilities occur to me.  One would be to only allow
+the cursor to sit on the underlined character ``as a whole'', and to
+have changes in underlining done by special commands: perhaps ^E as a
+toggle to turn emphasis on and off in insert mode, _ to change
+underlining in screen command mode as ~ changes capitalization
+("_" is at present a synonym to "^", except
+that it takes counts.  ^ could be modified to take
+counts, and _ then used as suggested above), and \e in replacement
+patterns.  The other would be to consider a cursor sitting ``on''
+a sequence _^Hx to actually be on the x, and to set things up so that
+if the cursor is on any of the other members of this sequence, the
+sequence is ``expanded'' on the screen, i.e. shown as it is in the
+present vi.  Then define a single vi command so as not to skip over
+the _ and ^H in such a sequence; namely ^H.  (This would mean
+making a distinction between h and ^H in screen command mode.)
+This one motion would allow one to edit parts of such a sequence.
+
+2)  Editing several files at once.
+     When I have to do work that involves more than one file, the
+repeated use of :w|e#, yanking text to named buffers to move it, losing
+marked lines when I return to a previous file, etc.  becomes
+annoying.  I think it would be desirable if one could make a group
+of files behave like one file during an editing session, and move
+around within that file as comfortably as one move within one file.
+     I suggest that visually, each file be separated from the next
+by a pattern
+:::::::::::::::::::
+as when ``more'' is applied to a group of files.
+For ``Go to file 3, line 20'' I suggest a screen command syntax
+*3*20G.  *-1* and *+2* could mean ``the preceding file'' and ``the
+file after next'' in such commands.  (The initial * could be optional
+if there is no preceding + or -, as in the first example.)  In a
+command such as :w, the default address range would be all of the file
+to which the current line belongs (i.e.,
+it would be a synonym for :*.*w)  To write all files, I suggest :**w.
+:q, :x and ZZ would quit the editing session entirely, while :*1*q
+would remove the buffer of file 1 from the object being edited.
+On the other hand, relative motions such as 10j, H, etc. would work
+within the ``visible object'', the union of the files.
+%s/pattern/repl/ would apply to the file containing the current line,
+and would have the synonym *.*s/pattern/repl/, while
+*1,2,4*s/pattern/repl/ would affect the 3 indicated files, and
+**s/pattern/repl/ would affect all files.
+
+3)  Input and output of shell escapes.
+     The various commands involving shell escapes that you have
+set up allow four possible relations between the text being edited
+and the input and output of the commands: none (:!command);
+specified line-range as input with output not affecting text
+(:address-range w !command); no input from text but output inserted at
+specified line (:address r !command); and specified input from text
+with output replacing input (:address-range !command).
+     It would be nice to have more flexibility; in particular, to
+be able to include input from the file and place the output somewhere
+else in the file without destroying the input text, and to input
+more than one segment of text, e.g.
+       !egrep -f[addr.range] [other.addr.range] > [place of insertion]
+Obviously, there would be a problem of setting up a syntax that would
+avoid confusion with strings that look like address-ranges in the
+shell command.  Perhaps \[...\] could enclose address-ranges where
+I have used [...] above.
+
+4)  ;
+    The ; syntax, allowing one to do a pattern-search starting
+from a specified line is useful, but in setting up 2-address commands,
+one does not necessarily want the point from which one starts the
+search for the second address to be the first address.  If this business
+were being set up now, I would suggest that
+       address;/pattern/
+should simply be a way of specifying the result of doing the indicated
+pattern-search relative to the indicated address, so that
+       :address1,address2;/pattern/d
+would delete from address1 to the location found by the pattern-search
+relative to address2.  Since people are used to the existing
+syntax of ;, I suggest that some other symbol be used in the above
+way, e.g. ], so that
+       :address1,address2]/pattern/d
+could be interpreted as described.
+
+5) Insertions into long lines on smart terminals at low or medium
+baud rate (e.g. 1200).
+     This is annoying because the material coming after the point
+of insertion begins to wrap around, and the cursor must jump back and
+forth, inserting characters at the beginning of the
+continuation line, then going back to the point of insertion, and so
+on.  (At least, this is my experience on my Z29.  I haven't done
+editing by phone connection on any other smart terminal.)  It's
+actually nicer on a dumb terminal, where the editor just overwrites,
+and shows you the result after you escape.  I suppose that the need
+for the cursor to jump back and forth is due to the deficiency of the
+terminals -- has anyone suggested to terminal manufacturers that along
+with the wraparound feature, they add a feature which ``remembers''
+when a line is a continuation of the preceding line, and automatically
+pushes material from the preceding line into the continuation line
+when characters are added to the former, eliminating the need to send
+all these instructions in over a slow line?  (Do terminal manufacturers
+listen to editor-software specialists?)  If not, it might just
+be best to not show the pushed-over earlier material till the insertion
+is complete.
+
+6)  Filename convention
+     This is really a suggestion for UNIX generally, but it could be
+implemented on the editor separately.  It is that for any file,
+filename/.. denote the directory in which the file lies.  (This
+does not mean that every file should be treated as a directory, or
+that the ls command should show filename/..; it would just
+be a convenient way to refer to the directory containing a given
+nondirectory file, consistent with the existing convention for
+directories.)  Within the editor, the important cases would be
+%/.. and #/.., allowing commands such as:
+       :1,10w %/../othername
+
+                       All for now! Yours,
+                               George
+