MAJOR BUG (vi modeline) -- a safe & powerful alternative

gbergman at ucbtopaz.CC.Berkeley.ARPA gbergman at ucbtopaz.CC.Berkeley.ARPA
Wed May 2 03:15:10 AEST 1984


Subject: "MAJOR BUG" (vi modeline) -- a safe & powerful alternative
Newsgroups: net.unix-wizards,net.bugs

     Convenient though it may be to have a command executed
automatically on entering a file with the editor, it is still
more useful to be able to keep command lines in the
file and execute any of them ad lib.
     Given a line of the file, the way to execute it as a bottom-line
command is to yank it to a named buffer, e.g.
	"ayy
and then give the bottom-line command that executes the contents of
that buffer, in this case
	:@a

     I have an item in my EXINIT that makes the single keystroke
control-O do this for me.  I will give it twice below, once exactly
as it appears in my EXINIT, and once with the two control-characters
shown explicitly as ^+Letter, for those of you seeing this through
``more'' etc.:
		map  "ayy:@a
   explicitly: 	map ^O "ayy:@a^M

     In addition to allowing you to keep commands in files for repeated
use, it makes it possible to carefully edit a command before executing
it, make a modification if the first version did not do what you meant
it to, etc..  It was actually for such editing capability that I set it
up, and the practice of storing commands for reuse developed after.

     The above mapped key can be preceded by a count.  E.g. 3^O will
execute the next three lines as bottom-line commands.

     Let me note a couple of limitations:
     In a bank of commands so executed together, e.g. by 3^O, none
except the last may be a ``global'':
	g/pattern/command
If a global appears in nonfinal position, all commands after it are
ignored.  (This seems to be a general bug of vi; the same thing happens
if one gives on the bottom-line of vi the command
	:source filename
and the file contains a global in nonfinal position.  Only in ex mode
does the command :source behave properly.  Modeline also seems to
be confused by global commands, by the way.)  On the other
hand, I regularly execute banks of many mappings together with no
trouble, as well as things like:
	10,-w !nroff|col|lpr -h
	x
or
	-r !date
	+,$-w !mail NAME
Banks of several substitute commands sometimes give trouble; messages
like ``extra characters after substitute command''.
     Also note that since we are in vi, not ex, the ex commands i, a,
and c cannot be used.  (However, in place of  a  one can use, say
	s/$/^Mline1^Mline2^Metc./
with ^M's entered as ^V-carriage-return, and similar
substitutes for the others, if the resulting command isn't too long.)
     Commands executed in this way (in fact, any commands
given by mappings, @x macros, etc.) cannot execute a ``yank'' (or a
deletion to a named buffer) after any operation that changes the
file.  (According to Mark Horton, there is good reason for this if the
yank is to the ``nameless'' buffer; the fact that it affects yanks to
named buffers as well is a bug.)  This behavior is somewhat capricious:
I have written one command involving such a yank that works OK for no
reason I understand, and another that does something totally
unrelated to what it ought to.
     Sometimes an ``undo'' following a command undoes both it and
some preceding commands!
     To avoid accidentally executing a command with serious consequences
(e.g. mailing a half-written letter, which I once did) one can write in
such commands preceded by the escape character ", e.g.
	"+,$-w !mail NAME
and delete the " only when ready to use.

     Despite its minor drawbacks, this trick has totally transformed
the use of the editor for me!  I would be very interested in other
people's reactions.

     I have some similar tricks for executing file-lines in
ex mode instead of vi mode (mainly developed when I was on a PDP
and didn't have a version 3.7 editor with its @-macro facility).
I occasionally use them when I want to execute something with
successive global commands; I'll give details if anyone is interested.
They're clumsier than the technique described above; I'd be
interested if one of you could come up with a version that wasn't.

     (Those of you here at Berkeley may have seen a version of this
message on msgs, with ^A in place of ^O.  I switched to ^O
because of ^A's interfering with function keys on some terminals.
And those of you at UCLA may have seen a version of my Berkeley message,
edited by David Cantor, who silently replaced my ^A with \, and changed
the mapping so that it would delete the original command line, both of
which changes I disagree with, especially the latter.)

     I will mention, finally, that I have a large file of editor
bugs, as well as suggestions for possible improvements in the editor,
interspersed with comments and rejoinders by Mark Horton.  If
anyone would like a copy, I will send it.

				George M. Bergman



More information about the Comp.unix.wizards mailing list