Viper is a Vi emulation on top of Emacs. At the same time, Viper provides a virtually unrestricted access to Emacs facilities. Perfect compatibility with Vi is possible but not desirable. This chapter tells you about the Emacs ideas that you should know about, how to use Viper within Emacs and some incompatibilities.
Viper was formerly known as VIP-19, which was a descendant of VIP 3.5 by Masahiko Sato and VIP 4.4 by Aamod Sane.
Emacs can edit several files at once. A file in Emacs is placed in a buffer that usually has the same name as the file. Buffers are also used for other purposes, such as shell interfaces, directory editing, etc. See section `Directory Editor' in The Gnu Emacs Manual, for an example.
A buffer has a distinguished position called the point. A point is always between 2 characters, and is looking at the right hand character. The cursor is positioned on the right hand character. Thus, when the point is looking at the end-of-line, the cursor is on the end-of-line character, i.e. beyond the last character on the line. This is the default Emacs behavior.
The default settings of Viper try to mimic the behavior of Vi, preventing the cursor from going beyond the last character on the line. By using Emacs commands directly (such as those bound to arrow keys), it is possible to get the cursor beyond the end-of-line. However, this won't (or shouldn't) happen if you restrict yourself to standard Vi keys, unless you modify the default editing style. See section Customization.
In addition to the point, there is another distinguished buffer position called the mark. See section `Mark' in The GNU Emacs manual, for more info on the mark. The text between the point and the mark is called the region of the buffer. For the Viper user, this simply means that in addition to the Vi textmarkers a--z, there is another marker called mark. This is similar to the unnamed Vi marker used by the jump commands (" and "), which move the cursor to the position of the last absolute jump. Viper provides access to the region in most text manipulation commands as r and R suffix to commands that operate on text regions, e.g., dr to delete region, etc. See section Basics, for more info.
Emacs divides the screen into tiled windows. You can see the contents of a buffer through the window associated with the buffer. The cursor of the screen is positioned on the character after point. Every window has a mode line that displays information about the buffer. You can change the format of the mode line, but normally if you see `**' at the beginning of a mode line it means that the buffer is modified. If you write out the contents of a buffer to a file, then the buffer will become not modified. Also if you see `%%' at the beginning of the mode line, it means that the file associated with the buffer is write protected. The mode line will also show the buffer name and current major and minor modes (see below). A special buffer called Minibuffer is displayed as the last line in a Minibuffer window. The Minibuffer window is used for command input output. Viper uses Minibuffer window for / and : commands.
An Emacs buffer can have a major mode that customizes Emacs for editing text of a particular sort by changing the functionality of the keys. Keys are defined using a keymap that records the bindings between keystrokes and functions. The global keymap is common to all the buffers. Additionally, each buffer has its local keymap that determines the mode of the buffer. If a function is bound to some key in the local keymap then that function will be executed when you type the key. If no function is bound to a key in the local map, however, the function bound to the key in the global map will be executed. See section `Major Modes' in The GNU Emacs Manual, for more information.
A buffer can also have a minor mode. Minor modes are options that you
can use or not. A buffer in
text-mode can have
as minor mode, which can be turned off or on at any time. In Emacs 19, a
minor mode may have it own keymap, which overrides the local keymap when
the minor mode is turned on. For more information, see section `Minor Modes' in The GNU Emacs Manual
Viper is implemented as a collection of minor modes. Different minor modes are involved when Viper emulates Vi command mode, Vi insert mode, etc. You can also turn Viper on and off at any time while in Vi command mode. See section States in Viper, for more information.
Emacs uses Control and Meta modifiers. These are denoted as C and M, e.g. ^Z as C-z and Meta-x as M-x. The Meta key is usually located on each side of the Space bar; it is used in a manner similar to the Control key, e.g., M-x means typing x while holding the Meta key down. For keyboards that do not have a Meta key, ESC is used as Meta. Thus M-x is typed as ESC x. Viper uses ESC to switch from Insert state to Vi state. Therefore Viper defines _ as its Meta key in Vi state. See section Vi State, for more info.
Emacs is structured as a lisp interpreter around a C core. Emacs keys cause lisp functions to be called. It is possible to call these functions directly, by typing M-x function-name.
First, make sure that all six Viper files `viper*.el' are somewhere on
Emacs load path. The load path is a list of directories where Emacs
looks for its Lisp code; it is similar to Unix environment variable
PATH. The load path is determined by the Lisp variable
C-h v load-path RET to check the current load path of your
Emacs. (Here and later, RET stands for carriage return.) If the files
`viper*.el' are not in any directory on the load path, you should
create your own directory and put it on the load path; then put
`viper*.el' in that directory. To put a new directory, say
`~/emacslib', on your load path, add the following line at the
beginning of your `~/.emacs' file:
(setq load-path (cons "~/emacslib" load-path))
It is recommended that you compile `viper.el' by running
in the directory where Viper was unpacked. The best way to ensure that Viper is installed properly is to run
in the directory where Viper was unpacked. See README in the Viper distribution for the details on which modifications to the make file may be necessary.
Once Viper is settled on the load path, the most common way to load it automatically is to include the line:
in your `~/.emacs' file. The `.emacs' file is placed in your home directory and it will be executed every time you invoke Emacs. Viper also uses the file `~/.vip' for Viper-specific customization. If you wish to be in Vi command state whenever this is appropriate, you can include the following line in your `.vip':
(setq vip-always t)
(See section Vi State, for the explanation of Vi mode.)
Once invoked, Viper will arrange to bring up Emacs buffers in Vi state whenever this makes sense. See section Packages that Change Keymaps, to find out when forcing Vi command state on a buffer may be counter-productive.
Even if your `.emacs' and `.vip' files do not contain any of the above lines, you can still load Viper and enter Vi state by typing the following from within Emacs:
M-x load-library RET viper RET M-x viper-mode
Ask your local Emacs administrator if this fails to work.
When Emacs first comes up, if you have not specified a file on the command line, it will show the `*scratch*' buffer, in the `Lisp Interaction' mode. After you invoke Viper, you can start editing files by using :e, :vi, or v commands. (See section File and Buffer Handling, for more information on v and other new commands that, in many cases, are more convenient than :e, :vi, and similar old-style Vi commands.)
Viper has four states, Emacs, Vi, Insert, and Replace.
The modes are indicated on the mode line as <E>, <I>, <V>, and <R>, so that the multiple modes do not confuse you. Most of your editing can be done in Vi and Insert states. Viper will try to make all new buffers be in Vi state, but sometimes they may come up in Emacs state. C-z will take you to Vi state in such a case. In some major modes, like Dired, Info, Gnus, etc., you should not switch to Vi state (and Viper will not attempt to do so) because these modes are not intended for text editing and many of the Vi keys have special meaning there. If you plan to read news, browse directories, read mail, etc., from Emacs (which you should start doing soon!), you should learn about the meaning of the various keys in those special modes (typing C-h m in a buffer provides help with key bindings for the major mode of that buffer).
If you switch to Vi in Dired or similar modes--no harm is done. It is just that the special keybindings provided by those modes will be temporarily overshadowed by Viper's bindings. Switching back to Viper's Emacs state will revive the environment provided by the current major mode.
States in Viper are orthogonal to Emacs major modes, such as C mode or Dired mode. You can turn Viper on and off for any Emacs state. When Viper is turned on, Vi state can be used to move around. In Insert state, the bindings for these modes can be accessed. For beginners (users at Viper levels 1 and 2), these bindings are suppressed in Insert state, so that new users are not confused by the Emacs states. Note that unless you allow Emacs bindings in Insert state, you cannot do many interesting things, like language sensitive editing. For the novice user (at Viper level 1), all major mode bindings are turned off in Vi state as well. This includes the bindings for key sequences that start with C-c, which practically means that all major mode bindings are supported. See section Customization, to find out how to allow Emacs keys in Insert state.
You will be in this mode only by accident (hopefully). This is the state Emacs is normally in (imagine!!). Now leave it as soon as possible by typing C-z. The you will be in Vi state (sigh of relief) :-).
Emacs state is actually a Viperism to denote all the major and minor modes (See section Emacs Preliminaries) other than Viper that Emacs can be in. Emacs can have several modes, such as C mode for editing C programs, LaTeX mode for editing LaTeX documents, Dired for directory editing, etc. These are major modes, each with a different set of key-bindings. Viper states are orthogonal to these Emacs major modes. The presence of these language sensitive and other modes is a major win over Vi. See section Improvements over Vi, for more.
The bindings for these modes can be made available in the Viper Insert state as well as in Emacs state. Unless you specify your user level as 1 (a novice), all major mode key sequences that start with C-x and C-c are also available in Vi state. This is important because major modes designed for editing files, such as cc-mode or latex-mode, use key sequences that begin with C-x and C-c.
There is also a key that lets you temporarily escape to Vi command state from Emacs state: typing M-C-z (or ESC C-z) will let you execute a single Vi command while staying in Viper's Emacs state. At present, this works only for 1-character Vi commands (and for some complex commands).
This is the Vi command mode. When Viper is in Vi state, you will see the sign <V> in the mode line. Most keys will work as in Vi. The notable exceptions are:
Other differences are mostly improvements. The ones you should know about are:
cshregular expressions (globbing, wildcards, what have you). However, the function
vip-toggle-search-style, bound to C-c /, lets the user switch from search with regular expressions to plain vanilla search and vice versa. It also lets one switch from case-sensitive search to case-insensitive and back. See section Viper Specials, for more details.
csh. See section Customization, if you want to change the default shell. The command :next takes counts from :args, so that :rew is obsolete. Also, :args will show only the invisible files (i.e., those that are not currently seen in Emacs windows). When applicable, Ex commands support file completion and history. This means that by typing a partial file name and then TAB, Emacs will try to complete the name or it will offer a menu of possible completions. This works similarly to Tcsh and extends the behavior of Csh. While Emacs is waiting for a file name, you can type M-p to get the previous file name you typed. Repeatedly typing M-p and M-n will let you browse through the file history. Like file names, partially typed Ex commands can be completed by typing TAB, and Viper keeps the history of Ex commands. After typing :, you can browse through the previously entered Ex commands by typing M-p and M-n. Viper tries to rationalize when it puts Ex commands on the history list. For instance, if you typed :w! foo, only :w! will be placed on the history list. This is because the last history element is the default that can be invoked simply by typing : RET. If :w! foo were placed on the list, it would be all to easy to override valuable data in another file. Reconstructing the full command, :w! foo, from the history is still not that hard, since Viper has a separate history for file names. By typing : M-p, you will get :w! in the Minibuffer. Then, repeated M-p will get you through the file history, inserting one file name after another. In contrast to :w! foo, if the command were :r foo, the entire command will appear in the history list. This is because having :r alone as a default is meaningless, since this command requires a file argument.
As Vi, Viper's destructive commands can be re-executed by typing `.'. However, in addition, Viper keeps track of the history of such commands. This history can be perused by typing C-c M-p and C-c M-n. Having found the appropriate command, it can be then executed by typing `.'. See section Improvements over Vi, for more information.
To avoid confusing the beginner (at Viper level 1 and 2), Viper makes only the standard Vi keys available in Insert state. The implication is that Emacs major modes cannot be used Insert state. It is strongly recommended that as soon as you are comfortable, make the Emacs state bindings visible (by changing your user level to 3 or higher). See section Customization, to see how to do this.
Once this is done, it is possible to do quite a bit of editing in Insert state. For instance, Emacs has a yank command, C-y, which is similar to Vi's p. However, unlike p, C-y can be used in Insert state of Viper. Emacs also has a kill ring where it keeps pieces of text you deleted while editing buffers. The command M-y is used to delete the text previously put back by Emacs' C-y or by Vi's p command and reinsert text that was placed on the kill-ring earlier.
This works both in Vi and Insert states. In Vi state, M-y is a much better alternative to the usual Vi's way of recovering the 10 previously deleted chunks of text. In Insert state, you can use this as follows. Suppose you deleted a piece of text and now you need to re-insert it while editing in Insert mode. The key C-y will put back the most recently deleted chunk. If this is not what you want, type M-y repeatedly and, hopefully, you will find the chunk you want.
Finally, in Insert and Replace states, Viper provides the history of pieces of text inserted in previous insert or replace commands. These strings of text can be recovered by repeatedly typing C-c M-p or C-c M-n while in Insert or Replace state. (This feature is disabled in the minibuffer: the above keys are usually bound to other histories, which are more appropriate in the minibuffer.)
You can call Meta functions from Insert state. The Vi-to-Emacs toggle key,
normally C-z, is bound to Meta in Insert state. Thus M-x is
typed as C-zx. The key _ will now insert itself--it is not a
Meta key in Insert state. (It is well understood that switching Meta keys
around is inconvenient. However, there seems to be no way around this
problem, short of changing Vi ESC key to something
else. See section Customization, for the information on
can be used to free up ESC and designate some other key to do escape
from Insert state to Vi state.)
Other Emacs commands that are useful in Insert state are C-e and C-a, which move the cursor to the end and the beginning of the current line, respectively. You can also use M-f and M-b, which move the cursor forward (or backward) one word. If your display has a Meta key, these functions are invoked by holding the Meta key and then typing f and b, respectively. On displays without the Meta key, these functions are invoked by typing C-z f and C-z b (C-z simulates the Meta key in Insert state, as explained above).
When Viper is in Insert state, you will see <I> in the mode line.
This state is entered through Vi replacement commands, such as C, cw, etc., or by typing R. In Replace state, Viper puts <R> in the mode line to let you know which state is in effect. If Replace state is entered through R, Viper stays in that state until the user hits ESC. If this state is entered via the other replacement commands, then Replace state is in effect until you hit ESC or until you cross the rightmost boundary of the replacement region. In the latter case, Viper changes its state from Replace to Insert (which you will notice by the change in the mode line).
Since Viper runs under Emacs, it is possible to switch between buffers while in Replace state. You can also move the cursor using the arrow keys (even on dumb terminals!) and the mouse. Because of this freedom (which is unattainable in regular Vi), it is possible to take the cursor outside the replacement region. (This may be necessary for several reasons, including the need to enable text selection and region-setting with the mouse.)
The issue then arises as to what to do when the user hits the ESC key. In Vi, this would cause the text between cursor and the end of the replacement region to be deleted. But what if, as is possible in Viper, the cursor is not inside the replacement region?
To solve the problem, Viper keeps track of the last cursor position while it was still inside the replacement region. So, in the above situation, Viper would delete text between this position and the end of the replacement region.
The Minibuffer is where commands are entered in. Editing can be done by commands from Insert state, namely:
Most of the Emacs keys are functional in the Minibuffer. While in the Minibuffer, Viper tries to make editing resemble Vi's behavior when the latter is waiting for the user to type an Ex command. In particular, you can use the regular Vi commands to edit the Minibuffer. You can switch between the Vi state and Insert state at will, and even use the replace mode. Initially, the Minibuffer comes up in Insert state.
Some users prefer plain Emacs bindings in the Minibuffer. To this end, set
nil in `.vip'.
See section Customization, to learn how to do this.
When the Minibuffer changes Viper states, you will notice that the appearance of the text there changes as well. This is useful because the Minibuffer has no mode line to tell which Vi state it is in. The appearance of the text in the Minibuffer can be changed. See section Viper Specials, for more details.
Viper can edit multiple files. This means, for example that you never need
to suffer through
No write since last change errors.
Some Viper elements are common over all the files.
Currently undisplayed files can be listed using the :ar command. The command :n can be given counts from the :ar list to switch to other files.
Unimplemented features include:
cat -t -e file. Unfortunately, it cannot be used directly inside Emacs, since Emacs will obdurately change `^I' back to normal tabs.