## 10.10. Interesting Features

elvis has a number of interesting features:

Internationalization support
  Like nvi, elvis also has a home-grown method for allowing translations of messages into different languages. The elvis.msg file is searched for along the `elvispath` and loaded into a buffer named `Elvis messages`.

  Messages have the form "terse message`:`long message." Before printing a message, elvis looks up the terse form, and if there is a corresponding long form, that message is used. Otherwise, the terse message is used.

Display modes
  This is perhaps the most interesting of elvis' features. For certain kinds of files, elvis formats the file content on the screen, giving a surprisingly good approximation of a WYSIWYG effect. elvis can also use the same formatting for printing the buffer to several kinds of printers. Display modes get their own subsection, below.
Pre- and post-operation command files
  elvis loads four files (if they exist), that allow you to customize its behavior before and after reading and writing a file. This feature also gets its own subsection, below.
Open mode
  elvis is the only one of the clones that actually implements vi's open mode. (Think of open mode as like vi, but with only a one-line window. The "advantage" to open mode is that it can be used on terminals that don't have cursor motion capabilities.)
Security
  The `:safer` command sets the `safer` option for execution of non-home-directory .exrc files, or any other untrusted files. When `safer` is set, "certain commands are disabled, wildcard expansion in filenames is disabled, and certain options are locked (including the `safer` option itself)". The elvis documentation is no more specific than this; don't blindly trust elvis to provide complete security for you.
Built-in calculator
  elvis extends the ex command language with a built-in calculator (sometimes referred to as an expression evaluator in the documentation). It understands C expression syntax, and is most used in the `:if`, `:calc`, and `:eval` commands. See the online help for the details, as well as the sample initialization files in the elvis distribution for examples.
Macro debugger (2.1)
  elvis 2.1 has a debugger for vi macros (the `:map` command). This can be useful when writing complicated input or command maps.

### 10.10.1. Display Modes

elvis has several display modes. Depending on the kind of file, elvis produces a formatted version of the file, producing a WYSIWYG effect. The display modes are outlined in Table 10.11.

#### Table 10.11. elvis Display Modes

Mode | Display Appearance
--- | ---
`normal` | No formatting, displays your text as it exists in the file.
`syntax` | Like `normal`, but with syntax coloring turned on.
`hex` | An interactive hex dump, reminiscent of mainframe hex dumps. This is good for editing binary files.
`html` | A simple Web page formatter. The tag commands can be used to follow links and return.
`man` | Simple man page formatter. Like the output of `nroff` -`man`.

The `:normal` command will switch the display from one of the formatted views to `normal` mode. Use `:display` ``mode`` to switch back. As a shortcut, the `^W d` command will toggle the display modes for the window.

Of the available modes, `html` and `man` are the most WYSIWYG in nature. The online documentation clearly defines the subset of both markup languages that elvis understands.

elvis uses the `html` mode for displaying its online help, which is written in HTML and has many cross-referencing links within it.

The example below shows elvis editing one of the HTML help files. The screen is split. Both windows show the same buffer; the bottom window is using the `html` display mode, while the top is using the `normal` display mode:

>     <html><head>
>     <title>Elvis 2.0 Sessions</title>
>     </head><body>

>     <h1>10. SESSIONS, INITIALIZATION, AND RECOVERY</h1>

>     This section of the manual describes the life-cycle of an
>     edit session. We begin with the definition of an
>     <a href="#SESSION">edit session</a> and
>     what that means to elvis.
>     This is followed by sections discussing
>     <a href="#INIT">initialization</a>
>     and <a href="#RECOVER">recovery after a crash.</a>
>     _____________________________________________________________________

>     10.0 SESSIONS, INITIALIZATION, AND RECOVERY

>             This section of the manual describes the life-cycle of an
>             edit session. We begin with the definition of an edit
>             session and what that means to elvis. This is
>             followed by sections discussing initialization and
>             recovery after a crash.

>         10.1 Sessions

The `man` mode is also interesting, since normally you have to format and print a man page to be sure you've done a decent job of laying it out. The following quote from the online help seems appropriate.

