A useful collection of Vim 8.2 quick reference cheat sheets to help you learn vim editor faster.
▼/▶ Cursor   ▽/▷ Target
┌───────────── |      
├───────────── 0      $ ──────────────┐ 
│  ┌────────── ^      fe ────────┐    │
│  │  ┌─────── Fo     te ───────┐│    │
│  │  │┌────── To     30| ───┐  ││    │
│  │  ││ ┌──── ge     w ───┐ │  ││    │
│  │  ││ │ ┌── b      e ─┐ │ │  ││    │
│  │  ││ │ │  ┌h      l┐ │ │ │  ││    │
▽  ▽  ▽▽ ▽ ▽  ▽▼      ▼▽ ▽ ▽ ▽  ▽▽    ▽
   echo "A cheatsheet from quickref.me"
                 - SCREEN 1 START
   ┌─┬─────────▷ #!/usr/bin/python
   │ │     ┌───▷     
   │ │     │     print("Hello")
   │ │     { } ▶ print("Vim")
   │ │       │   print("!")
   │ │       └─▷    
   │ │ ┌───┬───▷ print("Welcome")
G gg H M L k j ▶ print("to")
│        │   └─▷ print("cheatsheets.zip")
│        │       print("/vim")
│        │     
│        └─────▷ 
│                - SCREEN 1 END
└──────────────▷ print("SCREEN 2")
| Shortcut | Description | 
|---|---|
| h|j|k|l | Arrow keys | 
| <C-u>/<C-d> | Half-page up/down | 
| <C-b>/<C-f> | Page up/down | 
| Shortcut | Description | 
|---|---|
| b/w | Previous/Next word | 
| ge/e | Previous/Next end of word | 
| Shortcut | Description | 
|---|---|
| 0(zero) /$ | Start/End of line | 
| ^ | Start of line (non-blank) | 
| Shortcut | Description | 
|---|---|
| Fe/fe | Move to previous/next e | 
| To/to | Move before/after previous/next o | 
| |/n| | Go to first/ nth column | 
| Shortcut | Description | 
|---|---|
| gg/G | First/Last line | 
| :n|nG | Go to line n | 
| }/{ | Next/Previous empty line | 
| Shortcut | Description | 
|---|---|
| H/M/L | Top/Middle/Bottom screen | 
| zt/zz/zb | Top/Center/Bottom this line | 
| Shortcut | Description | 
|---|---|
| i/a | Insert before/after cursor | 
| I/A | Insert start/end of line | 
| o/O(letter) | Insert new line below/above | 
| s/S | Delete char/line and insert | 
| C/cc | Change to end of/current line | 
| gi | Insert at last insert point | 
| Esc|<C-[> | Exit insert mode | 
| Shortcut | Description | 
|---|---|
| :w | Save | 
| :q | Close file | 
| :wq|:x|ZZ | Save and quit | 
| :wqa | Save and quit all files | 
| :q!|ZQ | Force quit | 
| :qa | Close all files | 
| :qa! | Force quit all files | 
| :wnow.txt | Write to now.txt | 
| :savnew.txt | Save and edit new.txt | 
| :w!sudo tee % | Write to readonly file | 
| Shortcut | Description | 
|---|---|
| r | Replace one character | 
| R | Enter Replace mode | 
| u/3u | Undo changes 1/3times | 
| U | Undo changes on one line | 
| J | Join with next line | 
| <C-r>/ 5<C-r> | Redo changes 1/5times | 
| Shortcut | Description | 
|---|---|
| x | Delete character (Cut) | 
| p/P | Paste after/before | 
| xp | Swap two characters | 
| D | Delete to end of line (Cut) | 
| dw | Delete word (Cut) | 
| dd | Delete line (Cut) | 
| ddp | Swap two lines | 
| yy | Yank line (Copy) | 
| "*p|"+p | Paste from system clipboard | 
| "*y|"+y | Paste to system clipboard | 
| Shortcut | Description | 
|---|---|
| d|x | Delete selection (Cut) | 
| s | Replace selection | 
| y | Yank selection (Copy) | 
| Shortcut | Description | 
|---|---|
| . | Repeat last command | 
| ; | Repeat latest f,t,ForT | 
| , | Repeat latest f,t,ForTreversed | 
| & | Repeat last :s | 
| @: | Repeat a command-line command | 
| Shortcut | Description | 
|---|---|
| v | Enter visual mode | 
| V | Enter visual line mode | 
| <C-v> | Enter visual block mode | 
| ggVG | Select all text | 
| >/< | Shift text right/left | 
| - | - | 
|---|---|
| qi | Record macro i | 
| q | Stop recording macro | 
| @i | Run macro i | 
| 7@i | Run macro i7 times | 
| @@ | Repeat last macro | 
You can save macro for any letters not just i
| Shortcut | Description | 
|---|---|
| d | Delete | 
| y | Yank (copy) | 
| c | Change (delete then insert) | 
| p | Paste | 
| = | Formats code | 
| g~ | Toggle case | 
| gU | Uppercase | 
| gu | Lowercase | 
| > | Indent right | 
| < | Indent left | 
| ! | Filter through external program | 
| Combination | Description | 
|---|---|
| d | Delete current line | 
| d | Delete two lines | 
| d | Delete to next word | 
| d | Delete to beginning of word | 
| d | Delete until achar | 
| d | Delete until hello | 
| c | Change current line, synonym with S | 
| y | Copy current line | 
| > | Indent 2 lines | 
| gg d | Delete a complete document | 
| gg = | Indent a complete document | 
| gg y | Copy a whole document | 
[count] <operator> <motion>
<operator> [count] <motion>
| Combination | Description | 
|---|---|
| 2 d | Delete 2lines | 
| 6 y | Copy 6lines | 
| d3 | Delete 3words | 
| d5 | Delete 5lines downwards | 
| >4 | Indent 4lines upwards | 
| Shortcut | Description | - | 
|---|---|---|
| v |  | |
| Operator | Text object | 
Operate with an operator inner or around text blocks
| Shortcut | Description | 
|---|---|
| Paragraph | |
| Word | |
| WORD (surrounded by whitespace) | |
| Sentence | |
| A [], (), or {} block | |
| A [], (), or {} block | |
| A quoted string | |
| A block [( | |
| A block in [{ | |
| A HTML tag block | 
See :help text-objects
| Shortcut | Description | 
|---|---|
| d | Delete inner word | 
| d | Delete inner sentence | 
| d | Delete in quotes | 
| d | Delete in quotes (including quotes) | 
| d | Delete a paragraph | 
| Shortcut | Description | 
|---|---|
| v | Select inner quotes " ..." | 
| v | Select quotes "..." | 
| v | Select inner brackets [ ...] | 
| v | Select brackets [...] | 
| v | Select inner word | 
| v | Select inner paragraph | 
| v | Select more paragraph | 
| Shortcut | Description | 
|---|---|
| c | Change inner word | 
| c | Change inner quotes | 
| c | Change inner tags (HTML) | 
| c | Change inner paragraph | 
| y | Yank inner paragraph | 
| y | Yank paragraph (including newline) | 
| - | - | 
|---|---|
| :e file | Edit a file in a new buffer | 
| :bn | Go to the next buffer | 
| :bp | Go to the previous buffer | 
| :bd | Remove file from buffer list | 
| :b 5 | Open buffer #5 | 
| :b file | Go to a buffer by file | 
| :ls | List all open buffers | 
| :sp file | Open and split window | 
| :vs file | Open and vertically split window | 
| :hid | Hide this buffer | 
| :wn | Write file and move to next | 
| :tab ba | Edit all buffers as tabs | 
| - | - | 
|---|---|
| <C-w>s | Split window | 
| <C-w>v | Split window vertically | 
| <C-w>w | Switch windows | 
| <C-w>q | Quit a window | 
| <C-w>T | Break out into a new tab | 
| <C-w>x | Swap current with next | 
| <C-w>-/+ | Decrease/Increase height | 
| <C-w></> | Decrease/Increase width | 
| <C-w>| | Max out the width | 
| <C-w>= | Equally high and wide | 
| <C-w>h/l | Go to the left/right window | 
| <C-w>j/k | Go to the up/down window | 
| Shortcut | Description | 
|---|---|
| :tabe [file] | |
| :tabf [file] | Open if exists in new tab | 
| :tabc | |
| :tabo | Close | 
| :tabs | List all | 
| :tabr | Go to fi | 
| :tabl | Go to | 
| :tabm 0 | 0 | 
| :tabn | Go to | 
| :tabp | Go to | 
| Shortcut | Description | 
|---|---|
| gt | Go to | 
| gT | Go to | 
| 2gt | Go to tab number 2 | 
| - | - | 
|---|---|
| /foo | Search forward | 
| /foo\c | Search forward (case insensitive) | 
| ?foo | Search backward | 
| /\v\d+ | Search with regex | 
| n | Next matching search pattern | 
| N | Previous match | 
| * | Search for current word forward | 
| # | Search for current word backward | 
:[range]s/{pattern}/{str}/[flags]
| :s/old/new | Replace first | 
| :s/old/new/g | Replace all | 
| :s/\vold/new/g | Replace all with regex | 
| :s/old/new/gc | replace all (Confirm) | 
| :s/old/new/i | Ignore case replace first | 
| :2,6s/old/new/g | Replace between lines 2-6 | 
:%s/{pattern}/{str}/[flags]
| :%s/old/new | Replace first | 
| :%s/old/new/g | Replace all | 
| :%s/old/new/gc | Replace all (Confirm) | 
| :%s/old/new/gi | Replace all (ignore case) | 
| :%s/\vold/new/g | Replace all with regex | 
| - | - | 
|---|---|
| % | Entire file | 
| ’<,’> | Current selection | 
| 5 | Line 5 | 
| 5,10 | Lines 5to10 | 
| $ | Last line | 
| 2,$ | Lines 2to Last | 
| . | Current line | 
| ,3 | Next 3lines | 
| -3, | Forward 3lines | 
:[range]g/{pattern}/[command]
| :g/foo/d | Delete lines containing foo | 
| :g!/foo/d | Delete lines not containing foo | 
| :g/^\s*$/d | Delete all blank lines | 
| :g/foo/t$ | Copy lines containing footo EOF | 
| :g/foo/m$ | Move lines containing footo EOF | 
| :g/^/m0 | Reverse a file | 
| :g/^/t. | Duplicate every line | 
:[range]v/{pattern}/[command]
| :v/foo/d | Delete lines not containing foo(also :g!/foo/d) | 
| - | - | 
|---|---|
| g | Replace all occurrences | 
| i | Ignore case | 
| I | Don't ignore case | 
| c | Confirm each substitution | 
| - | - | 
|---|---|
| &|\0 | Replace with the whole matched | 
| \1...\9 | Replace with the group 0-9 | 
| \u | Uppercase next letter | 
| \U | Uppercase following characters | 
| \l | Lowercase next letter | 
| \L | Lowercase following characters | 
| \e | End of \u,\U,\land\L | 
| \E | End of \u,\U,\land\L | 
:s/a\|b/xxx\0xxx/g		         # Modifies "a b"      to "xxxaxxx xxxbxxx"
:s/test/\U& file/                # Modifies "test"     to "TEST FILE"
:s/\(test\)/\U\1\e file/         # Modifies "test"     to "TEST file"
:s/\v([abc])([efg])/\2\1/g	     # Modifies "af fa bg" to "fa fa gb"
:s/\v\w+/\u\0/g		             # Modifies "bla bla"  to "Bla Bla"
:s/\v([ab])|([cd])/\1x/g         # Modifies "a b c d"  to "ax bx x x"
:%s/.*/\L&/                      # Modifies "HTML"     to "html"
:s/\v<(.)(\w*)/\u\1\L\2/g        # Make every first letter of a word uppercase
:%s/^\(.*\)\n\1/\1/              # Remove duplicate lines
:%s/<\/\=\(\w\+\)\>/\U&/g        # Convert HTML-Tags to uppercase
:g/^pattern/s/$/mytext           # Find and append text to the end
:g/pattern/norm! @i              # Run a macro on matching lines
/^\(.*\)\(\r\?\n\1\)\+$          # View the duplicates lines
/\v^(.*)(\r?\n\1)+$              # View the duplicates lines (very magic)
:v/./,/./-j                      # Compress blank lines into a blank line
:g/<p1>/,/<p2>/d                 # Delete inclusively from <p1> to <p2>
$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]
:[range]diffget [bufspec]
:[range]diffput [bufspec]
| Shortcut | Description | 
|---|---|
| do/:diffget | Obtain (get) difference | 
| dp/:diffput | Put difference | 
| :dif | Re-scan differences | 
| :diffo | Switch off diff mode | 
| :1,$+1diffget | Get all differences | 
| ZQ | Quit without changes | 
See: Ranges
| Shortcut | Description | 
|---|---|
| zo/zO | Open | 
| zc/zC | Close | 
| za/zA | Toggle | 
| zv | Open folds for this line | 
| zM | Close all | 
| zR | Open all | 
| zm | Fold more (foldlevel += 1) | 
| zr | Fold less (foldlevel -= 1) | 
| zx | Update folds | 
| Shortcut | Description | 
|---|---|
| ]c | Next difference | 
| [c | Previous difference | 
| Shortcut | Description | 
|---|---|
| vU | Uppercase character | 
| vu | Lowercase character | 
| ~ | Toggle case character | 
| viwU | Uppercase word | 
| viwu | Lowercase word | 
| viw~ | Toggle case word | 
| VU/gUU | Uppercase line | 
| Vu/guu | Lowercase line | 
| V~/g~~ | Toggle case line | 
| gggUG | Uppercase all text | 
| ggguG | Lowercase all text | 
| ggg~G | Toggle case all text | 
| Shortcut | Description | 
|---|---|
| <C-o> | Go back to previous | 
| <C-i> | Go forward | 
| gf | Go to file in cursor | 
| ga | Display hex, ascii value | 
| - | - | 
|---|---|
| :h | Help open help view | 
| :edit! | Reload current file | 
| :2,8m0 | Move lines 2-8to0 | 
| :noh | Clear search highlights | 
| :sort | Sort lines | 
| :ter | Open a terminal window | 
| :set paste | Enable Insert Paste sub-mode | 
| :set nopaste | disable Insert Paste sub-mode | 
| :cq | Exiting with an error (aborting Git) | 
| Shortcut | Description | 
|---|---|
| % | Nearest/matching {[()]} | 
| [(|[{ | Previous (or{ | 
| ])|]{ | Next )or} | 
| [m | Previous method start | 
| [M | Previous method end | 
| Shortcut | Description | 
|---|---|
| <C-a> | Increase number | 
| <C-x> | Decrease number | 
| Shortcut | Description | 
|---|---|
| :tag Classname | Jump to first definition of Classname | 
| <C-]> | Jump to definition | 
| g] | See all definitions | 
| <C-t> | Go back to last tag | 
| <C-o> <C-i> | Back/forward | 
| :tselect Classname | Find definitions of Classname | 
| :tjump Classname | Find definitions of Classname (auto-select 1st) | 
| - | - | 
|---|---|
| :ce 8 | Center lines between 8columns | 
| :ri 4 | Right-align lines at 4columns | 
| :le | Left-align lines | 
See :help formatting
| Shortcut | Description | 
|---|---|
| `^ | Last position of cursor in insert mode | 
| `. | Last change in current buffer | 
| `" | Last exited current buffer | 
| `0 | In last file edited | 
| '' | Back to line in current buffer where jumped from | 
| `` | Back to position in current buffer where jumped from | 
| `[ | To beginning of previously changed or yanked text | 
| `] | To end of previously changed or yanked text | 
| `< | To beginning of last visual selection | 
| `> | To end of last visual selection | 
| ma | Mark this cursor position as a | 
| `a | Jump to the cursor position a | 
| 'a | Jump to the beginning of the line with position a | 
| d'a | Delete from current line to line of mark a | 
| d`a | Delete from current position to position of mark a | 
| c'a | Change text from current line to line of a | 
| y`a | Yank text from current position to position of a | 
| :marks | List all current marks | 
| :delm a | Delete mark a | 
| :delm a-d | Delete marks a,b,c,d | 
| :delm abc | Delete marks a,b,c | 
| Shortcut | Description | 
|---|---|
| <C-r>=7*7 | Shows the result | 
| <C-r>=10/2 | Shows the result | 
Do this in INSERT mode
| - | - | 
|---|---|
| :!<shell> | Interpret Shell Command | 
| :r!<shell> | Read in output of shell | 
| :r!date | Insert date | 
| :!!date | Replace current line with date | 
| Shortcut | Description | 
|---|---|
| <C-r><C-w> | Insert current word into the command line | 
| <C-r>" | Paste from " register | 
| <C-x><C-f> | Auto-completion of path in insert mode | 
Remove duplicate lines
:sort | %!uniq -u
To number the lines in the file
:%!cat -n
Copy whole doc to clipboard
:%w !pbcopy            # Mac OS X
:%w !xclip -i -sel c   # GNU/Linux
:%w !xsel -i -b        # GNU/Linux