vim/neovim cheatsheet.
Modes
i insert before cursor
a insert after
o / O new line below/above
v visual (char)
V visual (line)
ctrl-v visual (block)
esc normal mode
: command mode
/ search forward
? search backward
Save/quit
:w write
:q quit
:wq / :x write+quit
:q! quit without save
ZZ save+quit
ZQ quit without save
Motions (normal mode)
h j k l left, down, up, right
w next word
b prev word
e end of word
0 / ^ line start / first non-blank
$ end of line
gg / G file start / end
H M L top / middle / bottom of screen
ctrl-d/u half page down/up
ctrl-f/b full page
{} / () paragraph / sentence
% match bracket
Edit
x delete char
dd delete line
dw delete word
d$ delete to end
D same as d$
diw delete inner word
da{ delete around { }
ci" change inner "
yy yank line
y$ yank to end
p / P paste after / before
u undo
ctrl-r redo
. repeat last action
Search/replace
/pattern search forward
?pattern search backward
n / N next / prev
* search word under cursor
:s/old/new/ line, first
:s/old/new/g line, all
:%s/old/new/g whole file
:%s/old/new/gc with confirm
:5,10s/old/new/g lines 5-10
Buffers
:e file open file
:bn / :bp next / prev buffer
:b name buffer by name (fuzzy)
:bd delete buffer
:ls list
Windows
:sp horizontal split
:vsp vertical
ctrl-w h/j/k/l move
ctrl-w c close
ctrl-w o only this
ctrl-w = equal sizes
Tabs
:tabnew
gt / gT next / prev
:tabclose
Marks
ma set mark a
'a jump to mark a
`` last position
Macros
qa start record into a
... actions
q stop
@a play
5@a play 5 times
Registers
"ayy yank into a
"ap paste from a
"0p last yank
"+p system clipboard (vim with clipboard)
"*p primary selection
Indent
>> indent line
<< unindent
=G autoindent to end
gg=G autoindent file
Numbers
ctrl-a increment number under cursor
ctrl-x decrement
Folding
zo open
zc close
zR open all
zM close all
Settings
:set number
:set relativenumber
:set list " show whitespace
:set wrap / nowrap
:set hlsearch
:set ignorecase smartcase
:set expandtab tabstop=4 shiftwidth=4
:set autoindent smartindent
:set mouse=a
In ~/.vimrc or ~/.config/nvim/init.lua.
init.lua basics (neovim)
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.expandtab = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.clipboard = "unnamedplus"
vim.opt.mouse = "a"
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>w", "<cmd>w<cr>")
vim.keymap.set("n", "<leader>q", "<cmd>q<cr>")
Lazy.nvim plugin manager
require("lazy").setup({
{ "folke/tokyonight.nvim", lazy = false, priority = 1000 },
{ "nvim-telescope/telescope.nvim", dependencies = { "nvim-lua/plenary.nvim" } },
{ "nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },
{ "neovim/nvim-lspconfig" },
{ "hrsh7th/nvim-cmp" },
})
LSP
require("lspconfig").lua_ls.setup({})
require("lspconfig").pyright.setup({})
require("lspconfig").tsserver.setup({})
vim.keymap.set("n", "gd", vim.lsp.buf.definition)
vim.keymap.set("n", "K", vim.lsp.buf.hover)
vim.keymap.set("n", "<leader>r", vim.lsp.buf.rename)
vim.keymap.set("n", "<leader>a", vim.lsp.buf.code_action)
Telescope
local t = require("telescope.builtin")
vim.keymap.set("n", "<leader>f", t.find_files)
vim.keymap.set("n", "<leader>g", t.live_grep)
vim.keymap.set("n", "<leader>b", t.buffers)
:help
:help
:help motions
:help :substitute
:helpgrep pattern
Common mistakes
- Caps lock vs Esc — remap one to the other.
- :wq when you wanted :q!.
- Plugin sprawl. Start minimal.
- Not learning text objects (
ciw,di{). - Editing files in tmux scrollback (use
Escfirst).
Read this next
If you want my neovim config (LSP, Telescope, Treesitter), it’s at rajpoot.dev .
Building something AI-, backend-, or data-heavy and want a second pair of eyes? I do consulting and freelance work — see my projects and ways to reach me at rajpoot.dev .