Packages & the Runtime Path
23What Vim does natively, and how to debug it
~/.vim/pack/{any}/start/{plugin}/loaded at startup, no manager needed~/.vim/pack/{any}/opt/{plugin}/loaded only on :packadd {plugin}:packadd {name}load one optional package now:packadd! {name}the same, but skip it when Vim starts with --noplugin:packloadallload every start/ package; happens automatically after the vimrc:helptags ALLgenerate help tags for every doc/ in 'runtimepath'git submodule in ~/.vimversion-controlled plugins with no manager at all$VIMRUNTIME/pack/dist/opt/packages Vim itself ships:packadd matchitextends % to language keywords:packadd cfilter:Cfilter / :Lfilter to narrow a quickfix list:packadd termdebuga gdb front end inside Vimplugin/*.vimsourced once at startup, unconditionallyautoload/foo.vimsourced on the first call to foo#Bar()ftplugin/{ft}.vimper filetype; use setlocal and <buffer> mapsafter/ftplugin/{ft}.vimyour overrides, sourced lastftdetect/*.vimclaim new file extensionssyntax/ · indent/ · colors/ · compiler/ · doc/the rest of the runtime directories:scriptnamesevery file sourced, in ordervim --startuptime /tmp/stper-file startup timings; the last line is the total:verbose map <C-p>which plugin defined that mapping:verbose set foldmethod?which plugin set that option<Plug>Mappinga plugin’s named entry point, unreachable from the keyboardg:loaded_{plugin}the conventional guard variablePlugin Managers
22The managers
junegunn/vim-plugone file, one :PlugInstall, works in both editors — still the default answer for Vimk-takata/minpaca thin wrapper over Vim 8 packages; installs into pack/minpac/ and gets out of the wayfolke/lazy.nvimthe Neovim standard: declarative specs, lazy loading by event, command or filetype, and a lockfilewbthomason/packer.nvimthe previous Neovim standard; unmaintained in practice, superseded by lazy.nvimShougo/dein.vimfast and configurable, with a cache; the power-user option, and the steepestVundleVim/Vundle.vimthe plugin manager that made the pattern popular in 2010; nothing new needs ittpope/vim-pathogenthe original: it only manipulates 'runtimepath'. Vim 8 packages made it unnecessaryTheir command sets
Plug 'tpope/vim-surround'vim-plug: declare, between call plug#begin() and plug#end()Plug 'x/y', {'on': ':Cmd'}vim-plug: lazy by command; 'for' for filetype, 'branch'/'tag'/'do' for the rest:PlugInstall / :PlugUpdate / :PlugCleanvim-plug: install, update, remove what is no longer declared:PlugUpgrade / :PlugSnapshotvim-plug: update plug.vim itself; write a script pinning current commits:PlugStatus / :PlugDiffvim-plug: state, and what changed on the last updatecall minpac#add('x/y')minpac: declare; {'type': 'opt'} for an opt/ packagecall minpac#update() / #clean()minpac: install or update, and prunerequire("lazy").setup(specs)lazy.nvim: the entry point{ "x/y", event = "VeryLazy" }lazy.nvim: lazy by event, cmd, ft, keys or dependencies:Lazy / :Lazy sync / :Lazy profilelazy.nvim: the UI, install+update+clean, and startup timings per pluginlazy-lock.jsonlazy.nvim: the lockfile — commit it:PluginInstallVundlecall dein#add() / :call dein#update()deinexecute pathogen#infect()pathogen: put every directory in ~/.vim/bundle on the runtimepathautoload/-based costs almost nothing to load eagerlyMotions, Objects & Operators
27Editing verbs and nouns
tpope/vim-surroundthe one everyone installs: cs"', ds(, ysiw] — surroundings as an operatormachakann/vim-sandwichsurround, reconsidered: better text objects and a saner default set of recipeskylechui/nvim-surroundthe Lua rewrite, for Neovim configs that want no Vimscripttpope/vim-commentarygcc, gcap. Reads 'commentstring', so it works in any filetypenumToStr/Comment.nvimthe same, in Lua, with tree-sitter-aware commentstring for embedded languagestomtom/tcomment_vimthe older, more configurable commenterpreservim/nerdcommenterthe other older one, with a lot of optionstpope/vim-repeatmakes . work with plugin operators. Install it or half of tpope’s suite half-workstpope/vim-unimpairedpaired [/] mappings: [q ]q quickfix, [b ]b buffers, [<Space> blank lines, yo option toggleswellle/targets.vimtext objects that actually reach: ci, for an argument, din( for the next parens, seeking forward on the linekana/vim-textobj-userthe framework almost every custom text-object plugin builds onmichaeljsmith/vim-indent-objectai/ii — an indentation level as an object. The Python oneandymass/vim-matchup% that understands if/endif, not just brackets; supersedes matchiteasymotion/vim-easymotionlabel every target on screen and jump by letter. Heavy, and the original of the genrejustinmk/vim-sneakthe light alternative: s{char}{char}, a two-character f that works across linesunblevable/quick-scopehighlights the character to aim f at — passive, no new keys to learntommcdo/vim-exchangecx twice to swap two regionssvermeulen/vim-subversivesubstitute an object with a register: s{motion} pastes over itinkarkat/vim-ReplaceWithRegistergr{motion} — the smallest possible version of the same ideasvermeulen/vim-easyclipreworks the register model so deletes stop clobbering yanks; opinionated, and it changes muscle memoryAndrewRadev/splitjoin.vimgS / gJ: expand a one-liner into a block and back, per languageAndrewRadev/sideways.vimmove a function argument left or right without breaking the commasFooSoft/vim-argwrapwrap or unwrap an argument list at the cursorjunegunn/vim-easy-alignalign on a delimiter interactively: gaip=godlygeek/tabularthe older aligner; :Tabularize /=mg979/vim-visual-multireal multiple cursors, and the maintained oneterryma/vim-multiple-cursorsthe famous one, and long since abandoned by its author in favour of the aboveFiles & Navigation
20Finders, trees and jumps
junegunn/fzfthe fuzzy finder itself — a Go binary, not a Vim plugin. Installed as a dependencyjunegunn/fzf.vimthe Vim commands on top: :Files :Rg :Buffers :Lines :Commits :Helptagsnvim-telescope/telescope.nvimthe Neovim picker: extensible, previewing, and the centre of most modern configsnvim-lua/plenary.nvimthe Lua standard library half the Neovim ecosystem depends on. You will install it as a dependencyctrlpvim/ctrlp.vimpure Vimscript fuzzy finder — no external binary, and slow on very large treesYggdroot/LeaderFa faster pure-Vim finder with an optional C extensionpreservim/nerdtreethe file tree everyone knowstpope/vim-vinegarthe counter-argument: fixes netrw instead, and - opens the current file’s directoryjustinmk/vim-dirvisha directory is just a buffer of paths — edit it with ordinary Vim commandslambdalisue/vim-fernan asynchronous tree that works in both editorsShougo/defx.nvimShougo’s file explorer; needs +python3nvim-tree/nvim-tree.luathe Lua tree for Neovimstevearc/oil.nvimdirvish’s idea done properly: edit the filesystem as a buffer, including renames and deletesThePrimeagen/harpoonpin four files and jump between them by number. Small idea, disproportionate effectmhinz/vim-startifya start screen with recent files and sessionspreservim/tagbara ctags outline in a sidebarludovicchabant/vim-gutentagsregenerates the tags file in the background so CTRL-] is never stalejunegunn/vim-peekabooshows the register contents when you press " or @ryanoasis/vim-deviconsfiletype glyphs, if you have a patched fontnvim-tree/nvim-web-deviconsthe same for Neovim, and a dependency of most Lua UI pluginsGit
9Version control inside the editor
tpope/vim-fugitivethe reason people stay in Vim: :Git anything, a real status buffer, :Gdiffsplit three-way merges, :Gblame you can jump fromtpope/vim-rhubarbadds GitHub to fugitive — :GBrowse, and issue completion in commit messagesjunegunn/gv.vima commit browser built on fugitive; :GV for the log, :GV! for this fileairblade/vim-gitgutterchange signs in the gutter, plus stage and undo per hunkmhinz/vim-signifythe same idea for any VCS, and faster on large repositorieslewis6991/gitsigns.nvimthe Neovim one: signs, hunk staging, inline blame, all asynchronousrhysd/git-messenger.vima popup with the commit that touched the line under the cursorlambdalisue/vim-ginaan asynchronous git interface; archiveditchyny/vim-gitbranchone function that returns the branch name, for a statuslineLSP, Completion & Linting
11Language intelligence
neoclide/coc.nvima Node extension host inside the editor: LSP, completion, and the VS Code extension ecosystem. Powerful, and a large dependencydense-analysis/aleasynchronous linting and fixing, with an LSP client. The gentlest way into diagnostics for plain Vimprabirshrestha/vim-lspa pure-Vimscript LSP client, no Node requiredmattn/vim-lsp-settingsauto-installs and configures servers for vim-lsp — the piece that makes it painlessprabirshrestha/asyncomplete.vimthe asynchronous completion engine that pairs with vim-lspycm-core/YouCompleteMethe original heavyweight: a compiled server, semantic completion, and a real build stepvim-syntastic/syntasticsynchronous linting from before Vim had jobs. Archived; use ALEneovim/nvim-lspconfigthe community configurations for Neovim’s built-in LSP client — the client itself is not a pluginhrsh7th/nvim-cmpthe completion engine most Neovim configs use, with pluggable sourcesShougo/deoplete.nvimthe earlier asynchronous completion framework; needs +python3davidhalter/jedi-vimPython completion and navigation without LSPSnippets
4Engines and content
SirVer/ultisnipsthe Vim snippet engine: tabstops, placeholders, and Python interpolation inside a snippethonza/vim-snippetsthe community snippet corpus — the content, not an enginehrsh7th/vim-vsnipa lighter engine that speaks the LSP/VS Code snippet formatL3MON4D3/LuaSnipthe Neovim engine: snippets as Lua data, dynamic nodes, and fastEditing, Search & Folding
33The quality-of-life layer
markonm/traces.vimlive preview for :s, :g, :sort and ranges as you type themosyo-manga/vim-overthe earlier live-substitute previewhaya14busa/incsearch.vimincremental search with all matches highlighted while typingromainl/vim-cooltwelve lines that clear the search highlight when you move. The best effort-to-value ratio hereromainl/vim-qfmakes the quickfix window behave: filtering, toggling, and better mappingsstefandtw/quickfix-reflector.vimedit the quickfix window and have the edits written to the filesdyng/ctrlsf.vima search-and-edit buffer over ack/ag/ripgrep resultsmhinz/vim-grepperone :Grepper command over whichever search tool is installedmileszs/ack.vimthe classic grep wrapper; configurable to use ripgrepjremmen/vim-ripgrepa minimal :Rgrking/ag.vimthe silver-searcher wrapper, superseded by ack.vim itselfmbbill/undotreethe undo tree, visualised — the plugin that makes the tree usablesimnalamburt/vim-mundothe maintained fork of Gundo, same idea, with a diff panekshenoy/vim-signatureshows marks in the gutter and gives them navigation keyschrisbra/NrrwRgnnarrow a region into its own buffer, edit it, write it backchrisbra/csv.vima genuine CSV mode: column arithmetic, alignment, sorting, headerswill133/vim-dirdiffrecursive directory diff inside VimKonfekt/FastFoldstops foldmethod=syntax recomputing on every keystroke — the fix for slow scrollingtmhedberg/SimpylFoldsane folding for Pythonjiangmiao/auto-pairsauto-close brackets and quotesRaimondi/delimitMatethe other auto-close pluginwindwp/nvim-autopairsthe Neovim one, tree-sitter awaretpope/vim-endwiseadds end, endif, fi for you in the languages that need themluochen1990/rainbowrainbow parenthesesYggdroot/indentLineindent guides; archivedpreservim/vim-indent-guidesthe other indent-guide plugineditorconfig/editorconfig-vimhonours .editorconfigtpope/vim-sleuthguesses the file’s indentation and sets the options. Zero configuration, and usually rightsbdchd/neoformatrun any external formatter over the bufferprettier/vim-prettierprettier, specificallystevearc/conform.nvimthe Neovim formatter runner: per-filetype chains, format-on-save, LSP fallback907th/vim-auto-savesaves on a timer or on leaving insert modepsliwka/vim-smoothieanimated scrolling for CTRL-D and friendsRunning, Testing & Tooling
20Build, test, debug and the shell
tpope/vim-dispatchrun :Make and :Dispatch in the background, results into quickfix. Predates Vim 8 jobs and still worksskywind3000/asyncrun.vimthe asynchronous :AsyncRun, with quickfix streamingskywind3000/asynctasks.vima task-runner layer on asyncrun, configured per projectvim-test/vim-testone set of mappings that runs the nearest test in 40-odd frameworks — :TestNearest, :TestFile, :TestSuitepuremourning/vimspectora full DAP debugger UI for Vim, with a launch-configuration filemfussenegger/nvim-dapthe DAP client for Neovimrcarriga/nvim-dap-uithe panes and controls on top of nvim-dapakinsho/toggleterm.nvimterminal windows you can toggle, float and reusepreservim/vimuxsend commands to a tmux pane beside Vimchristoomey/vim-tmux-navigatorCTRL-h/j/k/l moves between Vim splits and tmux panes without thinkingedkolev/tmuxline.vimgenerate a tmux statusline from your Vim onetpope/vim-eunuchthe shell commands you actually wanted: :Rename, :Move, :Delete, :SudoWrite, :Mkdirtpope/vim-dadboda database client: :DB postgres://… select …tpope/vim-projectionistdeclare a project’s file layout and get :Emodel, :A for alternate files, and skeletonstpope/vim-obsessionkeeps a session file up to date without you remembering to :mksessiontpope/vim-apathysets 'path', 'include' and 'suffixesadd' per language, so gf and :find just worktpope/vim-characterizega that also tells you the Unicode name and HTML entitytpope/vim-abolishcase-preserving substitute (:S), coercion between snake/camel/kebab (crs crc cr-), and smart abbreviationstpope/vim-speeddatingCTRL-A on a date increments the date, not the first number in ittpope/vim-sensiblethe defaults everyone sets. Largely folded into defaults.vim nowInterface & Colour Schemes
20Statuslines, popups and palettes
vim-airline/vim-airlinethe statusline, in Vimscript, with integrations for everythingvim-airline/vim-airline-themesits theme collectionitchyny/lightline.vimthe same job in a fraction of the code, and it starts fasternvim-lualine/lualine.nvimthe Lua statusline for Neovimliuchengxu/vim-which-keya popup showing what the pending key sequence can becomefolke/which-key.nvimthe Neovim version, and the more polished onejunegunn/goyo.vimdistraction-free mode: centre the text, hide everything elsejunegunn/limelight.vimdims every paragraph but the one you are in. Pairs with goyomorhetz/gruvboxthe retro warm colour scheme; still the most-installed of them allaltercation/vim-colors-solarizedthe original Solarizedlifepillar/vim-solarized8a true-colour Solarized; archivedjoshdick/onedark.vimthe Atom One Dark palettenordtheme/vimthe arctic blue paletteNLKNguyen/papercolor-themea light scheme that is genuinely readabledracula/vimDraculacatppuccin/vimCatppuccin, in its Vim portfolke/tokyonight.nvimthe Neovim favouriterebelot/kanagawa.nvimmuted, ink-wash coloursayu-theme/ayu-vimthree variants, light through darkjunegunn/seoul256.vimlow-contrast, easy on tired eyesLanguages & Writing
25Filetype support and prose
vim-polyglot/vim-polyglota hundred-odd language packs in one, loaded lazily. Convenient, and it will shadow anything you install separatelyfatih/vim-gothe Go environment: build, test, gopls, coverage, struct tagsrust-lang/rust.vimthe official Rust filetype support and :RustFmtpangloss/vim-javascriptJavaScript syntax and indentationleafgarland/typescript-vimTypeScript syntaxMaxMEllon/vim-jsx-prettyJSX and TSX highlighting that survives nestingmattn/emmet-vimEmmet abbreviations: ul>li*3 then CTRL-Y ,alvan/vim-closetagcloses HTML and XML tags as you type themvim-python/python-syntaxa richer Python syntax filevim-ruby/vim-rubythe official Ruby supportelzr/vim-jsonJSON with concealed quotes and error highlightingcespare/vim-tomlTOMLstephpy/vim-yamla faster YAML syntax than the shipped onehashivim/vim-terraformTerraform, plus :TerraformFmtudalov/kotlin-vimKotlinkeith/swift.vimSwiftoctol/vim-cpp-enhanced-highlighthighlights C++ class and template namesrhysd/vim-clang-formatclang-format on a range or on savelervag/vimtexthe LaTeX environment: compilation, forward search, a document outline, and citation completionpreservim/vim-markdownMarkdown syntax, folding and TOCiamcco/markdown-preview.nvima live browser preview, synchronised with the cursorvimwiki/vimwikia personal wiki: linked pages, a diary, and exportxolox/vim-notesplain-text notes with automatic titles and searchvim-utils/vim-manread man pages in a Vim buffer, with Knvim-treesitter/nvim-treesittertree-sitter parsers for Neovim: highlighting, indentation, folds, and the text objects that come with themAI Assistants
6Agents and completion, in the editor
github/copilot.vimthe official Copilot plugin; works in Vim 9 and Neovimzbirenbaum/copilot.luathe Lua rewrite, with completion-engine integrationolimorris/codecompanion.nvima chat and inline-assistant buffer over several providersavante-corp/avante.nvima Cursor-like sidebar for Neovim, with diffs you accept or rejectcoder/claudecode.nvimruns Claude Code inside Neovim over its own protocolgreggh/claude-code.nvima lighter terminal-based Claude Code integration