I switched my daily editor setup over to Neovim with a Lua config and proper LSP support a while back, and I don't maintain this configuration anymore. I'm leaving it here mostly as a before/after reference for myself, and because a couple of the plugin choices are still reasonable defaults if you're on plain Vim for some reason.
The Core .vimrc
This was the bulk of the day-to-day config — nothing exotic, just the settings that removed the most friction:
set number relativenumber
set expandtab shiftwidth=2 tabstop=2
set ignorecase smartcase
set incsearch hlsearch
set scrolloff=8
set clipboard=unnamed
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <C-p> :FZF<CR>
relativenumber combined with regular line numbers made 5j / 3k style navigation actually usable, and smartcase searching (case-insensitive unless the search itself has a capital letter) is one of those defaults I still miss for a second whenever I'm on a machine without it configured.
Plugin Manager and the Plugin List
I used vim-plug, which at the time was the simplest option that didn't require compiling anything:
call plug#begin('~/.vim/plugged')
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-surround'
Plug 'airblade/vim-gitgutter'
call plug#end()
vim-fugitive for git commands inside the editor and vim-surround for quickly changing surrounding quotes/brackets were the two I'd genuinely recommend to anyone still on plain Vim today — both are small, do one thing, and don't fight with anything else in the config.
Why I Moved On
The thing that finally pushed me to Neovim wasn't any single missing feature — it was that getting real language-server support (go-to-definition, inline diagnostics, rename-across-files) required stacking several plugins together in ways that felt increasingly fragile, versus Neovim's built-in LSP client which does the same job with a fraction of the moving parts. That, plus Lua configuration being genuinely nicer to reason about than accumulated Vimscript, made the switch worth the day it took to redo everything.
I don't think this config was ever wrong — it served me well for a long time, and if you're happy on plain Vim there's no urgent reason to change. I'm just not the person to ask about maintaining a modern plain-Vim setup anymore, so treat this as a historical snapshot rather than current advice.
A Few Bindings I Carried Forward Anyway
Not everything got left behind. A handful of the mappings from this file made the jump into my current Neovim config essentially unchanged, because the underlying problem they solved never went away:
nnoremap <leader>e :Ex<CR>
nnoremap <leader>/ :nohlsearch<CR>
vnoremap < <gv
vnoremap > >gv
That last pair — reselecting the visual block after an indent instead of losing the selection — is one of those tiny quality-of-life fixes that's easy to forget you added, right up until you're on someone else's unconfigured Vim and lose a selection mid-edit for the tenth time in a session.
What I'd Tell Past Me
If I were setting this up again from scratch today, knowing what the LSP-based Neovim setup eventually looked like, I'd skip straight past the plugin-stacking phase entirely. But I don't think that shortcut would have taught me as much about what a language server actually does under the hood — fumbling through vim-fugitive and a half-working autocomplete plugin made the eventual "oh, this is what LSP replaces" moment land a lot more clearly than it would have otherwise.