- Basic Movement
- Inserting & Editing
- Copy & Paste
- Undo & Redo
- Visual Mode
- Search & Replace
- Navigation
- LSP & Completion
- Useful Commands
- File & Buffer Management
- Tabs
- Customization
- Plugin Management
Basic Movement
Command | Description | Real-World Example |
---|---|---|
h / l | Move left/right by one character | Input: h Effect: Cursor moves one character to the left |
j / k | Move down/up by one line | Input: j Effect: Cursor moves one line down |
w / b | Jump forward/backward to the start of the next/previous word | Input: w Effect: Cursor jumps to the next word |
e | Jump to the end of the current/next word | Input: e Effect: Cursor jumps to the end of the current/next word |
0 | Move to the beginning of the line | Input: 0 Effect: Cursor moves to the first column of the current line |
^ | Move to the first non-blank character of the line | Input: ^ Effect: Cursor jumps to the first word of the current line |
$ | Move to the end of the line | Input: $ Effect: Cursor jumps to the last character of the current line |
{ / } | Move to the beginning of the previous/next paragraph | Input: } Effect: Cursor moves to the start of the next paragraph |
/pattern / ?pattern | Search forward/backward for a pattern | Input: /function Effect: Cursor jumps to the next occurrence of "function" |
n / N | Repeat last search forward/backward | Input: n Effect: Jumps to next match of last search |
Inserting & Editing
Command | Description | Real-World Example |
---|---|---|
i | Insert before the cursor | Input: iHello Effect: Inserts "Hello" before cursor position |
I | Insert at the beginning of the line | Input: IHello Effect: Inserts "Hello" at the start of the current line |
a | Insert after the cursor | Input: aWorld Effect: Inserts "World" just after the current character |
A | Insert at the end of the line | Input: A! Effect: Appends "!" at the end of the current line |
o | Open a new line below and insert | Input: oNew line Effect: Creates a new line below and starts inserting "New line" |
O | Open a new line above and insert | Input: OHeader Effect: Adds "Header" on a new line above the current one |
x | Delete character under the cursor | Input: x Effect: Deletes the current character |
dd | Delete the current line | Input: dd Effect: Removes the entire line where the cursor is |
dw | Delete from cursor to end of word | Input: dw Effect: Deletes current word (or part of it) starting from cursor |
d$ | Delete from cursor to end of line | Input: d$ Effect: Deletes all text from cursor to line end |
D | Same as d$ | Input: D Effect: Deletes everything to the right of the cursor |
cw | Change word (delete and enter insert mode) | Input: cwHello Effect: Replaces the current word with "Hello" |
cc | Change the whole line | Input: ccHello World Effect: Replaces the entire line with "Hello World" |
C | Change from cursor to end of line | Input: CHi! Effect: Changes from current position to end of line to "Hi!" |
s | Substitute character under cursor | Input: sA Effect: Replaces current character with "A" |
r | Replace a single character | Input: rX Effect: Replaces current character with "X" |
R | Enter replace mode until <Esc> | Input: RHELLO |
Copy & Paste
Command | Description | Real-World Example |
---|---|---|
yy | Yank (copy) the current line | Input: yy Effect: Copies the entire line into default register |
yw | Yank from cursor to end of the current word | Input: yw Effect: Copies the current word from cursor position |
y$ | Yank from cursor to end of line | Input: y$ Effect: Copies text from cursor to the end of line |
Y | Yank the entire line (same as yy ) | Input: Y Effect: Copies the whole line |
p | Paste after the cursor or below the line | Input: p Effect: Pastes yanked content after cursor or below the line |
P | Paste before the cursor or above the line | Input: P Effect: Pastes yanked content before cursor or above the line |
"aY | Yank current line into register “a” | Input: "aY Effect: Saves the current line into register a |
"ap | Paste from register “a” | Input: "ap Effect: Pastes content stored in register a |
Undo & Redo
Command | Description | Real-World Example |
---|---|---|
u | Undo the last change | Input: u Effect: Reverts your most recent edit (e.g., undo inserted text) |
<C-r> | Redo the change that was just undone |
Input: Ctrl + r
Effect: Restores the change you just undid using |
Visual Mode
Command | Description | Real-World Example |
---|---|---|
v | Enter visual mode (character-wise selection) | Input: v (then move with arrows or hjkl) Effect: Highlights characters one by one |
V | Enter linewise visual mode | Input: V Effect: Selects entire lines |
<C-v> | Enter block visual mode (column-wise) | Input: Ctrl + v (then move to select block) Effect: Highlights a rectangular block of text |
y | Yank the selected text | Input: v (select) → y Effect: Copies the selected area |
d | Delete the selected text | Input: V (select lines) → d Effect: Deletes selected lines |
p | Paste over the selection | Input: Select text → p Effect: Replaces selection with yanked text |
: | Run a command on the selected text | Input: v (select) → :sort Effect: Sorts the selected lines |
Search & Replace
Command | Description | Real-World Example |
---|---|---|
/pattern | Search forward for a pattern | Input: /error Effect: Highlights and jumps to the next occurrence of "error" |
?pattern | Search backward for a pattern | Input: ?function Effect: Searches up the file for "function" |
n | Repeat the last search in the same direction | Input: n Effect: Jumps to the next match of the last search |
N | Repeat the last search in the opposite direction | Input: N Effect: Jumps to the previous match of the last search |
:%s/old/new/g | Replace all occurrences of “old” with “new” in the whole file | Input: :%s/bug/fix/g Effect: Replaces all instances of "bug" with "fix" |
:s/this/that/gc | Replace “this” with “that” on the current line, confirming each | Input: :s/error/warning/gc Effect: Prompts before replacing each "error" with "warning" on current line |
Command | Description | Real-World Example |
---|---|---|
:e filename | Edit/open a file | Input: :e notes.txt Effect: Opens "notes.txt" in the current window |
:Ex / :Explore | Open file explorer | Input: :Ex Effect: Opens a split file explorer in the current directory |
:ls | List all open buffers | Input: :ls Effect: Shows all currently open files (buffers) |
:bnext | Go to next buffer | Input: :bnext Effect: Switches to the next file in the buffer list |
:bprev | Go to previous buffer | Input: :bprev Effect: Switches to the previous file in the buffer list |
:bd | Delete/close a buffer | Input: :bd Effect: Closes the current buffer |
<C-w>v | Split window vertically | Input: Ctrl + w, then v Effect: Opens a vertical split |
<C-w>s | Split window horizontally | Input: Ctrl + w, then s Effect: Opens a horizontal split |
<C-w>h/j/k/l | Move between windows | Input: Ctrl + w, then l Effect: Moves to the window on the right |
:tabnew | Open a new tab | Input: :tabnew Effect: Opens a new empty tab |
gt | Go to next tab | Input: gt Effect: Switches to the next tab |
gT | Go to previous tab | Input: gT Effect: Switches to the previous tab |
LSP & Completion
Command | Description | Real-World Example |
---|---|---|
gd | Go to definition of symbol | Input: gd Effect: Jumps to the function or variable definition under the cursor |
K | Show hover documentation | Input: K Effect: Shows documentation for the symbol under the cursor |
<leader>rn | Rename symbol | Input: <leader>rn Effect: Prompts to rename the variable or function under cursor |
:lua vim.lsp.buf.format() | Format current buffer using LSP | Input: :lua vim.lsp.buf.format() Effect: Formats the file according to language server rules |
Useful Commands
Command | Description | Real-World Example |
---|---|---|
:w | Save the current file | Input: :w Effect: Saves the current file |
:q | Quit Neovim | Input: :q Effect: Exits Neovim (only works if no changes are unsaved) |
:wq | Save and quit Neovim | Input: :wq Effect: Saves the file and exits Neovim |
:x | Save and quit (same as :wq) | Input: :x Effect: Saves the file and exits (same as :wq) |
:q! | Quit without saving (force quit) | Input: :q! Effect: Exits without saving changes, even if unsaved modifications exist |
:!command | Execute an external command | Input: :!ls Effect: Runs the "ls" command in the terminal and displays the output inside Neovim |
:noh | Clear search highlighting | Input: :noh Effect: Clears any active search highlighting |
:set paste | Enable paste mode (useful when pasting text) | Input: :set paste Effect: Temporarily disables automatic indentation and formatting, ideal for pasting text |
File & Buffer Management
Command | Description | Real-World Example |
---|---|---|
:e filename | Open a file for editing | Input: :e example.txt Effect: Opens "example.txt" in the current window for editing |
:w | Save the current file | Input: :w Effect: Saves the changes made to the current file |
:q | Quit Neovim | Input: :q Effect: Exits Neovim (only works if no changes are unsaved) |
:ls | List all open buffers | Input: :ls Effect: Displays a list of all open buffers in Neovim |
:bnext | Switch to the next buffer | Input: :bnext Effect: Switches to the next buffer in the buffer list |
:bprev | Switch to the previous buffer | Input: :bprev Effect: Switches to the previous buffer in the buffer list |
:bd | Close the current buffer | Input: :bd Effect: Closes the current buffer (file) |
:b | Switch to a specific buffer by its number | Input: :b 2 Effect: Switches to the second buffer in the list |
:sp | Split the window horizontally and load a file | Input: :sp example.txt Effect: Opens "example.txt" in a horizontal split |
:vsp | Split the window vertically and load a file | Input: :vsp example.txt Effect: Opens "example.txt" in a vertical split |
Window Management
Command | Description | Real-World Example |
---|---|---|
<C-w>v | Split the window vertically | Input: <C-w>v Effect: Splits the current window into two vertical panes |
<C-w>s | Split the window horizontally | Input: <C-w>s Effect: Splits the current window into two horizontal panes |
<C-w>h/j/k/l | Navigate between windows using directional keys | Input: <C-w>h (move left window) <C-w>j (move down window) <C-w>k (move up window) <C-w>l (move right window) Effect: Moves the cursor to the respective window |
<C-w>q | Close the current window | Input: <C-w>q Effect: Closes the current window, leaving the other panes open |
<C-w>w | Switch to the next window | Input: <C-w>w Effect: Cycles to the next window in the current layout |
<C-w>H | Move the current window to the far left | Input: <C-w>H Effect: Moves the current window to the far left of the layout |
<C-w>J | Move the current window to the bottom | Input: <C-w>J Effect: Moves the current window to the bottom of the layout |
<C-w>K | Move the current window to the top | Input: <C-w>K Effect: Moves the current window to the top of the layout |
<C-w>L | Move the current window to the far right | Input: <C-w>L Effect: Moves the current window to the far right of the layout |
Tabs
Command | Description | Real-World Example |
---|---|---|
:tabnew | Open a new tab page | Input: :tabnew Effect: Opens a new tab page (creates a new workspace) |
gt | Switch to the next tab | Input: gt Effect: Switches to the next tab in the tab list |
gT | Switch to the previous tab | Input: gT Effect: Switches to the previous tab in the tab list |
:tabn | Go to the next tab | Input: :tabn Effect: Switches to the next tab |
:tabp | Go to the previous tab | Input: :tabp Effect: Switches to the previous tab |
:tabnew filename | Open a file in a new tab | Input: :tabnew example.txt Effect: Opens "example.txt" in a new tab |
:tabclose | Close the current tab | Input: :tabclose Effect: Closes the current tab (and all its windows) |
Customization
Command | Description | Real-World Example |
---|---|---|
:set number | Enable line numbering | Input: :set number Effect: Displays line numbers in the left margin |
:set relativenumber | Enable relative line numbering | Input: :set relativenumber Effect: Displays line numbers relative to the cursor position |
:set hlsearch | Highlight search results | Input: :set hlsearch Effect: Highlights all matches for the search pattern |
:set incsearch | Enable incremental search | Input: :set incsearch Effect: Shows search results as you type |
:set ignorecase | Enable case-insensitive search | Input: :set ignorecase Effect: Makes search patterns case-insensitive |
:set smartcase | Enable smart case search | Input: :set smartcase Effect: Enables case-sensitive search only when uppercase characters are used in the pattern |
:set tabstop=4 | Set tab width to 4 spaces | Input: :set tabstop=4 Effect: Sets the tab width to 4 spaces |
:set shiftwidth=4 | Set the number of spaces to use for indentation | Input: :set shiftwidth=4 Effect: Sets the indentation width to 4 spaces |
:set expandtab | Convert tabs to spaces | Input: :set expandtab Effect: Converts tabs to spaces when pressing the Tab key |
Plugin Management
Command | Description | Real-World Example |
---|---|---|
:PlugInstall | Install plugins with vim-plug | Input: :PlugInstall Effect: Installs all plugins listed in the vim-plug plugin manager configuration |
:PlugUpdate | Update installed plugins | Input: :PlugUpdate Effect: Updates all installed plugins to the latest version |
:PlugClean | Remove unused plugins | Input: :PlugClean Effect: Removes plugins that are no longer listed in the vim-plug configuration |
:PluginInstall | Install plugins with Pathogen | Input: :PluginInstall Effect: Installs plugins defined in the Pathogen configuration |
:PluginUpdate | Update plugins with Pathogen | Input: :PluginUpdate Effect: Updates all plugins installed via Pathogen |
:PackerSync | Sync and update plugins with Packer | Input: :PackerSync Effect: Installs, updates, and removes plugins defined in the Packer configuration |