3315 lines
		
	
	
		
			130 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			3315 lines
		
	
	
		
			130 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
echo x - cflags.ms
 | 
						|
sed '/^X/s///' > cflags.ms << '/'
 | 
						|
X.Go 9 "CFLAGS"
 | 
						|
X.PP
 | 
						|
X\*E uses many preprocessor symbols to control compilation.
 | 
						|
XSome of these control the sizes of buffers and such.
 | 
						|
XThe "-DNO_XXXX" options remove small sets of related features.
 | 
						|
X.PP
 | 
						|
XMost \*E users will probably want to keep all features available.
 | 
						|
XMinix-PC users, though, will have to sacrifice some sets because otherwise
 | 
						|
X\*E would be too bulky to compile.
 | 
						|
XThe "asld" phase of the compiler craps out.
 | 
						|
X.IP "-DM_SYSV, -Dbsd, -DTOS, -DCOHERENT, -Damiga"
 | 
						|
XThese flags tell the compiler that \*E is being compiled for
 | 
						|
XSystem-V UNIX, BSD UNIX, Atari TOS, Coherent, or AmigaDos, respectively.
 | 
						|
XFor other systems, the config.h file can generally figure it out automatically.
 | 
						|
X.IP -DRAINBOW
 | 
						|
XFor MS-DOS systems, this causes support for the DEC Rainbow to be compiled
 | 
						|
Xinto \*E.
 | 
						|
X.IP -DS5WINSIZE
 | 
						|
XSome versions of SysV UNIX don't support support the "winsize"
 | 
						|
Xstyle of screen-size testing,
 | 
						|
Xso elvis ignores window size changes by default.
 | 
						|
X.IP
 | 
						|
XHowever, many of the newer SysV systems defines "winsize" in the
 | 
						|
Xfile "/usr/include/sys/ptem.h".
 | 
						|
XIf your SysV system has "winsize" then you should add
 | 
						|
X-DS5SWINSIZE to the CFLAGS setting.
 | 
						|
X.IP -DTERMIOS
 | 
						|
XPOSIX is a SysV-derived specification which uses a terminal control
 | 
						|
Xpackage called "termios", instead of "termio".
 | 
						|
XSome other SysV systems may also use termios.
 | 
						|
XYou can make elvis uses termios instead of the more common termio
 | 
						|
Xby adding -DTERMIOS to CFLAGS.
 | 
						|
