VI was the first full-screen editor in existence. That is one of the main objections of Unix detractors, but also one of the main arguments of its defenders: while it is complicated to learn, it is also an extremely powerful tool once one gets into the habit of using it. With a few keystrokes, a VI user can move mountains, and apart from Emacs, few text editors can say the same.
The version supplied with Linux-Mandrake is in fact VIm, for VI iMproved, but we will call it VI throughout this chapter.
First, we need to start VI, which is identical to Emacs. So let us go back to our two files and type:
$ vi file1 file2 |
At this point, you find yourself in front of a window resembling figure 4-4.
You are now in command mode in front of the first open file. In command mode, you cannot insert text into a file... To do this, you have to go into insert mode, and therefore enter one of the commands which allows you to do so:
a and i: to insert text respectively after and before the cursor (A and I insert text at the end and at the beginning of the current line);
o and O: to insert text respectively below and above the current line.
In insert mode, you will see the string --INSERT-- appear at the bottom of the screen (so you know what mode you are in). It is in this and only this mode that you can enter text. To return to command mode, press the Esc key.
In insert mode, you can use the Backspace and DEL keys to delete text as you go along. To move around the text, both in command mode and in insert mode, you use the arrow keys. In command mode, there are also other key combinations which we will look at later.
ex mode is accessed by pressing the : key in command mode. The same : will appear at the bottom of the screen, and the cursor will be positioned on it. Everything you type subsequently, followed by pressing Enter, will be considered by VI to be an ex command. If you delete the command and the : you typed in, you will return to command mode and the cursor will go back to its original position.
To save changes to a file you type :w in command mode. If you want to save the contents of the buffer to another file, type :w <file_name>.
As with Emacs, you can have several buffers displayed on the screen. To do this, use the :split command.
To move from one file to another, in a buffer, you type :next to move to the next file and :prev to move to the previous file. You can also use :e <file_name>, which allows you either to change to the desired file if this is already open, or to open another file. Here again completion is available.
To change buffers, type C-w j to go to the buffer below or C-w k to go to the buffer above. You can also use the up and down arrow keys instead of j or k. The :close command hides a buffer, the :q command closes it.
Watch out, VI is finicky: if you try to hide or close a buffer without saving the changes, the command will not be carried out and you will get this message:
No write since last change (use! to override)
In this case, do as you are told and type :q! or :close!.
Apart from the Backspace and DEL keys in edit mode, VI has many other commands for deleting, copying, pasting, and replacing text -- in command mode. Here, we will look at a few. All the commands shown here are in fact separated into two parts: the action to be performed and its effect. The action may be:
c: to replace (Change); the editor deletes the text requested and goes back into insert mode after this command;
d: to delete (Delete);
y: to copy (Yank), we will look at this in the next section.
.: repeats last action.
The effect defines which group of characters the command acts upon. These also effect commands entered as they are in command mode correspond to movements:
h, j, k, l: one character left, down, up, right[1] respectively;
e, b, w: to the end (resp. to the beginning) of current word; to the beginning of the next word;
^, 0, $: to the first non blank character of current line, to beginning of current line, to the end of current line;
f<x>: to next occurrence of character <x>; for example, fe moves the cursor to the next occurrence of the character e;
/<string>, ?<string>: to the next occurrence of string or regexp <string>, and the same thing going backwards in the file; for example, /foobar moves the cursor until the next occurrence of the word foobar;
{, }: to the beginning, to the end of current paragraph;
G, H: to end of file, to beginning of screen.
Each of these effect characters or move commands can be preceded by a repetition number. For G, this references the line number in the file. On this basis, you can make all sorts of combinations.
Some examples:
6b: moves 6 words backward;
c8fk: delete all text until the eighth occurrence of the character k then goes into insert mode;
91G: goes to line 91 of the file;
d3$: deletes up to the end of the current line plus the next two lines.
VI has a command that we have already seen for copying text: the y command. To cut text, simply use the d command. You have 27 memories for storing text: an anonymous memory and 26 memories named after the 26 lowercase letters of the alphabet.
To use the anonymous memory you enter the command as it is. So the command y12w copies to the anonymous memory the 12 words after the cursor[2]. Use d12w if you want to cut this area.
To use one of the 26 named memories, enter the sequence "<x> before the command, where <x> gives the name of the memory. Thus, to copy the same 12 words into the memory k, you would write "ky12w, and "kd12w to cut them.
To paste the contents of the anonymous memory, you use the commands p or P (for Paste), to insert text after or before the cursor respectively. To paste the contents of a named memory, use "<x>p or "<x>P in the same way (for example "dp will paste the contents of memory d after the cursor).
Let us look at the example of figure 4-5.
To carry out this action, we will:
recopy the first 6 words of the sentence into memory r (for example): "ry6w[3];
go into the buffer file2, which is located below: C-w j;
paste the contents of memory r before the cursor: "rp.
We get the expected result, as shown in figure 4-6.
Searching for text is very simple: in command mode, you simply type / followed by the string to search for, and then press the Enter key. For example, /party will search for the string party from the current cursor position. Pressing n takes you to the next occurrence, and if you reach the end of the file, the search will start again from the beginning. To search backwards, use ? instead of /.
To quit, the command is :q (in fact, this command closes the active buffer, as we have already seen, but if it is the only buffer present, you quit VI). There is a shortcut: most of the time you edit only one file. So to quit, you will use:
:wq to save changes and quit (a quicker solution is ZZ), or
:q! to quit without saving.
You will have noticed that if you have several buffers, :wq will write the active buffer then close it.
[1] | A shortcut for dl (delete one character forward) is x; a shortcut for dh is X; dd deletes the current line. |
[2] | ... if the cursor is positioned at the beginning of the first word! |
[3] | y6w literally means: "Yank 6 words". |