Here's a quick list of features in 1.5 that aren't in 1.4 - Under MS-DOS, no system variables are accessed directly. - Elvis now works under VMS. - The "file is busy" limitation has been removed. - Control-V quoting is more compatible with the real vi. - The ":set warn" warning is only output on a ":!" or ":sh" command that isn't being used as a filter. - Function keys can be easily mapped in a terminal-independent way. The ":mkexrc" command will then save the mappings in a terminal-independent way. - The `ctags` program has been modified to support ANSI C (somewhat). - The `ref` program has been modified. It no longer needs a "refs" file - A new ":color" command allows you to control which colors elvis uses. (This only works right on PCs... running any operating system, though!) - The ":set remap" option is now supported. Elvis allows recursive macros! - A new option, ":set ruler", has been added. It causes elvis to constantly display the current line/column numbers. - Many small changes have been made to bring elvis a little closed to POSIX. - In visual commannd mode, the new 'v' and 'V' commands let you *visibly* mark the text that you want to apply a c/d/y//\ command to. - The \ key is a new operator command. It brings up a small menu. - The = key is now an operator command that sends the selected text through a predefined filter program. The default filter is "fmt", but you can change it via ":set equalprg=indent" or whatever. - A clone of "fmt" is included. - You can now move directly to a given percentage of the way through the file, via a command such as "50%". (The numberless % command still works, too.) - Regular expressions now support the \{n\} and \{n,m\} closure operators. - File preservation and recovery is now handled in a more vi-like way. - Keyboard timeouts are now handled in a better way on SysV and BSD unices. The main goals of 1.5 have been to fix bugs, improve portability, increase compatibility with the real vi, and add a few useful extensions. Most of the extensions can be individually disabled by compile-time options, if you like. My favorite extension is a new *visible* way to select text to delete, yank, or whatever. In visual command mode, if you hit 'v', then the character under the cursor is hilighted. As you move the cursor around, all text from the 'v' spot to the current cursor position is hilighted. When you've moved the cursor to the end of the text you want to act on, you just need to hit one of the operator keys once. For example, "vwwwd" is approximately the same as "3dw". To cancel the selection without doing anything to the text, hit 'v' a second time. The uppercase 'V' key does the same thing with whole lines, instead of characters. E.g., "Vjjjjj>" is a lot like ">5j" or "6>>". The '\' key is a new operator which pops up a menu from which you can choose any of the most common operations. All three of these can be mapped using the "visual" hack. This allows them to be used while you're in input mode. Also, I've experimented with using them in conjunction with a mouse, with the mouse configured like this: mouse movement simulates repeated pressings of the arrow keys, and the buttons send unique escape codes when pressed and when released. I mapped the left and right buttons to send 'v' and 'V' (respectively) when pressed, and '\' when released. This gives elvis a reasonably nice mouse interface, since the '\' pop-up menu is clever enough allow selection via arrow keys (mouse movement) and the '\' key (mouse button). The '%' movement command can now accept a "count" argument. A plain "%" still moves to the matching parenthesis, as always, but "50%" moves the cursor to approximately half way through the file. I figured this might provide a nice hook for adding support for a slider bar in a windowing system, but I haven't actually tried it. For a similar reason, control-X now moves the cursor to a given screen column (taking side-ways scrolling into account), which I figured might be useful in conjuction with the 'H' command for adding simple cursor positioning in a windowing system. If the user clicks on row 5 column 27, then you could stuff "5H27^X" into the type-ahead queue, and elvis would move the cursor there. The '=' key is a new operator which filters the affected text through an external program. It is similar to the '!' command, except that '=' uses a predefined command instead of asking you each time. The default program is "fmt", and you can change it via ":set ep=foo". A version of "fmt" is included. (In case you didn't know: fmt performs simple paragraph reformatting and word wrap.) There is a new ":color" command. Its usage should be fairly intuitive. Try ":color light cyan on blue" first, and then ":color" with no arguments. There are several new :set options. Most of them are SysV compatible. One nice extension is ":set ruler", which causes the row and column number to be continuously displayed on the bottom line of the screen. The ctags command has been modified to work better with "new style" function definitions. Also, it has been extended to allow typedefs and static (local) definitions to be included. The ref command has also been improved. Also, it has been extended to work well with the "static tags" option of the new ctags program. You are no longer forced to have a separate "refs" file (although you can if you want) because ref now reads the "tags" file and then looks up the function header. Elvis can be configured to call the "ref" program to perform tag lookup, so elvis can benefit from the more sophisticated lookup that "ref" offers. Regular expressions can now handle \{m\} and \{m,n\} notation. The \{m\} operator means "the preceding single-character expression must be repeated exactly m times." The \{m,n\} notation means "the preceding single-character expression must be repeated at least m times, but no more than n times." If m is missing, it defaults to 0. If n is missing, it defaults to infinity. So "^-\{80\}$" matches a line of exactly 80 hyphens, and "[A-Za-z]\{10,\}" matches any word that has 10 or more characters. The ttyread() function has been modified. It is now passed a "timeout" argument. This argument should be 0 to never timeout, or the amount of time to allow for a keystroke, expressed in tenths of a second. For SysV UNIX, this is implemented via VMIN/VTIME. For BSD, it uses select(). For other UNIX flavors, it uses the old SIGALRM trick and has poorer time resolution. All three UNIX versions are in the file "unix.c". File preservation and recovery is now handled in a more vi-like way. A program called elvprsv extracts the text from a temp file and stores it in the /usr/preserve directory. A separate program called "elvrec" is used to recover the file -- move it from /usr/preserve to the current directory. Sadly, this makes installation more complex. The tinytcap.c file has been completely rewritten, to make it smaller and more maintainable. More terminal descriptions are included in it now. The ":set remap" option is now supported. Many of the more complex macro packages depend on this option. Also, support for maps and abbreviations has been merged into a single, more cohesive package. Abbreviations work a little better now than they did before.