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 versions function keys. X-DNO_CTRL_FKEY removes support for the and versions function keys. X-DNO_SHIFT_FKEY removes support for the , , and 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 "#" Xto map function key . XFor example, ":map #1 {!}fmt^M" will cause the 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 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 +, X"#1c" to refer to +, and X"#1a" to refer to +. 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 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 ... 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 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 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 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 from ? 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 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 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 key on a DEC keyboard? X.AA XI don't know. Maybe the key? XYou could always use ":map!" to make some other key act like the key. XIf all else fails, use <[>. 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, /\\/ 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 key X:kl=: sequence sent by the key X:kr=: sequence sent by the key X:ku=: sequence sent by the key X:kP=: sequence sent by the key X:kN=: sequence sent by the key X:kh=: sequence sent by the key X:kH=: sequence sent by the key X:kI=: sequence sent by the key X.DE X.PP XOriginally, termcap didn't have any names for the , , , Xand 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 through keys X:s1=:...:s9=:s0=: codes sent by ... X:c1=:...:c9=:c0=: codes sent by ... X:a1=:...:a9=:a0=: codes sent by ... X.DE X.PP XNote that :k0=: is used to describe the key. XSome termcap documents recommend :ka=: or even :k;=: for describing Xthe 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 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. /