# How I Vim
By David Darais.
[this file](howivim.md) as Markdown.
You may want to keep one of these cheat sheets around while learning Vim.
- <https://vim.rtorr.com>
- <https://www.cs.cmu.edu/~15131/f17/topics/vim/vim-cheatsheet.pdf>
- <https://vimsheet.com>
- <http://i.imgur.com/YLInLlY.png>
- <http://michael.peopleofhonoronly.com/vim/>
- <http://www.viemu.com/vi-vim-cheat-sheet.gif>
## Modes
Normal mode:
This is the mode that vim starts in. All letter that you press are not
interpreted as “input this character”, rather they are interpreted as special
commands. *You should always be in normal mode as your “default” mode.*
Input mode:
You can get into input mode by a number of commands, the most common being `i`.
To get out of insert mode (i.e., back into normal mode), press `Esc`, `Ctl-c`
or `Ctl-[`. I remember hearing that `Ctl-c` is slightly different, and `Esc`
and `Ctl-[` are identical. Google it if you're curious. I remap my caps lock
key to `Esc`. I did this to train myself in preparation for a mac laptop with
no physical escape key. I never got one, and now my brain is trained to whack
caps lock to get back to normal mode, so I just left it.
## Moving Around
- `h`: left
- `j`: down (looks almost like a down arrow)
- `k`: up
- `l`: right
The keys `hjkl` are the arrows `←↓↑→`
Exercise:
work your way through this maze (found [here][1]):
___________________________________
| _____ | | ___ | ___ ___ | | | |
| | | |_| |__ | |_| __|____ | | | |
| | | |_________|__ |______ |___|_| |
| |_| | _______ |______ | | ____|
| ___ | |____ | |______ | |_| |____ |
|___|_|____ | | ___ | |________ | |
| ________| | |__ | |______ | | | |
| | | ________| | __|____ | | | __| |
|_| |__ | | __|__ | ____| | |_| __|
| ____| | |____ | |__ | |__ |__ |
| |_______|_______|___|___|___|_____|
[1]: https://www.asciiart.eu/art-and-design/mazes
command | effect | mnemonic
--------------------|--------------------------------------------|----------
`h`, `j`, `k`, `l` | left, down, up, right |
`Ctl-u` | page up | up
`Ctl-d` | page up | do
`gg` | first line |
`G` | last line |
`<n>gg` | line <n> |
`Ctl-o` | jump back |
`Ctl-i` | jump forward |
`w`, `W` | small word, big word | word
`e`, `E` | small end-of-word, big end-of-word | end
`b`, `B` | small back-word, big back-word | back
`\|` | beginning of line |
`^` | first non-space character on |
`$` | end of line |
`%` | jump to matching bracket |
`gj`, `gk` | up and down inside softwrap lines |
## Getting into Insert Mode
command | effect | mnemonic
-----------|---------------------------------------------|----------
`i` | insert mode before cursor | insert
`I` | insert mode at beginning of line |
`a` | insert mode after cursor | after
`A` | insert mode at end of line |
`o` | insert mode after making a new line below |
`O` | insert mode after making a new line above |
## Undo/Redo
command | effect | mnemonic
-----------|--------------------------------------------|----------
`u` | undo | undo
`Ctl-r` | redo | redo
## Selecting and Searching Text
command | effect | mnemonic
-----------|--------------------------------------------|----------
`v` | selection starting with cursor position | visual
`V` | selection starting with whole line |
`Ctl-v` | column-selection starting with cursor |
`/` | search (regex) |
`*` | search for word underneath cursor |
`n` | jump to next search result | next
`N` | jump to previous search result |
`vib` | select in parens ( ) |
`vi[` | select in square brackets [] |
`vi{` | select in curly brackets {} |
## Slicing and Dicing Text
command | effect | mnemonic
-------------------|--------------------------------------------------|----------
`d<motion>` | delete and copy text under <motion> | delete
`dd` | delete and copy whole line |
`D` | delete and copy text until end of line |
`c<motion>` | like “d” but ends up in insert mode | change
`cc` | like “dd” … |
`C` | like “D” … |
`y<motion>` | copy text under <motion> to Vim clipboard | yank
`yy` | like “dd” … |
`Y` | (should be) like “D” … |
`yib` | yank in parens () |
`yi[` | yank in square brackets [] |
`yi{` | yank in curly brackets {} |
`p` | paste after cursor | paste
`P` | paste behind cursor |
`x` | delete and copy character under cursor |
`xp` | swap characters |
`r<char>` | replace character under cursor with <char> | replace
`R` | like insert mode but overwrites text | replace
`~` | change character case (upper/lower) |
`"0p` | paste the last thing yanked |
`"ay` | yank to register “a” |
`"ap` | paste from register “a” |
`:reg` | look at clipboard registers |
`gq` | line-wrap paragraph |
`J` | un-line-wrap (join with spaces) lines | join
## Meta Commands
command | effect | mnemonic
-------------------------|--------------------------------------------|----------
`.` | repeat the last command |
`<n><cmd>` | repeat <cmd> <n> times |
## Files and Buffers
command | effect | mnemonic
---------------------|--------------------------------------------|----------
`:e <name>` | open <name> and start editing | edit
`:w` | save this buffer | write
`:wa` | save all buffers |
`:q` | quit | quit
`:q!` | quit I promise |
`:wq` | save and quit |
`:ls` | show all buffers | list
`:b <name>` | switch to buffer | buffer
`:b#` | switch to last buffer |
`:split` | horizontal split |
`:vsplit` | vertical split |
`:close` | close a split panel |
`:help <cmd>` | get help on a command |
`Ctl-w h` | go to panel to the left |
`Ctl-w j` | go to panel below |
`Ctl-w k` | go to panel above |
`Ctl-w l` | go to panel to the right |
`Ctl-w +` | make panel taller |
`Ctl-w -` | make panel shorter |
`Ctl-w <` | make panel thinner |
`Ctl-w >` | make panel wider |
## Miscellaneous
command | effect | mnemonic
--------------------|-------------------------------------|---------
`:set spell` | enable spell check on all buffers |
`:set local spell` | enable spell check on this buffer |
`zg` | add word to dictionary |
## Plugins
- Pathogen (plugin manager)
- NEREDTree (directory browser)