Quick intro to Elvis 2.2, with links to source code and binaries

CONTENTS
.---------------------------------------------------------------.
| This is not Elvis' user manual!  The real documentation for   |
| Elvis is located in its online help facility.  While running  |
| Elvis, enter the command ":help" to see the table of contents.|
^---------------------------------------------------------------^

1. About this file

This file is written in the HTML markup language. You can view it with any WWW viewer, such as Netscape. You can also use Elvis 2.2 to view it; this version of Elvis has the ability to view HTML documents, and print them.

If Elvis 2.2 doesn't automatically start up in HTML mode when you view this file, then you'll need to force it into HTML mode by giving the command ":display html".

2. Differences between vi and Elvis 2.2

Elvis is a superset of vi. It runs on more operating systems than vi, it is free, and you can obtain the source code. Elvis also has many new features. These new features are described in the first chapter of the online manual, which hypertext links to the other parts of the manual where those features are described in detail. Here's a just brief list:

For a more complete list, with links to detailed descriptions, check the online manual. You can bring up the online manual by starting Elvis and giving the command ":help". The list of extensions appears after the table of contents and a brief introduction.

3. Differences between 2.1 and 2.2

The following is a summary of changes made since the release of Elvis 2.1. These are in addition to any bug fixes.

3.1 New EX commands

:alias, :unalias
Create, list, alter, or remove aliases. Aliases are new ex commands that you create from a sequence of other ex commands.
:autocmd, :augroup
Create, list, alter, or remove autocmds. Autocmds are ex command lines that are executed automatically on certain events, such as loading a file.
:check, :words, :wordfile
These configure the built-in spell checker.
:color
Not really new, but radically changed. The new version is much more powerful.
:fold, :unfold
These define folds, and either close or open them. Folds give you a way to hide parts of your text without actually deleting it. There is a :foldc alias which folds C source pretty well.
:for, :do
This loops over a list of file names, or other values.
:local
Used within a script or alias, this creates a local copy of an option so the alias can use it for storing temporary values, without clobbering the value that the option had before.
:map
Not new, but significantly changed. You can now use keywords to control when and how the map is applied.
:nohlsearch
Temporarily removes the highlighting for the hlsearch option. Then next time you search, the highlighting will return.
:normal
When invoked with arguments, Elvis will interpret the arguments as vi commands.
:only
Closes all windows except this one.
:preserve
Exit Elvis, but don't delete the session file.
:push
This is similar to :e, except that :push saves the cursor's original location on the tag stack, so you can return via :pop or ^].
:region, :unregion, :chgregion
These create, remove, or change highlighted regions. The text itself is unchanged. Generally you would use :region to highlight text that has changed, or is significant for some other reason.
:safely
Run an ex command line with the security option temporarily increased to "safer". This replaces the :safer command which ran a script. You can achieve the same effect via ":safely source script".
:switch, :case, :default
The usual "switch" control structure. This is useful in scripts and aliases.

3.1 New VI commands

^I (<Tab>)
For "html" mode, this moves forward to the next hypertext link. For "normal" and "syntax", it toggles folding of the current line.
g^I (g<Tab>)
Move backward to the preceding hypertext link.
g^V (g<C-V>)
If a rectangle is selected, go to the other corner in the same line.
g$
Move to the end of the current row, taking line wrap into account.
g%
If any text is selected, go to the other end.
g0
Move to the start of the current row, taking line wrap into account.
g=key
Operator. Replace old text with an equal number of key characters.
gD, gd
Go to global or local definition of the word at the cursor.
gI
Input at start of line, before indent.
gJ
Join lines without adding whitespace
gS
Move to the end of a spell checker word. The spell checker's definition of a word differs from the rest of Elvis in that spell checker words may contain an apostrophe, provided there are letters on both sides of the apostrophe.
gU
Operator. Converts text to all uppercase.
g^
Move to start of current row, after indent, talking line wrap into account.
gh, gl
Move left or right one character, skipping over hidden characters. This is handy when viewing text in a markup display mode, since it moves over the markups effortlessly.
gj, gk
Move down or up one row, taking line wrap into account.
gs
Move to the next misspelled word. If given a count, then before moving it tries to fix the current misspelled word using one of the listed alternatives.
gu
Operator. Converts text to all lowercase.
g~
Operator. Toggles text between uppercase and lowercase.

3.3 New Options

