.---------------------------------------------------------------. | 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.1 to view it; this version of elvis has the ability to view HTML documents, and print them.This file has many hypertext links. Use them! If you're using elvis 2.1 to browse this file, then hypertextual references will appear as underlined text. (Except on color PCs; since color video cards don't support underlining, hypertextual references will be colored -- white on red, by default.) To follow the hypertext link, move the cursor onto the underlined text and press (Enter). To go back, press (Control-T). The (Tab) key moves the cursor forward to the next hypertext reference.
If elvis 2.1 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.1
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:
:only
:browse
command saves the cursor position on the stack and
then displays the table in the current window.
The :sbrowse
command creates a new window showing that table.
:browse foo.c :sbrowse class:/Ball
:bbrowse
command saves the cursor position on the stack and
then displays the table in the current window.
The :sbbrowse
command creates a new window showing that table.
:bbrowse
:alias
command creates an alias -- a new ex command which
you can implement via a series of existing ex commands.
Aliases can accept arguments, and perform complex operations.
Many sample aliases are included in the distribution.
:alias lower !% s/.*/\L&/
:error
message type has the side-effect of
aborting any pending macros or aliases.
:if !< == !> :then error Address range required
:set
, except that the options will be restored
to their previous value when the alias exits.
:alias total { "Sum the integers in a range of lines local t=0 report=0 nosaveregexp !% s/[0-9]\+/let t=t+\1/x eval !% c (t) }
:try
itself
always succeeds;
this is significant because when a command fails
(anywhere except as the argument of a :try
command),
any pending macros or aliases are aborted.
:alias togglecase { try !% s/.*[a-z].*/\U& else !% s/.*/\L& }
:let i = 1 :while i <= 10 :do { calc i let i = i + 1 }
:switch
command evaluates an expression, and stores the
result in an internal variable.
Each :case
command compares the switch value to a literal string;
if it matches then the remainder of the line is executed an an ex command.
If none of the cases match, then :default
will run its ex command.
:switch os :case unix echo LF :case mac echo CR :default echo CR-LF
:e #1 :1,20 copy (1)$
readeol
can be set to one of dos,
unix, mac, text, or
binary to indicate the newline translations that were
used to read a file into a buffer.
The writeeol
option can be set to any of those values, or
the special value same to use the same translation as
each buffer was read with.
%
command has been extended to match any
pairs of characers.
This option stores the list of character pairs.
showname
causes it to display the name of the current file.
showtag
causes it to display the name of the tag which is
defined on the current line, or the nearest line above it which has a tag.
The showtag
option can make elvis take more time to load files,
since it must find the location of every tag for that file.
true
and false
in the expressions used by :if
and the like.
The value of the false
option is used as a logical false value,
just like "", "0", or "false"; anything else is considered to be a logical
true value.
Any boolean option returns the value of the true
option if it
is set, or the false
option if it is reset.
Non-english speakers may wish to set true
and false
to the local words for those logical states.
You can do that by setting those options explicitly, or by adding lines to
the "elvis.msg" file (e.g., "true:verdad" and "false:falso").
true
and
false
options, to translate a few words that it uses.
Actually, help
doesn't do anything yet, but the values of
submit
and cancel
are used as the labels of
buttons on dialog windows.
menubar
isn't support by "x11" because "x11" doesn't
have a menu bar yet.
font
stores the base font, and the other options tell elvis
how to derive a display font from the base font.
:local nosre
to protect your regular
expression.
lpnumber
causes line numbers to be printed, just as
number
causes line number to be shown on the screen.
Setting the lpheader
option
causes pages to have a header showing the file name, page number, and date.
:if
, :let
, and others.
quote()
adds a backslash before each existing backslash, and
before each character listed in the chars string.
unquote()
does the opposite.
line cursor's current line number column cursor's current column number word word at the cursor position mode mode name as reported by showmode option next next file in args list prev previous file in args list tag current tag as reported by showtag option
readeol
option should be set to.
:set inputtab=identifier
".
:e ftp://ftp.cs.pdx.edu/pub/elvis/README.html
Together with elvis' "html" display mode, this allows elvis to be used as a light-weight Web browser.
:g
command is an example of this.
Traditionally, vi has allowed multiple commands by placing a backslash before
the end of each line except the last, but this didn't always work.
Elvis supports that, and adds a better alternative:
If you give a '{' in place of the command, then elvis will read the following
lines up to the next matching '}', and use the intervening lines as the ex
command.
This is both more reliable and more readable than the backslash notation.
:s///
command lacked
support for the c
flag.
Elvis 2.1 supports :s///c
, at long last!
Elvis' version of ctags will now be installed as "elvtags"
on all Unix systems, including Linux.
Previously for Linux it was installed as "ctags", which made sense because
originally most versions of Linux used elvis 1.8's "ctags", but now most
Linux systems ship with Exuberant Ctags as their default ctags.
Previously, other versions of Unix skipped elvis' ctags
because they already had their own.
The new name for elvis' ctags should allow you to keep the old ctags and
still have access to elvis' ctags when you want it.
(Elvis' version can generate the "ln" attribute, which makes the
showtag
option load files faster, but Exuberant Ctags is
better in just about every other way.)
Elvis' "fmt" program is no longer included in the default program list for any version of Unix. Previously it was installed under Linux, and skipped for other versions of Unix.
In fixing that bug, I noticed a problem in the way elvis was handling character-mode operations which happen to end at the start of a line. In certain circumstances, elvis was including the final newline character as part of the affected text, where the real vi would exclude it. This has been fixed.
Another minor bug: After a command such as "25i*^[" (to insert 25 asterisks), attempting to repeat the command via "." would only insert 24 asterisks. This has been fixed.
completebinary
option turned off, elvis
will still complete binary files' names when you're entering a shell command.
This is handy when you're trying to enter an ex command such as...
:r !uuencode elvis-2.1_3.tar.gz <elvis-2.1_3.tar.gz... in which you're running a program which takes a binary file as input. In any other context, the
completebinary
option will continue to work
as before.
If you normally have inputtab=identifier
set,
elvis will ignore that (treat it like inputtab=tab
)
unless there is a "tags" file in the current directory.
Without this rule, there could be a long delay if you're editing a
non-source file and you hit the <Tab> key, because
elvis would search through the whole tag path for the word before the tab.
(A better solution is to only set inputtab=identifier
if the
file is in a known programming language, as detected by the
knownsyntax(
file)
function.
You can add that to your ~/.exrc file.)
tagprgonce
option has been removed because the
:local
command offers a cleaner way to achieve the same effect.
In any alias or script, you can simply replace ":set tagprgonce=..." with
":local tagprg=...".
Also, there was a bug which prevented elvis from recognizing tags whose address contained a C++ comment. (In other words, "//" confused the tag file parser.) This bug is now fixed.
I added this mostly because users on some Unix platforms have reported that elvis says "# is illegal during initialization". It doesn't happen on any system I use, and none of the standard scripts contain a "#" command, so I'm hoping this will allow users to give me more information.
Also, the :cc
and :make
commands used to output
the first error message before the user hit <Enter>, but
now it will show that message afterward.
The format of the ~/.netrc
file or elvis.ftp
file
remains the same, but the way elvis interprets it has changed.
It now allows multiple entries for the same machine, with different user names.
When you use the
ftp://host/~user/resource
notation to access a given user's account,
elvis will search for an entry with a matching host and user, and use the password from that entry.
Elvis' implementation of HTTP was having trouble talking to some sites that run older server software. This should be fixed now.
Many fixed-pitch fonts were being displayed with a large gap between the characters. For example, although "Courier" looked good, "Courier New" was unusable. This has been corrected by making elvis use the average character width instead of the maximum width. (Shouldn't those two values be the same for fixed-pitch fonts? Apparently they aren't.)
You can now define your own colors, in addition to the named colors, by using the notation #RRGGBB anywhere a color name is expected. The "RR", "GG", and "BB" are any pairs of hex digits, giving the amount of of red, green, and blue in the color. For example, "#c0d0ff" is a nice sky-blue color. (This is the same notation that X-windows uses for non-standard colors.) Presently this feature is limited to defining one extra foreground color plus one extra background color, and it only works correctly on "high color" or "true color" displays (not 16-color or 256-color); these limitations should be lifted in later versions of elvis.
Sometimes, for some programs, elvis was unable to redirect a program's stdin.
This messed up attempts to filter text through an external program.
Typically, the fmt
program included with elvis worked correctly,
but the standard MS-DOS sort
program didn't.
I've spent probably 10 whole days trying to get the Win32 I/O redirection
functions to work consistently, and failed.
I suspect that Serge has had the same bad luck.
Elvis 2.1_3 has a totally rewritten module for running programs, which
simply creates a batch file and runs it.
If there is filtering to be done, then the batch file redirects stdin and/or
stdout to temporary files.
This is a kludge, but it seems to work reliably.
There were a couple of bugs in the "Options->Syntax" menu item. It wasn't always enabled for all syntaxes, and if it was enabled then selecting it would occasionally cause elvis to crash. Both of these should be fixed now.
:n `grep -l sometext *.c`
.
While I was at it, I added a new shell("command")
function which
runs an external program and returns its output, so you can do things like
:let d=shell("date")
.
(These features are omitted from the MS-DOS version to help elvis fit in
the lower 640k.)
The :mark
command, when invoked without any addresses, will
now set the mark to the exact cursor position; previously it was just setting
it to the start of the cursor's line.
I added a :kwic
alias, which greps for a given word anywhere
in elvis' documentation and builds a table table of all matches, with links
to their locations.
This gives you yet another way to search through elvis' documentation
(in addition to the :howto
alias and the :help
built-in command).
For non-Unix systems, you must find a grep utility somewhere for this to work.
If your ~/.exrc file contained :set wrapmargin=0
then
wrapmargin would be listed by :set
, but it shouldn't be.
And now it won't be.
It has been reported that "dead keys" (for entering accented letters) don't work under X11. It appears that my big mistake here was failing to #include <X11/Intrinsics.h>, so elvis' source code didn't know that the multi-character input methods were available. That's fixed, but now the multi-byte input code is being compiled for the first time, and new bugs may turn up.
If the TERM environment variable is unset and there is no reasonable default, then elvis will use the "open" user interface instead of "termcap". Previously you had to give an explicit "-Gopen" flag to make this happen. The new behavior is more like the traditional vi.
The markup display modes (html, man, and tex) can now be configured in or out separately, via DISPLAY_HTML, DISPLAY_MAN, and DISPLAY_TEX macros in the config.h file. Previously, there was a single DISPLAY_MARKUP macro which controlled all of them. This change was made mostly so that "tex" could be omitted from the MS-DOS version.
This is primarily a bug-fix update. There are some big changes that I'd like to make to elvis, but they'll all have to wait until version 2.2. This bug-fix version is simply intended to make waiting for 2.2 a little easier.
Some of the main areas of bug fixes are:
This was a significant bug! The '#' thing was only one manifestation of a dangerous bug. Other manifestations could mangle buffers, cause core dumps, etc. This bug fix alone is probably enough to justify downloading 2.1_4.
bash
shell.
elvis 2.1_4 should fix that. Specifically...
mount
utility.
vi.exe
, view.exe
, and ex.exe
programs
to run in the background.
(Those programs worked in Windows95, but choked in Windows98 and NT.)
To work around this, I replaced the execvp() call with a spawnvp() call
followed by an exit() call.
It'll waste a little RAM now, but at least it works.
This bug also hit Cygwin's bash
shell, when run under Windows98
or NT.
I've tested 2.1_4 under bash
, and it works now.
:make
, :cc
, and :errlist
commands were treating any alphanumeric word as a filename, without
checking to see if it even exists.
It was supposed to verify that the name was an existing,
readable/writable (or just readable if noanyerror
),
non-binary file... and now it will.
:=
command, when invoked without line number, should
display the total number of lines in the buffer. Previous versions of elvis
didn't do that correctly, but 2.1_3 did.
Unfortunately, that fix broke the :.=
command, which is supposed
to display the current line number.
Version 2.1_4 should both of those right, finally.
The ^F and ^B paging commands are supposed to leave two lines of overlap, but previous versions of elvis have only kept one line of overlap. (NOTE: I considered adding an option to control the overlap, because if you have a 24-line screen and 66-line pages, then then it would be nice to leave 1 line of overlap because three ^Fs or ^Bs would equal one page. If you believe an option would be useful, please let me know.)
The $ command accepts a count argument, and moves forward (count-1) lines before moving to the end.
The only new features (since 2.1_3) are...
if os=="unix" then echo Unix else { if os=="win32" then echo Windows95/98/NT/2000 else { if os=="msdos" then echo MS-DOS else { if os=="os2" then echo OS/2 else echo Who? } } }The new way:
switch os case unix echo Unix case win32 echo Windows95/98/NT/2000 case msdos echo MS-DOS case os2 echo OS/2 default echo Who?
lptype
option to "html" causes the
:lpr
command to write HTML output, instead of normal printer
control sequences.
This give a good way to generate WYSIWYG HTML code from any of elvis'
display modes.
It required minimal changes to the code, too -- basically, I just created
a new printer type that uses "<b>" to start bold font, "<i>" to
start italics, and so on, instead of some printer-dependent escape sequence.
:makehtml
alias which attempts to convert plain text to HTML.
It works pretty well, though you'll still need to hand-edit the results in
many cases. You might want to compare the output of :makehtml
to
that of the "html" lptype, to see which one fits your needs better.
:set smarttab shiftwidth=4
"
to change your indentation levels while leaving the tabstop
option unchanged.
The current implementation is a little half-assed though -- you can't backspace over the indentation. Instead, you must hit ^D to reduce the indentation level.
Windowing will be more versatile. Currently the GUI versions of elvis always split detached windows; sometimes it would be nice if they could be attached to the existing window, as a horizontal or vertical pane.
More colors will be supported.
The syntax of the :color
command will change to allow you
to specify colors and other attributes by the type of text, instead of
defining colors by attributes.
For example, ":color link=underlined green
" will define the
appearance of HTML links.
I intend to add a true extension language to elvis. The language interface will be general enough to support a variety of languages. The first language supported will probably be PERL, followed rapidly by Python and TCL.
I'm thinking of modifying the markup display modes (man, tex, and html) to store the list of supported markups, and their effects, in a separate file. That way, you could create your own markups to display nroff -ms, RTF, SGML, and MIME "rich text" documents.
I'd like to redesign the way elvis assigns assigns buffer names. I'd like to make it always use the full pathname of a file as the buffer name. In addition, I'd like for elvis to store a "current working directory" for each window, and use that to convert a relative buffer name into a the absolute pathname. A similar trick would be used for filenames. When running an external program, elvis would change the real current directory to that window's directory. The benefits of all this:
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".
untardos,
run it with no arguments.
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 under Windows95, 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.1_4-msdos.tar.gz
, and untarw32.exe
to unpack
elvis-2.1_4-win32.tar.gz
.
untaros2,
run it with no arguments.
elvis-2.1_4-os2.tar.gz
file, above.