129 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			129 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 several 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.
 | 
						||
 
 |