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.|
^---------------------------------------------------------------^
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
".
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.
The following is a summary of changes made since the release of Elvis 2.1.
These are in addition to any bug fixes.
- :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.
- ^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.
- 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.
- 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.
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.
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.