Vi reminders
Cursor movement
- h – move left
- j – move down
- k – move up
- l – move right
- w – jump by start of words (punctuation considered words)
- W – jump by words (spaces separate words)
- e – jump to end of words (punctuation considered words)
- E – jump to end of words (no punctuation)
- b – jump backward by words (punctuation considered words)
- B – jump backward by words (no punctuation)
- 0 – (zero) start of line
- ^ – first non-blank character of line
- $ – end of line
- G – Go To command (prefix with number – 5G goes to line 5)
Note: Prefix a cursor movement command with a number to repeat it. For example, 4j moves down 4 lines.
Insert Mode – Inserting/Appending text
- i – start insert mode at cursor
- I – insert at the beginning of the line
- a – append after the cursor
- A – append at the end of the line
- o – open (append) blank line below current line (no need to press return)
- O – open blank line above current line
- ea – append at end of word
- Esc – exit insert mode
Editing
- r – replace a single character (does not use insert mode)
- J – join line below to the current one
- cc – change (replace) an entire line
- cw – change (replace) to the end of word
- c$ – change (replace) to the end of line
- s – delete character at cursor and subsitute text
- S – delete line at cursor and substitute text (same as cc)
- xp – transpose two letters (delete and paste, technically)
- u – undo
- . – repeat last command
Marking text (visual mode)
- v – start visual mode, mark lines, then do command (such as y-yank)
- V – start Linewise visual mode
- o – move to other end of marked area
- Ctrl+v – start visual block mode
- O – move to Other corner of block
- aw – mark a word
- ab – a () block (with braces)
- aB – a {} block (with brackets)
- ib – inner () block
- iB – inner {} block
- Esc – exit visual mode
Visual commands
- > – shift right
- < – shift left
- y – yank (copy) marked text
- d – delete marked text
- ~ – switch case
Cut and Paste
- yy – yank (copy) a line
- 2yy – yank 2 lines
- yw – yank word
- y$ – yank to end of line
- p – put (paste) the clipboard after cursor
- P – put (paste) before cursor
- dd – delete (cut) a line
- dw – delete (cut) the current word
- x – delete (cut) current character
Exiting
- :w – write (save) the file, but don’t exit
- :wq – write (save) and quit
- :q – quit (fails if anything has changed)
- :q! – quit and throw away changes
Search/Replace
- /pattern – search for pattern
- ?pattern – search backward for pattern
- n – repeat search in same direction
- N – repeat search in opposite direction
- :%s/old/new/g – replace all old with new throughout file
- :%s/old/new/gc – replace all old with new throughout file with confirmations
Working with multiple files
- :e filename – Edit a file in a new buffer
- :bnext (or :bn) – go to next buffer
- :bprev (of :bp) – go to previous buffer
- :bd – delete a buffer (close a file)
- :sp filename – Open a file in a new buffer and split window
- ctrl+ws – Split windows
- ctrl+ww – switch between windows
- ctrl+wq – Quit a window
- ctrl+wv – Split windows vertically
thanks to Tim at https://www.worldtimzone.com