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

CONTENTS

- 1. About this file
- 2. Differences between vi and Elvis 2.2
- 3. Differences between 2.1 and 2.2
  - 3.1 New EX commands
  - 3.2 New VI commands
  - 3.3 New options
  - 3.4 Changed or removed options
- 4. Differences between 2.2.0 and 2.2.1
- 5. Links to related files

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

- Multiple edit buffers, so you can edit several files at once.
- Multiple windows, so you can see multiple edit buffers, or different parts of the same edit buffer.
- Multiple user interfaces, including graphical interfaces under Windows95/98/NT and X11.
- A variety of display modes, including syntax coloring and HTML.
- Online help, with hypertext links.
- Enhanced tags, to support overloading in C++.
- Network support, so you can load/save files via FTP, or even use Elvis as a light-weight Web browser.
- Aliases, which allow you to define new ex commands.
- Built-in calculator

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.