[net.unix-wizards] MAJOR BUG

phil@utecfa.UUCP (Philip Poulos) (04/16/84)

Now that I know we are not the only ones to have this "feature" of ex/vi
I should point out the obvious problems.

BUG: Any vi command will be executed as soon as you run ex/vi on a file
     that contains a string that matches the following conditions
     - the string starts with "vi:" or "ex:"
     - the string ends with ":"
     - the string appears in the first 5 or last 5 lines of the file

EXAMPLE: As seen in my original mail the string  vi:q!: results in quitting
         the editor, before you even get in.

         vi:!rm *: Will remove all your files while you are waiting for the
         vi prompt.

         There are, of course, better examples... picture the super user
         editting a source file from the net that has vi:!rm -rf /: hidden
         in the file, or perhaps vi:!kill 1: The list is endless.

	I found this by accident (what else is in vi?)
	 We have a login name in the password file
        that ends with "vi", so the string "vi:encryptedstuff:" caused ex to
        burp mildly. Further investigation led to the discovery of the bug.

So everybody that has this ex/vi version (4.2 bsd, maybe others) you better
fix it fast. Otherwise you leave yourself open to an attack of KILLER MAIL.

FIX:
	in ex/ex_io.c 2 pieces of code should be removed.

	1:	remove the routine checkmodeline(), it starts at line ~850

	2:	In rop2() remove the call to checkmodeline()
		the entire for loop should go, it looks like

				for(a=first; a<=lost; a++) {
					if(a == first+5 && last-first >10)
						a = last - 4;
					getline(*a);
					checkmodeline(linebuf);
				}


				Phil (I'll try vi next year) Poulos

mark@cbosgd.UUCP (Mark Horton) (04/17/84)

Why do you assume this is a bug?  It was put in as a feature at the
request of some users, so that vi "set" commands could automatically
be run when certain files are entered.  EMACS has a similar feature.
The only problems are (1) it isn't documented (an oversight on my part),
and (2) you seem to have found a security problem.  It would indeed be
possible to take the feature out (and since most of you didn't know it
was there, you'd never notice that it was gone), but it makes more sense
to set a flag while checkmodeline is in operation, and refuse to do
any ! or sh commands with this flag set.

The mode line feature was put into vi version 3.7, and is still in, so
it's in 4.2BSD and System V.

jpl@allegra.UUCP (John P. Linderman) (04/18/84)

Things are even worse than Philip Poulos let on.  Here is the routine he
suggested removing (a suggestion I am implementing as fast as `make' can run):

checkmodeline(line)
char *line;
{
	char *beg, *end;
	char cmdbuf[1024];
	char *index(), *rindex();

	beg = index(line, ':');
	if (beg == NULL)
		return;
	if (beg[-2] != 'e' && beg[-2] != 'v') return;
	if (beg[-1] != 'x' && beg[-1] != 'i') return;

	strncpy(cmdbuf, beg+1, sizeof cmdbuf);
	end = rindex(cmdbuf, ':');
	if (end == NULL)
		return;
	*end = 0;
	globp = cmdbuf;
	commands(1, 1);
}

Because of the way it checks for "ex:" or "vi:", it will also accept
"ei:" or "vx:".  Because of the way it fails to check that the ':'
is at least 2 characters into the line, it might also accept "x:",
"i:" or just ":", depending on the state of the chars in front of
the linebuf array.  If you are willing to live with this "feature",
you probably won't care about accepting bogus keywords, but you can
sleep a little easier if you do something like

	if ((beg == NULL) || (beg < (line + 2)))
		return;
	if (strncmp(beg-2, "ex", 2) && strncmp(beg-2, "vi", 2))
		return;

John P. Linderman  Department of Fun Software  allegra!jpl

prabhaka@ucbvax.UUCP (Aloke Prabhakar) (04/18/84)

Sorry guys, you really cannot call that a bug. It is a documented
*feature*. (really) There are people here who actually use it.
If your afraid of booby-traps, there`s always cat/more.


	Aloke Prabhakar
	wouldnt-it-be-funny: ...moskvax!kremvax!mcvax!decvax!ucbvax!prabhaka
	USENET: ...ucbvax!prabhaka
	ARPANET: prabhaka%ucbarpa@Berkeley

scw@cepu.UUCP (04/18/84)

This bug doesn't seem to be in the 2.8 BSD version of ex/vi (version 2.13).
-- 
Stephen C. Woods (VA Wadsworth Med Ctr./UCLA Dept. of Neurology)
uucp:	{ {ihnp4, uiucdcs}!bradley, hao, trwrb, sdcsvax!bmcg}!cepu!scw
ARPA: cepu!scw@ucla-locus       location: N 34 06'37" W 118 25'43"

alan@allegra.UUCP (Alan S. Driscoll) (04/18/84)

> ... it makes more sense to set a flag while checkmodeline is in
> operation, and refuse to do any ! or sh commands with this flag
> set.

Ah, the Berkeley mentality at work!  How do you fix a misfeature?
By throwing another feature on top of it, of course...

-- 
	Alan S. Driscoll
	AT&T Bell Laboratories

jdb@mordor.UUCP (04/18/84)

I'm not convinced that this "feature" is necessary (or even desirable).
If it is going to be implemented anyway then please make it optional.
Here's my proposal:

A "set" option ("modeline", "ml") would be used to enable processing
of the "vi:" or "ex:" information.  The default would be "nomodeline".
Users who wanted this feature could put the appropriate "set" command
into their ".exrc" files (or EXINIT environment variables).

I, for one, do not want this "feature"; however, at least one local
user does.  I plan to fix "vi" to work as described above.
-- 
  John Bruner (S-1 Project, Lawrence Livermore National Laboratory)
  MILNET: jdb@mordor.ARPA [jdb@s1-c]	(415) 422-0758
  UUCP: ...!ucbvax!dual!mordor!jdb 	...!decvax!decwrl!mordor!jdb

rcd@opus.UUCP (Dick Dunn) (04/18/84)

Mark Horton, on "vi" taking commands from its input file:
>Why do you assume this is a bug?  It was put in as a feature at the
>request of some users, so that vi "set" commands could automatically
>be run when certain files are entered...

I suspect that if response in unix-wizards is any indication, there are
more people who think that this is bad than people who want it.  The slip
in not documenting it means that many users may have not had a chance to
express opinions about it--until now, with many of them (myself included)
becoming paranoid about using "vi".

There is a fairly basic principle about text editors being ignored in this
feature:  A text editor is a tool for manipulating text files.  The fewer
assumptions the editor makes about its data, the more general its
applicability.  We mostly accept the idea that editors work with ASCII and
are therefore somewhat ungracious in handling characters with the top bit
set (but please, that's a different discussion), and we tend to expect line
boundaries now and then (another different discussion), BUT most of the
text we manipulate satisfies these conditions.

If you put editor commands in the file to be edited, you've said that the
file is, in part, not data but a command script for the editor.  What other
programs can process that file?  They have to understand or ignore the
editor commands.  You've got a fundamentally different type of file if it
has editor commands embedded.

Moreover, consider what happens if you get a gonzo command string in a file
that you were editing!  Now you've got to figure out what happened and use
ANOTHER EDITOR to fix the mess.

If you MUST spend still more of our dwindling memory (and no, it's NOT all
virtual anyway) on such a feature, isolate it somehow so that the general
users of vi don't have to worry about stepping in it every time they edit a
file.  For example, invoke the editor with a different name (as in the e/ex
dodge) or add a flag to the command line; just don't make it the default.
-- 
...Are you making this up as you go along?		Dick Dunn
{hao,ucbvax,allegra}!nbires!rcd				(303) 444-5710 x3086

rjhurdal@watmath.UUCP (David Canzi) (04/18/84)

Yes, you can call it a feature if you want, since it was obviously
deliberately put there.
But, if the first five or the last five lines of /etc/passwd contain a userid
or encrypted password ending in "vi", "ex", "vx", or "ei", then using "vipw"
becomes a risky business.
This feature is a trap waiting to spring on the unwary, and such features are
unwelcome in any programming language, operating system, or text editor.  It
obviously serves a purpose, but some safer way ought to be found to accomplish
this purpose.

chris@umcp-cs.UUCP (04/19/84)

It's obviously a ``feature'' (after all, how could it be an accident?).
I just think that there's got to be a better way.  I kinda like Emacs's
auto-execute myself, though it would be a bit hard to define how that
should work in vi.  Perhaps (in a .exrc):

    autoexecute *.nr { set ignorecase nowrapscan }
    autoexecute *.sh { <whatever> }

(Of course there would be a nice cryptic version:  "ae *.nr {se ic nows}"!)
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci (301) 454-7690
UUCP:	{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:	chris@umcp-cs		ARPA:	chris.umcp-cs@CSNet-Relay

smk@axiom.UUCP (Steven M. Kramer) (04/19/84)

I would hope that the checklinemode flag would be off by default
and only activated thru EXINIT or .exrc.  It's a scary default option.

So all you 4.2 sites out there, quickly type `halt' and bring up 4.1
again.  If you think I'm serious, I'm not.  Rather, I'm ...
-- 
	--steve kramer
	{allegra,genrad,ihnp4,utzoo,philabs,uw-beaver}!linus!axiom!smk	(UUCP)
	linus!axiom!smk@mitre-bedford					(MIL)

thomson@uthub.UUCP (Brian Thomson) (04/19/84)

Okay, it should be classified as a bad idea rather than a bug, since
it was deliberate.  There appears to be another questionable feature
in vi 3.7, and I quote from /usr/src/ucb/ex/ex.news:

	If there is a file .exrc in the current directory, it will be
	sourced when you enter vi, after your EXINIT or ~/.exrc.

I can see users leaving .exrc files in every directory they can write,
hoping that the superuser will trip over one someday.  We may can
this bad idea as well.
-- 
		    Brian Thomson,	    CSRG Univ. of Toronto
		    {linus,ihnp4,uw-beaver,floyd,utzoo}!utcsrgv!uthub!thomson

chenr@tilt.UUCP (Raymond Chen ) (04/20/84)

<wheeee.... isn't this fun>

I don't know about people out there, but on the 4.2 system I can get
to, there is file in the ex/ directory called ex.new (or ex.news) that
*does* contain a report on the "feature" as well as other changes made
in between versions 3.7 and 3.6.  Of course, I don't know if that
comes with to you without source license, but I suspect that it would.

Agreed, it's not the best place to put documentation, since nobody but
us ex hackers even look in the directory, but it's there.


-- 

From the Random Fingers of --

		Ray Chen
		{allegra | ihnp4 | mhuxi}!princeton!down!tilt!chenr	

"It's amazing what a thousand monkeys and a few typewriters can accomplish..."

richard@sequent.UUCP (04/20/84)

Maybe it would be enlightening to hear if someone in netland has
ever used this "bug"/"feature' in any sense.  I admit it might come
in handy, but can't imagine where... 

___________________________________________________________________________
The preceding should not to be construed as the statement or opinion of the
employers or associates of the author.    It is solely the belief...

			from the confused and bleeding fingertips of
				...!sequent!richard

guido@mcvax.UUCP (04/20/84)

It was very honorable of Mark Horton to admit his "guilt"; but I'm not
convinced by His reply.

>Why do you assume this is a bug?  It was put in as a feature [...].

At most I'd call it a quick hack, especially given the bad quality of the
code (pointed out by another unix-wizard) and the absence of documentation.

>EMACS has a similar feature.

No it hasn't.  There is no way to specify IN THE FILE you are editing
that certain Emacs commands must be performed.  You specify this in the
set-up file by binding commands to certain filenames.  (At least that's
the situation in Gosling's Emacs.)  This way it is only you who decides
what's be done (if you trust Emacs itself).

>[...] you seem to have found a security problem.

I can't believe you didn't think of that when you invented it.

Enough flaming; the gentleman who proposed to have a flag "modeline"
which turns the feature on (default off) has my warm approval.

--
	Guido van Rossum, "Stamp Out BASIC" Committee, CWI, Amsterdam
	guido @ mcvax

simpers@ucbvax.UUCP (Scott Simpers) (04/22/84)

(1) vi/ex reading commands from its source files.  I reluctantly have to
	agree that this is a bad idea.  I can see where it would be very
	useful, but I think the dangers outway the advantages.
(2) vi/ex reading .exrc from current directory and home directory:
	This one IS a good idea.  It can take the place of some of the 
	things that (1) was supposed to do.  Different types of files
	often require different configurations.  For example, 
	'autoindent' is very useful when writing a program, but a pain in
	the rear when typing text.  I like the idea of vi being 
	automatically reconfigured for these different tasks.

Scott

...!ucbvax!simpers

alan@allegra.UUCP (Alan S. Driscoll) (04/22/84)

> (1) vi/ex reading commands from its source files.  I reluctantly have to
> 	agree that this is a bad idea.  I can see where it would be very
> 	useful, but I think the dangers outway the advantages.
> (2) vi/ex reading .exrc from current directory and home directory:
> 	This one IS a good idea.  It can take the place of some of the 
> 	things that (1) was supposed to do.  Different types of files
> 	often require different configurations.  For example, 
> 	'autoindent' is very useful when writing a program, but a pain in
> 	the rear when typing text.  I like the idea of vi being 
> 	automatically reconfigured for these different tasks.

What if you have different sorts of files in the same directory?  Don't
you really want your editor's configuration determined by the extension
of the file you're editing?  That way, you get autoindent on '.c' files,
etc.  Gosling's Emacs has such a facility.

-- 
	Alan S. Driscoll
	AT&T Bell Laboratories

agb@ucbvax.UUCP (Alexander G. Burchell) (04/23/84)

	The gentleman asked if anyone had ever used this feature (YES! It is
a feature, by definition if for no other reason).  I certainly have;  I used
to use it every day.  Vis:

	; Random lisp program
	; vi: set lisp :

	(defun foo (bar)
	       (baz (bletch etc)))

or:

	.\" Random nroff file
	.\" vi: se noai :

BTW, my EXINIT is "set ai sm sw=8 terse report=1", and I find autoindent to be
not useful while writing text...  

	I agree that there should be a "modeline" option, default unset.  But
there *is* a better solution, which I employ now.  Use EMACS.
-- 

						Alexander Burchell
						[agb@ucbarpa]
						[ucbvax!agb]

ka@hou3c.UUCP (Kenneth Almquist) (04/23/84)

For the record, some EMACS's (including Warren Mongomery's EMACS
but not Goslings EMACS) will allow you to specify a list of editing
modes within a file.  However, this feature only sets modes so it
doesn't pose a security problem.

My own belief is that setting modes from the file extension (as Gos-
ling's EMACS allows you to do) is a better approach.
				Kenneth Almquist

ka@hou3c.UUCP (Kenneth Almquist) (04/23/84)

For the record, some EMACS's (including Warren Mongomery's EMACS
but not Goslings EMACS) will allow you to specify a list of editing
modes within a file.  However, this feature does not allow you to
execute an arbitrary command so it doesn't pose a security problem.

My own belief is that setting modes from the file name extension
(as Gosling's EMACS allows you to do) is a better approach.
				Kenneth Almquist

hans@log-hb.UUCP (Hans Albertsson) (04/26/84)

[]
I really think both ways should coexist, that is, set modes according
to filename patterns ( not just extensions ) or according to textual
commands within the file itself. The version of EMACS that I've been
involved in myself deliberately allows both, as does T20-EMACS. 
			...decvax!mcvax!enea!log-hb!hans
			Hans Albertsson.

crl@pur-phy.UUCP (Charles LaBrec) (04/26/84)

The two "features" added to vi/ex sounds like an attempt to give it
a limited flavor of EMACS "modes"--something that all of us EMACS
users know and love.

Charles LaBrec
UUCP:		pur-ee!Physics:crl, purdue!Physics:crl
INTERNET:	crl @ pur-phy.UUCP

tim@unc.UUCP (Tim Maroney) (04/30/84)

One tolerable solution would be to have a toggle option that
activates/deactivates the mode line scanning.  The default should probably
be "off".

Another solution would be to look, not in the file itself, but in a file
consisting completely of vi commands.   Conceptually, there would be some
function modefile such that if modefile(filename) = modfilename, modfilename
is the name of a file which is read in (like a .exrc file) when the editor
is called on filename.  If modfilename is not found, then nothing is read,
of course.  One good modefile would be simply to prepend a period.
--
Tim Maroney, The Censored Hacker
mcnc!unc!tim (USENET), tim.unc@csnet-relay (ARPA)

All opinions expressed herein are completely my own, so don't go assuming
that anyone else at UNC feels the same way.

gbergman@ucbtopaz.CC.Berkeley.ARPA (05/01/84)

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

gbergman@ucbtopaz.UUCP (05/01/84)

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 intere   0843
From: n44a!wjh12!genrad!decvax!cca!z
Newsgroups: net.bugs.4bsd
Title: Re: Bug in tset(1) - (nf)
Article-I.D.: cca.388
Posted: Tue May  1 08:59:06 1984
References: <3192@fortune.UUCP>

Yes, this is a problem.  Aside from the fact that it is only logical
that a tab from the end of a line behave like every other tab (i.e,
advance no more than eight spaces), all terminals that I have seen with
hardwired tab stops do behave this way.  Furthermore, even those
terminals with user settable tab stops have a tab set in the first
column and every eight columns thereafter when they are initialized.
If the tab stops set by tset are different from default tab settings and
those on terminals with hardwired tab stops, then it becomes impossible
for programs to reliably know exactly where a terminal's tab stops are.

	Steve Zimmerman
	decvax!cca!z

chris@umcp-cs.UUCP (05/03/84)

There are a number of bugs (and potential bugs, for anyone making
changes) in ex/vi due to ``11 squishing'' (reusing buffers all over
the place).  If you decide to experiment with macros, named buffers,
yanking, and undoing, test it out in a "junk file" first!
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci (301) 454-7690
UUCP:	{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:	chris@umcp-cs		ARPA:	chris@maryland

mark@elsie.UUCP (05/10/84)

<>
Instead of hacking up vi, or creating various alias that toggle .exrc files,
Why not write your own version of vi for each directory where you want to do
some editing. That is, write a shell script named vi! Here's one I'm using
for a paper I'm working on (^[ == CTRL V ESC; ^letter == CTRL V CTRL letter):

#! /bin/sh
EXINIT='set terse shell=/bin/csh sw=4 wm=4 aw |map! #1 ^V    |map! ^[Ow ^[>>$a|m
ap #1 :w^M:n^M|map #2 :n^M| map #3 :ta |map ^[Oq Gi/\<^[A\>^["zdd@z|map ^[Or 1G!
Gvispell^M'
export EXINIT
exec /usr/local/vi $@

Note that the EXINIT variable needs be a single line (escaped newlines don't
seem to work with sh variables; they do with csh but startup is slower).
I've split the line to let it transmit here. Also this won't work if you
want different options for different files in the same directory, but I find
it useful.

-- 
Mark J. Miller
NIH/NCI/DCE/LEC
UUCP:	decvax!harpo!seismo!rlgvax!cvl!elsie!mark
Phone:	(301) 496-5688