Troff source was never designed to be interactively edited, and although I did the best I could, attempting to edit in `man` mode is still a disorienting experience. I suggest you get in the habit of using `normal` mode when making changes, and `man` mode to preview the effect of those changes. The `^W d` command makes switching between modes a pretty easy thing to do.

As an interesting adjunct, both the `html` and `man` modes also work with the `:color` command described in Section 10.9.2. This is particularly nice with `man` mode. For example, by default on a Linux console, only bold text (.B) is distinguishable from normal text. But with syntax coloring on, both bold and italic (.I) text become distinct. The mode commands are summarized in Table 10.12.

#### Table 10.12. elvis Display Mode Commands

Command | Function
--- | ---
`di`[`splay`] [``mode`` [`lang`]] | Change the display mode to mode. Use lang for `syntax` mode.
`no[`rmal`]` | Same as `:display normal`, but much easier to type.

Associated with each window is the `bufdisplay` option, which should be set to one of the supported display modes. The standard elvis.arf file (see the next subsection) will look at the extension of the buffer's filename and attempt to set the display to a more interesting mode than `normal`.

Finally, elvis can also apply its WYSIWYG formatting to printing the contents of a buffer. The `:lpr` command formats a line range (or the whole buffer, by default) for printing. You can print to a file or down a pipe to a command. By default, elvis prints to a pipe that executes the system print spooling command.

The `:lpr` command is controlled by several options, described in Table 10.13.

#### Table 10.13. elvis Options for Print Management

Option | Function
--- | ---
`lptype`, `lp` | The printer type.
`lpconvert`, `lpcvt` | If set, convert Latin-8 extended ASCII to PC-8 extended ASCII.
`lpcrlf`, `lpc` | The printer needs CR-LF to end each line.
`lpout`, `lpo` | The file or command to print to.
`lpcolumns`, `lpcols` | The printer's width.
`lpwrap`, `lpw` | Simulate line wrapping.
`lplines`, `lprows` | The length of the printer's page.
`lpformfeed`, `lpff` | Send a form-feed after the last page.
`lppaper`, `lpp` | The size of the paper (letter, a4, etc.). This only matters for PostScript printers.

Most of the options are self-explanatory. elvis supports several printer types, as described in Table 10.14.

#### Table 10.14. Values for the `lptype` Option

Name | Printer Type
--- | ---
`ps` | PostScript, one logical page per sheet of paper.
`ps2` | PostScript, two logical pages per sheet of paper.
`epson` | Most dot-matrix printers, no graphic characters supported.
`pana` | Panasonic dot-matrix printers.
`ibm` | Dot-matrix printers with IBM graphic characters.
`hp` | Hewlett-Packard printers, and most non-PostScript laser printers.
`cr` | Line printers, overtyping is done with carriage-return.
`bs` | Overtyping is done via backspace characters. This setting is the closest to traditional UNIX nroff.
`dumb` | Plain ASCII, no font control.

If you have a PostScript printer, by all means use an `lptype` of `ps` or `ps2`. Use the latter to save paper, which is particularly handy when printing drafts.

### 10.10.2. Pre- and Post-Operation Control Files

elvis gives you the ability to control its actions at four points when reading and writing files: before and after reading a file, and before and after writing a file. It does this by executing the contents of four ex scripts at those respective points. These scripts are searched for using the directories listed in the `elvispath` option.

elvis.brf
  This file is executed Before Reading a File. The default version looks at the file's extension, and attempts to guess whether or not the file is binary. If it is, the `binary` option is turned on, to prevent elvis from converting newlines (which may be actual CR-LF pairs in the file) into linefeeds internally.
elvis.arf
  This file is executed After Reading a File. The default version examines the file's extension in order to turn on syntax highlighting.
elvis.bwf
  This file is executed Before Writing a File, in particular, before completely replacing an original file with the contents of the buffer. The default version implements copying the original file to a file with a .bak extension. You must set the `backup` option for this to work.
elvis.awf
  This file is executed After Writing a File. There is no default file for this, although it might be a good place to add hooks into a source code control system.

The use of command files to control these actions is quite powerful. It allows you to easily tailor elvis' behavior to suit your needs; in other editors these kinds of features are much more hardwired into the code.

Copyright © 2003 O'Reilly & Associates. All rights reserved.