This article explains how to use VI editor in Linux.
Linux and Unix are managed through a series of text files. Linux administrators do not normally use graphical editors to manage these configuration files. Editors such as WordPerfect, starOffice, and yes, even Microsoft Word normally save files in a binary format that Linux can't read. Popular text editors for Linux configuration files include emacs, pico, joe, and vi.
While emacs may be the most popular text editor in the world of Linux, every administrator needs at least a basic knowledge of vi. While emacs may be more popular and flexible, vi may help you save a broken system. If you ever have to restore a critical configuration file using an emergency boot floppy, vi is probably the only editor that you'll have available. You need to know how to restore your system from a rescue floppy, which does not have enough room to carry any editor other than vi.So should know how to use vi editor.
$ vi /tmp/test ~ ~ ~ ~ ~ “/tmp/test” [New File]
If this is a new file, you should see something similar to above.
The box at the top represents where your cursor is. The bottom line keeps you informed about what is going on with your editing (here you just opened a new file). In between, there are tildes (~) as filler because there is no text in the file yet. Now here's the intimidating part: There are no hints, menus, or icons to tell you what to do. On top of that, you can't just start typing. If you do, the computer is likely to beep at you. And some people complain that Linux isn't friendly.
The first things you need to know are the different operating modes: command and input. The vi editor always starts in command mode. Before you can add or change text in the file, you have to type a command (one or two letters and an optional number) to tell vi what you want to do. Case is important, so use uppercase and lowercase exactly as shown in the examples! To get into input mode, type an input command. To start out, type either of the following:
- a-The add command. After it, you can input text that starts to the right of the cursor.
- i-The insert command. After it, you can input text that starts to the left of the cursor.
Type a few words and then press Enter. Repeat that a few times until you have a few lines of text. When you're finished typing, press Esc to return to command mode. Now that you have a file with some text in it, try moving around in your text with the following keys or letters: Remember the Esc key! It always places you back into command mode.
Arrow keys-Move the cursor up, down, left, or right in the file one character at a time. To move left and right you can also use Backspace and the space bar, respectively. If you prefer to keep your fingers on the keyboard, move the cursor with h (left), l (right), j (down), or k (up).
- w-Moves the cursor to the beginning of the next word.
- b-Moves the cursor to the beginning of the previous word.
- 0 (zero)-Moves the cursor to the beginning of the current line.
- $-Moves the cursor to the end of the current line.
- H-Moves the cursor to the upper-left corner of the screen (first line on the screen).
- M-Moves the cursor to the first character of the middle line on the screen.
- L-Moves the cursor to the lower-left corner of the screen (last line on the screen).
The only other editing you need to know is how to delete text. Here are few vi commands for deleting text:
- x-Deletes the character under the cursor.
- X-Deletes the character directly before the cursor.
- dw-Deletes from the current character to the end of the current word.
- d$-Deletes from the current character to the end of the current line.
- d0-Deletes from the previous character to the beginning of the current line.
To wrap things up, use the following keystrokes for saving and quitting the file:
- ZZ-Save the current changes to the file and exit from vi.
- :w-Save the current file but continue editing.
- :wq-Same as ZZ.
- :q-Quit the current file. This works only if you don't have any unsaved changes.
- :q!-Quit the current file and don't save the changes you just made to the file.
If you've really trashed the file by mistake, the :q! command is the best way to exit and abandon your changes.
The file reverts to the most recently changed version. So, if you just did a :w, you are stuck with the changes up to that point. If you just want to undo a few bad edits, press u to back out of changes.
You have learned a few vi editing commands. I describe more commands in the following sections. First, however,
here are a few tips to smooth out your first trials with vi:
- Esc-Remember that Esc gets you back to command mode. (I've watched people press every key on the keyboard trying to get out of a file.) Esc followed by ZZ gets you out of command mode, saves the file, and exits.
- u-Press u to undo the previous change you made. Continue to press u to undo the change before that, and the one before that.
- Ctrl+R-If you decide you didn't want to undo the previous command, use Ctrl+R for Redo. Essentially, this command undoes your undo.
- Caps Lock-Beware of hitting Caps Lock by mistake. Everything you type in vi has a different meaning when the letters are capitalized. You don't get a warning that you are typing capitals-things just start acting weird.
- :! command-You can run a command while you are in vi using :! followed by a command name. For example,
- type :!date to see the current date and time,
- type :!pwd to see what your current directory is,
- type :!jobs to see if you have any jobs running in the background.
- INSERT-When you are in insert mode, the word INSERT appears at the bottom of the screen.
- Ctrl+G-If you forget what you are editing, pressing these keys displays the name of the file that you are editing and the current line that you are on at the bottom of the screen. It also displays the total number of lines in the file, the percentage of how far you are through the file, and the column number the cursor is on.
Moving Around the File
Besides the few movement commands described earlier, there are other ways of moving around a vi file. To try these out, open a large file that you can't do much damage to. (Try copying /var/log/ messages to /tmp and opening it in vi.) Here are some movement commands you can use:
- Ctrl+F-Page ahead, one page at a time.
- Ctrl+B-Page back, one page at a time.
- Ctrl+D-Page ahead one-half page at a time.
- Ctrl+U-Page back one-half page at a time.
- G-Goto the last line of the file.
- 1G-Go to the first line of the file. (Use any number to go to that line in the file.)
Searching for Text
To search for the next occurrence of text in the file, use either the slash (/) or the question mark (?) character. Follow the slash or question mark with a pattern (string of text) to search forward or backward, respectively, for that pattern. Within the search, you can also use metacharacters. Here are some examples:
- /hello-Searches forward for the word hello.
- ?goodbye-Searches backward for the word goodbye.
- /The.*foot-Searches forward for a line that has the word The in it and also, after that at some point, the word foot.
- ?[pP]rint-Searches backward for either print or Print. Remember that case matters in Linux, so make use of brackets to search for words that could have different capitalization.
The vi editor was originally based on the ex editor, which didn't let you work in full-screen mode. However, it did enable you to run commands that let you find and change text on one or more lines at a time. When you type a colon and the cursor goes to the bottom of the screen, you are essentially in ex mode. Here is an example of some of those ex commands for searching for and changing text. (I chose the words Local and Remote to search for, but you can use any appropriate words.)
- :g/Local-Searches for the word Local and prints every occurrence of that line from the file. (If there is more than a screenful, the output is piped to the more command.)
- :s/Local/Remote-Substitutes Remote for the word Local on the current line.
- :g/Local/s//Remote-Substitutes the first occurrence of the word Local on every line of the file with the word Remote.
- :g/Local/s//Remote/g-Substitutes every occurrence of the word Local with the word Remote in the entire file.
- :g/Local/s//Remote/gp-Substitutes every occurrence of the word Local with the word Remote in the entire file, and then prints each line so that you can see the changes (piping it through more if output fills more than one page).
Using Numbers with Commands
You can precede most vi commands with numbers to have the command repeated that number of times. This is a handy way to deal with several lines, words, or characters at a time. Here are some examples:
- 3dw-Deletes the next three words.
- 5cl-Changes the next five letters (that is, removes the letters and enters input mode).
- 12j-Moves down 12 lines.
Putting a number in front of most commands just repeats those commands. At this point, you should be fairly proficient at using the vi command. Once you get used to using vi, you will probably find other text editors less efficient to use.