antialias, aasqueeze
For "x11" only, the antialias option controls whether Elvis will use the Xft library to draw antialiased text. Antialiased fonts tend to leave a much larger gap between lines, so the aasqueeze option gives you a way to reduce that gap, and get more lines on the screen.
auevent, aufilename, and auforce
These options are only defined during an autocmd event. They describe the event.
background
When Elvis doesn't know the background color (which can only happen when using a text-based user interface such as "termcap"), it may use this option to help it choose a contrasting foreground color.
bb
This is a buffer option with no built-in purpose. You can use it to store attributes about the buffer, for use by your own maps and aliases.
binary
This is set to indicate that Elvis was invoked with a "-b" flag. The default Elvis.brf uses this to set the readeol option to "binary" when appropriate.
blinktime
For "x11", this controls the cursor's blink rate. Setting it to 0 will disable blinking.
cleantext
Controls when Elvis erases old text. Its value is a comma-delimited set of keywords, which may include "short", "long", "bs", "input", and/or "ex".
eventerrors, eventignore
These affect the handling of autocmd events.
filenamerules
This controls the way file names are parsed and manipulated by Elvis. It's value is a comma-delimited list of keywords, which may include "dollar", "paren", "space", "special", "tilde", and "wildcard". Windows users may want to remove the "space" keyword, which will prevent Elvis from parsing spaces as name delimiters; this will make it easier to enter names with spaces in them.
folding
This is a window option. It controls whether folding is active in that window.
guidewidth
This is a buffer option, which draws thin vertical lines between columns of text. Its value is a comma-delimited list of column widths, similar to the tabstop and shiftwidth options.
hllayers, hlobject
These two options work together to give you a way to highlight text objects around the cursor. For example, you can highlight the current line via ":set hllayers=1 hlobject=al".
hlsearch
This highlights all instances of text that matches the most recent search.
iconimage
This chooses an icon to be used for Elvis' windows.
includepath
In "syntax" display mode, clicking on a #include file will search for that file in the includepath.
incsearch
Causes searches to be incremental. This means that every time you hit a key while entering the search regular expression, Elvis will search on the partial expression entered so far.
listchars
Controls the appearance of special characters in list mode. You can also use it to define arrows to mark long lines when side-scrolling is active (i.e., the wrap option is off).
lpcontrast
For color printing, this enforces a minimum contrast by darkening light colors.
lpoptions
For the "ps" and "ps2" lptypes, this can be set to a variety of values to tweak the output. See ":help set lpoptions".
magicchar, magicname, magicperl
These control the parsing of regular expressions.
prefersyntax
You can set the prefersyntax option to one of "never", "writable", "local", or "always" to control when Elvis should start displaying a file in the "syntax" display modes rather than one of the markup display modes such as "html". For example, after ":set prefersyntax=writable", whenever you edit an HTML file that is writable Elvis will start in "syntax html" mode, but readonly files (including anything read via the HTTP protocol) will still start in "html" display mode.
scrollbgimage
Elvis can use background images in the "windows" and "x11" user interfaces. This option controls whether the background image should scroll when the text scrolls.
scrollwheelspeed
For wheel mice, this controls the number of lines scrolled for each detent of the wheel.
security
This can be set to "normal" for no protection, "safer" to protect you from malicious writing by a trojan horse, or "restricted" to protect the system from malicious reading by you.
smartargs
This uses the "tags" file to find the arguments for functions. When you're in "syntax" display mode and type in a function named followed by a '(', Elvis looks up that function name and inserts the formal parameters after the cursor. You can then overtype the formal parameters with the actual parameters.
spell, spellautoload, spelldict, and spellsuffix
These control Elvis' built-in spell checker.
ttyitalic, ttyunderline
These can be used to disable certain attributes on terminals that don't support them very well. In particular, the text mode on color VGA screens don't show underlining by converting the background to red; this may interfere with your own choice for a background color.
tweaksection
This relaxes the definition of a "section" so that the [[ and ]] commands will work well even if you aren't in the habit of putting your outer { characters in the first column of a line.
ww
This is a window option with no built-in purpose. You can use it to store attributes about the window, for use by your own maps and aliases.
xencoding
The "x11" interface now allows you to specify fonts as "fontname*size", like the "windows" interface. When using this notation, Elvis will use the value of xencoding as the last to elements of the font's long name. A typical value is "iso8859-1" to load Latin-1 fonts.

3.4 Changed or removed options

commentfont, stringfont, prepfont, keywordfont, functionfont, otherfont, and variablefont
The syntax display mode previously used these options to control the appearance of different parts of the language. Those options are no longer necessary since the :color command can directly assign attributes to text faces named "comment", "string", etc. Consequently, those options have been deleted.
boldstyle, emphasizedstyle, fixedstyle, italicstype, normalstyle, and underlinedstyle
Similarly, the "windows" interface used these options to control the attributes of fonts. The have been deleted, since :color does this now.
underline
The "x11" interface used to have an "underline" option to control the attributes of the "underline" font. This has been deleted.
normalfont
The "x11" interface's normalfont has been renamed to "font", to be more similar to the "windows" interface.
lppaper
The lppaper option has been replaced by a more versatile lpoptions option.
showname, showcmd, showstack and showtag
These options have all been replaced by a single show option.
safer
The safer option has been replaced by a security option, which can be set to "normal", "safer", or "restricted".
tabstop, shiftwidth
These options have been improved. You can now set the value to a comma-delimited list of column widths.

4. Differences between 2.2.1 and 2.2.0

Elvis 2.2.1 is mostly a bug-fix update of 2.2.0. A few new feature crept in though.

4.1 Fixed bugs

:andale was using Luxi Mono fonts
The :andale alias (used in the "x11" user interface) was actually using Luxi Mono fonts instead of Andale fonts.
filenamerules broke newline handling
When I implemented the filenamerules option in 2.2.0, I accidentally broke the way it parses newlines. This is important if you remove the spaces keyword from filenamerules, and then do something like ":n `grep foo *.txt`" to sets the args list to all files containing "foo".
HTTP User-agent: header line
When sending HTTP requests, Elvis should send a User-agent: header line. Some web sites demand this.
Default button names
In the "html" display mode, the <input type=submit> and <input type=reset> tags should have the default values "Submit" and "Reset" respectively. In 2.2.0, they have no default.
<hr/> shows ------------>
The "html" display mode had trouble with tags that end with "/>". Elvis would display the > on the screen instead of hiding it.
<Esc>
The <Esc> key should beep when pressed in visual command mode.
Delayed screen updates in "x11" user interface
When a map times out, Elvis wasn't updating the screens immediately in the "x11" user interface, which made it hard to detect that the map had indeed timed out.
"d)" could crash
In a file full of blank lines, "d)" caused 2.2.0 to dump core.
:put from a cut buffer
The :put command wasn't accepting a cut buffer name argument.
:dict didn't handle single words
The :dict alias (after ":load dict") didn't handle single-word queries correctly.
The directory editor's links were relative to the wrong directory.
If you used ":e dirname" to edit the directory "dirname", then the links in the generated HTML weren't interpreted as being relative to "dirname". They were treated as being relative to the current directory.
"x11" converts <b> to ^K0062.
The "x11" user interface is too aggressive when trying to convert key names from angle-bracket notation to raw characters. If a map contains an HTML tag such as <b>, and the tag name happens to match the name of a key such as the "b" key, then Elvis was trying to convert that keystroke into a raw control sequence.
":normal cwFOO^[" didn't work
The c operator was implemented in a way that didn't work in the :normal command.
".IP \(bu 4" had too large of an indent.
This is apparently due to the fact that "4" has no explicit scaling suffix, and .IP was using the wrong default scaling factor.
Hard to enter ^ in WinElvis on a Norwegian keyboard
WinElvis has always had a hard time with "dead keys", but now I'm hopeful that it should work. The ^ key works in Norway now, at least.
":e +cmd file" didn't work
For the :e command and a few others, the "+" flag could only handle a line number parameter, not a full ex command line.
Typos in manual.
Many found and fixed. Still many more to be found, I'm sure.
:chregion always changes the comment
The :chregion shouldn't change the comment of an existing region unless you give a new comment explicitly, or the old comment was merely the old font name.
":set show=spell" doesn't work very well.
You need to load the whole dictionary to get good suggestions from the spell checker. In 2.2.0 you had to turn on the "spellautoload" option, but in 2.2.1 that option is on by default.
:map doesn't list all user-defined maps.
2.2.0 assumed that any map tied to a symbolic key was defined by the system, so it wouldn't list it unless you said ":map all". This means you couldn't see actions mapped to function keys. 2.2.1 is smarter about this -- it adds a flag to indicate whether the map was added by the user or created automatically by the GUI.
Command names were truncated in error messages.
When displaying a "bad command name" error message, 2.2.0 would truncate the name at the first character that prevented it from being recognized as a command. 2.2.1 displays the full name of the bad command, exactly as you typed it.
:man doesn't display backslashes correctly
The :man alias didn't handle backslashes very well, so pages which use a lot of backslashes such as ":man groff_man" looked bad.
:%unr doesn't always remove all regions.
This mostly occured when running autocmds. It also affected the :chregion command.
:%j only joined two lines
The command ":1,%j" joins all lines but ":%j" only joined two.
elvis.ini maps too much
The default "elvis.ini" file contained maps without the nosave flag, so if you ran :mkexrc in an xterm, your ~/.elvisrc file would contain maps that are present in all user interfaces and for all termcap terminal types.
:mkexrc can lose GUI-specific options
The :mkexrc command only saved GUI-specific options for the current GUI. This means that running :mkexrc in the "termcap" interface could clobber your default font for the "x11" interface. 2.2.1 gets around this by storing all GUI-specific options, even those for other GUIs or unknown GUIs, just so it can save them in the ~/.elvisrc file.
<li><p> looks ugly
Many HTML documents use this sequence of tags to generate lists that have a bit of vertical whitespace between items. But 2.2.0 was drawing the list item marker (bullet or number) on the blank line, instead of the line where the paragraph's text starts. 2.2.1 treats this as a special case -- it ignores the <p> in this context.
security=safer is too strict
The "security=safer" setting didn't allow some command that it should have allowed. This prevented some harmless and useful commands such as "elvis -client foo" from working. To get this working right, I had to overhaul the behavior of "security=safer". It is no longer a more lenient superset of "security=restricted". See ":help set security" for details.

One consequence of this is that the "-S" flag now sets security=restricted.

:wq didn't work when security=safer or security=restricted.
The manual said it should. The new version of security=safer doesn't allow any writing, but you can now :wq when security=restricted.
The "ax" text object didn't support tag names with hyphens
I've extended it to allow single hyphens but not double hyphens (since double hyphens mark comments). It also allows colons, for namespace control.
dirperm(".") returns readonly
The dirperm() function didn't recognize directories correctly. This was a bug in the way the "dir:" pseudo-protocol was implemented.
hlobject didn't allow commas
An increasing number of options in elvis store multiple values in comma-delimited lists. The "hlobject" option can store multiple values, but required them to be either crammed together or delimited by spaces. Now it supports commas.
rcssince didn't work
The rcssince alias (part of ":load since") is supposed to be executed when a buffer is loaded, but it used some commands which are illegal during initialization. Most of the commands that are illegal during initialization are only illegal because they're useless until the first file is loaded into a buffer. The rcssince alias was actually running after the file was loaded, so it should be allowed, but Elvis had a rather weak idea of when "initialization" ends.
:suspend didn't work
It wasn't in Elvis' internal command list correctly. The :stop equivalent has always worked though.
Backslashes aren't handled right in "simpler syntax"
If a "simpler syntax" expression started with \( or \$ then Elvis should convert that to a literal ( or $ character. Instead, 2.2.0 was leaving it as a literal \ followed by an parenthesized subexpression, or $ variable substitution. (This arose from trying to make an initial \\ remain unchanged so Windows users could five UNC names such as \\machine\dir\file.)
AliasLeave events
At the end of an alias, 2.2.0 generated an AliasEnter event when it should have generated an AliasLeave event.
:eval does not compute
The :eval command could get confused if the command that it runs needs to evaluate an expression. This was because a static buffer is used to return the results of evaluations, and :eval didn't copy the result into a local buffer before trying to execute it.
Trouble with gzipped files
The ":load gzip" command (formerly ":load augz") sets up elvis to automatically handle gzipped files. It has some problems, but the two biggest problems are now fixed.

One problem was that filtering commands always wrote out the final newline to gunzip, even though that newline wasn't part of the gzipped data. This caused gunzip to output an error message. 2.2.1 doesn't write out the final newline when the "partiallastline" option is set.

The other main problem was that the file was initially displayed in hex mode, even after the file had been gunzipped into text. To get around this, elvis will now temporarily remove ".gz" from the end of the file name, then rerun the "elvis.arf" script, and then slap the ".gz" back on the file name again so the file can be saved correctly.

"x11" could generate a BadMatch error while exiting
This would occur if you start Elvis from an xterm, and then exited the xterm before Elvis. Elvis will now ignore that particular error.

4.2 New features

:nofold
Wipes out folds. This differs from :unfold in that :unfold leaves some information behind to allow the region to be easily refolded. :nofold leaves nothing behind.
Persistent information
Elvis can store cursor positions and some other things between invocations. See the "persistfile" and "persist" options.
%< and #< in filenames
When giving file name arguments, you can use %< and #< to get the name of the current or alternate file, with its extension removed. For example, if you're editing "database_interface.c", then you can get to "database_interface.h" by typing ":e %<.h".
:phelp command
Like :help except that :phelp doesn't split the screen. Instead, it saves your old cursor position on the tag stack and then shows the help page in your current screen.
X11 buttons can simulate keystrokes
The :gui command accepts a new notation for defining toolbar buttons that simulate keystrokes instead of invoking an ex command. This is useful when you want to do something with a character selection; ex commands treat all selections as line selections.

The notation uses square brackets around the name. You can put the characters to simulate after the closing square bracket. If you omit those characters, then Elvis will simulate keystrokes that spell out the button name, with the brackets included. You can then set up a :map to convert that to something else. That can be nice because elvis allows maps to be somewhat context sensitive.

Computed line addresses
In ex command lines, you can now use =option to pull a line address from an option, or =(expression) for more complex expressions. This is often handy in aliases.
GDB interface
The core of a simple GDB interface is provided, to allow Elvis and GDB to work together. This depends on Elvis' "x11" user interface; you can't use it with the termcap interface. It is implemented partly as a C program that acts as a "wrapper" around GDB and parses its output for things that Elvis needs to know, and partly as a set of aliases which receive that information and act on it (e.g., by moving the cursor, or changing the highlight of breakpoint lines).
Generic "state" display
A new "state" option has been created. If the "show" option contains the keyword "state", then the value of the "state" option will be displayed at the bottom of the window. This can be handy in complex alias packages. The GDB interface uses it to indicate the debugged program's status.
More function keys
The <F11> and <F12> function keys are now supported on most platforms. I also tried to support shift and control function keys, with some success on Linux.
:map noselect ...
The :map command now supports a noselect flag. This is short for "every context except select".
:load scripts described
I've added a section to the "Tips" chapter describing the scripts in Elvis' library. (These may be loaded via the :load alias.)
:source can read from a program
The :source command has been extended to allow it to read the output of a program, and interpret that output as a series of ex commands. For example, you could create a program that scans an HTML document and outputs a series of :fold commands to allow you to selective hide sections of it.
incsearch partially supports history
When using incremental search, the final search expression is stored in the search history. You can use arrow keys or ^Ok and ^Oj to retrieve a previous search. Full editing is still only supported for non-incremental searches, though.
herefile script
After ":load herefile", Elvis should be able to highlight "herefiles" in shell scripts. Herefiles are text files embedded within the script itself, between <<SYMBOL and a line containing just SYMBOL.

5. Links to related files

The main download site is ftp.cs.pdx.edu. The files can also be found at Elvis' home page, http://elvis.vi-editor.org/

Most of the following are binary files, not text or HTML files, so you can't view then with your Web browser. But you can use your browser to download the files. For Netscape, use <Shift-Click>; for MSIE, use <RightClick> and "download".

untar.c
This is the complete source code for "untar", a little program which extracts files from a gzipped tar archive. Comments near the top of "untar.c" describe how to compile and use it. If you already have the gzip and tar utilities, then you don't need this.
untardos.exe
This is an MS-DOS executable, produced from the above "untar.c" file. It can also be run under Windows 3.1, in a Dos-prompt window. For brief instructions on how to use untardos, run it with no arguments.
untarw32.exe
This is a Win32 executable, produced from the above "untar.c" file. It runs under WindowsNT and Windows95. It runs somewhat faster than the MS-DOS version. It also supports long file names. For brief instructions on how to use untarw32, run it with no arguments, in a text-mode window.

NOTE: MS-Windows95 and MS-DOS use incompatible methods for mapping long file names to short ones. So if you extract the files using untarw32.exe, DOS programs won't be able to find them with their expected names, and vice versa. Consequently, you must use untardos.exe to unpack elvis-2.2_1-msdos.tar.gz, and untarw32.exe to unpack elvis-2.2_1-win32.tar.gz. (Actually, I recently added a -m flag which forces untarw32.exe to convert long file names to short ones using the MS-DOS method.)

untaros2.exe
This is an OS/2 executable, produced from the above "untar.c" file. For brief instructions on how to use untaros2, run it with no arguments.
elvis-2.2_1.tar.gz
This is a gzipped tar archive of the source code and documentation for Elvis 2.2 and its related programs.
elvis-2.2_1-msdos.tar.gz
This archive contains the documentation and MS-DOS executables for Elvis 2.2.
elvis-2.2_1-win32.tar.gz
This archive contains the documentation and Win32 executables for Elvis 2.2. These were compiled and tested under Windows95, but should work under WindowsNT 3.51 (or later) as well.
elvis-2.2_1-os2.tar.gz
This archive contains the documentation and OS/2 executables for Elvis 2.2. If this link is broken then look in Herbert's site, below.
http://www.fh-wedel.de/pub/fh-wedel/staff/di/elvis/00-index.html
This is where the OS/2 maintainer stores his most up-to-date versions. It may be better than the elvis-2.2_1-os2.tar.gz file, above.