X(Note: This hasn't been tested very well.)
 | 
						|
X.IP -DNBUFS=\fInumber\fP
 | 
						|
X\*E keeps most of your text in a temporary file;
 | 
						|
Xonly a small amount is actually stored in RAM.
 | 
						|
XThis flag allows you to control how much of the file can be in RAM at any time.
 | 
						|
XThe default is 5 blocks, and the minimum is 3 blocks.
 | 
						|
X(See the -DBLKSIZE flag, below.)
 | 
						|
X.IP
 | 
						|
XMore RAM allows global changes to happen a little faster.
 | 
						|
X f you're just making many small changes in one section of a file, though,
 | 
						|
Xextra RAM won't help much.
 | 
						|
X.IP -DBLKSIZE=\fInumber\fP
 | 
						|
XThis controls the size of blocks that \*E uses internally.
 | 
						|
XThe value of BLKSIZE must be a power of two.
 | 
						|
XEvery time you double BLKSIZE, you quadruple the size of a text file that
 | 
						|
X\*E can handle, but you also cause the temporary file to grow faster.
 | 
						|
XFor MS-DOS, Coherent, and Minix-PC, the default value is 1024, which allows
 | 
						|
Xyou to edit files up to almost 512K bytes long.
 | 
						|
XFor all other systems, the default value is 2048, which allows you to edit
 | 
						|
Xfiles that are nearly 2 megabytes long.
 | 
						|
X.IP
 | 
						|
XThe BLKSIZE also determines the maximum line length, and a few other limits.
 | 
						|
XBLKSIZE should be either 256, 512, 1024, or 2048.
 | 
						|
XValues other than these can lead to strange behaviour.
 | 
						|
X.IP -DTMPDIR=\fIstring\fP
 | 
						|
XThis sets the default value of the "directory" option, which specifies where
 | 
						|
Xthe temporary files should reside.
 | 
						|
XThe value of TMPDIR must be a string, so be sure your value includes the
 | 
						|
Xquote characters on each end.
 | 
						|
X.IP "-DEXRC=\fIstr\fP, -DHMEXRC=\fIstr\fP, -DSYSEXRC=\fIstr\fP, -DEXINIT=\fIstr\fP"
 | 
						|
XThis lets you control the names of the initialization files.
 | 
						|
XTheir values must be strings, so be careful about quoting.
 | 
						|
X.IP
 | 
						|
XEXRC is the name of the initialization file in the current directory.
 | 
						|
XIts default value is ".exrc" on UNIX systems -- the same as the real vi.
 | 
						|
XSince that isn't a legal DOS filename, under DOS the default is "elvis.rc".
 | 
						|
XFor other systems, check the config.h file.
 | 
						|
X.IP
 | 
						|
XHMEXRC is the name of the initialization file in your home directory.
 | 
						|
XBy default, it is the same as EXRC.
 | 
						|
X\*E will automatically prepend the name of your home directory to HMEXRC
 | 
						|
Xat run time, so don't give a full path name.
 | 
						|
X.IP
 | 
						|
XSYSEXRC is the name of a system-wide initialization file.
 | 
						|
XIt has no default value;
 | 
						|
Xif you don't define a value for it, then
 | 
						|
Xthe code that supports SYSEXRC just isn't compiled.
 | 
						|
XThe value of SYSEXRC should be a full pathname, in quotes.
 | 
						|
X.IP
 | 
						|
XEXINIT is the name of an environment variable that can contain initialization
 | 
						|
Xcommands.
 | 
						|
XNormally, its value is "EXINIT".
 | 
						|
X.IP -DKEYWORDPRG=\fIstring\fP
 | 
						|
XThis flag determines the default value of the "keywordprg" option.
 | 
						|
XIts value must be a string, so be careful about quoting.
 | 
						|
XThe default value of this flag is "ref", which is a C reference program.
 | 
						|
X.IP "-DCC_COMMAND=\fIstring\fP -DMAKE_COMMAND=\fIstring\fP -DERRLIST=\fIstring\fP"
 | 
						|
XThese control the names of the C compiler, the "make" utility, and the
 | 
						|
Xerror output file, respectively.
 | 
						|
XThey are only used if -DNO_ERRLIST is not given.
 | 
						|
X.IP
 | 
						|
XThe default value of CC_COMMAND depends on the Operating System and compiler
 | 
						|
Xthat you use to compile elvis;
 | 
						|
Xfor UNIX, the default is "cc".
 | 
						|
XThe default values of MAKE_COMMAND and ERRLIST are "make" and "errlist",
 | 
						|
Xrespectively.
 | 
						|
X.IP -DMAXRCLEN=\fInumber\fP
 | 
						|
XThis determines how large a :@ macro command can be (measured in bytes).
 | 
						|
XThe default is 1000 bytes.
 | 
						|
XIf you increase this value significantly,
 | 
						|
Xthen you may need to allocate extra memory for the stack.
 | 
						|
XSee the "CHMEM" setting in the Makefile.
 | 
						|
X.IP -DSHELL=\fIstring\fP
 | 
						|
XThis is the default value of the "shell" option, and hence
 | 
						|
Xthe default shell used from within \*E.
 | 
						|
XThis only controls the default;
 | 
						|
Xthe value you give here may be overridden at run-time by setting
 | 
						|
Xan environment variable named SHELL (or COMSPEC for MS-DOS).
 | 
						|
XIts value must be a string constant, so be careful about quoting.
 | 
						|
X.IP -DTAGS=\fIstring\fP
 | 
						|
XThis sets the name of the "tags" file,
 | 
						|
Xwhich is used by the :tag command.
 | 
						|
XIts value must be a string constant, so be careful about quoting.
 | 
						|
X.IP "-DCS_IBMPC -DCS_LATIN1 -DCS_SPECIAL"
 | 
						|
XThe digraph table and flipcase option will normally start out empty.
 | 
						|
XHowever, if you add -DCS_IBMPC or -DCS_LATIN1 to your CFLAGS,
 | 
						|
Xthen they will start out filled with values that are appropriate for the
 | 
						|
XIBM PC character set or the ISO Latin-1 character set, respectively.
 | 
						|
X.IP
 | 
						|
XYou can also use -DCS_IBMPC and -DCS_SPECIAL together to get digraphs
 | 
						|
Xthat produce the PC's graphic characters.
 | 
						|
X.IP "-DDEBUG -DEBUG2"
 | 
						|
X-DDEBUG adds the ":debug" and ":validate" commands,
 | 
						|
Xand also adds many internal consistency checks.
 | 
						|
XIt increases the size of the ".text" segment by about 6K.
 | 
						|
X.IP
 | 
						|
X-DDEBUG2 causes a line to be appended to a file called "debug.out"
 | 
						|
Xeverytime any change is made to the edit buffer.
 | 
						|
X.IP -DCRUNCH
 | 
						|
XThis flag removes some non-critical code, so that \*E is smaller.
 | 
						|
XFor example, it removes a short-cut from the regexp package, so that
 | 
						|
Xtext searches are slower.
 | 
						|
XAlso, screen updates are not as efficient.
 | 
						|
XA couple of obscure features are disabled by this, too.
 | 
						|
X.IP -DNO_MKEXRC
 | 
						|
XThis removes the ":mkexrc" command,
 | 
						|
Xso you have to create any .exrc files manually.
 | 
						|
XThe size of the .text segment will be reduced by about 600 bytes.
 | 
						|
X.IP -DNO_CHARATTR
 | 
						|
XPermanently disables the charattr option.
 | 
						|
XThis reduces the size of your ".text" segment by about 850 bytes.
 | 
						|
X.IP -DNO_RECYCLE
 | 
						|
XNormally, \*E will recycle space (from the temporary file) which contains
 | 
						|
Xtotally obsolete text.
 | 
						|
XThis flag disables this recycling.
 | 
						|
XWithout recycling, the ".text" segment is about 1K smaller
 | 
						|
Xthan it would otherwise be,
 | 
						|
Xbut the tmp file grows much faster.
 | 
						|
XIf you have a lot of free space on your hard disk,
 | 
						|
Xbut \*E is too bulky to run with recycling,
 | 
						|
Xthen try it without recycling.
 | 
						|
X.IP
 | 
						|
XWhen using a version of \*E that has been compiled with -DNO_RECYCLE,
 | 
						|
Xyou should be careful to avoid making many small changes to a file
 | 
						|
Xbecause each individual change will cause the tmp file to grow by at least 1k.
 | 
						|
XHitting "x" thirty times counts as thirty changes,
 | 
						|
Xbut typing "30x" counts as one change.
 | 
						|
XAlso, you should occasionally do a ":w" followed by a ":e" to start with a
 | 
						|
Xfresh tmp file.
 | 
						|
X.IP
 | 
						|
XInterestingly, the real vi never recycles space from its temporary file.
 | 
						|
X.IP -DNO_SENTENCE
 | 
						|
XLeaves out the "(" and ")" visual mode commands.
 | 
						|
XAlso, the "[[", "]]", "{", and "}" commands will not recognize *roff macros.
 | 
						|
XThe sections and paragraphs options go away.
 | 
						|
XThis saves about 650 bytes in the ".text" segment.
 | 
						|
X.IP -DNO_CHARSEARCH
 | 
						|
XLeaves out the visual commands which locate a given character
 | 
						|
Xin the current line:
 | 
						|
X"f", "t", "F", "T", "," and ";".
 | 
						|
XThis saves about 900 bytes.
 | 
						|
X.IP -DNO_EXTENSIONS
 | 
						|
XLeaves out the "K" and "#" visual commands.
 | 
						|
XAlso, the arrow keys will no longer work in input mode.
 | 
						|
XRegular expressions will no longer recognize the \\{\\} operator.
 | 
						|
X(Other extensions are either inherent in the design of \*E,
 | 
						|
Xor are controlled by more specific flags,
 | 
						|
Xor are too tiny to be worth removing.)
 | 
						|
XThis saves about 250 bytes.
 | 
						|
X.IP -DNO_MAGIC
 | 
						|
XPermanently disables the "magic" option, so that most meta-characters
 | 
						|
Xin a regular expression are *NOT* recognized.
 | 
						|
XThis saves about 3k of space in the ".text" segment, because
 | 
						|
Xthe complex regular expression code can be replaced by much simpler code.
 | 
						|
X.IP -DNO_SHOWMODE
 | 
						|
XPermanently disables the "showmode" option, saving about 250 bytes.
 | 
						|
X.IP -DNO_CURSORSHAPE
 | 
						|
XNormally, \*E tries to adjust the shape of the cursor as a reminder
 | 
						|
Xof which mode you're in.
 | 
						|
XThe -DNO_CURSORSHAPE flag disables this, saving about 150 bytes.
 | 
						|
X.IP -DNO_DIGRAPH
 | 
						|
XTo allow entry of non-ASCII characters, \*E supports digraphs.
 | 
						|
XA digraph is a single (non-ASCII) character which is entered as a
 | 
						|
Xcombination of two other (ASCII) characters.
 | 
						|
XIf you don't need to input non-ASCII characters,
 | 
						|
Xor if your keyboard supports a better way of entering non-ASCII characters,
 | 
						|
Xthen you can disable the digraph code and save about 450 bytes.
 | 
						|
X.IP -DNO_ERRLIST
 | 
						|
X\*E adds a ":errlist" command, which is useful to programmers.
 | 
						|
XIf you don't need this feature, you can disable it via the -DNO_ERRLIST flag.
 | 
						|
XThis will reduce the .text segment by about 900 bytes, and the .bss segment
 | 
						|
Xby about 300 bytes.
 | 
						|
X.IP -DNO_ABBR
 | 
						|
XThe -DNO_ABBR flag disables the ":abbr" command,
 | 
						|
Xand reduces the size of \*E by about 250 bytes.
 | 
						|
X.IP -DNO_OPTCOLS
 | 
						|
XWhen \*E displays the current options settings via the ":set" command,
 | 
						|
Xthe options are normally sorted into columns.
 | 
						|
XThe -DNO_OPTCOLS flag causes the options to be sorted across the rows,
 | 
						|
Xwhich is much simpler for the computer.
 | 
						|
XThe -DNO_OPTCOLS flag will reduce the size of your .text segment by about
 | 
						|
X500 bytes.
 | 
						|
X.IP -DNO_MODELINES
 | 
						|
XThis removes all support for modelines.
 | 
						|
X.IP -DNO_TAG
 | 
						|
XThis disables tag lookup.
 | 
						|
XIt reduces the size of the .text segment by about 750 bytes.
 | 
						|
X.IP "-DNO_ALT_FKEY -DNO_CTRL_FKEY -DNO_SHIFT_FKEY -DNO_FKEY"
 | 
						|
XThese remove explicit support of function keys.
 | 
						|
X-DNO_ALT_FKEY removes support for the <alternate> versions function keys.
 | 
						|
X-DNO_CTRL_FKEY removes support for the <control> and <alternate> versions function keys.
 | 
						|
X-DNO_SHIFT_FKEY removes support for the <shift>, <control>, and <alternate> versions function keys.
 | 
						|
X-DNO_FKEY removes all support of function keys.
 | 
						|
X.IP
 | 
						|
X\*E's ":map" command normally allows you to use the special sequence "#<n>"
 | 
						|
Xto map function key <n>.
 | 
						|
XFor example, ":map #1 {!}fmt^M" will cause the <F1> key to reformat a paragraph.
 | 
						|
X\*E checks the :k1=: field in the termcap description of your terminal
 | 
						|
Xto figure out what code is sent by the <F1> key.
 | 
						|
XThis is handy because it allows you to create a .exrc file which maps function
 | 
						|
Xkeys the same way regardless of what type of terminal you use.
 | 
						|
X.IP
 | 
						|
XThat behaviour is standard; most implementations of the real vi supports it too.
 | 
						|
X\*E extends this to allow you to use "#1s" to refer to <shift>+<F1>,
 | 
						|
X"#1c" to refer to <control>+<F1>, and
 | 
						|
X"#1a" to refer to <alt>+<F1>.
 | 
						|
XThe termcap description for the terminal should have fields named
 | 
						|
X:s1=:c1=:a1=: respectively, to define the code sent by these key conbinations.
 | 
						|
X(You should also have :k2=:s2=:c2=:a2=: for the <F2> key, and so on.)
 | 
						|
X.IP
 | 
						|
XBut there may be problems.
 | 
						|
XThe terminfo database doesn't support :s1=:c1=:a1=:, so no terminfo terminal
 | 
						|
Xdescription could ever support shift/control/alt function keys;
 | 
						|
Xso you might as well add -DNO_SHIFT_FKEY to CFLAGS if you're using terminfo.
 | 
						|
X.IP
 | 
						|
XNote that, even if you have -DNO_FKEYS, you can still configure \*E to use
 | 
						|
Xyour function keys my mapping the literal character codes sent by the key.
 | 
						|
XYou just couldn't do it in a terminal-independent way.
 | 
						|
XTERM_925
 | 
						|
X.IP "-DTERM_AMIGA -DTERM_VT100 -DTERM_VT52 etc."
 | 
						|
XThe tinytcap.c file contains descriptions of several terminal types.
 | 
						|
XFor each system that uses tinytcap, a reasonable subset of the available
 | 
						|
Xdescriptions is actually compiled into \*E.
 | 
						|
XIf you wish to enlarge this subset, then you can add the appropriate -DTERM_XXX
 | 
						|
Xflag to your CFLAGS settings.
 | 
						|
X.IP
 | 
						|
XFor a list of the available terminal types, check the tinytcap.c file.
 | 
						|
X.IP -DINTERNAL_TAGS
 | 
						|
XNormally, \*E uses the "ref" program to perform tag lookup.
 | 
						|
XThis is more powerful than the real vi's tag lookup,
 | 
						|
Xbut it can be much slower.
 | 
						|
X.IP
 | 
						|
XIf you add -DINTERNAL_TAGS to your CFLAGS setting,
 | 
						|
Xthen \* will use its own internal tag lookup code, which is faster.
 | 
						|
X.IP -DPRSVDIR=\fIdirectory\fR
 | 
						|
XThis controls where preserved files will be placed.
 | 
						|
XAn appropriate default has been chosen for each Operating System,
 | 
						|
Xso you probably don't need to worry about it.
 | 
						|
X.IP -DFILEPERMS=\fInumber\fR
 | 
						|
XThis affects the attributes of files that are created by \*E;
 | 
						|
Xit is used as the second argument to the creat() function.
 | 
						|
XThe default is 0666 which (on UNIX systems at least) means that
 | 
						|
Xanybody can read or write the new file, but nobody can execute it.
 | 
						|
XOn UNIX systems, the creat() call modifies this via the umask setting.
 | 
						|
X.IP -DKEYBUFSIZE=\fInumber\fR
 | 
						|
XThis determines the size of the type-ahead buffer that elvis uses.
 | 
						|
XIt also limits the size of keymaps that it can handle.
 | 
						|
XThe default is 1000 characters, which should be plenty.
 | 
						|
/
 | 
						|
echo x - cutbufs.ms
 | 
						|
sed '/^X/s///' > cutbufs.ms << '/'
 | 
						|
X.Go 6 "CUT BUFFERS"
 | 
						|
X.PP
 | 
						|
XWhen \*E deletes text, it stores that text in a cut buffer.
 | 
						|
XThis happens in both visual mode and EX mode.
 | 
						|
XThere is no practical limit to how much text a cut buffer can hold.
 | 
						|
X.PP
 | 
						|
XThere are 36 cut buffers:
 | 
						|
X26 named buffers ("a through "z),
 | 
						|
X9 anonymous buffers ("1 through "9),
 | 
						|
Xand 1 extra cut buffer (".).
 | 
						|
X.PP
 | 
						|
XIn EX mode, the :move and :copy commands use a cut buffer to temporarily
 | 
						|
Xhold the text to be moved/copied.
 | 
						|
X.NH 2
 | 
						|
XPutting text into a Cut Buffer
 | 
						|
X.PP
 | 
						|
XIn visual mode, text is copied into a cut buffer when you use the
 | 
						|
Xd, y, c, C, s, or x commands.
 | 
						|
XThere are also a few others.
 | 
						|
X.PP
 | 
						|
XBy default, the text goes into the "1 buffer.
 | 
						|
XThe text that used to be in "1 gets shifted into "2,
 | 
						|
X"2 gets shifted into "3, and so on.
 | 
						|
XThe text that used to be in "9 is lost.
 | 
						|
XThis way, the last 9 things you deleted are still accessible.
 | 
						|
X.PP
 | 
						|
XYou can also put the text into a named buffer -- "a through "z.
 | 
						|
XTo do this, you should type the buffer's name
 | 
						|
X(two keystrokes: a double-quote and a lowercase letter)
 | 
						|
Xbefore the command that will cut the text.
 | 
						|
XWhen you do this, "1 through "9 are not affected by the cut.
 | 
						|
X.PP
 | 
						|
XYou can append text to one of the named buffers.
 | 
						|
XTo do this, type the buffer's name in uppercase
 | 
						|
X(a double-quote and an uppercase letter)
 | 
						|
Xbefore the d/y/c/C/s/x command.
 | 
						|
X.PP
 | 
						|
XThe ". buffer is special.
 | 
						|
XIt isn't affected by the d/y/c/C/s/x command.
 | 
						|
XInstead, it stores the text that you typed in
 | 
						|
Xthe last time you were in input mode.
 | 
						|
XIt is used to implement the . visual command,
 | 
						|
Xand ^A in input mode.
 | 
						|
X.PP
 | 
						|
XIn EX mode (also known as colon mode),
 | 
						|
Xthe :delete, :change, and :yank commands all copy text into a cut buffer.
 | 
						|
XLike the visual commands, these EX commands normally use the "1 buffer,
 | 
						|
Xbut you can use one of the named buffers by giving its name after the command.
 | 
						|
XFor example,
 | 
						|
X.sp 1
 | 
						|
X.ti +0.5i
 | 
						|
X:20,30y a
 | 
						|
X.sp
 | 
						|
X.LP
 | 
						|
Xwill copy lines 20 through 30 into cut buffer "a.
 | 
						|
X.PP
 | 
						|
XYou can't directly put text into the ". buffer, or the "2 through "9 buffers.
 | 
						|
X.NH 2
 | 
						|
XPasting from a Cut Buffer
 | 
						|
X.PP
 | 
						|
XThere are two styles of pasting:
 | 
						|
Xline-mode and character-mode.
 | 
						|
XIf a cut buffer contains whole lines (from a command like "dd")
 | 
						|
Xthen line-mode pasting is used;
 | 
						|
Xif it contains partial lines (from a command like "dw")
 | 
						|
Xthen character-mode pasting is used.
 | 
						|
XThe EX commands always cut whole lines.
 | 
						|
X.PP
 | 
						|
XCharacter-mode pasting causes the text to be inserted into the line that
 | 
						|
Xthe cursor is on.
 | 
						|
X.PP
 | 
						|
XLine-mode pasting inserts the text on a new line above or below the line
 | 
						|
Xthat the cursor is on.
 | 
						|
XIt doesn't affect the cursor's line at all.
 | 
						|
X.PP
 | 
						|
XIn visual mode, the p and P commands insert text from a cut buffer.
 | 
						|
XUppercase P will insert it before the cursor,
 | 
						|
Xand lowercase p will insert it after the cursor.
 | 
						|
XNormally, these commands will paste from the "1 buffer, but you can
 | 
						|
Xspecify any other buffer to paste from.
 | 
						|
XJust type its name (a double-quote and another character)
 | 
						|
Xbefore you type the P or p.
 | 
						|
X.PP
 | 
						|
XIn EX mode, the (pu)t command pastes text after a given line.
 | 
						|
XTo paste from a buffer other that "1,
 | 
						|
Xenter its name after the command.
 | 
						|
X.NH 2
 | 
						|
XMacros
 | 
						|
X.PP
 | 
						|
XThe contents of a named cut buffer can be executed as a series of
 | 
						|
Xex/vi commands.
 | 
						|
X.PP
 | 
						|
XTo put the instructions into the cut buffer, you must first insert
 | 
						|
Xthem into the file, and then delete them into a named cut buffer.
 | 
						|
X.PP
 | 
						|
XTo execute a cut buffer's contents as EX commands,
 | 
						|
Xyou should give the EX command "@" and the name of the buffer.
 | 
						|
XFor example, :@z will execute "z as a series of EX commands.
 | 
						|
X.PP
 | 
						|
XTo execute a cut buffer's contents as visual commands,
 | 
						|
Xyou should give the visual command "@" and the letter of the buffer's name.
 | 
						|
XThe visual "@" command is different from the EX "@" command.
 | 
						|
XThey interpret the cut buffer's contents differently.
 | 
						|
X.PP
 | 
						|
XThe visual @ command can be rather finicky.
 | 
						|
XEach character in the buffer is interpretted as a keystroke.
 | 
						|
XIf you load the instructions into the cut buffer via a "zdd command,
 | 
						|
Xthen the newline character at the end of the line will be executed just
 | 
						|
Xlike any other character, so the cursor would be moved down 1 line.
 | 
						|
XIf you don't want the cursor to move down 1 line at the end of each
 | 
						|
X@z command, then you should load the cut buffer by saying 0"zD instead.
 | 
						|
X.PP
 | 
						|
XAlthough cut buffers can hold any amount of text,
 | 
						|
X\*E can only \fIexecute\fR small buffers.
 | 
						|
XThe size limit is roughly 1000 characters, for either EX macros or VI macros.
 | 
						|
XIf a buffer is too large to execute, an error message is displayed.
 | 
						|
X.PP
 | 
						|
XYou can't nest :@ commands.
 | 
						|
XYou can't run :@ commands from your .exrc file,
 | 
						|
Xor any other :source file either.
 | 
						|
XSimilarly, you can't run a :source command from within an @ command.
 | 
						|
XHopefully, these restrictions will be lifted in a later version.
 | 
						|
X.NH 2
 | 
						|
XThe Effect of Switching Files
 | 
						|
X.PP
 | 
						|
XWhen \*E first starts up, all cut buffers are empty.
 | 
						|
XWhen you switch to a different file
 | 
						|
X(via the :n or :e commands perhaps)
 | 
						|
Xthe 9 anonymous cut buffers are emptied again,
 | 
						|
Xbut the other 27 buffers ("a through "z, and ".) retain their text.
 | 
						|
/
 | 
						|
echo x - differ.ms
 | 
						|
sed '/^X/s///' > differ.ms << '/'
 | 
						|
X.Go 7 "DIFFERENCES BETWEEN \*E & BSD VI/EX"
 | 
						|
X.PP
 | 
						|
X\*E is not 100% compatible with the real vi/ex.
 | 
						|
X\*E has many small extensions, some omissions, and a few features which
 | 
						|
Xare implemented in a slightly different manner.
 | 
						|
X.NH 2
 | 
						|
XExtensions
 | 
						|
X.IP "Save Configuration" 1i
 | 
						|
XThe :mkexrc command saves the current :set and :map configurations in
 | 
						|
Xthe ".exrc" file in your current directory.
 | 
						|
X.IP "Previous File" 1i
 | 
						|
XThe :N or :prev command moves backwards through the args list.
 | 
						|
X.IP "Center Current Row" 1i
 | 
						|
XIn visual command mode, the (lowercase) "zz" command will center the current
 | 
						|
Xline on the screen, like "z=".
 | 
						|
X.IP "Changing Repeat Count" 1i
 | 
						|
XThe default count value for . is the same as the previous command
 | 
						|
Xwhich . is meant to repeat.
 | 
						|
XHowever, you can supply a new count if you wish.
 | 
						|
XFor example, after "3dw", "." will delete 3 words,
 | 
						|
Xbut "5." will delete 5 words.
 | 
						|
X.IP "Previous Text" 1i
 | 
						|
XThe text which was most recently input
 | 
						|
X(via a "cw" command, or something similar)
 | 
						|
Xis saved in a cut buffer called ". (which
 | 
						|
Xis a pretty hard name to write in an English sentence).
 | 
						|
X.IP "Keyword Lookup" 1i
 | 
						|
XIn visual command mode, you can move the cursor onto a word and press
 | 
						|
Xshift-K to have \*E run a reference program to look that word up.
 | 
						|
XThis command alone is worth the price of admission!
 | 
						|
XSee the ctags and ref programs.
 | 
						|
X.IP "Increment/Decrement" 1i
 | 
						|
XIn visual command mode, you can move the cursor onto a number and
 | 
						|
Xthen hit ## or #+ to increment that number by 1.
 | 
						|
XTo increment it by a larger amount,
 | 
						|
Xtype in the increment value before hitting the initial #.
 | 
						|
XThe number can also be decremented or set by hitting #- or #=, respectively.
 | 
						|
X.IP "Input Mode" 1i
 | 
						|
XYou can backspace past the beginning of the line.
 | 
						|
X.IP "" 1i
 | 
						|
XThe arrow keys work in input mode.
 | 
						|
X.IP "" 1i
 | 
						|
XIf you type control-A, then the text that you input last time is inserted.
 | 
						|
XYou will remain in input mode, so you can backspace over part of it,
 | 
						|
Xor add more to it.
 | 
						|
X(This is sort of like control-@ on the real vi,
 | 
						|
Xexcept that control-A really works.)
 | 
						|
X.IP "" 1i
 | 
						|
XControl-P will insert the contents of the cut buffer.
 | 
						|
X.IP "" 1i
 | 
						|
XReal vi can only remember up to 128 characters of input,
 | 
						|
Xbut \*E can remember any amount.
 | 
						|
X.IP "" 1i
 | 
						|
XThe ^T and ^D keys can adjust the indent of a line no matter where
 | 
						|
Xthe cursor happens to be in that line.
 | 
						|
X.IP "" 1i
 | 
						|
XYou can save your file and exit \*E directly from input mode by hitting
 | 
						|
Xcontrol-Z twice.
 | 
						|
X.IP "" 1i
 | 
						|
X\*E supports digraphs as a way to enter non-ASCII characters.
 | 
						|
X.IP "Start in Input Mode" 1i
 | 
						|
XIf you ":set inputmode" in your .exrc file, then \*E will start up in
 | 
						|
Xinput mode instead of visual command mode.
 | 
						|
X.IP "Visible Fonts" 1i
 | 
						|
XWith ":set charattr", \*E can display "backslash-f" style character attributes on the
 | 
						|
Xscreen as you edit.
 | 
						|
XThe following example shows the recognized atributes:
 | 
						|
X.sp
 | 
						|
X.ti +0.5i
 | 
						|
Xnormal \\fBboldface\\fR \\fIitalics\\fR \\fUunderlined\\fR normal
 | 
						|
X.sp
 | 
						|
XNOTE: you must compile \*E without the -DNO_CHARATTR flag for
 | 
						|
Xthis to work.
 | 
						|
X.IP "File Syncing" 1i
 | 
						|
XAfter a crash, you can usually recover the altered form of the file
 | 
						|
Xfrom the temporary file that \*E uses -- unless the temporary file was
 | 
						|
Xcorrupted.
 | 
						|
X.IP "" 1i
 | 
						|
XUNIX systems use a delayed-write cache, which means that when \*E tries to
 | 
						|
Xwrite to the temporary file, the information might still be in RAM instead
 | 
						|
Xof on the disk.
 | 
						|
XA power failure at that time would cause the in-RAM information to be lost.
 | 
						|
XUNIX's sync() call will force all such information to disk.
 | 
						|
X.IP "" 1i
 | 
						|
XMS-DOS and Atari TOS don't write a file's length to disk until that file
 | 
						|
Xis closed.
 | 
						|
XConsequently, the temporary file would appear to be 0 bytes long if power
 | 
						|
Xfailed when we were editing.
 | 
						|
XTo avoid this problem, a sync() function has been written which will close
 | 
						|
Xthe temporary file and then immediately reopen it.
 | 
						|
X.IP "Cursor Shape" 1i
 | 
						|
X\*E changes the shape of the cursor to indicate which mode you're in,
 | 
						|
Xif your terminal's termcap entry includes the necessary capabilities.
 | 
						|
X.IP "Hide nroff Lines" 1i
 | 
						|
XTh ":set hideformat" option hides nroff format control lines.
 | 
						|
X(They are displayed on the screen as blank lines.)
 | 
						|
X.ne 7
 | 
						|
X.IP "Compiler Interface" 1i
 | 
						|
X\*E is clever enough to parse the error messages emitted by many compilers.
 | 
						|
XTo use this feature,
 | 
						|
Xyou should collect your compiler's error messages into a file called "errlist";
 | 
						|
X\*E will read this file,
 | 
						|
Xdetermine which source file caused the error messages,
 | 
						|
Xstart editing that file,
 | 
						|
Xmove the cursor to the line where the error was detected,
 | 
						|
Xand display the error message on the status line.
 | 
						|
XNifty!
 | 
						|
X.IP "Visible Text Selection" 1i
 | 
						|
XIn visual command mode, 'v' starts visibly selecting characters and
 | 
						|
X\&'V' starts visibly selecting whole lines.
 | 
						|
XThe character or line where the cursor is located becomes one
 | 
						|
Xendpoint of the selection.
 | 
						|
XYou can then use the standard cursor movement commands to move the cursor
 | 
						|
Xto the other endpoint, and then press one of the operator commands
 | 
						|
X(c/d/y/</>/!/=/\\).
 | 
						|
XThe operator will then immediately be applied to the selected text.
 | 
						|
X.IP "Pop-up Menu Operator" 1i
 | 
						|
XThe '\\' key is a new operator,
 | 
						|
Xsimilar in operation to the c/d/y/</>/! operators
 | 
						|
XIt conjures up a menu, from which you can select any of the other
 | 
						|
Xoperators plus a few other common commands.
 | 
						|
X.IP "Preset Filter Operator" 1i
 | 
						|
XThe '=' key is another new operator.
 | 
						|
XIt is similar to the '!' operator, except that while
 | 
						|
X\&'!' asks you to type in a filter command each time,
 | 
						|
X\&'=' assumes it should always run the command stored in the \fIequalprg\fR option.
 | 
						|
X.IP "Move to a Given Percentage" 1i
 | 
						|
XThe '%' movement key can now accept an optional count.
 | 
						|
XWithout a count, the '%' key still moves to a matching parenthesis
 | 
						|
Xlike it always did.
 | 
						|
XWith a count somewhere between 1 and 100, though, it moves the cursor to
 | 
						|
Xapproximately a given percentage of the way through the file.
 | 
						|
XFor example, typing "50%" will move the cursor to the middle of the file.
 | 
						|
X.IP "Regular Expressions"
 | 
						|
XIn regular expressions, several new forms of closure operators are supported:
 | 
						|
X\\{\fIn\fR}, \\{\fIn\fR,\fIm\fR}, \\+, and \\?.
 | 
						|
X.NH 2
 | 
						|
XOmissions
 | 
						|
X.PP
 | 
						|
XThe replace mode is a hack.
 | 
						|
XIt doesn't save the text that it overwrites.
 | 
						|
X.PP
 | 
						|
XLong lines are displayed differently -- where the real vi would
 | 
						|
Xwrap a long line onto several rows of the screen, \*E simply
 | 
						|
Xdisplays part of the line, and allows you to scroll the screen
 | 
						|
Xsideways to see the rest of it.
 | 
						|
X.PP
 | 
						|
XThe ":preserve" and ":recover" commands are missing.
 | 
						|
XSo is the -r flag.
 | 
						|
XI've never had a good reason to use ":preserve",
 | 
						|
Xand since ":recover" is used so rarely
 | 
						|
XI decided to implement it as a separate program.
 | 
						|
XThere's no need to load the recovery code into memory every
 | 
						|
Xtime you edit a file, I figured.
 | 
						|
X.PP
 | 
						|
XLISP support is missing.
 | 
						|
XHowever, the = key is still an operator that reformats lines of text.
 | 
						|
XBy default, it reformats lines by sending them through the \fIfmt\fP filter,
 | 
						|
Xbut you could write your own LISP beautifier and configure elvis to use it.
 | 
						|
XKey mappings could take care of most other differences.
 | 
						|
XAuto-indent is the only thing that is irrecoverably lost.
 | 
						|
X.PP
 | 
						|
XAutoindent mode acts a little different from the real vi, anyway.
 | 
						|
XIt doesn't handle ^^D or 0^D correctly.
 | 
						|
XOn the other hand, it \fIdoes\fP allow ^D and ^T to be used anywhere in the
 | 
						|
Xline, to adjust the indentation for the whole line.
 | 
						|
/
 | 
						|
echo x - environ.ms
 | 
						|
sed '/^X/s///' > environ.ms << '/'
 | 
						|
X.Go 11 "ENVIRONMENT VARIABLES"
 | 
						|
X.PP
 | 
						|
X\*E examines several environment variables when it starts up.
 | 
						|
XThe values of these variables are used internally for a variety
 | 
						|
Xof purposes.
 | 
						|
XYou don't need to define all of these;
 | 
						|
Xon most systems, \*E only requires TERM to be defined.
 | 
						|
XOn AmigaDOS, MS-DOS or TOS systems, even that is optional.
 | 
						|
X.SH
 | 
						|
XTERM, TERMCAP
 | 
						|
X.PP
 | 
						|
XTERM tells \*E the name of the termcap entry to use.
 | 
						|
XTERMCAP may contain either the entire termcap entry,
 | 
						|
Xor the full pathname of the termcap file to search through.
 | 
						|
X.PP
 | 
						|
XIf your version of \*E is using tinytcap instead of the full termcap library,
 | 
						|
Xthen the value of TERMCAP \fIcannot\fR contain any backslash escapes (\\E, \\r, etc.)
 | 
						|
Xor carat escapes (^[, ^M, etc.), because tinytcap doesn't understand them.
 | 
						|
XInstead, you should embed the actual control character into the string.
 | 
						|
X.SH
 | 
						|
XTMP, TEMP
 | 
						|
X.PP
 | 
						|
XThese only work for AmigaDOS, MS-DOS and Atari TOS.
 | 
						|
XEither of these variables may be used to set the "directory" option,
 | 
						|
Xwhich controls where temporary files are stored.
 | 
						|
XIf you define them both, then TMP is used, and TEMP is ignored.
 | 
						|
X.SH
 | 
						|
XLINES, COLUMNS
 | 
						|
X.PP
 | 
						|
XThe termcap entry for your terminal should specify the size of your screen.
 | 
						|
XIf you're using a windowing interface, then there is an ioctl() call which
 | 
						|
Xwill provide the size of the window; the ioctl() values will override the
 | 
						|
Xvalues in the termcap entry.
 | 
						|
XThe LINES and COLUMNS environment variables (if defined)
 | 
						|
Xwill override either of these sources.
 | 
						|
XThey, in turn, can be overridden by a ":set" command.
 | 
						|
X.PP
 | 
						|
XNormally, the LINES and COLUMNS variables shouldn't need to be defined.
 | 
						|
X.SH
 | 
						|
XEXINIT
 | 
						|
X.PP
 | 
						|
XThis variable's value may contain one or more colon-mode commands,
 | 
						|
Xwhich will be executed after all of the ".exrc" files
 | 
						|
Xbut before interactive editing begins.
 | 
						|
X.PP
 | 
						|
XTo put more than one command in EXINIT, you can separate the commands
 | 
						|
Xwith either a newline or a '|' character.
 | 
						|
X.SH
 | 
						|
XSHELL, COMSPEC
 | 
						|
X.PP
 | 
						|
XYou can use COMSPEC in MS-DOS, or SHELL in any other system,
 | 
						|
Xto specify which shell should be used for executing commands and
 | 
						|
Xexpanding wildcards.
 | 
						|
X.SH
 | 
						|
XHOME
 | 
						|
X.PP
 | 
						|
XThis variable should give the full pathname of your home directory.
 | 
						|
X\*E needs to know the name of your home directory so it can locate
 | 
						|
Xthe ".exrc" file there.
 | 
						|
X.SH
 | 
						|
XTAGPATH
 | 
						|
X.PP
 | 
						|
XThis variable is used by the "ref" program.
 | 
						|
XIt contains a list of directories that might contain a relevent "tags" file.
 | 
						|
XUnder AmigaDOS, MS-DOS or Atari TOS, the names of the directories should be separated by
 | 
						|
Xsemicolons (";").
 | 
						|
XUnder other operating systems, the names should be separated by colons (":").
 | 
						|
X.PP
 | 
						|
XIf you don't define TAGPATH, then "ref" will use a default list which includes
 | 
						|
Xthe current directory and a few other likely places.
 | 
						|
XSee the definition of DEFTAGPATH at the start of ref.c for an accurate list.
 | 
						|
/
 | 
						|
echo x - ex.ms
 | 
						|
sed '/^X/s///' > ex.ms << '/'
 | 
						|
X.Go 3 "COLON MODE COMMANDS"
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X.in 0.8i
 | 
						|
X.ta 2i 3.i
 | 
						|
X.\" NOTE: The following macro is used to output a single line of the
 | 
						|
X.\" command chart.  Its usage is:
 | 
						|
X.\"
 | 
						|
X.\"		.Cm <linespecs> <name> <arguments>...
 | 
						|
X.\"
 | 
						|
X.de Cm
 | 
						|
X.if "\\$1"0" \t\\$2\t\\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
 | 
						|
X.if "\\$1"1" \s-2[line]\s+2\t\\$2\t\\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
 | 
						|
X.if "\\$1"2" \s-2[line][,line]\s+2\t\\$2\t\\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9
 | 
						|
X..
 | 
						|
X.if t .ds Q ``
 | 
						|
X.if t .ds U ''
 | 
						|
X.if n .ds Q "
 | 
						|
X.if n .ds U "
 | 
						|
X\s+2LINES	COMMAND	ARGUMENTS\s-2
 | 
						|
X.Cm 0 ab[br] [short] [expanded form]
 | 
						|
X.Cm 1 a[ppend][!]
 | 
						|
X.Cm 0 ar[gs] [files]
 | 
						|
X.Cm 0 cc [files]
 | 
						|
X.Cm 0 cd[!] [directory]
 | 
						|
X.Cm 2 c[hange]
 | 
						|
X.Cm 0 chd[ir][!] [directory]
 | 
						|
X.Cm 2 co[py] line
 | 
						|
X.Cm 0 col[or] [when] [[\*Qlight\*U] color] [\*Qon\*U color]
 | 
						|
X.Cm 2 d[elete] [\*Ux]
 | 
						|
X.Cm 0 dig[raph][!] [XX [Y]]
 | 
						|
X.Cm 0 e[dit][!] [file]
 | 
						|
X.Cm 0 er[rlist][!] [errlist]
 | 
						|
X.Cm 0 f[ile] [file]
 | 
						|
X.Cm 2 g[lobal] /regexp/ command
 | 
						|
X.Cm 1 i[nsert]
 | 
						|
X.Cm 2 j[oin][!]
 | 
						|
X.Cm 2 l[ist]
 | 
						|
X.Cm 0 mak[e] [target]
 | 
						|
X.Cm 0 map[!] key mapped_to
 | 
						|
X.Cm 1 ma[rk]  \*Ux
 | 
						|
X.Cm 0 mk[exrc]
 | 
						|
X.Cm 2 m[ove] line
 | 
						|
X.Cm 0 n[ext][!] [files]
 | 
						|
X.Cm 0 N[ext][!]
 | 
						|
X.Cm 2 nu[mber]
 | 
						|
X.Cm 2 p[rint]
 | 
						|
X.Cm 1 pu[t] [\*Ux]
 | 
						|
X.Cm 0 q[uit][!]
 | 
						|
X.Cm 1 r[ead] file
 | 
						|
X.Cm 0 rew[ind][!]
 | 
						|
X.Cm 0 se[t] [options]
 | 
						|
X.Cm 0 so[urce] file
 | 
						|
X.Cm 2 s[ubstitute] /regexp/replacement/[p][g][c]
 | 
						|
X.Cm 0 ta[g][!] tagname
 | 
						|
X.Cm 0 una[bbr] [short]
 | 
						|
X.Cm 0 u[ndo]
 | 
						|
X.Cm 0 unm[ap][!] key
 | 
						|
X.Cm 0 ve[rsion]
 | 
						|
X.Cm 2 v[global] /regexp/ command
 | 
						|
X.Cm 0 vi[sual] [filename]
 | 
						|
X.Cm 0 wq 
 | 
						|
X.Cm 2 w[rite][!] [[>>]file]
 | 
						|
X.Cm 0 x[it][!]
 | 
						|
X.Cm 2 y[ank] [\*Ux]
 | 
						|
X.Cm 2 ! command
 | 
						|
X.Cm 2 < 
 | 
						|
X.Cm 2 = 
 | 
						|
X.Cm 2 > 
 | 
						|
X.Cm 2 & 
 | 
						|
X.Cm 0 @ "" \*Ux
 | 
						|
X.DE
 | 
						|
X.TA
 | 
						|
X.PP
 | 
						|
XTo use colon mode commands, you must switch from visual command
 | 
						|
Xmode to colon command mode.
 | 
						|
XThe visual mode commands to do this are ":" for a single colon command,
 | 
						|
Xor "Q" for many colon mode commands.
 | 
						|
X.NH 2
 | 
						|
XLine Specifiers
 | 
						|
X.PP
 | 
						|
XLine specifiers are always optional.
 | 
						|
XThe first line specifier of most commands usually defaults to the current line.
 | 
						|
XThe second line specifier usually defaults to be the same
 | 
						|
Xas the first line specifier.
 | 
						|
XExceptions are :write, :global, and :vglobal, which act on all lines of the
 | 
						|
Xfile by default, and :!, which acts on no lines by default.
 | 
						|
X.PP
 | 
						|
XLine specifiers consist of an absolute part and a relative part.
 | 
						|
XThe absolute part of a line specifier may be either an explicit line number,
 | 
						|
Xa mark, a dot to denote the current line, a dollar sign to denote the last
 | 
						|
Xline of the file, or a forward or backward search.
 | 
						|
X.PP
 | 
						|
XAn explicit line number is simply a decimal number, expressed as a
 | 
						|
Xstring of digits.
 | 
						|
X.PP
 | 
						|
XA mark is typed in as an apostrophe followed by a letter.
 | 
						|
XMarks must be set before they can be used.
 | 
						|
XYou can set a mark in visual command mode by typing "m" and a letter,
 | 
						|
Xor you can set it in colon command mode via the "mark" command.
 | 
						|
X.PP
 | 
						|
XA forward search is typed in as a regular expression surrounded by
 | 
						|
Xslash characters; searching begins at the default line.
 | 
						|
XA backward search is typed in as a regular expression surrounded by
 | 
						|
Xquestion marks; searching begins at the line before the default line.
 | 
						|
X.PP
 | 
						|
XIf you omit the absolute part, then the default line is used.
 | 
						|
X.PP
 | 
						|
XThe relative part of a line specifier is typed as a "+" or "-" character
 | 
						|
Xfollowed by a decimal number.
 | 
						|
XThe number is added to or subtracted from the absolute part
 | 
						|
Xof the line specifier to produce the final line number.
 | 
						|
X.PP
 | 
						|
XAs a special case, the % character may be used to specify all lines of the file.
 | 
						|
XIt is roughly equivelent to saying 1,$.
 | 
						|
XThis can be a handy shortcut.
 | 
						|
X.PP
 | 
						|
XSome examples:
 | 
						|
X.LD
 | 
						|
X.ps
 | 
						|
X.ta 0.5i 1.8i
 | 
						|
X	:p	print the current line
 | 
						|
X	:37p	print line 37
 | 
						|
X	:'gp	print the line which contains mark g
 | 
						|
X	:/foo/p	print the next line that contains "foo"
 | 
						|
X	:$p	print the last line of the file
 | 
						|
X	:20,30p	print lines 20 through 30
 | 
						|
X	:1,$p	print all lines of the file
 | 
						|
X	:%p	print all lines of the file
 | 
						|
X	:/foo/-2,+4p	print 5 lines around the next "foo"
 | 
						|
X.TA
 | 
						|
X.DE
 | 
						|
X.NH 2
 | 
						|
XText Entry Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line] append
 | 
						|
X[line][,line] change ["x]
 | 
						|
X[line] insert
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBa\fRppend command inserts text after the specified line.
 | 
						|
X.PP
 | 
						|
XThe \fBi\fRnsert command inserts text before the specified line.
 | 
						|
X.PP
 | 
						|
XThe \fBc\fRhange command copies the range of lines into a cut buffer,
 | 
						|
Xdeletes them, and inserts new text where the old text used to be.
 | 
						|
X.PP
 | 
						|
XFor all of these commands, you indicate the end of the text you're
 | 
						|
Xinserting by hitting ^D or by entering a line which contains only a
 | 
						|
Xperiod.
 | 
						|
X.NH 2
 | 
						|
XCut & Paste Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line][,line] delete ["x]
 | 
						|
X[line][,line] yank ["x]
 | 
						|
X[line] put ["x]
 | 
						|
X[line][,line] copy line
 | 
						|
X[line][,line] to line
 | 
						|
X[line][,line] move line
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBd\fRelete command copies the specified range of lines into a
 | 
						|
Xcut buffer, and then deletes them.
 | 
						|
X.PP
 | 
						|
XThe \fBy\fRank command copies the specified range of lines into a cut
 | 
						|
Xbuffer, but does *not* delete them.
 | 
						|
X.PP
 | 
						|
XThe \fBpu\fRt command inserts text from a cut buffer after the
 | 
						|
Xspecified line.
 | 
						|
X.PP
 | 
						|
XThe \fBco\fRpy and \fBt\fRo commands yank the specified range of lines and
 | 
						|
Xthen immediately paste them after some other line.
 | 
						|
X.PP
 | 
						|
XThe \fBm\fRove command deletes the specified range of lines and then
 | 
						|
Ximmediately pastes them after some other line.
 | 
						|
XIf the destination line comes after the deleted text,
 | 
						|
Xthen it will be adjusted automatically to account for the deleted lines.
 | 
						|
X.NH 2
 | 
						|
XDisplay Text Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line][,line] print
 | 
						|
X[line][,line] list
 | 
						|
X[line][,line] number
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBp\fRrint command displays the specified range of lines.
 | 
						|
X.PP
 | 
						|
XThe \fBnu\fRmber command displays the lines, with line numbers.
 | 
						|
X.PP
 | 
						|
XThe \fBl\fRist command also displays them, but it is careful to make
 | 
						|
Xcontrol characters visible.
 | 
						|
X.NH 2
 | 
						|
XGlobal Operations Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line][,line] global /regexp/ command
 | 
						|
X[line][,line] vglobal /regexp/ command
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBg\fRlobal command searches through the lines of the specified range
 | 
						|
X(or through the whole file if no range is specified)
 | 
						|
Xfor lines that contain a given regular expression.
 | 
						|
XIt then moves the cursor to each of these lines and
 | 
						|
Xruns some other command on them.
 | 
						|
X.PP
 | 
						|
XThe \fBv\fRglobal command is similar, but it searches for lines that \fIdon't\fR
 | 
						|
Xcontain the regular expression.
 | 
						|
X.NH 2
 | 
						|
XLine Editing Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line][,line] join[!]
 | 
						|
X[line][,line] ! program
 | 
						|
X[line][,line] <
 | 
						|
X[line][,line] >
 | 
						|
X[line][,line] substitute /regexp/replacement/[p][g][c]
 | 
						|
X[line][,line] &
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBj\fRoin command catenates all lines in the specified range together
 | 
						|
Xto form one big line.
 | 
						|
XIf only a single line is specified, then the following line is catenated
 | 
						|
Xonto it.
 | 
						|
XThe normal ":join" inserts one or two spaces between the lines;
 | 
						|
Xthe ":join!" variation (with a '!') doesn't insert spaces.
 | 
						|
X.PP
 | 
						|
XThe \fB!\fR command runs an external filter program,
 | 
						|
Xand feeds the specified range of lines to it's stdin.
 | 
						|
XThe lines are then replaced by the output of the filter.
 | 
						|
XA typical example would be ":'a,'z!sort" to sort the lines 'a,'z.
 | 
						|
X.PP
 | 
						|
XThe \fB<\fR and \fB>\fR commands shift the specified range of lines left or right,
 | 
						|
Xnormally by the width of 1 tab character.
 | 
						|
XThe "shiftwidth" option determines the shifting amount.
 | 
						|
X.PP
 | 
						|
XThe \fBs\fRubstitute command finds the regular expression in each line,
 | 
						|
Xand replaces it with the replacement text.
 | 
						|
XThe "p" option causes the altered lines to be printed.
 | 
						|
XThe "g" option permits all instances of the regular expression
 | 
						|
Xto be found & replaced.
 | 
						|
X(Without "g", only the first occurrence in each line is replaced.)
 | 
						|
XThe "c" option asks for confirmation before each substitution.
 | 
						|
X.PP
 | 
						|
XThe \fB&\fR command repeats the previous substitution command.
 | 
						|
XActually, "&" is equivelent to "s//~/" with the same options as last time.
 | 
						|
XIt searches for the last regular expression that you specified for any purpose,
 | 
						|
Xand replaces it with the the same text
 | 
						|
Xthat was used in the previous substitution.
 | 
						|
X.NH 2
 | 
						|
XUndo Command
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xundo
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBu\fRndo command restores the file to the state it was in before
 | 
						|
Xyour most recent command which changed text.
 | 
						|
X.NH 2
 | 
						|
XConfiguration & Status Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xmap[!] [key mapped_to]
 | 
						|
Xunmap[!] key
 | 
						|
Xabbr [word expanded_form_of_word]
 | 
						|
Xunabbr word
 | 
						|
Xdigraph[!] [XX [Y]]
 | 
						|
Xset [options]
 | 
						|
Xmkexrc
 | 
						|
X[line] mark "x
 | 
						|
Xvisual
 | 
						|
Xversion
 | 
						|
X[line][,line] =
 | 
						|
Xfile [file]
 | 
						|
Xsource file
 | 
						|
X@ "x
 | 
						|
Xcolor [when] [["light"] color] ["on" color]
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBma\fRp command allows you to configure \*E to recognize your function keys,
 | 
						|
Xand treat them as though they transmitted some other sequence of characters.
 | 
						|
XNormally this mapping is done only when in the visual command mode,
 | 
						|
Xbut with the [!] present it will map keys under input and replace modes as well.
 | 
						|
XWhen this command is given with no arguments,
 | 
						|
Xit prints a table showing all mappings currently in effect.
 | 
						|
XWhen called with two arguments, the first is the sequence that your
 | 
						|
Xfunction key really sends, and the second is the sequence that you want
 | 
						|
X\*E to treat it as having sent.
 | 
						|
XAs a special case, if the first argument is a number then \*E will map the
 | 
						|
Xcorresponding function key;
 | 
						|
Xfor example, ":map 7 dd" will cause the <F7> key to delete a line.
 | 
						|
X.PP
 | 
						|
XThe \fBunm\fRap command removes key definitions that were made via the map command.
 | 
						|
X.PP
 | 
						|
XThe \fBab\fRbr command is used to define/list a table of abbreviations.
 | 
						|
XThe table contains both the abbreviated form and the fully spelled-out form.
 | 
						|
XWhen you're in visual input mode, and you type in the abbreviated form,
 | 
						|
X\*E will replace the abbreviated form with the fully spelled-out form.
 | 
						|
XWhen this command is called without arguments, it lists the table;
 | 
						|
Xwith two or more arguments, the first argument is taken as the abbreviated
 | 
						|
Xform, and the rest of the command line is the fully-spelled out form.
 | 
						|
X.PP
 | 
						|
XThe \fBuna\fRbbr command deletes entries from the abbr table.
 | 
						|
X.PP
 | 
						|
XThe \fBdi\fRgraph command allows you to display the set of digraphs that \*E is
 | 
						|
Xusing, or add/remove a digraph.
 | 
						|
XTo list the set of digraphs, use the digraph command with no arguments.
 | 
						|
XTo add a digraph, you should give the digraph command two arguments.
 | 
						|
XThe first argument is the two ASCII characters that are to be combined;
 | 
						|
Xthe second is the non-ASCII character that they represent.
 | 
						|
XThe non-ASCII character's most significant bit is automatically set by the
 | 
						|
Xdigraph command, unless to append a ! to the command name.
 | 
						|
XRemoval of a digraph is similar to adding a digraph, except that you should
 | 
						|
Xleave off the second argument.
 | 
						|
X.PP
 | 
						|
XThe \fBse\fRt command allows you examine or set various options.
 | 
						|
XWith no arguments, it displays the values of options that have been changed.
 | 
						|
XWith the single argument "all" it displays the values of all options,
 | 
						|
Xregardless of whether they've been explicitly set or not.
 | 
						|
XOtherwise, the arguments are treated as options to be set.
 | 
						|
X.PP
 | 
						|
XThe \fBmk\fRexrc command saves the current configuration to a file
 | 
						|
Xcalled ".exrc" in the current directory.
 | 
						|
X.PP
 | 
						|
XThe mar\fBk\fR command defines a named mark to refer to a specific place
 | 
						|
Xin the file.
 | 
						|
XThis mark may be used later to specify lines for other commands.
 | 
						|
X.PP
 | 
						|
XThe \fBvi\fRsual command puts the editor into visual mode.
 | 
						|
XInstead of emulating ex, \*E will start emulating vi.
 | 
						|
X.PP
 | 
						|
XThe \fBve\fRrsion command tells you that what version of \*E this is.
 | 
						|
X.PP
 | 
						|
XThe \fB=\fR command tells you what line you specified, or,
 | 
						|
Xif you specified a range of lines, it will tell you both endpoints and
 | 
						|
Xthe number of lines included in the range.
 | 
						|
X.PP
 | 
						|
XThe \fBf\fRile command tells you the name of the file,
 | 
						|
Xwhether it has been modified,
 | 
						|
Xthe number of lines in the file,
 | 
						|
Xand the current line number.
 | 
						|
XYou can also use it to change the name of the current file.
 | 
						|
X.PP
 | 
						|
XThe \fBso\fRurce command reads a sequence of colon mode commands from a file,
 | 
						|
Xand interprets them.
 | 
						|
X.PP
 | 
						|
XThe \fB@\fR command executes the contents of a cut-buffer as EX commands.
 | 
						|
X.PP
 | 
						|
XThe \fBcol\fRor command only works under MS-DOS, or if you have an ANSI-compatible
 | 
						|
Xcolor terminal.
 | 
						|
XIt allows you to set the foreground and background colors
 | 
						|
Xfor different types of text:
 | 
						|
Xnormal, bold, italic, underlined, standout, pop-up menu, and visible selection.
 | 
						|
XBy default, it changes the "normal" colors;
 | 
						|
Xto change other colors, the first argument to the :color command should be
 | 
						|
Xthe first letter of the type of text you want.
 | 
						|
XThe syntax for the colors themselves is fairly intuitive.
 | 
						|
XFor example, ":color light cyan on blue" causes normal text to be displayed
 | 
						|
Xin light cyan on a blue background, and
 | 
						|
X":color b bright white" causes bold text to be displayed in bright white on
 | 
						|
Xa blue background.
 | 
						|
XThe background color always defaults to the current background color of
 | 
						|
Xnormal text.
 | 
						|
XYour first :color command \fImust\fP specify both the foreground and background
 | 
						|
Xfor normal text.
 | 
						|
X.NH 2
 | 
						|
XMultiple File Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xargs [files]
 | 
						|
Xnext[!] [files]
 | 
						|
XNext[!]
 | 
						|
Xprevious[!]
 | 
						|
Xrewind[!]
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XWhen you invoke \*E from your shell's command line,
 | 
						|
Xany filenames that you give to \*E as arguments are stored in the args list.
 | 
						|
XThe \fBar\fRgs command will display this list, or define a new one.
 | 
						|
X.PP
 | 
						|
XThe \fBn\fRext command switches from the current file to the next one
 | 
						|
Xin the args list.
 | 
						|
XYou may specify a new args list here, too.
 | 
						|
X.PP
 | 
						|
XThe \fBN\fRext and \fBpre\fRvious commands
 | 
						|
X(they're really aliases for the same command)
 | 
						|
Xswitch from the current file to the preceding file in the args list.
 | 
						|
X.PP
 | 
						|
XThe \fBrew\fRind command switches from the current file to the first file
 | 
						|
Xin the args list.
 | 
						|
X.NH 2
 | 
						|
XSwitching Files
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xedit[!] [file]
 | 
						|
Xtag[!] tagname
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBe\fRdit command allows to switch from the current file to some other file.
 | 
						|
XThis has nothing to do with the args list, by the way.
 | 
						|
X.PP
 | 
						|
XThe \fBta\fRg command looks up a given tagname in a file called "tags".
 | 
						|
XThis tells it which file the tag is in, and how to find it in that file.
 | 
						|
X\*E then switches to the tag's file and finds the tag.
 | 
						|
X.NH 2
 | 
						|
XWorking with a Compiler
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xcc [files]
 | 
						|
Xmake [target]
 | 
						|
Xerrlist[!] [errlist]
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBcc\fR and \fBmak\fRe commands execute your compiler or "make" utility
 | 
						|
Xand redirect any error messages into a file called "errlist".
 | 
						|
XBy default, cc is run on the current file.
 | 
						|
X(You should write it before running cc.)
 | 
						|
XThe contents of the "errlist" file are then scanned for error messages.
 | 
						|
XIf an error message is found, then the cursor is moved to the line where
 | 
						|
Xthe error was detected,
 | 
						|
Xand the description of the error is displayed on the status line.
 | 
						|
X.PP
 | 
						|
XAfter you've fixed one error, the \fBer\fRrlist command will move
 | 
						|
Xthe cursor to the next error.
 | 
						|
XIn visual command mode,
 | 
						|
Xhitting `*' will do this, too.
 | 
						|
X.PP
 | 
						|
XYou can also create an "errlist" file from outside of \*E,
 | 
						|
Xand use "\*E -m" to start elvis and have the cursor moved to the
 | 
						|
Xfirst error.
 | 
						|
XNote that you don't need to supply a filename with "\*E -m" because
 | 
						|
Xthe error messages always say which source file an error is in.
 | 
						|
X.PP
 | 
						|
XNote:
 | 
						|
XWhen you use errlist repeatedly to fix several errors in a single file,
 | 
						|
Xit will attempt to adjust the reported line numbers to allow for lines
 | 
						|
Xthat you have inserted or deleted.
 | 
						|
XThese adjustments are made with the assumption that you will work though
 | 
						|
Xthe file from the beginning to the end.
 | 
						|
X.NH 2
 | 
						|
XExit Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xquit[!]
 | 
						|
Xwq
 | 
						|
Xxit
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBq\fRuit command exits from the editor without saving your file.
 | 
						|
X.PP
 | 
						|
XThe \fBwq\fR command writes your file out, then then exits.
 | 
						|
X.PP
 | 
						|
XThe \fBx\fRit command is similar to the \fBwq\fR command, except that
 | 
						|
X\fBx\fRit won't bother to write your file if you haven't modified it.
 | 
						|
X.NH 2
 | 
						|
XFile I/O Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line] read file
 | 
						|
X[line][,line] write[!] [[>>]file]
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBr\fRead command gets text from another file and inserts it
 | 
						|
Xafter the specified line.
 | 
						|
XIt can also read the output of a program;
 | 
						|
Xsimply precede the program name by a '!' and use it in place of the file name.
 | 
						|
X.PP
 | 
						|
XThe \fBw\fRrite command writes the whole file, or just part of it,
 | 
						|
Xto some other file.
 | 
						|
XThe !, if present, will permit the lines to be written even if you've set
 | 
						|
Xthe readonly option.
 | 
						|
XIf you precede the filename by >> then the lines will be appended to the file.
 | 
						|
XYou can send the lines to the standard input of a program by replacing the
 | 
						|
Xfilename with a '!' followed by the command and its arguments.
 | 
						|
X.PP
 | 
						|
XNote: Be careful not to confuse ":w!filename" and ":w !command".
 | 
						|
XTo write to a program, you must have at least one blank before the '!'.
 | 
						|
X.NH 2
 | 
						|
XDirectory Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
Xcd [directory]
 | 
						|
Xchdir [directory]
 | 
						|
Xshell
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThe \fBcd\fR and \fBchd\fRir commands
 | 
						|
X(really two names for one command)
 | 
						|
Xswitch the current working directory.
 | 
						|
X.PP
 | 
						|
XThe \fBsh\fRell command starts an interactive shell.
 | 
						|
X.NH 2
 | 
						|
XDebugging Commands
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X.ps
 | 
						|
X[line][,line] debug[!]
 | 
						|
Xvalidate[!]
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThese commands are only available if you compile \*E with the -DDEBUG flag.
 | 
						|
X.PP
 | 
						|
XThe de\fBb\fRug command lists statistics for the blocks which contain
 | 
						|
Xthe specified range of lines.
 | 
						|
XIf the ! is present, then the contents of those blocks is displayed, too.
 | 
						|
X.PP
 | 
						|
XThe \fBva\fRlidate command checks certain variables for internal consistency.
 | 
						|
XNormally it doesn't output anything unless it detects a problem.
 | 
						|
XWith the !, though, it will always produce *some* output.
 | 
						|
/
 | 
						|
echo x - index.ms
 | 
						|
sed '/^X/s///' > index.ms << '/'
 | 
						|
X.XS 1
 | 
						|
XINTRODUCTION
 | 
						|
XWhat E\s-2LVIS\s+2 does,
 | 
						|
XCopyright,
 | 
						|
XHow to compile E\s-2LVIS\s+2,
 | 
						|
XOverview
 | 
						|
X.XA 2
 | 
						|
XVISUAL MODE COMMANDS
 | 
						|
XNormal interactive editing,
 | 
						|
XInput mode,
 | 
						|
XArrow keys,
 | 
						|
XDigraphs,
 | 
						|
XAbbreviations,
 | 
						|
XAuto-indentation
 | 
						|
X.XA 3
 | 
						|
XCOLON MODE COMMANDS
 | 
						|
XLine specifiers,
 | 
						|
XText entry,
 | 
						|
XCut & paste,
 | 
						|
XDisplay text,
 | 
						|
XGlobal operations,
 | 
						|
XLine editing,
 | 
						|
XUndo,
 | 
						|
XConfiguration & status,
 | 
						|
XMultiple files,
 | 
						|
XSwitching files,
 | 
						|
XWorking with a compiler,
 | 
						|
XExiting,
 | 
						|
XFile I/O,
 | 
						|
XDirectory & shell,
 | 
						|
XDebugging
 | 
						|
X.XA 4
 | 
						|
XREGULAR EXPRESSIONS
 | 
						|
XSyntax,
 | 
						|
XOptions,
 | 
						|
XSubstitutions,
 | 
						|
XExamples
 | 
						|
X.XA 5
 | 
						|
XOPTIONS
 | 
						|
XAutoindent,
 | 
						|
XAutoprint,
 | 
						|
Xetc.
 | 
						|
X.XA 6
 | 
						|
XCUT BUFFERS
 | 
						|
XPutting text into a cut buffer,
 | 
						|
XPasting from a cut buffer,
 | 
						|
XMacros,
 | 
						|
XThe effect of switching files
 | 
						|
X.XA 7
 | 
						|
XDIFFERENCES BETWEEN E\s-2LVIS\s+2 AND THE REAL VI/EX
 | 
						|
XExtensions,
 | 
						|
XOmissions
 | 
						|
X.XA 8
 | 
						|
XINTERNAL
 | 
						|
XFor programmers only,
 | 
						|
XThe temporary file,
 | 
						|
XImplementation of editing,
 | 
						|
XMarks and the cursor,
 | 
						|
XColon command interpretation,
 | 
						|
XScreen control,
 | 
						|
XPortability
 | 
						|
X.XA 9
 | 
						|
XCFLAGS
 | 
						|
X.XA 10
 | 
						|
XTERMCAP
 | 
						|
X.XA 11
 | 
						|
XENVIRONMENT VARIABLES
 | 
						|
X.XA 12
 | 
						|
XVERSIONS
 | 
						|
X.XA 13
 | 
						|
XQUESTIONS & ANSWERS
 | 
						|
X.XE
 | 
						|
X.PX
 | 
						|
X.sp 0.3i
 | 
						|
X.ce 1
 | 
						|
XUNIX-style "man" pages appear at the end of this manual.
 | 
						|
/
 | 
						|
echo x - internal.ms
 | 
						|
sed '/^X/s///' > internal.ms << '/'
 | 
						|
X.Go 8 "INTERNAL"
 | 
						|
X.PP
 | 
						|
XYou don't need to know the material in this section to use \*E.
 | 
						|
XYou only need it if you intend to modify \*E.
 | 
						|
X.PP
 | 
						|
XYou should also check out the CFLAGS, TERMCAP, ENVIRONMENT VARIABLES,
 | 
						|
XVERSIONS, and QUIESTIONS & ANSWERS sections of this manual.
 | 
						|
X.NH 2
 | 
						|
XThe temporary file
 | 
						|
X.PP
 | 
						|
XThe temporary file is divided into blocks of 1024 bytes each.
 | 
						|
XThe functions in "blk.c" maintain a cache of the five most recently used blocks,
 | 
						|
Xto minimize file I/O.
 | 
						|
X.PP
 | 
						|
XWhen \*E starts up, the file is copied into the temporary file
 | 
						|
Xby the function \fBtmpstart()\fR in "tmp.c".
 | 
						|
XSmall amounts of extra space are inserted into the temporary file to
 | 
						|
Xinsure that no text lines cross block boundaries.
 | 
						|
XThis speeds up processing and simplifies storage management.
 | 
						|
XThe extra space is filled with NUL characters.
 | 
						|
Xthe input file must not contain any NULs, to avoid confusion.
 | 
						|
XThis also limits lines to a length of 1023 characters or less.
 | 
						|
X.PP
 | 
						|
XThe data blocks aren't necessarily stored in sequence.
 | 
						|
XFor example, it is entirely possible that the data block containing
 | 
						|
Xthe first lines of text will be stored after the block containing the
 | 
						|
Xlast lines of text.
 | 
						|
X.PP
 | 
						|
XIn RAM, \*E maintains two lists: one that describes the "proper"
 | 
						|
Xorder of the disk blocks, and another that records the line number of
 | 
						|
Xthe last line in each block.
 | 
						|
XWhen \*E needs to fetch a given line of text, it uses these tables
 | 
						|
Xto locate the data block which contains that line.
 | 
						|
X.PP
 | 
						|
XBefore each change is made to the file, these lists are copied.
 | 
						|
XThe copies can be used to "undo" the change.
 | 
						|
XAlso, the first list
 | 
						|
X-- the one that lists the data blocks in their proper order --
 | 
						|
Xis written to the first data block of the temp file.
 | 
						|
XThis list can be used during file recovery.
 | 
						|
X.PP
 | 
						|
XWhen blocks are altered, they are rewritten to a \fIdifferent\fR block in the file,
 | 
						|
Xand the order list is updated accordingly.
 | 
						|
XThe original block is left intact, so that "undo" can be performed easily.
 | 
						|
X\*E will eventually reclaim the original block, when it is no longer needed.
 | 
						|
X.NH 2
 | 
						|
XImplementation of Editing
 | 
						|
X.PP
 | 
						|
XThere are three basic operations which affect text:
 | 
						|
X.ID
 | 
						|
X\(bu delete text	- delete(from, to)
 | 
						|
X\(bu add text	- add(at, text)
 | 
						|
X\(bu yank text	- cut(from, to)
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XTo yank text, all text between two text positions is copied into a cut buffer.
 | 
						|
XThe original text is not changed.
 | 
						|
XTo copy the text into a cut buffer,
 | 
						|
Xyou need only remember which physical blocks that contain the cut text,
 | 
						|
Xthe offset into the first block of the start of the cut,
 | 
						|
Xthe offset into the last block of the end of the cut,
 | 
						|
Xand what kind of cut it was.
 | 
						|
X(Cuts may be either character cuts or line cuts;
 | 
						|
Xthe kind of a cut affects the way it is later "put".)
 | 
						|
XYanking is implemented in the function \fBcut()\fR,
 | 
						|
Xand pasting is implemented in the function \fBpaste()\fR.
 | 
						|
XThese functions are defined in "cut.c".
 | 
						|
X.PP
 | 
						|
XTo delete text, you must modify the first and last blocks, and
 | 
						|
Xremove any reference to the intervening blocks in the header's list.
 | 
						|
XThe text to be deleted is specified by two marks.
 | 
						|
XThis is implemented in the function \fBdelete()\fR.
 | 
						|
X.PP
 | 
						|
XTo add text, you must specify
 | 
						|
Xthe text to insert (as a NUL-terminated string)
 | 
						|
Xand the place to insert it (as a mark).
 | 
						|
XThe block into which the text is to be inserted may need to be split into
 | 
						|
Xas many as four blocks, with new intervening blocks needed as well...
 | 
						|
Xor it could be as simple as modifying a single block.
 | 
						|
XThis is implemented in the function \fBadd()\fR.
 | 
						|
X.PP
 | 
						|
XThere is also a \fBchange()\fR function,
 | 
						|
Xwhich generally just calls delete() and add().
 | 
						|
XFor the special case where a single character is being replaced by another
 | 
						|
Xsingle character, though, change() will optimize things somewhat.
 | 
						|
XThe add(), delete(), and change() functions are all defined in "modify.c".
 | 
						|
X.PP
 | 
						|
XThe \fBinput()\fR function reads text from a user and inserts it into the file.
 | 
						|
XIt makes heavy use of the add(), delete(), and change() functions.
 | 
						|
XIt inserts characters one at a time, as they are typed.
 | 
						|
X.PP
 | 
						|
XWhen text is modified, an internal file-revision counter, called \fBchanges\fR,
 | 
						|
Xis incremented.
 | 
						|
XThis counter is used to detect when certain caches are out of date.
 | 
						|
X(The "changes" counter is also incremented when we switch to a different file,
 | 
						|
Xand also in one or two similar situations -- all related to invalidating caches.)
 | 
						|
X.NH 2
 | 
						|
XMarks and the Cursor
 | 
						|
X.PP
 | 
						|
XMarks are places within the text.
 | 
						|
XThey are represented internally as 32-bit values which are split
 | 
						|
Xinto two bitfields:
 | 
						|
Xa line number and a character index.
 | 
						|
XLine numbers start with 1, and character indexes start with 0.
 | 
						|
XLines can be up to 1023 characters long, so the character index is 10 bits
 | 
						|
Xwide and the line number fills the remaining 22 bits in the long int.
 | 
						|
X.PP
 | 
						|
XSince line numbers start with 1,
 | 
						|
Xit is impossible for a valid mark to have a value of 0L.
 | 
						|
X0L is therefore used to represent unset marks.
 | 
						|
X.PP
 | 
						|
XWhen you do the "delete text" change, any marks that were part of
 | 
						|
Xthe deleted text are unset, and any marks that were set to points
 | 
						|
Xafter it are adjusted.
 | 
						|
XMarks are adjusted similarly after new text is inserted.
 | 
						|
X.PP
 | 
						|
XThe cursor is represented as a mark.
 | 
						|
X.NH 2
 | 
						|
XColon Command Interpretation
 | 
						|
X.PP
 | 
						|
XColon commands are parsed, and the command name is looked up in an array
 | 
						|
Xof structures which also contain a pointer to the function that implements
 | 
						|
Xthe command, and a description of the arguments that the command can take.
 | 
						|
XIf the command is recognized and its arguments are legal,
 | 
						|
Xthen the function is called.
 | 
						|
X.PP
 | 
						|
XEach function performs its task; this may cause the cursor to be
 | 
						|
Xmoved to a different line, or whatever.
 | 
						|
X.NH 2
 | 
						|
XScreen Control
 | 
						|
X.PP
 | 
						|
XIn input mode or visual command mode,
 | 
						|
Xthe screen is redrawn by a function called \fBredraw()\fR.
 | 
						|
XThis function is called in the getkey() function before each keystroke is
 | 
						|
Xread in, if necessary.
 | 
						|
X.PP
 | 
						|
XRedraw() write to the screen via a package which looks like the "curses"
 | 
						|
Xlibrary, but isn't.
 | 
						|
XIt is actually much simpler.
 | 
						|
XMost curses operations are implemented as macros which copy characters
 | 
						|
Xinto a large I/O buffer, which is then written with a single large
 | 
						|
Xwrite() call as part of the refresh() operation.
 | 
						|
X.PP
 | 
						|
X(Note: Under MS-DOS, the pseudo-curses macros check to see whether you're
 | 
						|
Xusing the pcbios interface.  If you are, then the macros call functions
 | 
						|
Xin "pc.c" to implement screen updates.)
 | 
						|
X.PP
 | 
						|
XThe low-level functions which modify text (namely add(), delete(), and change())
 | 
						|
Xsupply redraw() with clues to help redraw() decide which parts of the
 | 
						|
Xscreen must be redrawn.
 | 
						|
XThe clues are given via a function called \fBredrawrange()\fR.
 | 
						|
X.PP
 | 
						|
XMost EX commands use the pseudo-curses package to perform their output,
 | 
						|
Xlike redraw().
 | 
						|
X.PP
 | 
						|
XThere is also a function called \fBmsg()\fR which uses the same syntax as printf().
 | 
						|
XIn EX mode, msg() writes message to the screen and automatically adds a
 | 
						|
Xnewline.
 | 
						|
XIn VI mode, msg() writes the message on the bottom line of the screen
 | 
						|
Xwith the "standout" character attribute turned on.
 | 
						|
X.NH 2
 | 
						|
XOptions
 | 
						|
X.PP
 | 
						|
XFor each option available through the ":set" command,
 | 
						|
X\*E contains a character array variable, named "o_\fIoption\fR".
 | 
						|
XFor example, the "lines" option uses a variable called "o_lines".
 | 
						|
X.PP
 | 
						|
XFor boolean options, the array has a dimension of 1.
 | 
						|
XThe first (and only) character of the array will be NUL if the
 | 
						|
Xvariable's value is FALSE, and some other value if it is TRUE.
 | 
						|
XTo check the value, just by dereference the array name,
 | 
						|
Xas in "if (*o_autoindent)".
 | 
						|
X.PP
 | 
						|
XFor number options, the array has a dimension of 3.
 | 
						|
XThe array is treated as three unsigned one-byte integers.
 | 
						|
XThe first byte is the current value of the option.
 | 
						|
XThe second and third bytes are the lower and upper bounds of that
 | 
						|
Xoption.
 | 
						|
X.PP
 | 
						|
XFor string options, the array usually has a dimension of about 60
 | 
						|
Xbut this may vary.
 | 
						|
XThe option's value is stored as a normal NUL-terminated string.
 | 
						|
X.PP
 | 
						|
XAll of the options are declared in "opts.c".
 | 
						|
XMost are initialized to their default values;
 | 
						|
Xthe \fBinitopts()\fR function is used to perform any environment-specific
 | 
						|
Xinitialization.
 | 
						|
X.NH 2
 | 
						|
XPortability
 | 
						|
X.PP
 | 
						|
XTo improve portability, \*E collects as many of the system-dependent
 | 
						|
Xdefinitions as possible into the "config.h" file.
 | 
						|
XThis file begins with some preprocessor instructions which attempt to
 | 
						|
Xdetermine which compiler and operating system you have.
 | 
						|
XAfter that, it conditionally defines some macros and constants for your system.
 | 
						|
X.PP
 | 
						|
XOne of the more significant macros is \fBttyread()\fR.
 | 
						|
XThis macro is used to read raw characters from the keyboard, possibly
 | 
						|
Xwith timeout.
 | 
						|
XFor UNIX systems, this basically reads bytes from stdin.
 | 
						|
XFor MSDOS, TOS, and OS9, ttyread() is a function defined in curses.c.
 | 
						|
XThere is also a \fBttywrite()\fR macro.
 | 
						|
X.PP
 | 
						|
XThe \fBtread()\fR and \fBtwrite()\fR macros are versions of read() and write() that are
 | 
						|
Xused for text files.
 | 
						|
XOn UNIX systems, these are equivelent to read() and write().
 | 
						|
XOn MS-DOS, these are also equivelent to read() and write(),
 | 
						|
Xsince DOS libraries are generally clever enough to convert newline characters
 | 
						|
Xautomatically.
 | 
						|
XFor Atari TOS, though, the MWC library is too stupid to do this,
 | 
						|
Xso we had to do the conversion explicitly.
 | 
						|
X.PP
 | 
						|
XOther macros may substitute index() for strchr(), or bcopy() for memcpy(),
 | 
						|
Xor map the "void" data type to "int", or whatever.
 | 
						|
X.PP
 | 
						|
XThe file "tinytcap.c" contains a set of functions that emulate the termcap
 | 
						|
Xlibrary for a small set of terminal types.
 | 
						|
XThe terminal-specific info is hard-coded into this file.
 | 
						|
XIt is only used for systems that don't support real termcap.
 | 
						|
XAnother alternative for screen control can be seen in
 | 
						|
Xthe "curses.h" and "pc.c" files.
 | 
						|
XHere, macros named VOIDBIOS and CHECKBIOS are used to indirectly call
 | 
						|
Xfunctions which perform low-level screen manipulation via BIOS calls.
 | 
						|
X.PP
 | 
						|
XThe stat() function must be able to come up with UNIX-style major/minor/inode
 | 
						|
Xnumbers that uniquely identify a file or directory.
 | 
						|
X.PP
 | 
						|
XPlease try to keep you changes localized,
 | 
						|
Xand wrap them in #if/#endif pairs,
 | 
						|
Xso that \*E can still be compiled on other systems.
 | 
						|
XAnd PLEASE let me know about it, so I can incorporate your changes into
 | 
						|
Xmy latest-and-greatest version of \*E.
 | 
						|
/
 | 
						|
echo x - intro.ms
 | 
						|
sed '/^X/s///' > intro.ms << '/'
 | 
						|
X.Go 1 "INTRODUCTION"
 | 
						|
X.PP
 | 
						|
X\*E is a clone of vi/ex, the standard UNIX editor.
 | 
						|
X\*E supports nearly all of the vi/ex commands,
 | 
						|
Xin both visual mode and colon mode.
 | 
						|
X.PP
 | 
						|
XLike vi/ex, \*E stores most of the text in a temporary file, instead of RAM.
 | 
						|
XThis allows it to edit files that are too large to fit
 | 
						|
Xin a single process' data space.
 | 
						|
XAlso, the edit buffer can survive a power failure or crash.
 | 
						|
X.PP
 | 
						|
X\*E runs under BSD UNIX, AT&T SysV UNIX, Minix, MS-DOS, Atari TOS,
 | 
						|
XCoherent, OS9/68000, VMS and AmigaDos.
 | 
						|
XThe next version is also expected to add MS-Windows, OS/2 and MacOS.
 | 
						|
XContact me before you start porting it to some other OS,
 | 
						|
Xbecause somebody else may have already done it for you.
 | 
						|
X.PP
 | 
						|
X\*E is freely redistributable, in either source form or executable form.
 | 
						|
XThere are no restrictions on how you may use it.
 | 
						|
X.NH 2
 | 
						|
XCompiling
 | 
						|
X.PP
 | 
						|
XSee the "Versions" section of this manual for instructions on how to compile
 | 
						|
X\*E.
 | 
						|
X.PP
 | 
						|
XIf you want to port \*E to another O.S. or compiler, then
 | 
						|
Xyou should start be reading the "Portability" part of the "Internal" section.
 | 
						|
X.NH 2
 | 
						|
XOverview of \*E
 | 
						|
X.PP
 | 
						|
XThe user interface of \*E/vi/ex is weird.
 | 
						|
XThere are two major command modes in \*E, and a few text input modes as well.
 | 
						|
XEach command mode has a command which allows you to switch to the other mode.
 | 
						|
X.PP
 | 
						|
XYou will probably use the \fIvisual command mode\fR
 | 
						|
Xmost of the time.
 | 
						|
XThis is the mode that \*E normally starts up in.
 | 
						|
X.PP
 | 
						|
XIn visual command mode, the entire screen is filled with lines of text
 | 
						|
Xfrom your file.
 | 
						|
XEach keystroke is interpretted as part of a visual command.
 | 
						|
XIf you start typing text, it will \fInot\fR be inserted,
 | 
						|
Xit will be treated as part of a command.
 | 
						|
XTo insert text, you must first give an "insert text" command.
 | 
						|
XThis will take some getting used to.
 | 
						|
X(An alternative exists.
 | 
						|
XLookup the "inputmode" option.)
 | 
						|
X.PP
 | 
						|
XThe \fIcolon mode\fR is quite different.
 | 
						|
X\*E displays a ":" character on the bottom line of the screen, as a prompt.
 | 
						|
XYou are then expected to type in a command line and hit the <Return> key.
 | 
						|
XThe set of commands recognized in the colon mode is different
 | 
						|
Xfrom visual mode's.
 | 
						|
/
 | 
						|
echo x - options.ms
 | 
						|
sed '/^X/s///' > options.ms << '/'
 | 
						|
X.Go 5 "OPTIONS"
 | 
						|
X.PP
 | 
						|
XOptions may be set or examined via the colon command "set".
 | 
						|
XThe values of options will affect the operation of later commands.
 | 
						|
X.PP
 | 
						|
XFor convenience, options have both a long descriptive name and a short name
 | 
						|
Xwhich is easy to type.
 | 
						|
XYou may use either name interchangably.
 | 
						|
XI like the short names, myself.
 | 
						|
X.PP
 | 
						|
XThere are three types of options: Boolean, string, and numeric.
 | 
						|
XBoolean options are made TRUE by giving the name of the option as an
 | 
						|
Xargument to the "set" command;
 | 
						|
Xthey are made FALSE by prefixing the name with "no".
 | 
						|
XFor example, "set autoindent" makes the autoindent option TRUE,
 | 
						|
Xand "set noautoindent" makes it FALSE.
 | 
						|
X\*E also allows boolean options to be toggled by prefixing the name with "neg".
 | 
						|
XSo, ":map g :set neglist^M" will cause the <g> key to alternately toggle the
 | 
						|
X"list" option on and off.
 | 
						|
X(The "neg" prefix is an extension; the real vi doesn't support it.)
 | 
						|
X.PP
 | 
						|
XTo change the value of a string or numeric option, pass the "set" command
 | 
						|
Xthe name of the option, followed by an "=" sign and the option's new value.
 | 
						|
XFor example, "set tabstop=8" will give the tabstop option a value of 8.
 | 
						|
XFor string options, you may enclose the new value in quotes.
 | 
						|
X.LD
 | 
						|
X.ta 1.9i 2.4i 3.8i
 | 
						|
X.ps +2
 | 
						|
X\fBNAMES	TYPE	DEFAULT	MEANING\fP
 | 
						|
X.ps
 | 
						|
Xautoindent, ai	Bool	noai	auto-indent during input
 | 
						|
Xautoprint, ap	Bool	ap	in EX, print the current line
 | 
						|
Xautotab, at	Bool	at	auto-indent allowed to use tabs?
 | 
						|
Xautowrite, aw	Bool	noaw	auto-write when switching files
 | 
						|
Xbeautify,  bf	Bool	nobf	strip control chars from file?
 | 
						|
Xcharattr, ca	Bool	noca	interpret \\fX sequences?
 | 
						|
Xcc, cc	Str	cc="cc -c"	name of the C compiler
 | 
						|
Xcolumns, co	Num	co=80	width of the screen
 | 
						|
Xdigraph, dig	Bool	nodig	recognize digraphs?
 | 
						|
Xdirectory, dir	Str	dir="/usr/tmp"	where tmp files are kept
 | 
						|
Xedcompatible, ed	Bool	noed	remember ":s//" options
 | 
						|
Xequalprg, ep	Bool	ep="fmt"	program to run for = operator
 | 
						|
Xerrorbells, eb	Bool	eb	ring bell on error
 | 
						|
Xexrc, exrc	Bool	noexrc	read "./.exrc" file?
 | 
						|
Xexrefresh, er	Bool	er	write lines indiviually in EX
 | 
						|
Xflash, vbell	Bool	flash	use visible alternative to bell
 | 
						|
Xflipcase, fc	Str	fc=""	non-ASCII chars flipped by ~
 | 
						|
Xhideformat, hf	Bool	hf	hide text formatter commands
 | 
						|
Xignorecase, ic	Bool	noic	upper/lowercase match in search
 | 
						|
Xinputmode, im	Bool	noim	start vi in insert mode?
 | 
						|
Xkeytime, kt	Num	kt=2	timeout for mapped key entry
 | 
						|
Xkeywordprg, kp	Str	kp="ref"	full pathname of shift-K prog
 | 
						|
Xlines, ln	Num	ln=25	number of lines on the screen
 | 
						|
Xlist, li	Bool	noli	display lines in "list" mode
 | 
						|
Xmagic, ma	Bool	ma	use regular expression in search
 | 
						|
Xmake, mk	Str	mk="make"	name of the "make" program
 | 
						|
Xmesg, ms	Bool	ms	allow messages from other users?
 | 
						|
Xmodelines, ml	Bool	noml	are modelines processed?
 | 
						|
Xmore, more	Bool	more	pause between messages?
 | 
						|
Xnovice, nov	Bool	nonovice	set options for ease of use
 | 
						|
Xparagraphs, para	Str	para="PPppIPLPQP"	names of "paragraph" nroff cmd
 | 
						|
Xprompt, pr	Bool	pr	show ':' prompt in \fIex\fR mode
 | 
						|
Xreadonly, ro	Bool	noro	prevent overwriting of orig file
 | 
						|
Xremap, rem	Bool	remap	allow key maps to call key maps
 | 
						|
Xreport, re	Num	re=5	report when 5 or more changes
 | 
						|
Xruler, ru	Bool	noru	display line/column numbers
 | 
						|
Xscroll, sc	Num	sc=12	scroll amount for ^U and ^D
 | 
						|
Xsections, sect	Str	sect="NHSHSSSEse"	names of "section" nroff cmd
 | 
						|
Xshell, sh	Str	sh="/bin/sh"	full pathname of the shell
 | 
						|
Xshowmatch, sm	Bool	nosm	show matching ()[]{}
 | 
						|
Xshowmode, smd	Bool	nosmd	say when we're in input mode
 | 
						|
Xshiftwidth, sw	Num	sw=8	shift amount for < and >
 | 
						|
Xsidescroll, ss	Num	ss=8	amount of sideways scrolling
 | 
						|
Xsync, sy	Bool	nosy	call sync() often
 | 
						|
Xtabstop, ts	Num	ts=8	width of tab characters
 | 
						|
Xtaglength, tl	Num	tl=0	significant chars in tag name
 | 
						|
Xterm, te	Str	te="$TERM"	name of the termcap entry
 | 
						|
Xterse, tr	Bool	notr	give shorter error messages
 | 
						|
Xtimeout, to	Bool	to	distinguish <esc> from <arrow>?
 | 
						|
Xwarn, wa	Bool	wa	warn for ! if file modified
 | 
						|
Xwindow, wi	Num	wi=24	lines to redraw after long move
 | 
						|
Xwrapmargin, wm	Num	wm=0	wrap long lines in input mode
 | 
						|
Xwrapscan, ws	Bool	ws	at EOF, searches wrap to line 1
 | 
						|
Xwriteany, wr	Bool	nowr	allow :w to clobber files
 | 
						|
X.DE
 | 
						|
X.TA
 | 
						|
X.ne 6
 | 
						|
X.IP "autoindent, ai"
 | 
						|
XDuring input mode, the autoindent option will cause each added line
 | 
						|
Xto begin with the same amount of leading whitespace as the line above it.
 | 
						|
XWithout autoindent, added lines are initially empty.
 | 
						|
X.IP "autoprint, ap"
 | 
						|
XThis option only affects EX mode.
 | 
						|
XIf the autoprint option on,
 | 
						|
Xand either the cursor has moved to a different line
 | 
						|
Xor the previous command modified the file,
 | 
						|
Xthen \*E will print the current line.
 | 
						|
X.IP "autotab, at"
 | 
						|
XThis option affects the behaviour of the autoindent mode.
 | 
						|
XIf autoindent is turned off, then autotab has no effect.
 | 
						|
X.IP
 | 
						|
XWhen autotab is turned on, elvis will use a mixture of spaces and tabs
 | 
						|
Xto create the proper amount of indentation.
 | 
						|
XThis is the default.
 | 
						|
X.IP
 | 
						|
XWhen autotab is turned off, elvis will only use spaces for auto-indent.
 | 
						|
X\*E will still insert a real tab character when you hit the <Tab> key, though;
 | 
						|
Xthe autotab option only affects \fIautomatic\fR indentation.
 | 
						|
X.IP "autowrite, aw"
 | 
						|
XWhen you're editing one file and decide to switch to another
 | 
						|
X\- via the :tag command, or :next command, perhaps \-
 | 
						|
Xif your current file has been modified,
 | 
						|
Xthen \*E will normally print an error message and refuse to switch.
 | 
						|
X.IP
 | 
						|
XHowever, if the autowrite option is on,
 | 
						|
Xthen \*E will write the modified version of the current file
 | 
						|
Xand successfully switch to the new file.
 | 
						|
X.IP "beautify, bf"
 | 
						|
XThis option causes all control characters to be deleted from the text file,
 | 
						|
Xat the time when you start editing it.
 | 
						|
XIf you're already editing a file when you turn on the beautify option,
 | 
						|
Xthen that file won't be affected.
 | 
						|
X.IP cc
 | 
						|
XThe :cc command runs the C compiler.
 | 
						|
XThis option should be set to the name of your compiler.
 | 
						|
X.IP "charattr, ca"
 | 
						|
XMany text formatting programs allow you to designate portions of
 | 
						|
Xyour text to be underlined, italicized, or boldface by embedding
 | 
						|
Xthe special strings \\fU, \\fI, and \\fB in your text.
 | 
						|
XThe special string \\fP marks the end of underlined or boldface text.
 | 
						|
X.IP
 | 
						|
X\*E normally treats those special strings just like any other text.
 | 
						|
X.IP
 | 
						|
XHowever, if the charattr option is on, then \*E will interpret
 | 
						|
Xthose special strings correctly,
 | 
						|
Xto display underlined or boldface text on the screen.
 | 
						|
X(This only works, of course, if your terminal can display
 | 
						|
Xunderlined and boldface, and if the TERMCAP entry says how to do it.)
 | 
						|
X.IP "columns, co"
 | 
						|
XThis option shows how wide your screen is.
 | 
						|
X.IP "digraph, dig"
 | 
						|
XThis option is used to enable/disable recognition of digraphs.
 | 
						|
XThe default value is nodigraph, which means that digraphs will not be
 | 
						|
Xrecognized.
 | 
						|
X.IP "directory, dir"
 | 
						|
X\*E stores text in temporary files.
 | 
						|
XThis option allows you to control which directory those temporary files will
 | 
						|
Xappear in.
 | 
						|
XThe default is /usr/tmp.
 | 
						|
X.IP
 | 
						|
XThis option can only be set in a .exrc file;
 | 
						|
Xafter that, \*E will have already started making temporary files
 | 
						|
Xin some other directory, so it would be too late.
 | 
						|
X.IP "edcompatible, ed"
 | 
						|
XThis option affects the behaviour of the ":s/regexp/text/options" command.
 | 
						|
XIt is normally off (:se noed) which causes all of the substitution options
 | 
						|
Xto be off unless explicitly given.
 | 
						|
X.IP
 | 
						|
XHowever, with edcompatible on (:se ed), the substitution command remembers
 | 
						|
Xwhich options you used last time.
 | 
						|
XThose same options will continue to be used until you change them.
 | 
						|
XIn edcompatible mode, when you explicitly give the name of a
 | 
						|
Xsubstitution option, you will toggle the state of that option.
 | 
						|
X.IP
 | 
						|
XThis all seems very strange to me, but its implementation was almost free
 | 
						|
Xwhen I added the ":&" command to repeat the previous substitution,
 | 
						|
Xso there it is.
 | 
						|
X.IP "equalprg, ep"
 | 
						|
XThis holds the name & arguments of the external filter program
 | 
						|
Xused the the visual = operator.
 | 
						|
XThe defualt value is "fmt",
 | 
						|
Xso the = operator will adjust line breaks in text.
 | 
						|
X.IP "errorbells, eb"
 | 
						|
X\*E normally rings a bell when you do something wrong.
 | 
						|
XThis option lets you disable the bell.
 | 
						|
X.IP exrc
 | 
						|
XThis option specifies whether a .exrc file in the current directory
 | 
						|
Xshould be executed.
 | 
						|
XBy default, this option is off (":set noexrc") which prevents elvis from
 | 
						|
Xexecuting .exrc in the current directory.
 | 
						|
XIf the .exrc file in your home directory turns this option on (":set exrc")
 | 
						|
Xthen the \*E will attempt to execute the .exrc file in the current directory.
 | 
						|
X.IP
 | 
						|
XThis option exist mainly for security reasons.
 | 
						|
XA mean-spirited person could do something like
 | 
						|
X.br
 | 
						|
X	echo >/tmp/.exrc '!rm -rf $HOME'
 | 
						|
X.br
 | 
						|
Xand then anybody who attempted to edit or view a file in the /tmp directory
 | 
						|
Xwould lose most of their files.
 | 
						|
XWith the exrc option turned off, this couldn't happen to you.
 | 
						|
X.IP "exrefresh, er"
 | 
						|
XThe EX mode of \*E writes many lines to the screen.
 | 
						|
XYou can make \*E either write each line to the screen separately,
 | 
						|
Xor save up many lines and write them all at once.
 | 
						|
X.IP
 | 
						|
XThe exrefresh option is normally on, so each line is written to the
 | 
						|
Xscreen separately.
 | 
						|
X.IP
 | 
						|
XYou may wish to turn the exrefresh option off (:se noer) if the
 | 
						|
X"write" system call is costly on your machine, or if you're using a
 | 
						|
Xwindowing environment.
 | 
						|
X(Windowing environments scroll text a lot faster when you write
 | 
						|
Xmany lines at once.)
 | 
						|
X.IP
 | 
						|
XThis option has no effect in visual command mode or input mode.
 | 
						|
X.IP "flash, vbell"
 | 
						|
XIf your termcap entry describes a visible alternative to ringing
 | 
						|
Xyour terminal's bell, then this option will say whether the visible
 | 
						|
Xversion gets used or not.
 | 
						|
XNormally it will be.
 | 
						|
X.IP
 | 
						|
XIf your termcap does NOT include a visible bell capability,
 | 
						|
Xthen the flash option will be off, and you can't turn it on.
 | 
						|
X.IP "flipcase, fc"
 | 
						|
XThe flipcase option allows you to control how the non-ASCII characters are
 | 
						|
Xaltered by the "~" command.
 | 
						|
X.IP
 | 
						|
XThe string is divided into pairs of characters.
 | 
						|
XWhen "~" is applied to a non-ASCII character,
 | 
						|
X\*E looks up the character in the flipcase string to see which pair it's in,
 | 
						|
Xand replaces it by the other character of the pair.
 | 
						|
X.IP "hideformat, hf"
 | 
						|
XMany text formatters require you to embed format commands in your text,
 | 
						|
Xon lines that start with a "." character.
 | 
						|
X\*E normally displays these lines like any other text,
 | 
						|
Xbut if the hideformat option is on,
 | 
						|
Xthen format lines are displayed as blank lines.
 | 
						|
X.IP "ignorecase, ic"
 | 
						|
XNormally, when \*E searches for text, it treats uppercase letters
 | 
						|
Xas being different for lowercase letters.
 | 
						|
X.IP
 | 
						|
XWhen the ignorecase option is on, uppercase and lowercase are treated as equal.
 | 
						|
X.IP "inputmode, im"
 | 
						|
XThis option allows you to have \*E start up in insert mode.
 | 
						|
XYou can still exit insert mode at any time by hitting the ESC key, as usual.
 | 
						|
XUsually, this option would be set in your ".exrc" file.
 | 
						|
X.IP "keytime, kt"
 | 
						|
XThe arrow keys of most terminals send a multi-character sequence.
 | 
						|
XIt takes a measurable amount of time for these sequences to be transmitted.
 | 
						|
XThe keytime option allows you to control the maximum amount of time
 | 
						|
Xto allow for an arrow key (or other mapped key) to be received in full.
 | 
						|
X.IP
 | 
						|
XOn most systems, the setting is the number of tenths of a second to allow
 | 
						|
Xbetween characters.
 | 
						|
XOn some other systems, the setting is in whole seconds.
 | 
						|
X.IP
 | 
						|
XTry to avoid setting keytime=1.
 | 
						|
XMost systems just count clock beats, so if you tried to read a character
 | 
						|
Xshortly before a clock beat, you could allow almost no time at all for
 | 
						|
Xreading the characters.
 | 
						|
XFor higher keytime settings, the difference is less critical.
 | 
						|
X.IP
 | 
						|
XIf your system's response time is poor, you might want to increase the keytime.
 | 
						|
XIn particular, I've found that when keystrokes must be sent through a network
 | 
						|
X(via X windows, rlogin, or telnet, for example) the keytime should be set to
 | 
						|
Xat least 1 second.
 | 
						|
X.IP
 | 
						|
XAs a special case,
 | 
						|
Xyou can set keytime to 0 to disable this time limit stuff altogether.
 | 
						|
XThe big problem here is:
 | 
						|
XIf your arrow keys' sequences start with an ESC,
 | 
						|
Xthen every time you hit your ESC key \*E will wait... and wait...
 | 
						|
Xto see if maybe that ESC was part of an arrow key's sequence.
 | 
						|
X.IP
 | 
						|
XNOTE: this option is a generalization of the timeout option of the real vi.
 | 
						|
X.IP "keywordprg, kp"
 | 
						|
X\*E has a special keyword lookup feature.
 | 
						|
XYou move the cursor onto a word, and hit shift-K,
 | 
						|
Xand \*E uses another program to look up the word
 | 
						|
Xand display information about it.
 | 
						|
X.IP
 | 
						|
XThis option says which program gets run.
 | 
						|
X.IP
 | 
						|
XThe default value of this option is "ref",
 | 
						|
Xwhich is a program that looks up the definition of a function in C.
 | 
						|
XIt looks up the function name in a file called "refs" which is created by ctags.
 | 
						|
X.IP
 | 
						|
XYou can subtitute other programs, such as an English dictionary program
 | 
						|
Xor the online manual.
 | 
						|
X\*E runs the program, using the keyword as its only argument.
 | 
						|
XThe program should write information to stdout.
 | 
						|
XThe program's exit status should be 0, unless you want \*E to print
 | 
						|
X"<<< failed >>>".
 | 
						|
X.IP "lines, ln"
 | 
						|
XThis option says how many lines you screen has.
 | 
						|
X.IP "list, li"
 | 
						|
XIn nolist mode (the default), \*E displays text in a "normal" manner
 | 
						|
X-- with tabs expanded to an appropriate number of spaces, etc.
 | 
						|
X.IP
 | 
						|
XHowever, sometimes it is useful to have tab characters displayed differently.
 | 
						|
XIn list mode, tabs are displayed as "^I",
 | 
						|
Xand a "$" is displayed at the end of each line.
 | 
						|
X.IP "magic, ma"
 | 
						|
XThe search mechanism in \*E can accept "regular expressions"
 | 
						|
X-- strings in which certain characters have special meaning.
 | 
						|
X.IP
 | 
						|
XThe magic option is normally on, which causes these characters to be treated
 | 
						|
Xspecially.
 | 
						|
X.IP
 | 
						|
XIf you turn the magic option off (:se noma),
 | 
						|
Xthen all characters except ^ and $ are treated literally.
 | 
						|
X^ and $ retain their special meanings regardless of the setting of magic.
 | 
						|
X.IP "make, mk"
 | 
						|
XThe :make command runs your "make" program.
 | 
						|
XThis option defines the name of your "make" program.
 | 
						|
X.IP mesg
 | 
						|
XWith the real vi, running under real UNIX,
 | 
						|
X":set nomesg" would prevent other users from sending you messages.
 | 
						|
X\*E ignores it, though.
 | 
						|
X.IP "modelines, ml"
 | 
						|
X\*E supports modelines.
 | 
						|
XModelines are lines near the beginning or end of your text file which
 | 
						|
Xcontain "ex:yowza:",
 | 
						|
Xwhere "yowza" is any EX command.
 | 
						|
XA typical "yowza" would be something like "set ts=5 ca kp=spell wm=15".
 | 
						|
XOther text may also appear on a modeline,
 | 
						|
Xso you can place the "ex:yowza:" in a comment:
 | 
						|
X.br
 | 
						|
X.ID
 | 
						|
X/* ex:set sw=4 ai: */
 | 
						|
X.DE
 | 
						|
X.IP
 | 
						|
XNormally these lines are ignored, for security reasons,
 | 
						|
Xbut if you have "set modelines" in your .exrc file
 | 
						|
Xthen "yowza" is executed.
 | 
						|
X.IP "novice, nov"
 | 
						|
XThe command ":set novice" is equivelent to ":set nomagic report=1 showmode".
 | 
						|
X.IP "paragraphs, pa"
 | 
						|
XThe { and } commands move the cursor forward or backward in increments
 | 
						|
Xof one paragraph.
 | 
						|
XParagraphs may be separated by blank lines, or by a "dot" command of
 | 
						|
Xa text formatter.
 | 
						|
XDifferent text formatters use different "dot" commands.
 | 
						|
XThis option allows you to configure \*E to work with your text formatter.
 | 
						|
X.IP
 | 
						|
XIt is assumed that your formatter uses commands that start with a
 | 
						|
X"." character at the front of a line,
 | 
						|
Xand then have a one- or two-character command name.
 | 
						|
X.IP
 | 
						|
XThe value of the paragraphs option is a string in which each pair
 | 
						|
Xof characters is one possible form of your text formatter's paragraph
 | 
						|
Xcommand.
 | 
						|
X.IP "more"
 | 
						|
XWhen \*E must display a sequence of messages at the bottom line of the screen
 | 
						|
Xin visual mode, it normally pauses after all but the last one, so you have
 | 
						|
Xtime to read them all.
 | 
						|
X.IP
 | 
						|
XIf you turn off the "more" option, then \*E will not pause.
 | 
						|
XThis means you can only read the last message, but it is usually the most
 | 
						|
Ximportant one anyway.
 | 
						|
X.IP "prompt, pr"
 | 
						|
XIf you ":set noprompt", then \*E will no longer emit a ':' when it
 | 
						|
Xexpects you to type in an \fIex\fR command.
 | 
						|
XThis is slightly useful if you're using an astonishingly slow UNIX machine,
 | 
						|
Xbut the rest of us can just ignore this one.
 | 
						|
X.IP "readonly, ro"
 | 
						|
XNormally, \*E will let you write back any file to which you have
 | 
						|
Xwrite permission.
 | 
						|
XIf you don't have write permission, then you can only write the changed
 | 
						|
Xversion of the file to a \fIdifferent\fP file.
 | 
						|
X.IP
 | 
						|
XIf you set the readonly option,
 | 
						|
Xthen \*E will pretend you don't have write permission to \fIany\fP file you edit.
 | 
						|
XIt is useful when you really only mean to use \*E to look at a file,
 | 
						|
Xnot to change it.
 | 
						|
XThis way you can't change it accidentally.
 | 
						|
X.IP
 | 
						|
XThis option is normally off, unless you use the "view" alias of \*E.
 | 
						|
X"View" is like "vi" except that the readonly option is on.
 | 
						|
X.IP "remap"
 | 
						|
XThe ":map" command allows you to convert one key sequence into another.
 | 
						|
XThe remap option allows you to specify what should happen if portions of
 | 
						|
Xthat other sequence are also in the map table.
 | 
						|
XIf remap is on, then those portions will also be mapped, just as if they
 | 
						|
Xhad been typed on the keyboard.
 | 
						|
XIf remap is off, then the matching portions will not be mapped.
 | 
						|
X.IP
 | 
						|
XFor example, if you enter the commands ":map A B" and ":map B C",
 | 
						|
Xthen when remap is on, A will be converted to C.
 | 
						|
XBut when remap is off, A will be converted only to B.
 | 
						|
X.IP "report, re"
 | 
						|
XCommands in \*E may affect many lines.
 | 
						|
XFor commands that affect a lot of lines, \*E will output a message saying
 | 
						|
Xwhat was done and how many lines were affected.
 | 
						|
XThis option allows you to define what "a lot of lines" means.
 | 
						|
XThe default is 5, so any command which affects 5 or more lines will cause
 | 
						|
Xa message to be shown.
 | 
						|
X.IP "ruler, ru"
 | 
						|
XThis option is normally off.
 | 
						|
XIf you turn it on, then \*E will constantly display the line/column numbers
 | 
						|
Xof the cursor, at the bottom of the screen.
 | 
						|
X.IP "scroll, sc"
 | 
						|
XThe ^U and ^D keys normally scroll backward or forward by half a screenful,
 | 
						|
Xbut this is adjustable.
 | 
						|
XThe value of this option says how many lines those keys should scroll by.
 | 
						|
XIf you invoke ^U or ^D with a count argument (for example, "33^D") then
 | 
						|
Xthis option's value is set to the count.
 | 
						|
X.IP "sections, se"
 | 
						|
XThe [[ and ]] commands move the cursor backward or forward in increments of
 | 
						|
X1 section.
 | 
						|
XSections may be delimited by a { character in column 1
 | 
						|
X(which is useful for C source code)
 | 
						|
Xor by means of a text formatter's "dot" commands.
 | 
						|
X.IP
 | 
						|
XThis option allows you to configure \*E to work with your text formatter's
 | 
						|
X"section" command, in exectly the same way that the paragraphs option makes
 | 
						|
Xit work with the formatter's "paragraphs" command.
 | 
						|
X.IP "shell, sh"
 | 
						|
XWhen \*E forks a shell
 | 
						|
X(perhaps for the :! or :shell commands)
 | 
						|
Xthis is the program that is uses as a shell.
 | 
						|
XThis is "/bin/sh" by default,
 | 
						|
Xunless you have set the SHELL (or COMSPEC, for MS-DOS) environment variable,
 | 
						|
Xit which case the default value is copied from the environment.
 | 
						|
X.IP "shiftwidth, sw"
 | 
						|
XThe < and > commands shift text left or right by some uniform number of columns.
 | 
						|
XThe shiftwidth option defines that "uniform number".
 | 
						|
XThe default is 8.
 | 
						|
X.IP "showmatch, sm"
 | 
						|
XWith showmatch set,
 | 
						|
Xin input mode every time you hit one of )}],
 | 
						|
X\*E will momentarily move the cursor to the matching ({[.
 | 
						|
X.IP "showmode, smd"
 | 
						|
XIn visual mode, it is easy to forget whether you're in the visual command mode
 | 
						|
Xor input/replace mode.
 | 
						|
XNormally, the showmode option is off, and you haven't a clue as to which mode
 | 
						|
Xyou're in.
 | 
						|
XIf you turn the showmode option on, though, a little message will appear in the
 | 
						|
Xlower right-hand corner of your screen, telling you which mode you're in.
 | 
						|
X.IP "sidescroll, ss"
 | 
						|
XFor long lines, \*E scrolls sideways.
 | 
						|
X(This is different from the real vi,
 | 
						|
Xwhich wraps a single long line onto several rows of the screen.)
 | 
						|
X.IP
 | 
						|
XTo minimize the number of scrolls needed,
 | 
						|
X\*E moves the screen sideways by several characters at a time.
 | 
						|
XThe value of this option says how many characters' widths to scroll at a time.
 | 
						|
X.IP
 | 
						|
XGenerally, the faster your screen can be redrawn,
 | 
						|
Xthe lower the value you will want in this option.
 | 
						|
X.IP "sync, sy"
 | 
						|
XIf the system crashes during an edit session, then most of your work
 | 
						|
Xcan be recovered from the temporary file that \*E uses to store
 | 
						|
Xchanges.
 | 
						|
XHowever, sometimes the OS will not copy changes to the
 | 
						|
Xhard disk immediately, so recovery might not be possible.
 | 
						|
XThe [no]sync option lets you control this.
 | 
						|
X.IP
 | 
						|
XIn nosync mode (which is the default, for UNIX), \*E lets the operating system
 | 
						|
Xcontrol when data is written to the disk.
 | 
						|
XThis is generally faster.
 | 
						|
X.IP
 | 
						|
XIn sync mode (which is the default for MS-DOS, AmigaDos, and Atari TOS),
 | 
						|
X\*E forces all changes out
 | 
						|
Xto disk every time you make a change.
 | 
						|
XThis is generally safer, but slower.
 | 
						|
XIt can also be a rather rude thing to do on a multi-user system.
 | 
						|
X.IP "tabstop, ts"
 | 
						|
XTab characters are normally 8 characters wide,
 | 
						|
Xbut you can change their widths by means of this option.
 | 
						|
X.IP "taglength, tl"
 | 
						|
XThis option allows you to specify how many characters of a tag's name
 | 
						|
Xmust match when performing tag lookup.
 | 
						|
XAs a special case, ":set taglength=0" means that all characters of a tag's
 | 
						|
Xname must match.
 | 
						|
X.IP
 | 
						|
XNote: some configurations of \*E don't support this option.
 | 
						|
X.IP "term, te"
 | 
						|
XThis read-only option shows the name of the termcap entry that
 | 
						|
X\*E is using for your terminal.
 | 
						|
X.IP "terse, tr"
 | 
						|
XThe real vi uses this option to select longer vs. shorter error messages.
 | 
						|
X\*E has only one set of error messages, though, so this option has no effect.
 | 
						|
X.IP "timeout, to"
 | 
						|
XThe command ":set notimeout" is equivelent to ":set keytime=0",
 | 
						|
Xand ":set timeout" is equivelent to ":set keytime=1".
 | 
						|
XThis affects the behaviour of the <Esc> key.
 | 
						|
XSee the discussion of the "keytime" option for more information.
 | 
						|
X.IP "warn, wa"
 | 
						|
XIf you have modified a file but not yet written it back to disk, then
 | 
						|
X\*E will normally print a warning before executing a ":!cmd" command.
 | 
						|
XHowever, in nowarn mode, this warning is not given.
 | 
						|
X.IP
 | 
						|
X\*E also normally prints a message after a successful search that
 | 
						|
Xwrapped at EOF.
 | 
						|
XThe [no]warn option can also disable this warning.
 | 
						|
X.IP "window, wi"
 | 
						|
XThis option controls how many lines are redrawn after a long move.
 | 
						|
X.IP
 | 
						|
XOn fast terminals, this is usually set to the number of rows that the
 | 
						|
Xterminal can display, minus one.
 | 
						|
XThis causes the entire screen to be filled with text around the cursor.
 | 
						|
X.IP
 | 
						|
XOn slow terminals, you may wish to reduce this value to about 7 or so.
 | 
						|
XThat way, if you're doing something like repeatedly hitting 'n' to search
 | 
						|
Xfor each occurrence of some string and trying to find a particular occurrence,
 | 
						|
Xthen you don't need to wait as long for \*E to redraw the screen after each
 | 
						|
Xsearch.
 | 
						|
X.IP "wrapmargin, wm"
 | 
						|
XNormally (with wrapmargin=0) \*E will let you type in extremely long
 | 
						|
Xlines, if you wish.
 | 
						|
X.IP
 | 
						|
XHowever, with warpmargin set to something other that 0 (wrapmargin=10
 | 
						|
Xis nice), \*E will automatically cause long lines to be "wrapped"
 | 
						|
Xon a word break for lines come too close to the right-hand margin.
 | 
						|
XFor example: On an 80-column screen, ":set wm=10" will cause lines to
 | 
						|
Xwrap when their length exceeds 70 columns.
 | 
						|
X.IP "wrapscan, ws"
 | 
						|
XNormally, when you search for something, \*E will find it no matter
 | 
						|
Xwhere it is in the file.
 | 
						|
X\*E starts at the cursor position, and searches forward.
 | 
						|
XIf \*E hits EOF without finding what you're looking for,
 | 
						|
Xthen it wraps around to continue searching from line 1.
 | 
						|
XIf you turn off the wrapscan option (:se nows),
 | 
						|
Xthen when \*E hits EOF during a search, it will stop and say so.
 | 
						|
X.IP "writeany, wr"
 | 
						|
XWith "writeany" turned off, elvis will prevent you from accidentally
 | 
						|
Xoverwriting a file.
 | 
						|
XFor example, if "foo" exists then ":w foo" will fail.
 | 
						|
XIf you turn on the "writeany" option, then ":w foo" will work.
 | 
						|
X.IP
 | 
						|
XRegardless of the setting of "writeany", though, ":w! foo" will work.
 | 
						|
XThe '!' forces the ":w" command to write the file unless the operating system
 | 
						|
Xwon't allow it.
 | 
						|
/
 | 
						|
echo x - question.ms
 | 
						|
sed '/^X/s///' > question.ms << '/'
 | 
						|
X.nr Qn 0 1
 | 
						|
X.de QQ
 | 
						|
X.sp
 | 
						|
X.IP \fB\\n+(Qn) 0.3i
 | 
						|
X..
 | 
						|
X.de AA
 | 
						|
X.IP \fR 0.75i
 | 
						|
X..
 | 
						|
X.Go 13 "QUESTIONS & ANSWERS"
 | 
						|
X.QQ
 | 
						|
XHow can I make elvis run faster under DOS?
 | 
						|
X.AA
 | 
						|
XThere are several things you can do.
 | 
						|
XThe first thing to do is get a good screen driver such as NANSI.SYS.
 | 
						|
XThis can speed up screen redrawing by as much as a factor of eight!
 | 
						|
XThe DOS-specific part of section 12 tells you how to do this.
 | 
						|
X.AA
 | 
						|
XYou might also consider reducing the size of the blocks that elvis uses.
 | 
						|
XYou'll need to recompile \*E to do this.
 | 
						|
XThe default BLKSIZE is 1024 byte for the DOS version of \*E, which means
 | 
						|
Xthat for each keystroke that you insert, elvis must shift an average of
 | 
						|
Xabout 500 bytes.
 | 
						|
XThat's a lot to ask from a little old 5MHz 8088.
 | 
						|
XA BLKSIZE of 512 bytes might be more appropriate.
 | 
						|
X.AA
 | 
						|
XIf you're \fIreally\fR desperate for more speed, you might want to make
 | 
						|
X\*E store its temporary files on a RAM disk.
 | 
						|
XHowever, this limits the size of the file you can edit, and it eliminates any
 | 
						|
Xchance you may have had to recover your work after a power failure
 | 
						|
Xor system crash, but it might be worth it; you decide.
 | 
						|
XTo do this, add ":set dir=R:\\" (or whatever your RAM disk's name is)
 | 
						|
Xto the \fIelvis.rc\fP file.
 | 
						|
X.AA
 | 
						|
XNext, consider turning off the "sync" option.
 | 
						|
XWhen the sync option is turned on, \*E will close the temporary file
 | 
						|
Xand reopen it after every change, in order to force DOS to update
 | 
						|
Xthe file's directory entry.
 | 
						|
XIf you put ":set nosync" into the \fIelvis.rc\fP file, then elvis will
 | 
						|
Xonly close the file when you start editing a different text file, or
 | 
						|
Xwhen you're exiting \*E.
 | 
						|
XConsequently, there is no chance that you'll be able to recover your
 | 
						|
Xchanges after a power failure... so if you're going to this, then you
 | 
						|
Xmight as well store the temp files on the RAM disk, too.
 | 
						|
X.QQ
 | 
						|
XWhere's the <Esc> key on a DEC keyboard?
 | 
						|
X.AA
 | 
						|
XI don't know.  Maybe the <F11> key?
 | 
						|
XYou could always use ":map!" to make some other key act like the <Esc> key.
 | 
						|
XIf all else fails, use <Control><[>.
 | 
						|
X.QQ
 | 
						|
XIs there a way to show which keys do what?
 | 
						|
X.AA
 | 
						|
XYes.  The command ":map" will show what each key does in command mode,
 | 
						|
Xand ":map!" (with an exclamation mark) shows what each key does in
 | 
						|
Xinput mode.
 | 
						|
X.AA
 | 
						|
XThe table is divided into three columns: the key's label, the characters
 | 
						|
Xthat it sends, and the characters that \*E pretends you typed.
 | 
						|
X.QQ
 | 
						|
XHow can I make \*E display long lines like the real vi?
 | 
						|
X.AA
 | 
						|
XYou can't yet.
 | 
						|
XThe next version of \*E shouldsupport this, though.
 | 
						|
X.QQ
 | 
						|
XI can't recover my text [under MS-DOS or Atari TOS].
 | 
						|
XAccording to the directory listing, the temporary file is 0 bytes long.
 | 
						|
XWhat went wrong?
 | 
						|
X.AA
 | 
						|
XMS-DOS and TOS only update a file's directory entry when the file is closed.
 | 
						|
XIf the system crashes while the file is still open, then the file's length
 | 
						|
Xis stored as 0 bytes.
 | 
						|
XThe ":set sync" option is supposed to prevent this;
 | 
						|
Xyou probably turned it off in the interest of speed, right?
 | 
						|
X.AA
 | 
						|
XUnder MS-DOS [I don't know about TOS], you should delete the empty
 | 
						|
Xtemporary file, and then run CHKDSK/F.
 | 
						|
XThis \fImight\fP find the data that belonged in the empty file,
 | 
						|
Xand place it in a new file with a name like "000001.CHK" -- something like that.
 | 
						|
XYou can then try to extract the text from that temporary file by giving the
 | 
						|
Xcommand "elvprsv -R 000001.chk >goodnews.txt".
 | 
						|
XIf you're lucky, then your text might be in GOODNEWS.TXT.
 | 
						|
X.QQ
 | 
						|
XWhat is the most current version of \*E?
 | 
						|
X.AA
 | 
						|
XEach version of \*E that is released to the public has a version number
 | 
						|
Xof the form "number point number".
 | 
						|
XAs I write this, the most current version of elvis is 1.5.
 | 
						|
X.AA
 | 
						|
XThe intermediate steps between one release and the next are labeled with
 | 
						|
Xthe \fInext\fP version number, with a letter appended.
 | 
						|
XFor example, after 1.4 was released, I started working on 1.5a.
 | 
						|
XI am currently working on 2.0a.
 | 
						|
XWhen \*E reaches a stable state, I'll call it 2.0 and release it.
 | 
						|
X.AA
 | 
						|
XSometimes a beta-test version of elvis will be available via anonymous FTP
 | 
						|
Xfrom m2xenix.psg.com, in the directory "pub/elvis/beta".
 | 
						|
X.QQ
 | 
						|
XI only got executables, but now I want the source code.
 | 
						|
XWhere can I get it?
 | 
						|
X.AA
 | 
						|
XIf you have access to the Internet, then you should be able to fetch it
 | 
						|
Xfrom one of the public archives such as \fBplains.nodak.edu\fP.
 | 
						|
XIt is accessible via anonymous FTP, or via an email server named
 | 
						|
X"archive-server@plains.nodak.edu".
 | 
						|
XElvis is located in the directory "/pub/Minix/all.contrib".
 | 
						|
X.AA
 | 
						|
XI will also offer it to the C Users' Group.
 | 
						|
XThey sell C source code for us$8 per diskette
 | 
						|
X(or slightly more outside  North  America).
 | 
						|
XTheir phone number is (913) 841-1631,
 | 
						|
Xand their address is:
 | 
						|
X.ID
 | 
						|
XThe C Users' Group
 | 
						|
XPO Box 3127
 | 
						|
XLawrence KS 66046-0127
 | 
						|
X.DE
 | 
						|
X.QQ
 | 
						|
XIs this shareware, or public domain, or what?
 | 
						|
X.AA
 | 
						|
XIt is not public domain; it is copyrighted by me, Steve Kirkendall.
 | 
						|
XHowever, this particular version is freely redistributable, in either
 | 
						|
Xsource form or executable form.
 | 
						|
X(I would prefer that you give copies away for free, complete with the
 | 
						|
Xfull source code... but I'm not going to force you.)
 | 
						|
X.AA
 | 
						|
XIt is not shareware; you aren't expected to send me anything.
 | 
						|
XYou can use it without guilt.
 | 
						|
X.AA
 | 
						|
XIt is not "copylefted."
 | 
						|
XI hold a copyright, but currently I have not added any of the usual restrictions
 | 
						|
Xthat you would find on copylefted software.
 | 
						|
XIf people start doing really obnoxious things to \*E, then I will start
 | 
						|
Xadding restrictions to subsequent versions, but earlier versions won't
 | 
						|
Xbe affected.
 | 
						|
X(So far, everybody has been pretty good about this so no restrictions
 | 
						|
Xhave been necessary.)
 | 
						|
X.QQ
 | 
						|
XCan I reuse parts of your source code?
 | 
						|
X.AA
 | 
						|
XYes.  Please be careful, though, to make sure that the code really is mine.
 | 
						|
XSome of the code was contributed by other people, and I don't have the
 | 
						|
Xauthority to give you permission to use it.
 | 
						|
XThe author's name can be found near the top of each source file.
 | 
						|
XIf it says "Steve Kirkendall" then you may use it;
 | 
						|
Xotherwise, you'd better contact the author first.
 | 
						|
X.AA
 | 
						|
XPlease don't remove my name from the source code.
 | 
						|
XIf you modify the source, please make a note of that fact in a comment
 | 
						|
Xnear the top of the source code.
 | 
						|
XAnd, finally, please mention my name in your documentation.
 | 
						|
X.QQ
 | 
						|
XCan \*E work with non-ASCII files?
 | 
						|
X.AA
 | 
						|
X\*E can't edit binary files because it can't handle the NUL character,
 | 
						|
Xand because of line-length limitations.
 | 
						|
XHowever, it is 8-bit clean so you should be able to edit any European
 | 
						|
Xextended ASCII file without any surprises.
 | 
						|
X.AA
 | 
						|
X\*E has also been modified to work with 16-bit character sets.
 | 
						|
XYongguang Zhang (ygz@cs.purdue.edu) has created a Chinese version of \*E
 | 
						|
Xthat uses 16-bit characters and runs under cxterm (Chinese X-term)
 | 
						|
Xon X-windows systems.
 | 
						|
XJunichiro Itoh (itojun@foretune.co.jp) has modified \*E to edit Japanese
 | 
						|
Xtext under MS-DOS.
 | 
						|
/
 | 
						|
echo x - regexp.ms
 | 
						|
sed '/^X/s///' > regexp.ms << '/'
 | 
						|
X.Go 4 "REGULAR EXPRESSIONS"
 | 
						|
X
 | 
						|
X.PP
 | 
						|
X\*E uses regular expressions for searching and substututions.
 | 
						|
XA regular expression is a text string in which some characters have
 | 
						|
Xspecial meanings.
 | 
						|
XThis is much more powerful than simple text matching.
 | 
						|
X.SH
 | 
						|
XSyntax
 | 
						|
X.PP
 | 
						|
X\*E' regexp package treats the following one- or two-character
 | 
						|
Xstrings (called meta-characters) in special ways:
 | 
						|
X.IP "\\\\\\\\(\fIsubexpression\fP\\\\\\\\)" 0.8i
 | 
						|
XThe \\( and \\) metacharacters are used to delimit subexpressions.
 | 
						|
XWhen the regular expression matches a particular chunk of text,
 | 
						|
X\*E will remember which portion of that chunk matched the \fIsubexpression\fP.
 | 
						|
XThe :s/regexp/newtext/ command makes use of this feature.
 | 
						|
X.IP "^" 0.8i
 | 
						|
XThe ^ metacharacter matches the beginning of a line.
 | 
						|
XIf, for example, you wanted to find "foo" at the beginning of a line,
 | 
						|
Xyou would use a regular expression such as /^foo/.
 | 
						|
XNote that ^ is only a metacharacter if it occurs
 | 
						|
Xat the beginning of a regular expression;
 | 
						|
Xanyplace else, it is treated as a normal character.
 | 
						|
X.IP "$" 0.8i
 | 
						|
XThe $ metacharacter matches the end of a line.
 | 
						|
XIt is only a metacharacter when it occurs at the end of a regular expression;
 | 
						|
Xelsewhere, it is treated as a normal character.
 | 
						|
XFor example, the regular expression /$$/ will search for a dollar sign at
 | 
						|
Xthe end of a line.
 | 
						|
X.IP "\\\\\\\\<" 0.8i
 | 
						|
XThe \\< metacharacter matches a zero-length string at the beginning of
 | 
						|
Xa word.
 | 
						|
XA word is considered to be a string of 1 or more letters and digits.
 | 
						|
XA word can begin at the beginning of a line
 | 
						|
Xor after 1 or more non-alphanumeric characters.
 | 
						|
X.IP "\\\\\\\\>" 0.8i
 | 
						|
XThe \\> metacharacter matches a zero-length string at the end of a word.
 | 
						|
XA word can end at the end of the line
 | 
						|
Xor before 1 or more non-alphanumeric characters.
 | 
						|
XFor example, /\\<end\\>/ would find any instance of the word "end",
 | 
						|
Xbut would ignore any instances of e-n-d inside another word
 | 
						|
Xsuch as "calendar".
 | 
						|
X.IP "\&." 0.8i
 | 
						|
XThe . metacharacter matches any single character.
 | 
						|
X.IP "[\fIcharacter-list\fP]" 0.8i
 | 
						|
XThis matches any single character from the \fIcharacter-list\fP.
 | 
						|
XInside the \fIcharacter-list\fP, you can denote a span of characters
 | 
						|
Xby writing only the first and last characters, with a hyphen between
 | 
						|
Xthem.
 | 
						|
XIf the \fIcharacter-list\fP is preceded by a ^ character, then the
 | 
						|
Xlist is inverted -- it will match character that \fIisn't\fP mentioned
 | 
						|
Xin the list.
 | 
						|
XFor example, /[a-zA-Z]/ matches any letter, and /[^ ]/ matches anything
 | 
						|
Xother than a blank.
 | 
						|
X.IP "\\\\\\\\{\fIn\fP\\\\\\\\}" 0.8i
 | 
						|
XThis is a closure operator,
 | 
						|
Xwhich means that it can only be placed after something that matches a
 | 
						|
Xsingle character.
 | 
						|
XIt controls the number of times that the single-character expression
 | 
						|
Xshould be repeated.
 | 
						|
X.IP "" 0.8i
 | 
						|
XThe \\{\fIn\fP\\} operator, in particular, means that the preceding
 | 
						|
Xexpression should be repeated exactly \fIn\fP times.
 | 
						|
XFor example, /^-\\{80\\}$/ matches a line of eighty hyphens, and
 | 
						|
X/\\<[a-zA-Z]\\{4\\}\\>/ matches any four-letter word.
 | 
						|
X.IP "\\\\\\\\{\fIn\fP,\fIm\fP\\\\\\\\}" 0.8i
 | 
						|
XThis is a closure operator which means that the preceding single-character
 | 
						|
Xexpression should be repeated between \fIn\fP and \fIm\fP times, inclusive.
 | 
						|
XIf the \fIm\fP is omitted (but the comma is present) then \fIm\fP is
 | 
						|
Xtaken to be inifinity.
 | 
						|
XFor example, /"[^"]\\{3,5\\}"/ matches any pair of quotes which contains
 | 
						|
Xthree, four, or five non-quote characters.
 | 
						|
X.IP "*" 0.8i
 | 
						|
XThe * metacharacter is a closure operator which means that the preceding
 | 
						|
Xsingle-character expression can be repeated zero or more times.
 | 
						|
XIt is equivelent to \\{0,\\}.
 | 
						|
XFor example, /.*/ matches a whole line.
 | 
						|
X.IP "\\\\\\\\+" 0.8i
 | 
						|
XThe \\+ metacharacter is a closure operator which means that the preceding
 | 
						|
Xsingle-character expression can be repeated one or more times.
 | 
						|
XIt is equivelent to \\{1,\\}.
 | 
						|
XFor example, /.\\+/ matches a whole line, but only if the line contains
 | 
						|
Xat least one character.
 | 
						|
XIt doesn't match empty lines.
 | 
						|
X.IP "\\\\\\\\?" 0.8i
 | 
						|
XThe \\? metacharacter is a closure operator which indicates that the
 | 
						|
Xpreceding single-character expression is optional -- that is, that it
 | 
						|
Xcan occur 0 or 1 times.
 | 
						|
XIt is equivelent to \\{0,1\\}.
 | 
						|
XFor example, /no[ -]\\?one/ matches "no one", "no-one", or "noone".
 | 
						|
X.PP
 | 
						|
XAnything else is treated as a normal character which must exactly match
 | 
						|
Xa character from the scanned text.
 | 
						|
XThe special strings may all be preceded by a backslash to
 | 
						|
Xforce them to be treated normally.
 | 
						|
X.SH
 | 
						|
XSubstitutions
 | 
						|
X.PP
 | 
						|
XThe :s command has at least two arguments: a regular expression,
 | 
						|
Xand a substitution string.
 | 
						|
XThe text that matched the regular expression is replaced by text
 | 
						|
Xwhich is derived from the substitution string.
 | 
						|
X.br
 | 
						|
X.ne 15 \" so we don't mess up the table
 | 
						|
X.PP
 | 
						|
XMost characters in the substitution string are copied into the
 | 
						|
Xtext literally but a few have special meaning:
 | 
						|
X.LD
 | 
						|
X.ta 0.75i 1.3i
 | 
						|
X	&	Insert a copy of the original text
 | 
						|
X	~	Insert a copy of the previous replacement text
 | 
						|
X	\\1	Insert a copy of that portion of the original text which
 | 
						|
X		matched the first set of \\( \\) parentheses
 | 
						|
X	\\2-\\9	Do the same for the second (etc.) pair of \\( \\)
 | 
						|
X	\\U	Convert all chars of any later & or \\# to uppercase
 | 
						|
X	\\L	Convert all chars of any later & or \\# to lowercase
 | 
						|
X	\\E	End the effect of \\U or \\L
 | 
						|
X	\\u	Convert the first char of the next & or \\# to uppercase
 | 
						|
X	\\l	Convert the first char of the next & or \\# to lowercase
 | 
						|
X.TA
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XThese may be preceded by a backslash to force them to be treated normally.
 | 
						|
XIf "nomagic" mode is in effect,
 | 
						|
Xthen & and ~ will be treated normally,
 | 
						|
Xand you must write them as \\& and \\~ for them to have special meaning.
 | 
						|
X.SH
 | 
						|
XOptions
 | 
						|
X.PP
 | 
						|
X\*E has two options which affect the way regular expressions are used.
 | 
						|
XThese options may be examined or set via the :set command.
 | 
						|
X.PP
 | 
						|
XThe first option is called "[no]magic".
 | 
						|
XThis is a boolean option, and it is "magic" (TRUE) by default.
 | 
						|
XWhile in magic mode, all of the meta-characters behave as described above.
 | 
						|
XIn nomagic mode, only ^ and $ retain their special meaning.
 | 
						|
X.PP
 | 
						|
XThe second option is called "[no]ignorecase".
 | 
						|
XThis is a boolean option, and it is "noignorecase" (FALSE) by default.
 | 
						|
XWhile in ignorecase mode, the searching mechanism will not distinguish between
 | 
						|
Xan uppercase letter and its lowercase form.
 | 
						|
XIn noignorecase mode, uppercase and lowercase are treated as being different.
 | 
						|
X.PP
 | 
						|
XAlso, the "[no]wrapscan" option affects searches.
 | 
						|
X.SH
 | 
						|
XExamples
 | 
						|
X.PP
 | 
						|
XThis example changes every occurence of "utilize" to "use":
 | 
						|
X.sp
 | 
						|
X.ti +1i
 | 
						|
X:%s/utilize/use/g
 | 
						|
X.PP
 | 
						|
XThis example deletes all whitespace that occurs at the end of a line anywhere
 | 
						|
Xin the file.
 | 
						|
X(The brackets contain a single space and a single tab.):
 | 
						|
X.sp
 | 
						|
X.ti +1i
 | 
						|
X:%s/[   ]\\+$//
 | 
						|
X.PP
 | 
						|
XThis example converts the current line to uppercase:
 | 
						|
X.sp
 | 
						|
X.ti +1i
 | 
						|
X:s/.*/\\U&/
 | 
						|
X.PP
 | 
						|
XThis example underlines each letter in the current line,
 | 
						|
Xby changing it into an "underscore backspace letter" sequence.
 | 
						|
X(The ^H is entered as "control-V backspace".):
 | 
						|
X.sp
 | 
						|
X.ti +1i
 | 
						|
X:s/[a-zA-Z]/_^H&/g
 | 
						|
X.PP
 | 
						|
XThis example locates the last colon in a line,
 | 
						|
Xand swaps the text before the colon with the text after the colon.
 | 
						|
XThe first \\( \\) pair is used to delimit the stuff before the colon,
 | 
						|
Xand the second pair delimit the stuff after.
 | 
						|
XIn the substitution text, \\1 and \\2 are given in reverse order
 | 
						|
Xto perform the swap:
 | 
						|
X.sp
 | 
						|
X.ti +1i
 | 
						|
X:s/\\(.*\\):\\(.*\\)/\\2:\\1/
 | 
						|
/
 | 
						|
echo x - termcap.ms
 | 
						|
sed '/^X/s///' > termcap.ms << '/'
 | 
						|
X.Go 10 "TERMCAP"
 | 
						|
X.PP
 | 
						|
X\*E uses fairly standard termcap fields for most things.
 | 
						|
XI invented the cursor shape names
 | 
						|
Xbut other than that there should be few surprises.
 | 
						|
X.SH
 | 
						|
XRequired numeric fields
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X:co#:	number of columns on the screen (chars per line)
 | 
						|
X:li#:	number of lines on the screen
 | 
						|
X.DE
 | 
						|
X.SH
 | 
						|
XRequired string fields
 | 
						|
X.ID
 | 
						|
X.if n .ul 0
 | 
						|
X:ce=:	clear to end-of-line
 | 
						|
X:cl=:	home the cursor & clear the screen
 | 
						|
X:cm=:	move the cursor to a given row/column
 | 
						|
X:up=:	move the cursor up one line
 | 
						|
X.DE
 | 
						|
X.SH
 | 
						|
XBoolean fields
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X:am:	auto margins - wrap when char is written in last column?
 | 
						|
X:xn:	brain-damaged auto margins - newline ignored after wrap
 | 
						|
X:pt:	physical tabs?
 | 
						|
X.DE
 | 
						|
X.SH
 | 
						|
XOptional string fields
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X:al=:	insert a blank row on the screen
 | 
						|
X:dl=:	delete a row from the screen
 | 
						|
X:cd=:	clear to end of display
 | 
						|
X:ei=:	end insert mode
 | 
						|
X:ic=:	insert a blank character
 | 
						|
X:im=:	start insert mode
 | 
						|
X:dc=:	delete a character
 | 
						|
X:sr=:	scroll reverse (insert row at top of screen)
 | 
						|
X:vb=:	visible bell
 | 
						|
X:ti=:	terminal initialization string, to start full-screen mode
 | 
						|
X:te=:	terminal termination, to end full-screen mode
 | 
						|
X:ks=:	enables the cursor keypad
 | 
						|
X:ke=:	disables the cursor keypad
 | 
						|
X.DE
 | 
						|
X.SH
 | 
						|
XOptional strings received from the keyboard
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X:kd=:	sequence sent by the <down arrow> key
 | 
						|
X:kl=:	sequence sent by the <left arrow> key
 | 
						|
X:kr=:	sequence sent by the <right arrow> key
 | 
						|
X:ku=:	sequence sent by the <up arrow> key
 | 
						|
X:kP=:	sequence sent by the <PgUp> key
 | 
						|
X:kN=:	sequence sent by the <PgDn> key
 | 
						|
X:kh=:	sequence sent by the <Home> key
 | 
						|
X:kH=:	sequence sent by the <End> key
 | 
						|
X:kI=:	sequence sent by the <Insert> key
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XOriginally, termcap didn't have any names for the <PgUp>, <PgDn>, <Home>,
 | 
						|
Xand <End> keys.
 | 
						|
XAlthough the capability names shown in the table above are the most common,
 | 
						|
Xthey are \fInot\fR universal.
 | 
						|
XSCO Xenix uses :PU=:PD=:HM=:EN=: for those keys.
 | 
						|
XAlso, if the four arrow keys happen to be part of a 3x3 keypad,
 | 
						|
Xthen the five non-arrow keys may be named :K1=: through :K5=:,
 | 
						|
Xso an IBM PC keyboard may be described using those names instead.
 | 
						|
X\*E can find any of these names.
 | 
						|
X.SH
 | 
						|
XOptional strings sent by function keys
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X:k1=:...:k9=:k0=:	codes sent by <F1> through <F10> keys
 | 
						|
X:s1=:...:s9=:s0=:	codes sent by <Shift F1> ... <Shift F10>
 | 
						|
X:c1=:...:c9=:c0=:	codes sent by <Ctrl F1> ... <Ctrl F10>
 | 
						|
X:a1=:...:a9=:a0=:	codes sent by <Alt F1> ... <Alt F10>
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XNote that :k0=: is used to describe the <F10> key.
 | 
						|
XSome termcap documents recommend :ka=: or even :k;=: for describing
 | 
						|
Xthe <F10> key, but \*E doesn't support that.
 | 
						|
X.PP
 | 
						|
XAlso, the :s1=:..., :c1=:..., and :a1=:... codes are very non-standard.
 | 
						|
XThe terminfo library doesn't support them.
 | 
						|
X.SH
 | 
						|
XOptional fields that describe character attributes
 | 
						|
X.if n .ul 0
 | 
						|
X.ID
 | 
						|
X:so=:se=:	start/end standout mode (We don't care about :sg#:)
 | 
						|
X:us=:ue=:	start/end underlined mode
 | 
						|
X:md=:me=:	start/end boldface mode
 | 
						|
X:as=:ae=:	start/end alternate character set (italics)
 | 
						|
X:ug#:		visible gap left by :us=:ue=:md=:me=:as=:ae=:
 | 
						|
X.DE
 | 
						|
X.SH
 | 
						|
XOptional fields that affect the cursor's shape
 | 
						|
X.PP
 | 
						|
XThe :cQ=: string is used by \*E immediately before exiting to undo
 | 
						|
Xthe effects of the other cursor shape strings.
 | 
						|
XIf :cQ=: is not given, then all other cursor shape strings are ignored.
 | 
						|
X.ID
 | 
						|
X:cQ=:	normal cursor
 | 
						|
X:cX=:	cursor used for reading EX command
 | 
						|
X:cV=:	cursor used for reading VI commands
 | 
						|
X:cI=:	cursor used during VI input mode
 | 
						|
X:cR=:	cursor used during VI replace mode
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XIf the capabilities above aren't given, then \*E will try to use the
 | 
						|
Xfollowing values instead.
 | 
						|
X.ID
 | 
						|
X:ve=:	normal cursor, used as :cQ=:cX=:cI=:cR=:
 | 
						|
X:vs=:	gaudy cursor, used as :cV=:
 | 
						|
X.DE
 | 
						|
X.SH
 | 
						|
XAn example
 | 
						|
X.PP
 | 
						|
XHere's the termcap entry I use on my Minix-ST system.
 | 
						|
XSome of the fields in it have nothing to do with \*E.
 | 
						|
XSome can only work on my system;
 | 
						|
XI have modified my kernel's screen driver.
 | 
						|
X.sp
 | 
						|
X.LD
 | 
						|
X.ne 14
 | 
						|
Xmx|minix|minixst|ansi:\\
 | 
						|
X	:is=\\E[0~:co#80:li#25:bs:pt:\\
 | 
						|
X	:cm=\\E[%i%d;%dH:up=\\E[A:do=^J:nd=\\E[C:sr=\\EM:\\
 | 
						|
X	:cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[J:\\
 | 
						|
X	:al=\\E[L:dl=\\E[M:ic=\\E[@:dc=\\E[P:im=:ei=:\\
 | 
						|
X	:so=\\E[7m:se=\\E[m:us=\\E[4m:ue=\\E[m:\\
 | 
						|
X	:md=\\E[1m:me=\\E[m:as=\\E[1;3m:ae=\\E[m:\\
 | 
						|
X	:ku=\\E[A:kd=\\E[B:kr=\\E[C:kl=\\E[D:\\
 | 
						|
X	:k1=\\E[1~:k2=\\E[2~:k3=\\E[3~:k4=\\E[4~:k5=\\E[5~:\\
 | 
						|
X	:k6=\\E[6~:k7=\\E[17~:k8=\\E[18~:k9=\\E[19~:k0=\\E[20~:\\
 | 
						|
X	:kU=\\E[36~:kQ=\\E[32~:kH=\\E[28~:\\
 | 
						|
X	:GV=3:GH=D:G1=?:G2=Z:G3=@:G4=Y:GC=E:GL=4:GR=C:GU=A:GD=B:\\
 | 
						|
X	:cQ=\\E[k:cX=\\E[2;0k:cV=\\E[16;0k:cI=\\E[k:cR=\\E[16;20k:
 | 
						|
X.DE
 | 
						|
/
 | 
						|
echo x - title.ms
 | 
						|
sed '/^X/s///' > title.ms << '/'
 | 
						|
X.de tE
 | 
						|
X.ps 80
 | 
						|
X.ce 1
 | 
						|
X\*E
 | 
						|
X..
 | 
						|
X.de nE
 | 
						|
X.ce 7
 | 
						|
X#######                                
 | 
						|
X#        #       #    #     #     #### 
 | 
						|
X#        #       #    #     #    #     
 | 
						|
X#####    #       #    #     #     #### 
 | 
						|
X#        #       #    #     #         #
 | 
						|
X#        #        #  #      #    #    #
 | 
						|
X#######  ######    ##       #     #### 
 | 
						|
X..
 | 
						|
X.sp |2i
 | 
						|
X.if t .tE
 | 
						|
X.if n .nE
 | 
						|
X.ps 10
 | 
						|
X.sp 1
 | 
						|
X.ce 2
 | 
						|
X- a clone of vi/ex -
 | 
						|
Xversion \*V
 | 
						|
X.sp |7.5i
 | 
						|
X.IP Author: 0.9i
 | 
						|
XSteve Kirkendall
 | 
						|
X.br
 | 
						|
X14407 SW Teal Blvd., Apt C
 | 
						|
X.br
 | 
						|
XBeaverton, OR 97005
 | 
						|
X.IP E-Mail: 0.9i
 | 
						|
Xkirkenda@cs.pdx.edu
 | 
						|
X.IP Phone: 0.9i
 | 
						|
X(503) 643-6980
 | 
						|
/
 | 
						|
echo x - ver.ms
 | 
						|
sed '/^X/s///' > ver.ms << '/'
 | 
						|
X.ds V 1.5j-betatest
 | 
						|
X.if t .ds E E\s-2LVIS\s+2
 | 
						|
X.if n .ds E Elvis
 | 
						|
X.\"
 | 
						|
X.\" usage: .Go <section#> <title>
 | 
						|
X.de Go
 | 
						|
X.ds LH "\\$1-\\\\n%
 | 
						|
X.ds RH "\\$1-\\\\n%
 | 
						|
X.ds CH "\\$2
 | 
						|
X.NH S \\$1
 | 
						|
X\\$2
 | 
						|
X.\"if !\\n%=1 .bp 1
 | 
						|
X.if n .ul 0
 | 
						|
X..
 | 
						|
/
 | 
						|
echo x - versions.ms
 | 
						|
sed '/^X/s///' > versions.ms << '/'
 | 
						|
X.Go 12 "VERSIONS"
 | 
						|
X.PP
 | 
						|
X\*E currently works under BSD UNIX, AT&T System-V UNIX, SCO XENIX,
 | 
						|
XMinix, Coherent, MS-DOS, Atari TOS, OS9/68k, VAX/VMS, and AmigaDos.
 | 
						|
XThis section of the manual provides special information that applies to each
 | 
						|
Xparticular version of \*E.
 | 
						|
X.PP
 | 
						|
XFor all versions except MS-DOS,
 | 
						|
Xthe file "Makefile.mix" should be copied to "Makefile",
 | 
						|
Xand then edited to select the correct set of options for your system.
 | 
						|
XThere is more information about this embedded in the file itself.
 | 
						|
X.NH 2
 | 
						|
XBSD UNIX
 | 
						|
X.PP
 | 
						|
XTemporary files are stored in /tmp.
 | 
						|
X.PP
 | 
						|
XYou should modify /etc/rc so that
 | 
						|
Xthe temp files are preserved when the system is rebooted.
 | 
						|
XFind a line in /etc/rc which reads
 | 
						|
X.br
 | 
						|
X.ti +0.5i
 | 
						|
Xex4.3preserve /tmp
 | 
						|
X.PP
 | 
						|
Xor something like that, and append the following line after it:
 | 
						|
X.br
 | 
						|
X.ti +0.5i
 | 
						|
Xelvprsv /tmp/elv*
 | 
						|
X.PP
 | 
						|
XIf you do not have permission to modify /etc/rc, don't fret.
 | 
						|
XThe above modification is only needed to allow you to recover your changes
 | 
						|
Xafter a system crash.
 | 
						|
XYou can still run \*E without that modification,
 | 
						|
Xand you can still recover your changes when \*E crashes
 | 
						|
Xor when your dialup modem looses the carrier signal, or something like that.
 | 
						|
XOnly a system crash or power failure could hurt you.
 | 
						|
X.PP
 | 
						|
XBoth \*E and the real Vi
 | 
						|
Xread initialization commands from a file called ".exrc",
 | 
						|
Xbut the commands in that file might work on one but not the other.
 | 
						|
XFor example, "set keywordprg=man" will work for \*E,
 | 
						|
Xbut Vi will complain because it doesn't have a "keywordprg" option.
 | 
						|
XIf the warning messages annoy you, then you can edit the config.h file
 | 
						|
Xto change the name of the initialization file ".exrc" to something else,
 | 
						|
Xsuch as ".elvisrc".
 | 
						|
X.PP
 | 
						|
XIf you use X windows, you may wish to add "-DCS_LATIN1" to CFLAGS.
 | 
						|
XThis will cause the digraph table and the flipcase option to have default
 | 
						|
Xvalues that are appropriate for the LATIN-1 character set.
 | 
						|
XThat's the standard character set for X.
 | 
						|
X.PP
 | 
						|
XThe default keyboard macro time-out value is larger for BSD than it is for
 | 
						|
Xsome other systems, because I've had trouble running \*E via rlogin or Xterm.
 | 
						|
XI guess it takes a while for those keystokes to squirt through the net.
 | 
						|
X.NH 2
 | 
						|
XSystem-V UNIX
 | 
						|
X.PP
 | 
						|
XMost SysV UNIX systems use terminfo instead of termcap,
 | 
						|
Xbut  the  terminfo  library  doesn't seem to have a standard name.
 | 
						|
XAs shipped, Elvis' Makefile.mix  is  configured  with "LIBS=-lterm".
 | 
						|
XYou may need to change it to "LIBS=-ltermcap" or "LIBS=-lterminfo"
 | 
						|
Xor even "LIBS=-lcurses".
 | 
						|
X.PP
 | 
						|
XThe /etc/rc file should be modified as described for BSD systems, above.
 | 
						|
XThe only difference is that SysV systems tend to have directories for
 | 
						|
Xinitialization, instead of a single large /etc/rc file.
 | 
						|
XEditor recovery is usually done somewhere in the /etc/rc2.d directory.
 | 
						|
X.PP
 | 
						|
XThe potential trouble with ".exrc" described above for BSD UNIX applies
 | 
						|
Xto System-V UNIX as well.
 | 
						|
X.PP
 | 
						|
X\*E uses control-C as the interrupt key, not Delete.
 | 
						|
X.NH 2
 | 
						|
XSCO Xenix
 | 
						|
X.PP
 | 
						|
XFor Xenix-386, you can use the generic System-V settings.
 | 
						|
XYou may wish to add "-DCS_IBMPC" to CFLAGS, to have the digraph table and
 | 
						|
Xflipcase option start up in a mode that is appropriate for the console.
 | 
						|
X
 | 
						|
XThere is a separate group of settings for use with Xenix-286.
 | 
						|
XIt already has "-DCS_IBMPC" in CFLAGS.
 | 
						|
X.PP
 | 
						|
XBecause Xenix is so similar to System-V, everything I said earlier about
 | 
						|
XSystem-V applies to the Xenix version too, except that editor recovery
 | 
						|
Xprobably belongs in a directory called /etc/rc.d/8.
 | 
						|
X.NH 2
 | 
						|
XMinix
 | 
						|
X.PP
 | 
						|
XThere are separate settings in Makefile.mix for Minix-PC and Minix-68k.
 | 
						|
XThe differences between these two are that
 | 
						|
Xthe 68k version uses ".o" for the object file extension where
 | 
						|
Xthe PC version uses ".s", and
 | 
						|
Xthe PC version has some extra flags in CFLAGS to reduce the size of \*E.
 | 
						|
XThe PC version also uses tinytcap (instead of the full termcap) to make it smaller.
 | 
						|
X.PP
 | 
						|
XMinix-PC users should read the CFLAGS section of this manual very carefully.
 | 
						|
XYou have some choices to make...
 | 
						|
X.PP
 | 
						|
XThe temporary files are stored in /usr/tmp.
 | 
						|
XThe /usr/tmp directory must exist before you run \*E,
 | 
						|
Xand it must be readable/writable by everybody.
 | 
						|
XWe use /usr/tmp instead of /tmp because
 | 
						|
Xafter a system crash or power failure,
 | 
						|
Xyou can recover the altered version of a file from the temporary file
 | 
						|
Xin /usr/tmp.
 | 
						|
XIf it was stored in /tmp, though, then it would be lost because /tmp is
 | 
						|
Xnormally located on the RAM disk.
 | 
						|
X.PP
 | 
						|
X\*E uses control-C as the interrupt key, not Delete.
 | 
						|
X.NH 2
 | 
						|
XCoherent
 | 
						|
X.PP
 | 
						|
X\*E was ported to Coherent by Esa Ahola.
 | 
						|
X.PP
 | 
						|
X\*E is too large to run under Coherent unless you eliminate some
 | 
						|
Xfeatures via the CFLAGS setting.
 | 
						|
XThe recommended settings, in Makefile.mix, produce a working version
 | 
						|
Xof \*E which emulates Vi faithfully, but lacks most of the extensions.
 | 
						|
XYou should read the CFLAGS section of this manual carefully.
 | 
						|
X.PP
 | 
						|
XYou can probably reduce the size of \*E by using tinytcap.c instead of -lterm.
 | 
						|
XThis would allow you to keep most features of \*E,
 | 
						|
Xat the expense of terminal independence.
 | 
						|
X(Tinytcap.c has ANSI escape sequences hard-coded into it.)
 | 
						|
XTo use tinytcap, just add "tinytcap.o" to the "EXTRA=" line in the Makefile,
 | 
						|
Xand remove "-lterm" from the "LIBS=" line.
 | 
						|
X.PP
 | 
						|
XThe temporary files are stored in /tmp.
 | 
						|
XYou should modify your /etc/rc file as described for BSD earlier.
 | 
						|
X.NH 2
 | 
						|
XMS-DOS
 | 
						|
X.PP
 | 
						|
X\*E was ported to MS-DOS by Guntram Blohm and Martin Patzel.
 | 
						|
XWillett Kempton added support for the DEC Rainbow.
 | 
						|
X.PP
 | 
						|
XIdeally, \*E should be compiled with Microsoft C 5.10 and the standard
 | 
						|
XMicrosoft Make utility,
 | 
						|
Xvia the command "make elvis.mak".
 | 
						|
XThis will compile \*E and all related utilities.
 | 
						|
X.PP
 | 
						|
XWith Microsoft C 6.00, you may have trouble compiling regexp.c.
 | 
						|
XIf so, try compiling it without optimization.
 | 
						|
X.PP
 | 
						|
XThe "Makefile.mix" file contains a set of suggested settings for compiling
 | 
						|
Xelvis with Turbo-C or Borland C.
 | 
						|
X(If you have Turbo-C, but not the Make utility,
 | 
						|
Xthen you can \fIalmost\fR use the "\*E.prj" file to compile \*E,
 | 
						|
Xbut you must explicitly force Turbo-C to compile it with the "medium" memory model.
 | 
						|
XMost of the related programs [ctags, ref, virec, refont, and wildcard] are
 | 
						|
Xonly one file long, so you should have no trouble compiling them.)
 | 
						|
XThe "alias.c" file is meant to be compiled once into an executable named
 | 
						|
X"ex.exe".
 | 
						|
XYou should then copy "ex.exe" to "vi.exe" and "view.exe".
 | 
						|
X.PP
 | 
						|
X\*E stores its temporary files in C:\\tmp.
 | 
						|
XIf this is not satisfactory, then you should edit the CFLAGS line of
 | 
						|
Xyour Makefile to change TMPDIR to something else before compiling.
 | 
						|
XYou can also control the name of the temp directory via an environment
 | 
						|
Xvariable named TMP or TEMP.
 | 
						|
XThe directory must exist before you can run \*E.
 | 
						|
X.PP
 | 
						|
XThe TERM environment variable determines how elvis will write to the screen.
 | 
						|
XIt can be set to any one of the following values:
 | 
						|
X.LD
 | 
						|
X.ta 1.5i 2.5i
 | 
						|
X	pcbios	Use BIOS calls on an IBM-PC clone.
 | 
						|
X	rainbow	Use DEC Rainbow interface.
 | 
						|
X	ansi	Use ANSI.SYS driver.
 | 
						|
X	nansi	User faster NANSI.SYS driver.
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XIf the TERM variable isn't set, then elvis will automatically select either
 | 
						|
Xthe "rainbow" interface (when run on a Rainbow) or "pcbios" (on an IBM clone).
 | 
						|
X.PP
 | 
						|
XYou may prefer to use NANSI.SYS for speed;
 | 
						|
Xor you may NEED to use ANSI.SYS for a non-clone, such as a lap-top.
 | 
						|
XIf so, you should
 | 
						|
Xinstall one of these drivers by adding "driver = nansi.sys" (or whatever)
 | 
						|
Xto your CONFIG.SYS file,
 | 
						|
Xand then you should define TERM to be "nansi" (or whatever) by adding
 | 
						|
X"set TERM=nansi" to your AUTOEXEC.BAT file.
 | 
						|
XYou must then reboot for these changes to take effect.
 | 
						|
XAfter that, \*E will notice the "TERM" setting and use the driver.
 | 
						|
X.PP
 | 
						|
XSince ".exrc" is not a valid DOS filename,
 | 
						|
Xthe name of the initialization file has been changed to "elvis.rc".
 | 
						|
XElvis will look for an "elvis.rc" file first in your home directory,
 | 
						|
Xand then in the current directory.
 | 
						|
XNote that you must set an environment variable named "HOME" to the
 | 
						|
Xfull pathname of your home directory, for Elvis to check there;
 | 
						|
Xif "HOME" isn't set, then Elvis will only look in the current directory.
 | 
						|
XTo set "HOME", you would typically add the following line to your
 | 
						|
XAUTOEXEC.BAT file:
 | 
						|
X.br
 | 
						|
X.ti +0.5i
 | 
						|
Xset HOME c:\\
 | 
						|
X.PP
 | 
						|
XAn extra program, called "wildcard", is needed for MS-DOS.
 | 
						|
XIt expands wildcard characters in file names.
 | 
						|
XIf \*E flashes a "Bad command or filename" message when it starts,
 | 
						|
Xthen you've probably lost the WILDCARD.EXE program somehow.
 | 
						|
X.PP
 | 
						|
X\*E can run under Windows, but only in full-screen mode.
 | 
						|
XAlso, Windows uses an environment variable called TEMP which interferes with
 | 
						|
Xelvis' usage of TEMP;
 | 
						|
Xto work around this, you can simply set an environment variable named
 | 
						|
XTMP (with no 'E') to the name of elvis' temporary directory.
 | 
						|
XWhen TEMP and TMP are both set, \*E uses TMP and ignored TEMP.
 | 
						|
X.NH 2
 | 
						|
XAtari TOS
 | 
						|
X.PP
 | 
						|
X\*E was ported to Atari TOS by Guntram Blohm and Martin Patzel.
 | 
						|
XIt is very similar to the MS-DOS version.
 | 
						|
XIt has been tested with the Mark Williams C compiler and also GNU-C.
 | 
						|
X.PP
 | 
						|
XThe TERM environment variable is ignored;
 | 
						|
Xthe ST port always assumes that TERM=vt52.
 | 
						|
XThe SHELL (not COMSPEC!) variable should be set to
 | 
						|
Xthe name of a line-oriented shell.
 | 
						|
X.PP
 | 
						|
XA simple shell in included with \*E.
 | 
						|
XIts source is in "shell.c", and the name of the executable is "shell.ttp".
 | 
						|
XThe file "profile.sh" should contain a set of instructions to be executed
 | 
						|
Xwhen the shell first starts up.
 | 
						|
XAn example of this file is included, but you will almost certainly want to
 | 
						|
Xedit it right away to match your configuration.
 | 
						|
X(If you already have a command-line shell,
 | 
						|
Xthen you'll probably want to continue using it.
 | 
						|
XThe shell that comes with \*E is very limited.)
 | 
						|
X.PP
 | 
						|
XCurrently, character attributes cannot be displayed on the screen.
 | 
						|
X.PP
 | 
						|
X\*E runs under MiNT (a free multi-tasking extension to TOS)
 | 
						|
Xbut it can be a CPU hog because of the way that \*E reads from the
 | 
						|
Xkeyboard with timeout.
 | 
						|
XAlso, \*E doesn't use any of the special features of MiNT.
 | 
						|
XI have received a set of patches that optimize \*E for MiNT,
 | 
						|
Xbut they arrived too late to integrate into this release.
 | 
						|
X.NH 2
 | 
						|
XOS9/68k
 | 
						|
X.PP
 | 
						|
X\*E was ported to OS9/68k by Peter Reinig.
 | 
						|
X.PP
 | 
						|
XThe Makefile is currently configured to install \*E and the related
 | 
						|
Xprograms in /dd/usr/cmds
 | 
						|
XIf this this is unacceptable, then you should change the BIN setting
 | 
						|
Xto some other directory.
 | 
						|
XSimilarly, it expects the source code to reside in /dd/usr/src/elvis;
 | 
						|
Xthe ODIR setting is used to control this.
 | 
						|
X.PP
 | 
						|
XTemporary files are stored in the /dd/tmp directory.
 | 
						|
XYour /dd/startup file may need to be modified
 | 
						|
Xto prevent it from deleting \*E' temporary files;
 | 
						|
Xmake /dd/startup run the \fIelvprsv\fR program before it wipes out /dd/tmp.
 | 
						|
X.PP
 | 
						|
XThe program in alias.c is linked repeatedly to produce the
 | 
						|
X"vi", "view", and "input" aliases for \*E.
 | 
						|
XSadly, the "ex" alias is impossible to implement under OS9
 | 
						|
Xbecause the shell has a built-in command by that name.
 | 
						|
X.PP
 | 
						|
XFor some purposes,
 | 
						|
Xyou must give `make' the "-b" option.
 | 
						|
XSpecifically, you need this for "make -b clean" and "make -b install".
 | 
						|
X.NH 2
 | 
						|
XVAX/VMS
 | 
						|
X.PP
 | 
						|
XJohn Campbell ported \*E to VAX/VMS.
 | 
						|
X.PP
 | 
						|
XA heavily laden VAX can take half an hour to compile elvis.
 | 
						|
XThis is normal.
 | 
						|
XDon't panic.
 | 
						|
X.PP
 | 
						|
XWhile running, elvis will create temporary files in SYS$SCRATCH.
 | 
						|
XEnter SHOW LOGICAL SYS$SCRATCH to see what actual directory you are using.
 | 
						|
XMany sites have SYS$SCRATCH equivalenced to SYS$LOGIN.
 | 
						|
XThe elvis temporary files look like the following on VMS while elvis is running:
 | 
						|
X.br
 | 
						|
X.ti 0.75i
 | 
						|
XELV_1123A.1;1       ELV_1123A.2;1       SO070202.;1
 | 
						|
X.PP
 | 
						|
XAlso, filtering commands (like !!dir and !}fmt) should work on VMS.
 | 
						|
XThis assumes, however, that you can create temporary mailboxes and that
 | 
						|
Xyour mailbox quota (a sysgen parameter) is at least 256 bytes for a
 | 
						|
Xsingle write to the mailbox.
 | 
						|
XThis is the default sysgen parameter,
 | 
						|
Xso there should be few people who experience filter problems.
 | 
						|
X.PP
 | 
						|
XAdditionally, an attempt was made to support the standard terminals on VMS:
 | 
						|
X"vt52", "vt100", "vt200", "vt300", "vt101", "vt102".
 | 
						|
XNon-standard terminals could be supported by setting your terminal type to
 | 
						|
XUNKNOWN (by entering SET TERM/UNKNOWN)
 | 
						|
Xand defining the logical name ELVIS_TERM.
 | 
						|
XWhatever ELVIS_TERM translates to, however, will have to be included in
 | 
						|
Xtinytcap.c.
 | 
						|
XNote that the upper/lowercase distinctions are significant,
 | 
						|
Xand that DCL will upshift characters that are not quoted strings, so
 | 
						|
Xenter DEFINE ELVIS_TERM "hp2621a".
 | 
						|
XAs distributed, it would probably not be a good idea to have more than the
 | 
						|
Xstandard terminals in tinytcap.c (else it wouldn't be tiny, would it?).
 | 
						|
XChanges here, of course, would require a recompilation to take effect.
 | 
						|
X.PP
 | 
						|
XIf you have a version of the "termcap" library and database on your system,
 | 
						|
Xthen you may wish to replace tinytcap with the real termcap.
 | 
						|
X.NH 2
 | 
						|
XAmigaDOS
 | 
						|
X.PP
 | 
						|
XMike Rieser and Dale Rahn ported \*E to AmigaDOS.
 | 
						|
X.PP
 | 
						|
XThe port was done using Manx Aztec C version 5.2b.
 | 
						|
X\*E uses about as much space as it can and still be small code and data.
 | 
						|
X\*E should also compile under DICE, though there may be a little trouble with
 | 
						|
Xsigned versus unsigned chars.
 | 
						|
X.PP
 | 
						|
XThe port has been done so the same binary will run under both versions of AmigaDOS.
 | 
						|
XUnder AmigaDOS 2.04, \*E supports all the documented features.
 | 
						|
XIt also uses an external program ref to do tag lookup.
 | 
						|
XSo, the accompanying programs: ref and ctags are recommended.
 | 
						|
XUnder AmigaDOS 1.2/1.3 \*E works, buts lacks the more advanced features.
 | 
						|
X.PP
 | 
						|
XFor the port to AmigaDOS 2.04, we tried to use as many Native AmigaDOS
 | 
						|
Xcalls as we could.
 | 
						|
XThis should increase Elvis's chances at being compiled with other compilers.
 | 
						|
XDICE seems to have a different default char type.
 | 
						|
XYou may need to use the UCHAR() macro in tio.c.
 | 
						|
XTo test it, try the :map command; if it looks right, things are cool.
 | 
						|
X.PP
 | 
						|
XFor the port to AmigaDOS 1.3, we tried to make sure the program was at
 | 
						|
Xleast usable.
 | 
						|
XMany features are missing, most notably running commands in subshells.
 | 
						|
XAlso, what we could get working, we used Aztec functions to support them,
 | 
						|
Xso this part is little more compiler dependent.
 | 
						|
X.PP
 | 
						|
XAztec is compatible with the SAS libcall #pragma.
 | 
						|
XI personally prefer using the includes that come from Commodore over the ones
 | 
						|
Xsupplied with Aztec, but for people with a straight Aztec installation,
 | 
						|
XI went with the default names for the Aztec pragmas.
 | 
						|
X.PP
 | 
						|
XOne include you'll need is <sys/types.h>.
 | 
						|
XIts a common include when porting software just make yourself one.
 | 
						|
XIts a two line file that saves a lot of hassle especially in the elvis source.
 | 
						|
XSo, make a directory where your includes are located called `sys'
 | 
						|
Xand in a file below that type:
 | 
						|
X.br
 | 
						|
X.ti +0.8i
 | 
						|
X/* sys/types.h */
 | 
						|
X.br
 | 
						|
X.ti +0.8i
 | 
						|
X#include <exec/types.h>
 | 
						|
X.PP
 | 
						|
XWhen setting environment variables (either local or global) for
 | 
						|
Xvariables that specify a directory, make sure the variable ends in `:'
 | 
						|
Xor `/'.
 | 
						|
XThis saved from having to change much of the way elvis works.
 | 
						|
XThe default temporary directory (if TEMP and TMP aren't specified) is "T:".
 | 
						|
XThe default if HOME directory (if no HOME environment variable is set) is "S:".
 | 
						|
X.PP
 | 
						|
XTo avoid conlict with other uses, \*E uses elvis.rc instead of .exrc or
 | 
						|
Xwhere it looks for macros.
 | 
						|
X.NH 2
 | 
						|
XOther Systems
 | 
						|
X.PP
 | 
						|
XFor Sun workstations, use the BSD configuration.
 | 
						|
XEarlier versions of elvis didn't link correctly due to a quirk in Sun's
 | 
						|
Xversion of the "make" utility, but this version of elvis has a work-around
 | 
						|
Xfor that quirk so you should have no trouble at all.
 | 
						|
X.PP
 | 
						|
XFor Linux, use the SysV settings.
 | 
						|
XYou can probably just remove the "-lterm" from the "LIBS= -lterm" line,
 | 
						|
Xsince linux keeps the termcap functions in the standard C library.
 | 
						|
X.PP
 | 
						|
XFor other UNIXoid systems, I suggest you start with the Minix-68k settings
 | 
						|
Xand then grow from that.
 | 
						|
XMinix is a nice starting point because it is a clone of Version 7 UNIX,
 | 
						|
Xwhich was the last common ancestor of BSD UNIX and SysV UNIX.
 | 
						|
XAny Operating System which claims any UNIX compatibility what so ever
 | 
						|
Xwill therefore support V7/Minix code.
 | 
						|
XYou may need to fiddle with #include directives or something, though.
 | 
						|
XMinix-68k is a better starting point than Minix-PC because the PC compiler
 | 
						|
Xhas some severe quirks.
 | 
						|
/
 | 
						|
echo x - visual.ms
 | 
						|
sed '/^X/s///' > visual.ms << '/'
 | 
						|
X.Go 2 "VISUAL MODE COMMANDS"
 | 
						|
X.PP
 | 
						|
XMost visual mode commands are one keystroke long.
 | 
						|
XThe following table lists the operation performed by each keystroke,
 | 
						|
Xand also denotes any options or arguments that it accepts.
 | 
						|
XNotes at the end of the table describe the notation used in this table.
 | 
						|
X.PP
 | 
						|
XIn addition to the keys listed here, your keyboard's "arrow" keys
 | 
						|
Xwill be interpretted as the appropriate cursor movement commands.
 | 
						|
XThe same goes for <PgUp> and <PgDn>, if your keyboard has them.
 | 
						|
XThe <Insert> key will toggle between insert mode and replace mode.
 | 
						|
XThere is a colon mode command (":map", to be described later)
 | 
						|
Xwhich will allow you to define other keys, such as function keys.
 | 
						|
X.PP
 | 
						|
XA tip: visual command mode looks a lot like text input mode.
 | 
						|
XIf you forget which mode you're in, just hit the <Esc> key.
 | 
						|
XIf \*E beeps, then you're in visual command mode.
 | 
						|
XIf \*E does not beep, then you were in input mode,
 | 
						|
Xbut by hitting <Esc> you will have switched to visual command mode.
 | 
						|
XSo, one way or another, after <Esc> \*E will be ready for a command.
 | 
						|
X.LD
 | 
						|
X.ta 0.7i 1.3i
 | 
						|
X\s+2COMMAND	DESCRIPTION\s-2
 | 
						|
X	^A	Search for next occurence of word at cursor (MOVE)(EXT)
 | 
						|
X	^B	Move toward the top of the file by 1 screenful
 | 
						|
X	^C	--- (usually sends SIGINT, to interupt a command)
 | 
						|
Xcount	^D	Scroll down <count> lines (default 1/2 screen)
 | 
						|
Xcount	^E	Scroll up <count> lines
 | 
						|
X	^F	Move toward the bottom of the file by 1 screenful
 | 
						|
X	^G	Show file status, and the current line #
 | 
						|
Xcount	^H	Move left, like h (MOVE)
 | 
						|
X	^I	---
 | 
						|
Xcount	^J	Move down (MOVE)
 | 
						|
X	^K	---
 | 
						|
X	^L	Redraw the screen
 | 
						|
Xcount	^M	Move to the front of the next line (MOVE)
 | 
						|
Xcount	^N	Move down (MOVE)
 | 
						|
X	^O	---
 | 
						|
Xcount	^P	Move up (MOVE)
 | 
						|
X	^Q	--- (typically XON, which restarts screen updates)
 | 
						|
X	^R	Redraw the screen
 | 
						|
X	^S	--- (typically XOFF, which stops screen updates)
 | 
						|
X	^T	---
 | 
						|
Xcount	^U	Scroll up <count> lines (default 1/2 screen)
 | 
						|
X	^V	---
 | 
						|
X	^W	---
 | 
						|
Xcount	^X	Move to a physical column number on the screen (MOVE) (EXT)
 | 
						|
Xcount	^Y	Scroll down <count> lines
 | 
						|
X	^Z	--- (sometimes sends SIGSUSP, to suspend execution)
 | 
						|
X	ESC	---
 | 
						|
X	^\\	--- (usually sends SIGQUIT, which is ignored)
 | 
						|
X	^]	If the cursor is on a tag name, go to that tag
 | 
						|
X	^^	Switch to the previous file, like ":e #"
 | 
						|
X	^_	---
 | 
						|
Xcount	SPC	Move right,like l (MOVE)
 | 
						|
X	! \s-2mv\s+2	Run the selected lines thru an external filter program
 | 
						|
X	" \s-2key\s+2	Select which cut buffer to use next
 | 
						|
Xcount	# \s-2+\s+2	Increment a number (EDIT) (EXT)
 | 
						|
X	$	Move to the rear of the current line (MOVE)
 | 
						|
Xcount	%	Move to matching (){}[] or to a given % of file (MOVE) (EXT)
 | 
						|
Xcount	&	Repeat the previous ":s//" command here (EDIT)
 | 
						|
X	' \s-2key\s+2	Move to a marked line (MOVE)
 | 
						|
Xcount	(	Move backward <count> sentences (MOVE)
 | 
						|
Xcount	)	Move forward <count> sentences (MOVE)
 | 
						|
X	*	Go to the next error in the errlist (EXT)
 | 
						|
Xcount	+	Move to the front of the next line (MOVE)
 | 
						|
Xcount	,	Repeat the previous [fFtT] but in the other direction (MOVE)
 | 
						|
Xcount	-	Move to the front of the preceding line (MOVE)
 | 
						|
Xcount	.	Repeat the previous "edit" command
 | 
						|
X	/ \s-2text\s+2	Search forward for a given regular expression (MOVE)
 | 
						|
X	0	If not part of count, move to 1st char of this line (MOVE)
 | 
						|
X	1	Part of count
 | 
						|
X	2	Part of count
 | 
						|
X	3	Part of count
 | 
						|
X	4	Part of count
 | 
						|
X	5	Part of count
 | 
						|
X	6	Part of count
 | 
						|
X	7	Part of count
 | 
						|
X	8	Part of count
 | 
						|
X	9	Part of count
 | 
						|
X	: \s-2text\s+2	Run single EX cmd
 | 
						|
Xcount	;	Repeat the previous [fFtT] cmd (MOVE)
 | 
						|
X	< \s-2mv\s+2	Shift text left (EDIT)
 | 
						|
X	= \s-2mv\s+2	Reformat
 | 
						|
X	> \s-2mv\s+2	Shift text right (EDIT)
 | 
						|
X	? \s-2text\s+2	Search backward for a given regular expression (MOVE)
 | 
						|
X	@ \s-2key\s+2	Execute the contents of a cut-buffer as VI commands
 | 
						|
Xcount	A \s-2inp\s+2	Append at end of the line (EDIT)
 | 
						|
Xcount	B	Move back Word (MOVE)
 | 
						|
X	C \s-2inp\s+2	Change text from the cursor through the end of the line (EDIT)
 | 
						|
X	D	Delete text from the cursor through the end of the line (EDIT)
 | 
						|
Xcount	E	Move end of Word (MOVE)
 | 
						|
Xcount	F \s-2key\s+2	Move leftward to a given character (MOVE)
 | 
						|
Xcount	G	Move to line #<count> (default is the bottom line) (MOVE)
 | 
						|
Xcount	H	Move to home row (the line at the top of the screen)
 | 
						|
Xcount	I \s-2inp\s+2	Insert at the front of the line (after indents) (EDIT)
 | 
						|
Xcount	J	Join lines, to form one big line (EDIT)
 | 
						|
X	K	Look up keyword (EXT)
 | 
						|
Xcount	L	Move to last row (the line at the bottom of the screen)
 | 
						|
X	M	Move to middle row
 | 
						|
X	N	Repeat previous search, but in the opposite direction (MOVE)
 | 
						|
Xcount	O \s-2inp\s+2	Open up a new line above the current line (EDIT)
 | 
						|
X	P	Paste text before the cursor (EDIT)
 | 
						|
X	Q	Quit to EX mode
 | 
						|
X	R \s-2inp\s+2	Overtype (EDIT)
 | 
						|
Xcount	S \s-2inp\s+2	Change lines, like <count>cc
 | 
						|
Xcount	T \s-2key\s+2	Move leftward *almost* to a given character (MOVE)
 | 
						|
X	U	Undo all recent changes to the current line
 | 
						|
X	V	Start marking lines for c/d/y/</>/!/\\ (EXT)
 | 
						|
Xcount	W	Move forward <count> Words (MOVE)
 | 
						|
Xcount	X	Delete the character(s) to the left of the cursor (EDIT)
 | 
						|
Xcount	Y	Yank text line(s) (copy them into a cut buffer)
 | 
						|
X	Z Z	Save the file & exit
 | 
						|
X	[ [	Move back 1 section (MOVE)
 | 
						|
X	\\ \s-2mv\s+2	Pop-up menu for modifying text (EXT)
 | 
						|
X	] ]	Move forward 1 section (MOVE)
 | 
						|
X	^	Move to the front of the current line (after indent) (MOVE)
 | 
						|
Xcount	_	Move to the current line
 | 
						|
X	` \s-2key\s+2	Move to a marked character (MOVE)
 | 
						|
Xcount	a \s-2inp\s+2	Insert text after the cursor (EDIT)
 | 
						|
Xcount	b	Move back <count> words (MOVE)
 | 
						|
X	c \s-2mv\s+2	Change text (EDIT)
 | 
						|
X	d \s-2mv\s+2	Delete text (EDIT)
 | 
						|
Xcount	e	Move forward to the end of the current word (MOVE)
 | 
						|
Xcount	f \s-2key\s+2	Move rightward to a given character (MOVE)
 | 
						|
X	g	---
 | 
						|
Xcount	h	Move left (MOVE)
 | 
						|
Xcount	i \s-2inp\s+2	Insert text at the cursor (EDIT)
 | 
						|
Xcount	j	Move down (MOVE)
 | 
						|
Xcount	k	Move up (MOVE)
 | 
						|
Xcount	l	Move right (MOVE)
 | 
						|
X	m \s-2key\s+2	Mark a line or character
 | 
						|
X	n	Repeat the previous search (MOVE)
 | 
						|
Xcount	o \s-2inp\s+2	Open a new line below the current line (EDIT)
 | 
						|
X	p	Paste text after the cursor (EDIT)
 | 
						|
X	q	---
 | 
						|
Xcount	r \s-2key\s+2	Replace <count> chars by a given character (EDIT)
 | 
						|
Xcount	s \s-2inp\s+2	Replace <count> chars with text from the user (EDIT)
 | 
						|
Xcount	t \s-2key\s+2	Move rightward *almost* to a given character (MOVE)
 | 
						|
X	u	Undo the previous edit command
 | 
						|
X	v	Start marking characters for c/d/y/</>/!/\\ (EXT)
 | 
						|
Xcount	w	Move forward <count> words (MOVE)
 | 
						|
Xcount	x	Delete the character that the cursor's on (EDIT)
 | 
						|
X	y \s-2mv\s+2	Yank text (copy it into a cut buffer)
 | 
						|
X	z \s-2key\s+2	Scroll current line to the screen's +=top -=bottom .=middle
 | 
						|
Xcount	{	Move back <count> paragraphs (MOVE)
 | 
						|
Xcount	|	Move to column <count> (the leftmost column is 1)
 | 
						|
Xcount	}	Move forward <count> paragraphs (MOVE)
 | 
						|
Xcount	~	Switch a character between uppercase & lowercase (EDIT)
 | 
						|
X	DEL	--- (usually mapped to shift-X, so it deletes one character)
 | 
						|
X.DE
 | 
						|
X.IP count
 | 
						|
XMany commands may be preceded by a count.  This is a sequence of digits
 | 
						|
Xrepresenting a decimal number.  For most commands that use a count,
 | 
						|
Xthe command is repeated <count> times.  The count is always optional,
 | 
						|
Xand usually defaults to 1.
 | 
						|
X.IP key
 | 
						|
XSome commands require two keystrokes.  The first key always determines
 | 
						|
Xwhich command is to be executed.  The second key is used as a parameter
 | 
						|
Xto the command.
 | 
						|
X.IP mv
 | 
						|
XSome commands (! < > c d y \\ =) operate on text between the cursor and some
 | 
						|
Xother position.
 | 
						|
XThere are three ways that you can specifify that other position.
 | 
						|
X.IP
 | 
						|
XThe first way is to follow the command keystroke with a movement command.
 | 
						|
XFor example, "dw" deletes a single word.
 | 
						|
X"d3w" and "3dw" both delete three words.
 | 
						|
X.IP
 | 
						|
XThe second way is to type the command keystroke twice.
 | 
						|
XThis causes whole lines to be acted upon.
 | 
						|
XFor example, ">>" indents the current line.
 | 
						|
X"3>>" indents the current line and the following two lines.
 | 
						|
X.IP
 | 
						|
XThe last way is to move the cursor to one end of the text,
 | 
						|
Xtype 'v' or 'V' to start marking,
 | 
						|
Xmove the cursor to the other end,
 | 
						|
Xand then type the desired command key.
 | 
						|
X.IP inp
 | 
						|
XMany commands allow the user to interactively enter text.
 | 
						|
XSee the discussion of "input mode" in the following section.
 | 
						|
X.IP (EXT)
 | 
						|
XThese commands are extensions -- the real vi doesn't have them.
 | 
						|
X.IP (EDIT)
 | 
						|
XThese commands affect text, and may be repeated by the "." command.
 | 
						|
X.IP (MOVE)
 | 
						|
XThese commands move the cursor, and may be used to specify the extent
 | 
						|
Xof a member of the "mv" class of commands.
 | 
						|
X.NH 2
 | 
						|
XInput Mode
 | 
						|
X.PP
 | 
						|
XYou can't type text into your file directly from visual command mode.
 | 
						|
XInstead, you must first give a command which will put you into input mode.
 | 
						|
XThe commands to do this are A/C/I/O/R/S/a/i/o/s.
 | 
						|
X.PP
 | 
						|
XThe S/s/C/c commands temporarily place a $ at the end of the text that
 | 
						|
Xthey are going to change.
 | 
						|
X.PP
 | 
						|
XIn input mode, all keystrokes are inserted into the text at the
 | 
						|
Xcursor's position, except for the following:
 | 
						|
X.ID
 | 
						|
X^A	insert a copy of the last input text
 | 
						|
X^D	delete one indent character
 | 
						|
X^H	(backspace) erase the character before the cursor
 | 
						|
X^L	redraw the screen
 | 
						|
X^M	(carriage return) insert a newline (^J, linefeed)
 | 
						|
X^O	execute next key as a visual command (limited!)
 | 
						|
X^P	insert the contents of the cut buffer
 | 
						|
X^R	redraw the screen, like ^L
 | 
						|
X^T	insert an indent character
 | 
						|
X^U	backspace to the beginning of the line
 | 
						|
X^V	insert the following keystroke, even if special
 | 
						|
X^W	backspace to the beginning of the current word
 | 
						|
X^Z^Z	write the file & exit \*E
 | 
						|
X^[	(ESCape) exit from input mode, back to command mode
 | 
						|
X.DE
 | 
						|
X.PP
 | 
						|
XAlso, on some systems, ^S may stop output, ^Q may restart output,
 | 
						|
Xand ^C may interupt execution.
 | 
						|
X^@ (the NUL character) cannot be inserted.
 | 
						|
X.PP
 | 
						|
XThe R visual command puts you in overtype mode,
 | 
						|
Xwhich is a slightly different form of input mode.
 | 
						|
XIn overtype mode, each time you insert a character,
 | 
						|
Xone of the old characters is deleted from the file.
 | 
						|
X.NH 2
 | 
						|
XArrow keys in Input Mode
 | 
						|
X.PP
 | 
						|
XThe arrow keys can be used to move the cursor in input mode.
 | 
						|
X(This is an extension; the real Vi doesn't support arrow keys in input mode.)
 | 
						|
XThe <PgUp>, <PgDn>, <Home>, and <End> keys work in input mode, too.
 | 
						|
XThe <Delete> key deletes a single character in input mode.
 | 
						|
XThe <Insert> key toggles between input mode and replace mode.
 | 
						|
X.PP
 | 
						|
XThe best thing about allowing arrow keys to work in input mode is that
 | 
						|
Xas long as you're in input mode,
 | 
						|
X\*E seems to have a fairly ordinary user interface.
 | 
						|
XWith most other text editors, you are always in either insert mode or
 | 
						|
Xreplace mode, and you can use the arrow keys at any time to move the cursor.
 | 
						|
XNow, \*E can act like that, too.
 | 
						|
XIn fact, with the new "inputmode" option and the "control-Z control-Z" input
 | 
						|
Xcommand, you may never have to go into visual command mode for simple edit
 | 
						|
Xsessions.
 | 
						|
X.NH 2
 | 
						|
XDigraphs
 | 
						|
X.PP
 | 
						|
X\*E supports digraphs as a way to enter non-ASCII characters.
 | 
						|
XA digraph is a character which is composed of two other characters.
 | 
						|
XFor example, an apostrophe and the letter i could be defined as a digraph
 | 
						|
Xwhich is to be stored & displayed as an accented i.
 | 
						|
X.PP
 | 
						|
XThere is no single standard for extended ASCII character sets.
 | 
						|
X\*E can be compiled to fill the digraph with values appropriate for
 | 
						|
Xeither the IBM PC character set, or the LATIN-1 character set used by
 | 
						|
XX windows, or neither.
 | 
						|
X(See the discussions of -DCS_IBMPC and -DCS_LATIN1 in the CFLAGS section
 | 
						|
Xof this manual.)
 | 
						|
XYou can view or edit the digraph table via the ":digraph" colon command.
 | 
						|
X.PP
 | 
						|
XDigraphs will not be recognized until you've entered ":set digraph".
 | 
						|
X.PP
 | 
						|
XTo actually use a digraph
 | 
						|
Xtype the first character, then hit <Backspace>, and then type the
 | 
						|
Xsecond character.
 | 
						|
X\*E will then substitute the non-ASCII character in their place.
 | 
						|
X.NH 2
 | 
						|
XAbbreviations
 | 
						|
X.PP
 | 
						|
X\*E can expand abbreviations for you.
 | 
						|
XYou define an abbreviation with the :abbr command,
 | 
						|
Xand then whenever you type in the abbreviated form while in input mode,
 | 
						|
X\*E will immediately replace it with the long form.
 | 
						|
XCOBOL programmers should find this useful. :-)
 | 
						|
X.PP
 | 
						|
X\*E doesn't perform the substitution until you type a non-alphanumeric
 | 
						|
Xcharacter to mark the end of the word.
 | 
						|
XIf you type a control-V before that non-alphanumeric character, then
 | 
						|
X\*E will not perform the substitution.
 | 
						|
X.NH 2
 | 
						|
XAuto-Indent
 | 
						|
X.PP
 | 
						|
XWith the ":set autoindent" option turned on,
 | 
						|
X\*E will automatically insert leading whitespace at the beginning of each
 | 
						|
Xnew line that you type in.
 | 
						|
XThe leading whitespace is copied from the preceding line.
 | 
						|
X.PP
 | 
						|
XTo add more leading whitespace, type control-T.
 | 
						|
XTo remove some whitespace, type control-D.
 | 
						|
X.PP
 | 
						|
XIf you ":set noautotab", then the whitespace generated by control-T will
 | 
						|
Xalways consist of spaces -- never tabs.
 | 
						|
XSome people seem to prefer this.
 | 
						|
X.PP
 | 
						|
X\*E' autoindent mode isn't 100% compatible with vi's.
 | 
						|
XIn \*E, 0^D and ^^D don't work,
 | 
						|
X^U can wipeout all indentation, 
 | 
						|
Xand sometimes \*E will use a different amount of indentation than vi would.
 | 
						|
/
 |