--- title: Vim category: Vim tags: [Featured] updated: 2020-07-05 weight: -10 --- ## Getting started {: .-three-column} ### Introduction [Vim](http://www.vim.org/) is a very efficient text editor. This reference was made for Vim 8.0. For shortcut notation, see `:help key-notation`. ### Exiting {: .-prime} | Shortcut | Description | | -------------- | -------------------------------- | | `:q` | Close file | | `:qa` | Close all files | | --- | --- | | `:w` | Save | | `:wq` _/_ `:x` | Save and close file | | --- | --- | | `ZZ` | Save and quit | | `ZQ` | Quit without checking changes | {: .-shortcuts} ### Exiting insert mode | Shortcut | Description | | --- | --- | | `Esc` _/_ `` | Exit insert mode | | `` | Exit insert mode, and abort current command | {: .-shortcuts} ## Editing {: .-three-column} ### Editing | Shortcut | Description | | --- | --- | | `a` | Append | | `A` | Append from end of line | | `i` | Insert | | `o` | Next line | | `O` | Previous line | | --- | --- | | `s` | Delete char and insert | | `S` | Delete line and insert | | `C` | Delete until end of line and insert | | --- | --- | | `r` | Replace one character | | `R` | Enter Replace mode | | --- | --- | | `u` | Undo changes | | `` | Redo changes | {: .-shortcuts} ### Clipboard | Shortcut | Description | | --- | --- | | `x` | Delete character | | --- | --- | | `dd` | Delete line _(Cut)_ | | `yy` | Yank line _(Copy)_ | | --- | --- | | `p` | Paste | | `P` | Paste before | | --- | --- | | `"*p` _/_ `"+p` | Paste from system clipboard | | `"*y` _/_ `"+y` | Paste to system clipboard | {: .-shortcuts} ### Visual mode | Shortcut | Description | | --- | --- | | `v` | Enter visual mode | | `V` | Enter visual line mode | | `` | Enter visual block mode | {: .-shortcuts} #### In visual mode | Shortcut | Description | | --- | --- | | `d` _/_ `x` | Delete selection | | `s` | Replace selection | | `y` | Yank selection _(Copy)_ | {: .-shortcuts} See [Operators](#operators) for other things you can do. ### Find & Replace | Shortcut | Description | | --- | --- | | :%s/foo/bar/g | Replace foo with bar in whole document | ## Navigating {: .-three-column} ### Directions | Shortcut | Description | | --- | --- | | `h` `j` `k` `l` | Arrow keys | | `` _/_ `` | Half-page up/down | | `` _/_ `` | Page up/down | {: .-shortcuts} ### Words | Shortcut | Description | | --- | --- | | `b` _/_ `w` | Previous/next word | | `ge` _/_ `e` | Previous/next end of word | {: .-shortcuts} ### Line | Shortcut | Description | | --- | --- | | `0` _(zero)_ | Start of line | | `^` | Start of line _(after whitespace)_ | | `$` | End of line | {: .-shortcuts} ### Character | `fc` | Go forward to character `c` | | `Fc` | Go backward to character `c` | {: .-shortcuts} ### Document | Shortcut | Description | | --- | --- | | `gg` | First line | | `G` | Last line | | `:{number}` | Go to line `{number}` | | `{number}G` | Go to line `{number}` | | `{number}j` | Go down `{number}` lines | | `{number}k` | Go up `{number}` lines | {: .-shortcuts} ### Window | Shortcut | Description | | --- | --- | | `zz` | Center this line | | `zt` | Top this line | | `zb` | Bottom this line | | `H` | Move to top of screen | | `M` | Move to middle of screen | | `L` | Move to bottom of screen | {: .-shortcuts} ### Search | Shortcut | Description | | --- | --- | | `n` | Next matching search pattern | | `N` | Previous match | | `*` | Next whole word under cursor | | `#` | Previous whole word under cursor | {: .-shortcuts} Operators --------- {: .-three-column} ### Usage {: .-prime} Operators let you operate in a range of text (defined by *motion*). These are performed in normal mode. {: .-setup} | `d` | `w` | | Operator | Motion | {: .-css-breakdown} ### Operators list | Shortcut | Description | | --- | --- | | `d` | Delete | | `y` | Yank _(copy)_ | | `c` | Change _(delete then insert)_ | | --- | --- | | `>` | Indent right | | `<` | Indent left | | `=` | Autoindent | | --- | --- | | `g~` | Swap case | | `gU` | Uppercase | | `gu` | Lowercase | | --- | --- | | `!` | Filter through external program | {: .-shortcuts} See `:help operator` ### Examples Combine operators with *motions* to use them. {: .-setup} | Shortcut | Description | | --- | --- | | `d`_d_ | _(repeat the letter)_ Delete current line | | `d`_w_ | Delete to next word | | `d`_b_ | Delete to beginning of word | | _2_`dd` | Delete 2 lines | | `d`_ip_ | Delete a text object _(inside paragraph)_ | | _(in visual mode)_ `d` | Delete selection | See: `:help motion.txt` Text objects ------------ {: .-three-column} ### Usage {: .-prime} Text objects let you operate (with an *operator*) in or around text blocks (*objects*). {: .-setup} | `v` | `i` | `p` | | Operator | [i]nside or [a]round | Text object | {: .-css-breakdown} ### Text objects | Shortcut | Description | | --- | --- | | `p` | Paragraph | | `w` | Word | | `s` | Sentence | | --- | --- | | `[` `(` `{` `<` | A [], (), or {} block | | `'` `"` ` | A quoted string | | --- | --- | | `b` | A block [( | | `B` | A block in [{ | | `t` | A XML tag block | {: .-shortcuts} ### Examples | Shortcut | Description | | --- | --- | | `vip` | Select paragraph | | `vipipipip` | Select more | | --- | --- | | `yip` | Yank inner paragraph | | `yap` | Yank paragraph (including newline) | | --- | --- | | `dip` | Delete inner paragraph | | `cip` | Change inner paragraph | {: .-shortcuts} See [Operators](#operators) for other things you can do. ### Diff | Shortcut | Description | | --- | --- | | `gvimdiff file1 file2 [file3]` | See differences between files, in HMI | Misc ---- ### Tab pages | Shortcut | Description | | --- | --- | | `:tabedit [file]` | Edit file in a new tab | | `:tabfind [file]` | Open file if exists in new tab | | `:tabclose` | Close current tab | | `:tabs` | List all tabs | | `:tabfirst` | Go to first tab | | `:tablast` | Go to last tab | | `:tabn ` | Go to next tab | | `:tabp ` | Go to previous tab | ### Folds | 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 | {: .-shortcuts} Uppercase ones are recursive (eg, `zO` is open recursively). ### Navigation | Shortcut | Description | | --- | --- | | `%` | Nearest/matching `{[()]}` | | `[(` `[{` `[<` | Previous `(` or `{` or `<` | | `])` | Next | | --- | --- | | `[m` | Previous method start | | `[M` | Previous method end | {: .-shortcuts} ### Jumping | Shortcut | Description | | --- | --- | | `` | Go back to previous location | | `` | Go forward | | --- | --- | | `gf` | Go to file in cursor | {: .-shortcuts} ### Counters | Shortcut | Description | | --- | --- | | `` | Increment number | | `` | Decrement | {: .-shortcuts} ### Windows | `z{height}` | Resize pane to `{height}` lines tall | ### Tags | Shortcut | Description | | --- | --- | | `:tag Classname` | Jump to first definition of Classname | | --- | --- | | `` | Jump to definition | | `g]` | See all definitions | | `` | Go back to last tag | | ` ` | Back/forward | | --- | --- | | `:tselect Classname` | Find definitions of Classname | | `:tjump Classname` | Find definitions of Classname (auto-select 1st) | {: .-shortcuts} ### Case | Shortcut | Description | | --- | --- | | `~` | Toggle case (Case => cASE) | | `gU` | Uppercase | | `gu` | Lowercase | | --- | --- | | `gUU` | Uppercase current line (also `gUgU`) | | `guu` | Lowercase current line (also `gugu`) | {: .-shortcuts} Do these in visual or normal mode. ### Marks | 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` | {: .-shortcuts} ### Misc | Shortcut | Description | | --- | --- | | `.` | Repeat last command | | `]p` | Paste under the current indentation level | | --- | --- | | `:set ff=unix` | Convert Windows line endings to Unix line endings | {: .-shortcuts} ### Command line | Shortcut | Description | | --- | --- | | `` | Insert current word into the command line | | `"` | Paste from " register | | `` | Auto-completion of path in insert mode | {: .-shortcuts} ### Text alignment :center [width] :right [width] :left See `:help formatting` ### Calculator | Shortcut | Description | | --- | --- | | `=128/2` | Shows the result of the division : '64' | Do this in insert mode. ### Exiting with an error :cq :cquit Works like `:qa`, but throws an error. Great for aborting Git commands. ### Spell checking | Shortcut | Description | | --- | --- | | `:set spell spelllang=en_us` | Turn on US English spell checking | | `]s` | Move to next misspelled word after the cursor | | `[s` | Move to previous misspelled word before the cursor | | `z=` | Suggest spellings for the word under/after the cursor | | `zg` | Add word to spell list | | `zw` | Mark word as bad/misspelling | | `zu` / `C-X (Insert Mode)` | Suggest words for bad word under cursor from spellfile | {: .-shortcuts} See `:help spell` Also see -------- - [Vim cheatsheet](https://vim.rtorr.com/) _(vim.rotrr.com)_ - [Vim documentation](http://vimdoc.sourceforge.net/htmldoc/) _(vimdoc.sourceforge.net)_ - [Interactive Vim tutorial](http://openvim.com/) _(openvim.com)_