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.
 | |
| /
 | 
