.Go 7 "DIFFERENCES BETWEEN \*E & BSD VI/EX"
.PP
\*E is not 100% compatible with the real vi/ex.
\*E has many small extensions, some omissions, and a few features which
are implemented in a slightly different manner.
.NH 2
Extensions
.IP "Save Configuration" 1i
The :mkexrc command saves the current :set and :map configurations in
the ".exrc" file in your current directory.
.IP "Previous File" 1i
The :N or :prev command moves backwards through the args list.
.IP "Center Current Row" 1i
In visual command mode, the (lowercase) "zz" command will center the current
line on the screen, like "z=".
.IP "Changing Repeat Count" 1i
The default count value for . is the same as the previous command
which . is meant to repeat.
However, you can supply a new count if you wish.
For example, after "3dw", "." will delete 3 words,
but "5." will delete 5 words.
.IP "Previous Text" 1i
The text which was most recently input
(via a "cw" command, or something similar)
is saved in a cut buffer called ". (which
is a pretty hard name to write in an English sentence).
.IP "Keyword Lookup" 1i
In visual command mode, you can move the cursor onto a word and press
shift-K to have \*E run a reference program to look that word up.
This command alone is worth the price of admission!
See the ctags and ref programs.
.IP "Increment/Decrement" 1i
In visual command mode, you can move the cursor onto a number and
then hit ## or #+ to increment that number by 1.
To increment it by a larger amount,
type in the increment value before hitting the initial #.
The number can also be decremented or set by hitting #- or #=, respectively.
.IP "Input Mode" 1i
You can backspace past the beginning of the line.
.IP "" 1i
The arrow keys work in input mode.
.IP "" 1i
If you type control-A, then the text that you input last time is inserted.
You will remain in input mode, so you can backspace over part of it,
or add more to it.
(This is sort of like control-@ on the real vi,
except that control-A really works.)
.IP "" 1i
Control-P will insert the contents of the cut buffer.
.IP "" 1i
Real vi can only remember up to 128 characters of input,
but \*E can remember any amount.
.IP "" 1i
The ^T and ^D keys can adjust the indent of a line no matter where
the cursor happens to be in that line.
.IP "" 1i
You can save your file and exit \*E directly from input mode by hitting
control-Z twice.
.IP "" 1i
\*E supports digraphs as a way to enter non-ASCII characters.
.IP "Start in Input Mode" 1i
If you ":set inputmode" in your .exrc file, then \*E will start up in
input mode instead of visual command mode.
.IP "Visible Fonts" 1i
With ":set charattr", \*E can display "backslash-f" style character attributes on the
screen as you edit.
The following example shows the recognized atributes:
.sp
.ti +0.5i
normal \\fBboldface\\fR \\fIitalics\\fR \\fUunderlined\\fR normal
.sp
NOTE: you must compile \*E without the -DNO_CHARATTR flag for
this to work.
.IP "File Syncing" 1i
After a crash, you can usually recover the altered form of the file
from the temporary file that \*E uses -- unless the temporary file was
corrupted.
.IP "" 1i
UNIX systems use a delayed-write cache, which means that when \*E tries to
write to the temporary file, the information might still be in RAM instead
of on the disk.
A power failure at that time would cause the in-RAM information to be lost.
UNIX's sync() call will force all such information to disk.
.IP "" 1i
MS-DOS and Atari TOS don't write a file's length to disk until that file
is closed.
Consequently, the temporary file would appear to be 0 bytes long if power
failed when we were editing.
To avoid this problem, a sync() function has been written which will close
the temporary file and then immediately reopen it.
.IP "Cursor Shape" 1i
\*E changes the shape of the cursor to indicate which mode you're in,
if your terminal's termcap entry includes the necessary capabilities.
.IP "Hide nroff Lines" 1i
Th ":set hideformat" option hides nroff format control lines.
(They are displayed on the screen as blank lines.)
.ne 7
.IP "Compiler Interface" 1i
\*E is clever enough to parse the error messages emitted by many compilers.
To use this feature,
you should collect your compiler's error messages into a file called "errlist";
\*E will read this file,
determine which source file caused the error messages,
start editing that file,
move the cursor to the line where the error was detected,
and display the error message on the status line.
Nifty!
.IP "Visible Text Selection" 1i
In visual command mode, 'v' starts visibly selecting characters and
\&'V' starts visibly selecting whole lines.
The character or line where the cursor is located becomes one
endpoint of the selection.
You can then use the standard cursor movement commands to move the cursor
to the other endpoint, and then press one of the operator commands
(c/d/y/</>/!/=/\\).
The operator will then immediately be applied to the selected text.
.IP "Pop-up Menu Operator" 1i
The '\\' key is a new operator,
similar in operation to the c/d/y/</>/! operators
It conjures up a menu, from which you can select any of the other
operators plus a few other common commands.
.IP "Preset Filter Operator" 1i
The '=' key is another new operator.
It is similar to the '!' operator, except that while
\&'!' asks you to type in a filter command each time,
\&'=' assumes it should always run the command stored in the \fIequalprg\fR option.
.IP "Move to a Given Percentage" 1i
The '%' movement key can now accept an optional count.
Without a count, the '%' key still moves to a matching parenthesis
like it always did.
With a count somewhere between 1 and 100, though, it moves the cursor to
approximately a given percentage of the way through the file.
For example, typing "50%" will move the cursor to the middle of the file.
.IP "Regular Expressions"
In regular expressions, several new forms of closure operators are supported:
\\{\fIn\fR}, \\{\fIn\fR,\fIm\fR}, \\+, and \\?.
.NH 2
Omissions
.PP
The replace mode is a hack.
It doesn't save the text that it overwrites.
.PP
Long lines are displayed differently -- where the real vi would
wrap a long line onto several rows of the screen, \*E simply
displays part of the line, and allows you to scroll the screen
sideways to see the rest of it.
.PP
The ":preserve" and ":recover" commands are missing.
So is the -r flag.
I've never had a good reason to use ":preserve",
and since ":recover" is used so rarely
I decided to implement it as a separate program.
There's no need to load the recovery code into memory every
time you edit a file, I figured.
.PP
LISP support is missing.
However, the = key is still an operator that reformats lines of text.
By default, it reformats lines by sending them through the \fIfmt\fP filter,
but you could write your own LISP beautifier and configure elvis to use it.
Key mappings could take care of most other differences.
Auto-indent is the only thing that is irrecoverably lost.
.PP
Autoindent mode acts a little different from the real vi, anyway.
It doesn't handle ^^D or 0^D correctly.
On the other hand, it \fIdoes\fP allow ^D and ^T to be used anywhere in the
line, to adjust the indentation for the whole line.
