130 lines
5.8 KiB
Markdown
130 lines
5.8 KiB
Markdown
---
|
||
title: Modes in Vim
|
||
---
|
||
|
||
# Vim Modes
|
||
|
||
Because Vim is focused on changing existing code just as much as writing new
|
||
code, it is split into several modes that each have different purposes.
|
||
|
||
### Normal Mode
|
||
By default, Vim starts in "normal" mode.
|
||
Normal mode can be accessed from other modes by pressing `Esc` or `<C-[>`.
|
||
|
||
In Normal mode key presses don't work as one would expect. That is, they don't insert text into the document; instead,
|
||
certain key presses can:
|
||
|
||
#### Move the cursor
|
||
- **h** move one character left
|
||
- **j** move one row down
|
||
- **k** move one row up
|
||
- **l** move one character right
|
||
|
||
As many vim commands, row movement can be prefixed by a number to move s
|
||
everal lines at a time:
|
||
- **4j** move 4 rows down
|
||
- **6k** move 6 rows up
|
||
|
||
Basic word movements:
|
||
- **w** move to beginning of next word
|
||
- **b** move to previous beginning of word
|
||
- **e** move to end of word
|
||
- **W** move to beginning of next word after a whitespace
|
||
- **B** move to beginning of previous word before a whitespace
|
||
- **E** move to end of word before a whitespace
|
||
|
||
Beginning/End of line movement:
|
||
- **0** move to the beginning of the line
|
||
- **$** move to the end of the line
|
||
|
||
#### Manipulate text
|
||
#### Enter other modes
|
||
|
||
**Normal mode** is where one should spend most of their time while using Vim. Remember,
|
||
this is what makes Vim different.
|
||
|
||
|
||
In normal mode, there are multiple ways to move around an open file. In addition
|
||
to using the cursor keys to move around, you can use `h` (left), `j` (down), `k`
|
||
(up), and `l` (right) to move as well. This particularly helps touch typists who
|
||
don’t like leaving the home row when making changes.
|
||
|
||
You can also make changes to single characters in normal mode. For example, to
|
||
replace a single character, move your cursor over it and press `r`, and then the
|
||
character you want to replace it with. Similarly, you can delete single characters
|
||
by moving your cursor over it and pressing `x`.
|
||
|
||
To perform an undo, press `u` in normal mode. This undoes changes up to the last
|
||
time you were in normal mode. If you want to redo (*i.e.*, undo your undo) press
|
||
`Ctrl+r` in normal mode.
|
||
|
||
### Insert Mode
|
||
|
||
This is the second most used mode, and will be the most familiar behavior
|
||
to most people. Once in insert mode, typing inserts characters just like a regular
|
||
text editor. You can enter it by using an insert command from normal mode.
|
||
|
||
Insert commands include:
|
||
- `i` for '**i**nsert', this immediately switches vim to insert mode
|
||
- `a` for '**a**ppend', this moves the cursor after the current character and enters insert mode
|
||
- `o` inserts a new line below the current line and enters insert mode on the new line
|
||
|
||
These commands have an uppercase variety too:
|
||
- `I` moves the cursor to the beginning of the line and enters insert mode
|
||
- `A` moves the cursor to the end of the line and enters insert mode
|
||
- `O` inserts a new line above the current one and enters insert mode on the new line
|
||
|
||
There are so many more ways of inserting text in Vim that can't be listed here
|
||
but these are the simplest. Also, beware of staying in insert mode for too long; Vim is
|
||
not designed to be used in insert mode all the time.
|
||
|
||
To leave insert mode and return to normal mode, press `Esc` or `<C-[>`
|
||
|
||
### Visual Mode
|
||
|
||
Visual mode is used to make selections of text, similar to how clicking and dragging with a
|
||
mouse behaves. Selecting text allows commands to apply only to the selection, such as copying,
|
||
deleting, replacing, and so on.
|
||
|
||
To make a text selection:
|
||
- Press `v` to enter visual mode, this will also mark a starting selection point
|
||
- Move the cursor to the desired end selection point; vim will provide a visual
|
||
highlight of the text selection
|
||
|
||
Visual mode also has the following variants:
|
||
- `V` to enter visual line mode, this will make text selections by line
|
||
- `<C-V>` to enter visual block mode, this will make text selections by blocks; moving the
|
||
cursor will make rectangle selections of the text
|
||
|
||
To leave visual mode and return to normal mode, press `Esc` or `<C-[>`.
|
||
|
||
The visual mode actually has multiple subtypes: *visual*, *block-visual* and *linewise-visual*
|
||
- *visual*: like described above. Enter by pressing `v`
|
||
- *block-visual*: select any rectangular region. Enter by pressing `<ctrl>+v`
|
||
- *linewise-visual*: always select full lines. Enter by pressing `<shift>+v`
|
||
|
||
### Command Mode
|
||
Command mode has a wide variety of commands and can do things that normal mode
|
||
can't do as easily. To enter command mode type ':' from normal mode and then
|
||
type your command which should appear at the bottom of the window.
|
||
For example, to do a global find and replace type `:%s/foo/bar/g` to replace
|
||
all 'foo' with 'bar'
|
||
- `:` Enters command mode
|
||
- `%` Means across all lines
|
||
- `s` Means substitute
|
||
- `/foo` is regex to find things to replace
|
||
- `/bar/` is regex to replace things with
|
||
- `/g` means global, otherwise it would only execute once per line
|
||
|
||
Vim has a number of other methods that you can read about in the help
|
||
documentation, `:h` or `:help`.
|
||
|
||
### Replace Mode
|
||
Replace mode allows you replace existing text by directly typing over it.
|
||
Before entering this mode, get into normal mode and put your cursor
|
||
on top of the first character that you want to replace. Then press 'R' (capital R) to
|
||
enter replace mode. Now whatever you type will replace the existing text. The
|
||
cursor automatically moves to the next character just like in insert mode. The
|
||
only difference is that every character you type will replace the existing one.
|
||
|