http://invisible-island.net/vile/
Copyright © 1999-2013,2014 by Thomas E. Dickey


VILE (Vi Like Emacs) – Frequently Asked Questions (FAQ)

What is VILE?

VILE – Vi Like Emacs – is a text editor.

vile retains the "finger-feel", if you will, of vi, while adding the multiple buffer and multiple window features of emacs and other editors. It is definitely not a vi clone, in that some substantial stuff is missing, and the screen doesn't look quite the same. The things that you tend to type over and over probably work. Things done less frequently, like configuring a startup file, are somewhat (or very, depending on how ambitious you are) different. But what matters most is that one's "muscle memory" does the right thing to the text in front of you, and that is what vile tries to do for vi users.

Who wrote VILE?

A lot of people, of course, as is true of almost all large programs. (No counter examples come to mind for programs larger than vile).

Vile was started by Paul Fox from an early (public domain) version of MicroEmacs. That is a little odd for two reasons:

So Paul did a lot of work making vile.

I started working on vile late in 1992. Though I had been using vi for almost ten years, it was with little documentation (I long ago lost a grubby photocopy of vi's commands), and had only recently gotten involved in projects where I would edit large numbers of files. Two buffers weren't enough, and (because I was collecting tools for development) I noticed some discussion of implementations of vi that could handle multiple windows. Xvi was unable to get the correct screen-size. Vile looked better, but there were a few problems with left/right scrolling (individual lines would shift, but the display did not necessarily shift as a whole). So I started fixing vile.

Kevin Buettner came in early in 1994, changing the X Windows driver, and later implementing the Perl interface. Rick Sladkey arrived in 1995, working on win32 and djgpp.

We four are listed as authors of vile – but many more people have contributed code, fixes and feedback.

Vile is not huge—at this time (late 2011) the sources total about 174,000 lines—but is still large compared to some editors. A good deal of the bulk is from I/O drivers for different systems. Most of those drivers were written or modified heavily by other contributors.

How is VILE different?

With so many editors to choose from, differences may appear slight. Start with the documented features.

As seen in vile's help-file, it assumes that you are already familiar with vi:

The only vile commands described herein are those not present in vi, or differing greatly from those in vi.
There is a section at the bottom describing other differences between vile and vi.

In contrast, the other common “vi-clones” (elvis, nvi and vim), include the vi documentation—modified to include their extensions. In some cases, the distinction between vi and the clone is obscure.

Vile's documentation can be considered in three parts:

The last part is a difference.

We build vile using a combination of hand-crafted code and tables generated by a special-purpose program mktbls. The source files for those generated tables comprise about 13% of the source code which is used to build vile. Paul Fox wrote mktbls in 1990. When I started work on vile, it was not used routinely to build the tables. Adding a new feature would require modifying the code in two or more places, e.g., one or more function prototypes plus one or more table entries. I revised the program, and made it the first step in building vile. As of 2014, mktbls reads 2,745 lines of data to produce 20,604 lines of header-files.

Vile uses the tables in various ways, including showing the available commands, providing name-completion, lists of predefined variables, functions used for scripting, etc. In other flavors of “vi”, tables like this are an integral part of the hand-crafted code—requiring their developers to do much of the busy-work which mktbls does.

Moreover, in other “vi” flavors, the information shown in response to status commands is static, requiring interaction from the user to make the editor update the display. In vile, however, this information is dynamic—it updates these special buffers (and their windows) as changes are made to the features they render, e.g., the list of all buffers in memory, the mode-settings corresponding to the buffer which has focus, etc.

While many (not all) of vile's features are now found in other vi-compatible editors, some of the most powerful were implemented before widespread adoption in the others.

For example, multiple windows were early features in vile (and xvi) from the start. The same applies to reading from pipes, complex fences. Some of this is brought out in the O'Reilly book, though no careful study has been made of the way in which features are adopted and adapted across the “vi” and “emacs” variants.

What is a vi clone, anyway?

Paul Fox's comment at the beginning of this FAQ suggests that vile is not a vi-clone.
Others say it is. The answer depends on what you want the editor to do.

While other programs may be suggested (see for example, Sven Guckes' page), the term arose in comp.editors during the mid-1990s to refer to four specific programs which reimplemented vi. Those are (in canonical order): elvis, nvi, vim and vile.

Besides basing their design upon vi (with extensions), the vi-clones also influenced each other, mainly through the comp.editors newsgroup in the early/mid-1990s.

Elvis

Elvis was the pioneering vi clone, widely admired in the 1990s for its conciseness and many features. For that combination it is still unmatched among the vi clones. It was the first to provide color syntax highlighting (and to generalize syntax highlighting to multiple filetypes), first to provide highlighted selections via keyboard. Elvis's built-in nroff (early) and (later) html displays gave it unusual WYSIWYG features.

To my eyes, elvis had the conciseness of a program which solved a 15-tile puzzle which I saw demonstrated on a co-worker's MacIntosh in the mid-1980s. Very nice, and impressive.

Steve Kirkendall (elvis's author) would occasionally post to comp.editors, discussing plans and release notes. I started the VMS port of vile using Steve's earlier port of elvis as a reference for the system calls.

Nvi

Nvi was developed by Keith Bostic, and extended by Sven Verdoolaege (a contributor to ncurses). Keith Bostic did not post to comp.editors, nor did Sven Verdoolaege.

Keith Bostic, who is the author of the POSXI vi description, declined to document the modeline feature since it is insecure.

Once (early in 1997) I was discussing ncurses problems with Keith on the telephone, and happened to digress, telling him that I admired nvi for its compatibility with the original vi. Keith responded with a comment that "vile always did windowing better than anyone else".

Aside from using it as a reference version of vi, for testing compatibility, vile does not directly use nvi.

Vim

As Kevin Buettner remarked some time ago, vim is a fine program, but there is a problem with the hype used to promote it. Bram Moolenaar is fairly easy to get along with; this is not true of his fans.

Though presented as the work of a single developer, it was apparent to others that there were many people working on vim during the mid-1990s.

Some of the vim developers (rarely Bram Moolenaar) posted to comp.editors. The only time that I recall Bram posting to comp.editors was to dispute a point with me regarding the compatibility (versus vi) of vim's implementation of the tags setting (a list of filenames).

Most of the discussion on comp.editors regarding vim was by vim's contributors or fans. Not much of that was productive, since its fans were largely ignorant of the features in original vi, and routinely credited vim for those features.

There are a few features where vile and vim have influenced each other. Beginning with 3.0 (August 1994), vim's developers began making lists of features that other programs did, which vim should, with a note where the feature was copied from. As those were implemented, the note was removed; the changelog reflected only the addition.

For completeness, here are the items from vim's to-do lists referring to vile:

The last two items mentioned in 4.0 still appear in vim's to-do list as of release 7 (May 2006).
The other two appeared in releases 5 (February 1998) and 6 (September 2001).

I found these items noteworthy:

Likewise, vile has borrowed occasionally from vim. For example, the way vile shows the "no" prefix for a disabled boolean mode in the settings display was prompted by seeing it in vim. However, vile's settings display is dynamic (updated when a mode is changed), while vim (like vi) is static (requires the user to re-enter the command to get a new display).

The dynamic displays in vile were something that occurred to me when I first became involved with vile at the end of 1992, looking at the [Buffer List] display, and wondering why the “%” and “#” markers did not automatically move around in the display as I switched the current buffer. I fixed that. That led to improving the way vile does caching of buffer size and line-numbers. Once that buffer was dynamic, doing the same for other buffers seemed intuitive. None of that is reflected in the development of the other vi clones.

Here are a couple of animated GIFs to illustrate dynamic displays:

Occasionally someone asks for a feature like vim's (or unlike it). Those are noted in the change-log for vile, e.g., nine occurrences since 1999:

+ add linebreak mode, like vim (request by Paul Van Tilburg).
+ add (nvi/vim) ex-commands: a!, c!, i!
+ add ":c" as alias for ":change-til" (nvi/vim).
  behavior, unlike vim (request by Igor Schein).
  treated as comments if there was a /x modifier. vim does not check
  with vim. Remove reference to nonexistent -m switch (which was
  winvile. Patch is based on code I recently noticed in the vim
+ add vimmode, for vim syntax files
  the former, nvi does the latter, and vim repeats the entire string.

Vile

That is us.

What platforms does it run on?

Vile should build properly on any Unix platform (or similar such as Linux, Cygwin, QNX and BeOS), using the auto-configure script to check for required system features. The configure script is normally Unix-specific (because it uses a variety of shell commands such as sed), but can be regenerated for some other environments such as OS/2 EMX.

Specialized build scripts and I/O drivers are also provided for non-Unix platforms:

I have built—and used—vile on all of those.

Why does Vile have multiple icons?

This is rather lengthy, and is discussed here.

Known/Frequent problems


ANSI C compiler is required

Vile evolved from K&R source, to extended C, i.e., K&R code with ANSI prototypes (which is what many programs are written in). Early in 1996 we chose to convert vile to ANSI C to take advantage of the better type-checking available. So vile requires an ANSI C compiler.

Vile will build with a C++ compiler, though you may have difficulty with the configure script.

Build for one terminal driver

On Unix and Win32, vile can be built for character-cell and GUI terminal types. Most of the terminal-specific I/O calls are made through a generic interface, however you cannot reuse the object files from one type on configuration to build the other.

Some of the Unix configuration tests may yield different results, or be incomplete for one configuration versus another. We remove the config.cache file explicitly in the configure script to circumvent problems with this.

What initialization files are needed?

Vile is similar to vi in some ways, but it reads its own startup file to avoid surprise should you happen to execute vi. Vile's initialization scripts include many commands which would confuse vi.

On Unix, vile looks for .vilerc, starting in the current directory, then in the home directory, and finally in the installed share-directory (shown in the variable $startup-path).

On other systems (including those that cannot use multiple dots in filenames such as VMS, or do so in a crippled fashion such as Win32), vile looks for vile.rc.

Which initialization files are used?

In either case, you can use the command which-source to show which file is actually loaded. Use a count before the command to show all files which would be checked, and the corresponding matches, e.g.,

2
:which-source .vilerc

What environment variables are needed?

The most critical ones are documented in the online help vile.hlp, which you can view by

:h

They include those specific to vile

VILEINIT
VILE_HELP_FILE
VILE_LIBDIR_PATH
VILE_STARTUP_FILE
VILE_STARTUP_PATH
XVILE_MENU (doc/menus.doc)

as well as variables borrowed from common Unix or Win32 convention:

COMSPEC
on OS/2, your shell interpreter.
COLUMNS
the width of your terminal display, for termcap or terminfo configurations.
HOME
your home directory.
HOMEDRIVE
under WinNT, the disk drive containing your home directory.
LINES
the height of your terminal display, for termcap or terminfo configurations.
LOGNAME
used to identify you for reporting errors, or for locking files.
PATH
your execution path, except on VMS.
SHELL
alternative to the $shell variable for specifying subshells, including those used for syntax filtering.
SYS$LOGIN
your home directory on VMS.
TEMP
on Win32 your temporary directory.
TERM
your terminal type, for termcap or terminfo configurations.
TMPDIR
used as the first choice when saving files if a fatal error is detected. Vile uses no temporary files for storing your files' current state otherwise.
USER
alternative to $LOGNAME to identify you for reporting errors, or for locking files.

How can winvile be launched?

There are several ways. Some are created by the installer:

Besides that, there are some programs which have their own mechanisms, which may/may not work well without some customization. On Windows, the key to doing this is to use the start keyword. For instance, I use this (as "grep-winvile.bat") with WinGrep, which lets me jump to the given line and column of a match (trivial with Visual Studio):

@echo off
rem %1 = filename
rem %2 = line
rem %3 = column
setlocal
cd "C:\Program Files (x86)\VI Like Emacs\bin"
set EDITOR=winvile-wide-ole.exe
set PARAMS=-h
if "x%1"=="x" goto edit
set PARAMS=%1
if "x%2"=="x" goto edit
set PARAMS=+%2 %1
if "x%3"=="x" goto edit
if "x%3"=="x1" goto edit
if "x%3"=="x2" goto edit
set /a PARAM2=%3 - 2
set PARAMS=+%2 -c "%PARAM2%:right-arrow" %1
goto edit
:edit
start %EDITOR% %PARAMS%
endlocal

A simpler wrapper script suffices for Eclipse (sorry, no line/columns without a plug-in):

@echo off
setlocal
set WINVILE_DIR="C:\Program Files (x86)\VI Like Emacs\bin"
cd %WINVILE_DIR%
IF ERRORLEVEL 1 goto :finish
set WINVILE_EXE=WinVile-wide-ole.exe
if exist %WINVILE_EXE% start %WINVILE_EXE% %1 %2 %3 %4 %5 %6 %7 %8 %9
:finish
endlocal

What can vile color?

Vile makes use of color to make your file easier to read. It has modes to set the foreground, background and status line colors (fcolor, bcolor and mcolor respectively). Add this to your initialization file to get the predefined color schemes:

source palettes.rc

The most useful schemes are white, black and default, which you can specify by setting the cs mode, e.g.,

:set cs=white

It can also overlay colors and other visual highlighting on your file to show the syntax. The overlay is computed by an external program, referred to as a syntax filter.

The simplest way to turn on syntax highlighting is to add

source filters.rc

to your initialization file, e.g., .vilerc. Typing ^X-q will paint colors according to the majormode which applies to the given file. Typing ^X-Q will clear all of the colors.

If you have a reasonably fast computer, adding

setv $read-hook HighlightFilter

will tell vile to paint colors each time it reads a file.

No colors are shown

Well, you did all that, and there are no colors. If there is a majormode in effect for the buffer, vile attempts to run a syntax filter based on the name of the majormode. Check to see if vile is configured to display colors:

:show-colors

If that works, then the problem is with the syntax filter (perhaps vile cannot find it for some reason). If it does not work, then you have to set up colors (assuming your terminal can display color).

For character cell terminals on Unix, i.e., termcap or terminfo, vile reads the color information specified by your $TERM variable. See the ncurses FAQ for more information. The X Window configuration, xvile reads the color assignments from resources, and is documented in the online help. The Win32 and other non-Unix ports do not require external files to set up color.

If colors are working, perhaps vile simply did not find the syntax filter.

Where are the syntax filters?

Syntax filters may be built-in, or run as separate programs. The former are more portable, less trouble to run and somewhat faster. The configure script (and the win32 makefile) provide a means to specify that any combination of filters can be built-in or external. Even if they are built-in, vile can still run external filters—that choice is left to the macro which performs the highlighting, e.g., HighlightFilter. You can see which filters are built-in by looking at the result of

:show-variables

for the $filter-list variable.

Vile looks for external syntax filters in your path—after adding the library directory $libdir-path to the end.

Use

2:
which-exec

to display the places where vile looks—an "*" will mark the ones it finds.

It used to work...

We changed the form and use of $HOME/.vile.keywords with version 8.3:

The old scheme had no provision for multiple syntax filters. The new scheme names keyword files according to the syntax filter which is used, and may load two files, e.g., $HOME/.c.keywords and $HOME/.vile.keywords for C.

To see which files are found, run the corresponding filter with the -v option. For example, vile-html-filt -vv on this file produces output beginning

ReadKeywords(vile)
..skip ./.vile.keywords
Opened /home/tom/.vile.keywords
parsed  name "" attr "<null>"
parsed  name "" attr "<null>"
parsed  name "Action"   attr "BC1" - class
parsed  name "Comment"  attr "C1" - class
parsed  name "Error"    attr "RC1"
parsed  name "" attr "<null>"
parsed  name "Ident2"   attr "C6" - class
parsed  name "Keyword"  attr "BC3" - class
parsed  name "Keyword2" attr "BC1" - class
parsed  name "Literal"  attr "C5" - class
parsed  name "Number"   attr "BC6" - class
parsed  name "Preproc"  attr "C2" - class
parsed  name "Type"     attr "BC2" - class
ReadKeywords(html)
..skip ./.html.keywords
..skip /home/tom/.html.keywords
..skip /home/tom/.vile/html.keywords
Opened /usr/local/share/vile/html.keywords

The trace notes "..skip" for files that are not found. On Unix, files in the current or home directory are prefixed with "." to hide them. The ".vile.keywords" file is read first, to provide default values for classes.

You can also use the which-keywords macro. For example,

:which-keywords vile

makes a window showing:

Show which keyword-files are tested for:
        vilemode
(* marks found-files)

$cwd
  ./.vile.keywords
$HOME
* ~/.vile.keywords
  ~/.vile/vile.keywords
$startup-path
* /usr/local/share/vile/vile.keywords

Some words are not colored

The syntax filters distributed with vile do not color every word, but the colors should be consistent, corresponding to the syntax. (Coloring every word detracts from readability; by design most of the text is left with the global foreground color fcolor).

But the coloring may be incomplete or inconsistent, and it may not be due to a coding error in the syntax filter. This may happen when the colors overlaid on your buffer from the syntax filter are not aligned properly. Vile runs the given filter, reads the resulting output and extracts markup from it to paint on your file. If another program produces output, it will confuse vile, since the output is not necessarily aligned with your file.

For example, if your $shell is /bin/csh, and your .cshrc file contains an stty command, that program will write an error message when it is run in a pipe. I work around this by setting $shell to /bin/sh (my .profile is empty), which bypasses messages and is faster:

setv $shell=/bin/sh

A better solution bypasses the shell entirely. Build vile using the --with-builtin-filters option. That compiles-in the syntax filters, which also runs much faster. The only drawback to that approach is the size of the executable. Your system may also support --with-loadable-filters, which allows you to keep a relatively small vile executable, with some speed advantage over the original external filters.

No words are colored

Well, take this in stages:

Flex/lex output does not compile

We recommend building the syntax filters with flex (e.g., version 2.5.4a). You can build workable filters with recent versions of lex, but older ones usually lack the %state support needed for most of the filters.

Some older implementations of lex also assume a different order for the chunks of C code in the lex specification; however these do not appear to work well even when the chunks are moved to make the filter compile.

Chunk-ordering is not solely a problem with antique versions of flex. There is a so-called "new" flex available which introduces similar bugs. While the code can (has been as of 9.4) reordered, the maintainers of this new version do not respond to bug reports (it appears to be a defunct project). Stick with flex 2.5.4a, which works.

In particular, there are two areas where "new" flex is broken:

As an alternative to "old" flex, you may wish to install reflex and (setting the $LEX environment variable to "reflex") build vile using that.

What commands does vile accept?

Vile accepts most—not all—commands that vi implements. The few that are not implemented are generally because their syntax is not compatible with vile's command-parsing or name-completion. (For the ones that are compatible—someday).

Vile's extensions over vi are documented in the help file. Detailed descriptions for writing macros, etc., are in the doc directory which is part of the source distribution. But the essential information is in the help file. Just type

:h

The help file is static, and requires you to search it. Far nicer are the features for listing commands, e.g.,

:describe-bindings

That looks like a lot to type. But it is not. With name-completion, one may press tab to fill in the unambiguous parts and see what choices there are.

:des<tab>
:describe-<tab>
:describe-b<tab>indings
:describe-bindings

How do I report bugs?

Submit bug reports via the project mailing list, or via the web-based bug reporting system. Both of these are available here:

https://savannah.nongnu.org/projects/vile

Subscribing to the mailing list is also the best way to keep informed of new releases.


Is there a project history?

Not formally. This FAQ provides a start; if it becomes long it will be in a separate page.

Paul Fox started vile in 1990. According to his comment in main.c:

 * this used to be MicroEMACS, a public domain program written by
 * dave g. conroy, further improved and modified by daniel m. lawrence.

I have been the project maintainer following Paul's changes on September 10, 1996 (vile 6.2).
The switch in maintainers was due to my work to ANSIfy vile, and move away from “legacy C” (unlike other vi-clones, even in 2014).
I began by ensuring that prototypes were used everywhere, and then focused on using (where possible) const.
One of the latter changes broke the imdying function (which saves a copy of the current buffer when vile is unexpectedly killed).
Paul Fox decided that it would be better if I were the maintainer, so that I could deal with these issues firsthand.

As part of the switch, Paul Fox gave me a copy of his RCS archive for vile. I had already begun my own RCS archive (with more detailed history for my own changes), so there was no convenient method for merging the two. I refer to both in providing dates and analysis.

Most of the project highlights are recorded in the CHANGES* files which are part of the project.
Initially, Paul Fox made about one release per year, renaming CHANGES to CHANGES.R3 as part of releasing vile 4.0, etc.
We kept that scheme up until 1999.

Beginning with vile 9.0, the granularity of the versions is finer. I use an alphabetic suffix (occasionally going past z).
After all (unless I change the goal), reaching “10” will make it perfect. There is no point in hurrying, as Zeno was well aware.

That said, here is an outline of the project highlights which I wrote based on reading the change-logs and RCS archives:


Where can I read more?

Vile is covered reasonably well in both of these. I have found the 6th edition of the O'Reilly book more useful.
On the other hand, I contributed much more (to the section on vile, of course) to the 7th edition.

The 6th edition is useful due to Robbins' inclusion of vi esoteria. That is not provided in earlier editions.

Earlier, I relied for vi information on this:

It is out of print.

Y2K Compliant?

Certainly.

Vile does not store or retrieve dates in any form that depends on the year. Vile's use of time information is limited to

Copyright

Vile is copyrighted by Paul G. Fox, Thomas E. Dickey and Kevin Buettner with some files (e.g., visvile) copyright by Clark Morgan. We distribute it under the terms of the GNU Public License, Version 2.