Rafael Bodill's Neovim Config
Lean mean Neovim machine, 30-45ms startup time. Works best with Neovim ≥0.8
I encourage you to fork this repo and create your own experience. Learn how to tweak and change Neovim to the way YOU like it. This is my cultivation of years of tweaking, use it as a git remote and stay in-touch with upstream for reference or cherry-picking.
Table of Contents (🔎 Click to expand/collapse)
Features
- Fast startup time — plugins are almost entirely lazy-loaded!
- Robust, yet light-weight
- Plugin management with folke/lazy.nvim. Use with
:Lazy
or Space+l - Install LSP, DAP, linters, and formatters. Use with
:Mason
or Space+mm - LSP configuration with nvim-lspconfig
- telescope.nvim centric work-flow with lists (try ;+f…)
- Custom context-menu (try it! ;+c)
- Auto-complete extensive setup with nvim-cmp (try Tab or Ctrl+Space in insert-mode)
- Structure view with simrat39/symbols-outline.nvim
- Git features using lewis6991/gitsigns.nvim and tpope/vim-fugitive
- Auto-save and restore sessions with olimorris/persisted.nvim
- Unobtrusive, yet informative status & tab lines
- Premium color-schemes
- Remembers last-used colorscheme
Screenshot
Prerequisites
Optional, but highly recommended:
- bat (
brew install bat
) - fd (
brew install fd
) - fzf (
brew install fzf
) - ripgrep (
brew install ripgrep
) - zoxide (
brew install zoxide
)
Install
1. Let's clone this repo! Clone to ~/.config/nvim
mkdir -p ~/.config
git clone [email protected]:rafi/vim-config.git ~/.config/nvim
cd ~/.config/nvim
2. Run nvim
(will install all plugins the first time).
It's highly recommended running :checkhealth
to ensure your system is healthy
and meet the requirements.
Enjoy! 😄
Install LSP, DAP, Linters, Formatters
Use :Mason
to install and manage LSP servers, DAP servers, linters and
formatters. See :h mason.nvim
and williamboman/mason.nvim for more
information.
Language-Server Protocol (LSP)
You can install LSP servers using :Mason
UI, or :MasonInstall <name>
,
or :LspInstall <name>
(use Tab to list available servers).
See Mason's PACKAGES.md
for the official list, and the Language server mapping
list. You can also view at :h mason-lspconfig-server-map
You'll need utilities like npm
and curl
to install some extensions, see
requirements
(or :h mason-requirements
) for more information.
See lua/rafi/plugins/lsp/init.lua for custom key-mappings and configuration for some language-servers.
Recommended LSP
:MasonInstall ansible-language-server bash-language-server css-lsp
:MasonInstall dockerfile-language-server gopls html-lsp json-lsp
:MasonInstall lua-language-server marksman pyright sqlls
:MasonInstall svelte-language-server typescript-language-server
:MasonInstall tailwindcss-language-server
:MasonInstall vim-language-server yaml-language-server
and more…
Recommended Linters
:MasonInstall vint shellcheck editorconfig-checker flake8 gitlint hadolint
:MasonInstall markdownlint mypy selene shellharden write-good yamllint
Recommended Formatters
:MasonInstall black fixjson gofumpt golines isort
:MasonInstall shfmt sql-formatter stylua
Recommended Fonts
- Pragmata Pro (€19 — €1,990): My preferred font
- Any of the Nerd Fonts
On macOS with Homebrew, choose one of the Nerd Fonts, for example, here are some popular fonts:
brew tap homebrew/cask-fonts
brew search nerd-font
brew install --cask font-victor-mono-nerd-font
brew install --cask font-iosevka-nerd-font-mono
brew install --cask font-hack-nerd-font
brew install --cask font-fira-code
Upgrade
To upgrade packages and plugins:
- Neovim plugins:
:Lazy update
- Mason packages:
:Mason
and press U
To update Neovim configuration from my repo:
git pull --ff --ff-only
Structure
- init.lua — Entry-point, plugin initialization.
- neoconf.json — LSP servers options.
- after/ — Language specific custom settings and plugins.
- lua/ — Lua configurations
- config/ — Custom user configuration
- plugins/ — Custom user plugins (or
lua/plugins.lua
) - lsp/ — Custom user LSP configurations
- rafi/
- config/ — Neovim configurations
- autocmd.lua — Auto-commands
- init.lua — initialization
- keymaps.lua — Key-mappings
- options.lua — Editor settings
- lib/ — Libraries
- plugins/ — Plugins and configurations
- config/ — Neovim configurations
- snippets/ — Personal code snippets
- themes/ — Colorscheme overrides
Extending
Extend: Config
There are 2 distinct ways to extend configuration:
-
The first option is to fork this repository and create a directory
lua/config
with one or more of these files: (Optional)lua/config/autocmds.lua
— Custom auto-commandslua/config/options.lua
— Custom optionslua/config/keymaps.lua
— Custom key-mappingslua/config/setup.lua
— Override config, see extend defaults.
Adding plugins or override existing options:
lua/plugins/*.lua
orlua/plugins.lua
— Plugins (See lazy.nvim for syntax)
This option is recommended if you're not planning on customizing a lot, or you'd like to keep a close look of source-code.
-
Create your own clean
~/.config/nvim
, and leverage lazy.nvim to import my configuration specs. You can use LazyVim/starter and just changelua/plugins/example.lua
to:return { { "rafi/vim-config", -- Will load ALL my plugins and config/* import = "rafi.plugins", opts = true, }, { import = "plugins" }, -- Your local lua/plugins* }
This will import and set up my
lua/rafi/config/*
,lua/rafi/plugins/*
and then yours.If you'd rather import only specific plugins or specs, and not the entire plugin catalog, use
import
and removeopts
. For example:return { { "rafi/vim-config", import = "rafi.plugins.colorscheme" }, { import = "rafi.plugins.editor" }, { import = "rafi.plugins.ui" }, { import = "plugins" }, -- Your local lua/plugins* }
This example will NOT load my
lua/rafi/config/*
, and only install plugins categorically fromcolorscheme.lua
,editor.lua
, andui.lua
. At last, it will load all your plugins defined inlua/plugins.lua
orlua/plugins/*
.This option has the advantage of partially importing different "plugin specs" from various sources.
Extend: Plugins
For installing/overriding/disabling plugins, create a lua/plugins/foo.lua
file (or lua/plugins/foo/bar.lua
or simply lua/plugins.lua
) and manage your
own plugin collection. You can add or override existing plugins' options, or
just disable them all-together. Here's an example:
return {
-- Import "extras" plugins. See "Extra Plugins" in README
{ import = 'rafi.plugins.extras.ui.incline' },
-- Disable builtin plugins
{ 'shadmansaleh/lualine.nvim', enabled = false },
{ 'limorris/persisted.nvim', enabled = false },
-- Change builtin plugins' options
{
'nvim-treesitter/nvim-treesitter',
opts = {
ensure_installed = {
'bash', 'comment', 'css', 'diff', 'dockerfile', 'fennel', 'fish',
'gitcommit', 'gitignore', 'gitattributes', 'git_rebase', 'go', 'gomod',
'gosum', 'gowork', 'graphql', 'hcl', 'html', 'javascript', 'jsdoc',
'json', 'json5', 'jsonc', 'jsonnet', 'lua', 'make', 'markdown',
'markdown_inline', 'nix', 'perl', 'php', 'pug', 'python', 'regex',
'rst', 'ruby', 'rust', 'scss', 'sql', 'svelte', 'terraform', 'toml',
'tsx', 'typescript', 'vim', 'vimdoc', 'vue', 'yaml', 'zig',
},
},
},
-- GitHub plugins
-- Choose only ONE of these statuslines ;)
{ 'itchyny/lightline.vim' },
{ 'vim-airline/vim-airline' },
{ 'glepnir/galaxyline.nvim' },
{ 'glepnir/spaceline.vim' },
{ 'liuchengxu/eleline.vim' },
}
Extend: Defaults
If you are using this distro as-is, and aren't importing it externally,
create lua/config/setup.lua
and return any of these functions:
override()
lazy_opts()
For example: (Default values are shown)
local M = {}
---@return table
function M.override()
return {
defaults = {
autocmds = true, -- Load lua/rafi/config/autocmds.lua
keymaps = true, -- Load lua/rafi/config/keymaps.lua
},
features = {
elite_mode = false, -- Set arrow-keys to window resize
window_q_mapping = true, -- Disable regular window closing with 'q'
},
icons = {
-- See lua/rafi/config/init.lua for icon configuration…
},
}
end
---@return table
function M.lazy_opts()
return {}
end
return M
If you are importing this distro via lazy.nvim specs, you can use opts
.
For example:
return {
{
"rafi/vim-config",
import = "rafi.plugins",
opts = {
features = {
elite_mode = false,
window_q_mapping = true,
},
},
},
}
Note: rafi.config.options
can't be disabled here since it's loaded
prematurely. You can disable loading options.lua
with the following line at
the top of your lua/config/setup.lua
or init.lua
:
package.loaded['rafi.config.options'] = true
Extend: LSP Settings
To override LSP configurations, you can do either:
-
Customize per project's
.neoconf.json
-
Or, override server options with nvim-lspconfig plugin, for example:
{ 'neovim/nvim-lspconfig', opts = { servers = { yamlls = { filetypes = { 'yaml', 'yaml.ansible', 'yaml.docker-compose' }, }, lua_ls = { settings = { Lua = { workspace = { checkThirdParty = false }, completion = { callSnippet = 'Replace' }, }, }, }, }, } }
-
Or, create a
lua/lsp/<server_name>.lua
file. Must return a table withconfig
function. For example, createlua/lsp/go.lua
:local opts = { settings = { gopls = { staticcheck = true } } } return { config = function() return opts end }
Plugin Highlights
- Plugin management with cache and lazy loading for speed
- Auto-completion with Language-Server Protocol (LSP)
- Project-aware tabline
- Extensive syntax highlighting with nvim-treesitter.
Note that 95% of the plugins are lazy-loaded.
Plugins Included
List of plugins (🔎 Click to expand/collapse)
Completion & Code-Analysis
Name | Description |
---|---|
neovim/nvim-lspconfig | Quickstart configurations for the Nvim LSP client |
folke/neoconf.nvim | Manage global and project-local settings |
folke/neodev.nvim | Neovim setup for init.lua and plugin development |
williamboman/mason.nvim | Portable package manager for Neovim |
williamboman/mason-lspconfig.nvim | Mason extension for easier lspconfig integration |
hrsh7th/cmp-nvim-lsp | nvim-cmp source for neovim builtin LSP client |
b0o/SchemaStore.nvim | JSON schemas for Neovim |
rafi/neoconf-venom.nvim | Automatically set virtual-environment python runtime |
Editor Plugins
Name | Description |
---|---|
folke/lazy.nvim | Modern plugin manager for Neovim |
nmac427/guess-indent.nvim | Automatic indentation style detection |
christoomey/tmux-navigator | Seamless navigation between tmux panes and vim splits |
tweekmonster/helpful.vim | Display vim version numbers in docs |
lambdalisue/suda.vim | An alternative sudo for Vim and Neovim |
olimorris/persisted.nvim | Simple session management for Neovim with git branching |
RRethy/vim-illuminate | Highlights other uses of the word under the cursor |
mbbill/undotree | Ultimate undo history visualizer |
ggandor/flit.nvim | Enhanced f/t motions for Leap |
ggandor/leap.nvim | General-purpose motion plugin |
kana/vim-niceblock | Make blockwise Visual mode more useful |
haya14busa/vim-edgemotion | Jump to the edge of block |
folke/zen-mode.nvim | Distraction-free coding for Neovim |
folke/which-key.nvim | Create key bindings that stick |
folke/todo-comments.nvim | Highlight, list and search todo comments in your projects |
folke/trouble.nvim | Pretty lists to help you solve all code diagnostics |
sindrets/diffview.nvim | Tabpage interface for cycling through diffs |
akinsho/toggleterm.nvim | Persist and toggle multiple terminals |
simrat39/symbols-outline.nvim | Tree like view for symbols using LSP |
s1n7ax/nvim-window-picker | Window picker |
rest-nvim/rest.nvim | Fast Neovim http client written in Lua |
mickael-menu/zk-nvim | Extension for the zk plain text note-taking assistant |
nvim-pack/nvim-spectre | Find the enemy and replace them with dark power |
echasnovski/mini.bufremove | Helper for removing buffers |
mzlogin/vim-markdown-toc | Generate table of contents for Markdown files |
Coding Plugins
Name | Description |
---|---|
sbdchd/neoformat | Format code with numerous tools |
hrsh7th/nvim-cmp | Completion plugin for neovim written in Lua |
hrsh7th/cmp-buffer | nvim-cmp source for buffer words |
hrsh7th/cmp-path | nvim-cmp source for path |
hrsh7th/cmp-emoji | nvim-cmp source for emoji |
saadparwaiz1/cmp_luasnip | Luasnip completion source for nvim-cmp |
andersevenrud/compe-tmux | Tmux completion source for nvim-compe/cmp |
L3MON4D3/LuaSnip | Snippet Engine written in Lua |
rafamadriz/friendly-snippets | Preconfigured snippets for different languages |
ziontee113/SnippetGenie | Snippet creation tool |
danymat/neogen | Annotation generator |
echasnovski/mini.pairs | Automatically manage character pairs |
echasnovski/mini.surround | Fast and feature-rich surround actions |
JoosepAlviste/nvim-ts-context-commentstring | Set the commentstring based on the cursor location |
echasnovski/mini.comment | Fast and familiar per-line commenting |
echasnovski/mini.trailspace | Trailing whitespace highlight and remove |
echasnovski/mini.ai | Extend and create a /i textobjects |
echasnovski/mini.splitjoin | Split and join arguments |
AndrewRadev/linediff.vim | Perform diffs on blocks of code |
AndrewRadev/dsf.vim | Delete surrounding function call |
Colorscheme Plugins
Name | Description |
---|---|
rafi/neo-hybrid.vim | Modern dark colorscheme, hybrid improved |
rafi/awesome-colorschemes | Awesome color-schemes |
AlexvZyl/nordic.nvim | Nord for Neovim, but warmer and darker |
folke/tokyonight.nvim | Clean, dark Neovim theme |
rebelot/kanagawa.nvim | Inspired by the colors of the famous painting by Katsushika Hokusai |
olimorris/onedarkpro.nvim | OneDarkPro theme |
EdenEast/nightfox.nvim | Highly customizable theme |
catppuccin/nvim | Soothing pastel theme |
nyoom-engineering/oxocarbon.nvim | Dark and light theme inspired by IBM Carbon |
Git Plugins
Name | Description |
---|---|
lewis6991/gitsigns.nvim | Git signs written in pure lua |
NeogitOrg/neogit | Magit clone for Neovim |
tpope/vim-fugitive | Git client |
junegunn/gv.vim | Git log browser |
ruifm/gitlinker.nvim | Browse git repositories |
rhysd/committia.vim | Pleasant editing on Git commit messages |
Misc Plugins
Name | Description |
---|---|
hoob3rt/lualine.nvim | statusline plugin written in pure lua |
nvim-neo-tree/neo-tree.nvim | File explorer written in Lua |
nvim-telescope/telescope.nvim | Find, Filter, Preview, Pick. All lua. |
jvgrootveld/telescope-zoxide | Telescope extension for Zoxide |
rafi/telescope-thesaurus.nvim | Browse synonyms from thesaurus.com |
nvim-lua/plenary.nvim | Lua functions library |
Treesitter & Syntax
Name | Description |
---|---|
nvim-treesitter/nvim-treesitter | Nvim Treesitter configurations and abstraction layer |
nvim-treesitter/nvim-treesitter-textobjects | Textobjects using treesitter queries |
nvim-treesitter/nvim-treesitter-context | Show code context |
RRethy/nvim-treesitter-endwise | Wisely add "end" in various filetypes |
windwp/nvim-ts-autotag | Use treesitter to auto close and auto rename html tag |
andymass/vim-matchup | Modern matchit and matchparen |
iloginow/vim-stylus | Better vim plugin for stylus |
chrisbra/csv.vim | Handling column separated data |
towolf/vim-helm | Syntax for Helm templates (yaml + gotmpl + sprig) |
mustache/vim-mustache-handlebars | Mustache and handlebars syntax |
lifepillar/pgsql.vim | PostgreSQL syntax and indent |
MTDL9/vim-log-highlighting | Syntax highlighting for generic log files |
reasonml-editor/vim-reason-plus | Reason syntax and indent |
vmchale/just-vim | Syntax highlighting for Justfiles |
pearofducks/ansible-vim | Improved YAML support for Ansible |
UI Plugins
Name | Description |
---|---|
nvim-tree/nvim-web-devicons | Lua fork of vim-devicons |
MunifTanjim/nui.nvim | UI Component Library |
rafi/tabstrip.nvim | Minimal and opinionated tabline |
rafi/theme-loader.nvim | Use last-used colorscheme |
folke/noice.nvim | Replaces the UI for messages, cmdline and the popupmenu |
stevearc/dressing.nvim | Improve the default vim-ui interfaces |
SmiteshP/nvim-navic | Shows your current code context in winbar/statusline |
rcarriga/nvim-notify | Fancy notification manager for NeoVim |
chentau/marks.nvim | Interacting with and manipulating marks |
lukas-reineke/indent-blankline.nvim | Visually display indent levels |
tenxsoydev/tabs-vs-spaces.nvim | Hint and fix deviating indentation |
t9md/vim-quickhl | Highlight words quickly |
kevinhwang91/nvim-bqf | Better quickfix window in Neovim |
uga-rosa/ccc.nvim | Super powerful color picker/colorizer plugin |
dnlhc/glance.nvim | Pretty window for navigating LSP locations |
itchyny/calendar.vim | Calendar application |
Extra Plugins
List of extras (🔎 Click to expand/collapse)
These plugins aren't enabled by default. You'll have to import them using specs. See Extend: Plugins on how to add plugins.
For example:
return {
{ import = 'rafi.plugins.extras.ui.incline' },
{ import = 'rafi.plugins.extras.org.vimwiki' },
}
Extra Plugins: Coding
Spec: rafi.plugins.extras.coding.<name>
Name | Repository | Description |
---|---|---|
autopairs |
windwp/nvim-autopairs | Autopairs for neovim written by lua |
cmp-git |
petertriho/cmp-git | Git source for nvim-cmp |
copilot |
zbirenbaum/copilot.lua | Fully featured & enhanced copilot |
editorconfig |
sgur/vim-editorconfig | EditorConfig plugin written entirely in Vimscript |
emmet |
mattn/emmet-vim | Provides support for expanding abbreviations alá emmet |
sandwich |
machakann/vim-sandwich | Search, select, and edit sandwich text objects |
Extra Plugins: Diagnostics
Spec: rafi.plugins.extras.diagnostics.<name>
Name | Description |
---|---|
proselint |
proselint: null-ls source and mason package |
write-good |
write-good: null-ls source and mason package |
Extra Plugins: Editor
Spec: rafi.plugins.extras.editor.<name>
Name | Repository | Description |
---|---|---|
anyjump |
pechorin/any-jump.vim | Jump to any definition and references without overhead |
flybuf |
glepnir/flybuf.nvim | List buffers in a float window |
sidebar |
sidebar-nvim/sidebar.nvim | Generic and modular lua sidebar |
ufo |
kevinhwang91/nvim-ufo | Make folds look modern and keep a high performance |
Extra Plugins: Formatting
Spec: rafi.plugins.extras.formatting.<name>
Name | Description |
---|---|
prettier |
prettier: null-ls source and mason package |
Extra Plugins: Lang
Spec: rafi.plugins.extras.lang.<name>
Name | Description |
---|---|
go |
go syntax, lsp, dap and test |
json |
json syntax, lsp and schemas |
python |
python syntax, lsp, dap, test and rafi/neoconf-venom.nvim |
yaml |
yaml syntax, lsp and schemas |
Extra Plugins: Linting
Spec: rafi.plugins.extras.linting.<name>
Name | Description |
---|---|
ruff |
ruff for python |
Extra Plugins: LSP
Spec: rafi.plugins.extras.lsp.<name>
Key | Name | Description |
---|---|---|
gtd |
hrsh7th/nvim-gtd | LSP's go-to definition plugin |
inlayhints |
lvimuser/lsp-inlayhints.nvim | Partial implementation of LSP inlay hint |
lightbulb |
kosayoda/nvim-lightbulb | VSCode 💡 for neovim's built-in LSP |
null-ls |
jose-elias-alvarez/null-ls.nvim | Inject LSP diagnostics, code actions, and more |
yaml-companion |
yaml-companion.nvim | Get, set and autodetect YAML schemas in your buffers |
Extra Plugins: Org
Spec: rafi.plugins.extras.org.<name>
Key | Name | Description |
---|---|---|
vimwiki |
vimwiki/vimwiki | Personal Wiki for Vim |
Extra Plugins: Treesitter
Spec: rafi.plugins.extras.treesitter.<name>
Key | Name | Description |
---|---|---|
treesj |
Wansmer/treesj | Splitting and joining blocks of code |
Extra Plugins: UI
Spec: rafi.plugins.extras.ui.<name>
Key | Name | Description |
---|---|---|
barbecue |
utilyre/barbecue.nvim | VS Code like winbar |
bufferline |
akinsho/bufferline.nvim | Snazzy tab/bufferline |
cursorword |
itchyny/cursorword | Underlines word under cursor |
cybu |
ghillb/cybu.nvim | Cycle buffers with a customizable notification window |
deadcolumn |
Bekaboo/deadcolumn.nvim | Show colorcolumn dynamically |
goto-preview |
rmagatti/goto-preview | Preview definitions using floating windows |
incline |
b0o/incline.nvim | Floating statuslines |
minimap |
echasnovski/mini.map | Window with buffer text overview, scrollbar and highlights |
statuscol |
luukvbaal/statuscol.nvim | Configurable 'statuscolumn' and click handlers |
Custom Key-mappings
Note that,
- Leader key set as Space
- Local-Leader key set as ; and used for navigation and search (Telescope and Neo-tree)
- Disable ← ↑ → ↓ in normal mode by enabling
elite_mode
.
Key-mappings (🔎 Click to expand/collapse)
Modes: 𝐍=normal 𝐕=visual 𝐒=select 𝐈=insert 𝐎=operator 𝐂=commandNavigation
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
j / k | 𝐍 𝐕 | Cursor moves through display-lines | g j/k |
g+j / k | 𝐍 𝐕 𝐒 | Jump to edge upward/downward | haya14busa/vim-edgemotion |
gh / gl | 𝐍 𝐕 | Easier line-wise movement | g ^/$ |
Space+Space | 𝐍 𝐕 | Toggle visual-line mode | V / Escape |
zl / zh | 𝐍 | Scroll horizontally and vertically wider | z4 l/h |
Ctrl+j | 𝐍 | Move to split below | christoomey/tmux-navigator |
Ctrl+k | 𝐍 | Move to upper split | christoomey/tmux-navigator |
Ctrl+h | 𝐍 | Move to left split | christoomey/tmux-navigator |
Ctrl+l | 𝐍 | Move to right split | christoomey/tmux-navigator |
Return | 𝐍 | Toggle fold | za |
Shift+Return | 𝐍 | Focus the current fold by closing all others | zMzvzt |
]a or [a | 𝐍 | Next/previous on location-list | :lnext / :lprev |
]m or [m | 𝐍 | Next/previous function | nvim-treesitter-textobjects |
]s or [s | 𝐍 | Next/previous whitespace error | config/keymaps.lua |
]g or [g | 𝐍 | Next/previous Git hunk | lewis6991/gitsigns.nvim |
]] or [[ | 𝐍 | Next/previous reference | RRethy/vim-illuminate |
Ctrl+f | 𝐂 | Move cursor forwards in command | Right |
Ctrl+b | 𝐂 | Move cursor backwards in command | Left |
Ctrl+h | 𝐂 | Move cursor to the beginning in command | Home |
Ctrl+l | 𝐂 | Move cursor to the end in command | End |
File Operations
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
Space+cd | 𝐍 | Switch to the directory of opened buffer | :lcd %:p:h |
Space+w | 𝐍 | Write buffer to file | :write |
Ctrl+s | 𝐍 𝐕 𝐂 | Write buffer to file | :write |
Auto-Completion
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
Tab / Shift-Tab | 𝐈 | Navigate/open completion-menu | nvim-cmp |
Tab / Shift-Tab | 𝐈 𝐒 | Navigate snippet placeholders | nvim-cmp |
Ctrl+Space | 𝐈 | Open completion menu | nvim-cmp |
Enter | 𝐈 | Select completion item or expand snippet | nvim-cmp |
Ctrl+p/n | 𝐈 | Movement in completion pop-up | nvim-cmp |
Ctrl+b/f | 𝐈 | Scroll documentation | nvim-cmp |
Ctrl+e | 𝐈 | Abort selection and close pop-up | nvim-cmp |
Ctrl+l | 𝐈 | Expand snippet at cursor | L3MON4D3/LuaSnip |
Space cc | 𝐍 | Generate annotations | danymat/neogen |
LSP
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
gD | 𝐍 | Go to declaration | plugins/lsp/keymaps.lua |
gd | 𝐍 | Go to definition | plugins/lsp/keymaps.lua |
gr | 𝐍 | Go to references | plugins/lsp/keymaps.lua |
gy | 𝐍 | Go to type definition | plugins/lsp/keymaps.lua |
gi | 𝐍 | Go to implementation | plugins/lsp/keymaps.lua |
K | 𝐍 | Show hover help or collapsed fold | plugins/lsp/keymaps.lua |
gK | 𝐍 | Show signature help | plugins/lsp/keymaps.lua |
Ctrl+g h | 𝐈 | Show signature help | plugins/lsp/keymaps.lua |
]d or [d | 𝐍 | Jump to next/prev diagnostics | plugins/lsp/keymaps.lua |
]e or [e | 𝐍 | Jump to next/prev diagnostics | plugins/lsp/keymaps.lua |
Space cl | 𝐍 | Open LSP info window | plugins/lsp/keymaps.lua |
Space cf | 𝐍 𝐕 | Format | plugins/lsp/keymaps.lua |
Space cr | 𝐍 | Rename | plugins/lsp/keymaps.lua |
Space ce | 𝐍 | Open diagnostics window | plugins/lsp/keymaps.lua |
Space ca | 𝐍 𝐕 | Code action | plugins/lsp/keymaps.lua |
Space cA | 𝐍 | Source action | plugins/lsp/keymaps.lua |
Space uh | 𝐍 | Toggle inlay-hints | plugins/lsp/keymaps.lua |
Space ud | 𝐍 | Toggle buffer diagnostics | plugins/lsp/keymaps.lua |
Space uD | 𝐍 | Toggle global diagnostics | plugins/lsp/keymaps.lua |
,wa | 𝐍 | Add workspace folder | plugins/lsp/keymaps.lua |
,wr | 𝐍 | Remove workspace folder | plugins/lsp/keymaps.lua |
,wl | 𝐍 | List workspace folders | plugins/lsp/keymaps.lua |
gpd | 𝐍 | Glance definitions | dnlhc/glance.nvim |
gpr | 𝐍 | Glance references | dnlhc/glance.nvim |
gpy | 𝐍 | Glance type definitions | dnlhc/glance.nvim |
gpi | 𝐍 | Glance implementations | dnlhc/glance.nvim |
Edit
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
Shift+Return | 𝐈 | Start new line from any cursor position | <C-o>o |
< | 𝐕 | Indent to left and re-select | <gv |
> | 𝐕 | Indent to right and re-select | `>gv |
Tab | 𝐕 | Indent to right and re-select | `>gv |
Shift+Tab | 𝐕 | Indent to left and re-select | <gv |
gc | 𝐍 𝐕 | Comment prefix | echasnovski/mini.comment |
gcc | 𝐍 𝐕 | Toggle comments | echasnovski/mini.comment |
Space+v | 𝐍 𝐕 | Toggle single-line comments | echasnovski/mini.comment |
Space+j or k | 𝐍 𝐕 | Move lines down/up | :m … |
Space+d | 𝐍 𝐕 | Duplicate line or selection | config/keymaps.lua |
Space+cp | 𝐍 | Duplicate paragraph | yap<S-}>p |
Space+cw | 𝐍 | Remove all spaces at EOL | echasnovski/mini.trailspace |
sj / sk | 𝐍 | Join/split arguments | echasnovski/mini.splitjoin |
dsf / csf | 𝐍 | Delete/change surrounding function call | AndrewRadev/dsf.vim |
I / gI | 𝐕 | Blockwise insert | kana/vim-niceblock |
A | 𝐕 | Blockwise append | kana/vim-niceblock |
Search & Replace
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
* / # | 𝐍 𝐕 | Search partial words | g* / g# |
g* / g# | 𝐍 𝐕 | Search whole-word forward/backward | * / # |
Backspace | 𝐍 | Match bracket | % |
gpp | 𝐍 | Select last paste | config/keymaps.lua |
sg | 𝐕 | Replace within selected area | :s/⌴/gc |
Ctrl+r | 𝐕 | Replace selection with step-by-step confirmation | :%s/\V/⌴/gc |
ss / SS | 𝐍 𝐕 | Leap forward/backward | ggandor/leap.nvim |
f / F / t / T | 𝐍 𝐕 | Enhanced motions | ggandor/flit.nvim |
Clipboard
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
p or P | 𝐕 | Paste without yank | :let @+=@0 |
Space+y | 𝐍 | Copy relative file-path to clipboard | config/keymaps.lua |
Space+Y | 𝐍 | Copy absolute file-path to clipboard | config/keymaps.lua |
Command & History
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
! | 𝐍 | Shortcut for shell command | :! |
g! | 𝐍 | Read vim command into buffer | :put=execute('⌴') |
Ctrl+n / p | 𝐂 | Switch history search pairs | ↓ / ↑ |
↓ / ↑ | 𝐂 | Switch history search pairs | Ctrl n /p |
Diagnostics
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
;+dt | 𝐍 | Open TODO Telescope list | folke/todo-comments.nvim |
Space+xt | 𝐍 | Open TODO list | folke/todo-comments.nvim |
Space+xT | 𝐍 | Open TODO/FIXME list | folke/todo-comments.nvim |
Space+e | 𝐍 | Open Trouble document | folke/trouble.nvim |
Space+r | 𝐍 | Open Trouble workspace | folke/trouble.nvim |
Space+xQ | 𝐍 | Open Quickfix via Trouble | folke/trouble.nvim |
Space+xL | 𝐍 | Open Locationlist via Trouble | folke/trouble.nvim |
Editor UI
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
Space uf | 𝐍 | Toggle format on Save | config/keymaps.lua |
Space us | 𝐍 | Toggle spell-checker | :setlocal spell! |
Space ul | 𝐍 | Toggle line numbers | :setlocal nonumber! |
Space uo | 𝐍 | Toggle hidden characters | :setlocal nolist! |
Space uu | 𝐍 | Toggle highlighted search | :set hlsearch! |
Space uw | 𝐍 | Toggle wrap | :setlocal wrap! … |
Space ue | 𝐍 | Toggle indentation lines | lukas-reineke/indent-blankline.nvim |
Space ui | 𝐍 | Show highlight groups for word | vim.show_pos |
Space uC | 𝐍 | Select colorscheme | config/keymaps.lua |
Space un | 𝐍 | Dismiss all notifications | rcarriga/nvim-notify |
Space ur | 𝐍 | Redraw, clear hlsearch, and diff update | config/keymaps.lua |
g1 | 𝐍 | Go to first tab | :tabfirst |
g9 | 𝐍 | Go to last tab | :tablast |
g5 | 𝐍 | Go to previous tab | :tabprevious |
Ctrl+Tab | 𝐍 | Go to next tab | :tabnext |
Ctrl+ShiftTab | 𝐍 | Go to previous tab | :tabprevious |
Alt+j | 𝐍 | Go to next tab | :tabnext |
Alt+k | 𝐍 | Go to previous tab | :tabprevious |
Alt+{ | 𝐍 | Move tab backward | :-tabmove |
Alt+} | 𝐍 | Move tab forward | :+tabmove |
Custom Tools & Plugins
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
;+c | 𝐍 | Open context-menu | lua/rafi/lib/contextmenu.lua |
gCtrl+o | 𝐍 | Navigate to previous file on jumplist | lib/edit.lua |
gCtrl+i | 𝐍 | Navigate to next file on jumplist | lib/edit.lua |
s+p | 𝐍 | Choose a window to edit | s1n7ax/nvim-window-picker |
s+w | 𝐍 | Switch editing window with selected | s1n7ax/nvim-window-picker |
Space l | 𝐍 | Open Lazy | folke/lazy.nvim |
Space o | 𝐍 | Open structure window | simrat39/symbols-outline.nvim |
Space f | 𝐍 | Show current structure scope in winbar | SmiteshP/nvim-navic |
Space ? | 𝐍 | Open the macOS dictionary on current word | :!open dict:// |
Space P | 𝐍 | Use Marked 2 for real-time Markdown preview | Marked 2 |
Space cp | 𝐍 | Open color-picker | uga-rosa/ccc.nvim |
Space tt | 𝐍 | Open terminal (root dir) | config/keymaps.lua |
Space tT | 𝐍 | Open terminal (cwd) | config/keymaps.lua |
Space tg | 𝐍 | Open Lazygit (root dir) | config/keymaps.lua |
Space tG | 𝐍 | Open Lazygit (cwd) | config/keymaps.lua |
Space cc | 𝐍 | Generate doc | danymat/neogen |
Space gu | 𝐍 | Open undo-tree | mbbill/undotree |
Space gd | 𝐍 | Git diff | tpope/vim-fugitive |
Space gb | 𝐍 | Git blame | tpope/vim-fugitive |
Space go | 𝐍 𝐕 | Open SCM detailed URL in browser | ruifm/gitlinker.nvim |
Space ml | 𝐍 | Append modeline to end of buffer | config/keymaps.lua |
Space mda | 𝐕 | Sequentially mark region for diff | AndrewRadev/linediff.vim |
Space mdf | 𝐕 | Mark region for diff and compare if more than one | AndrewRadev/linediff.vim |
Space mds | 𝐍 | Shows the comparison for all marked regions | AndrewRadev/linediff.vim |
Space mdr | 𝐍 | Removes the signs denoting the diff regions | AndrewRadev/linediff.vim |
Space mh | 𝐍 | Open HTTP Rest UI | rest-nvim/rest.nvim |
Space mt | 𝐍 𝐕 | Toggle highlighted word | t9md/vim-quickhl |
Space zz | 𝐍 | Toggle distraction-free writing | folke/zen-mode.nvim |
Window Management
Key | Mode | Action | Plugin or Mapping |
---|---|---|---|
q | 𝐍 | Quit window (if last window, quit nvim) | :quit |
Ctrl+x | 𝐍 | Rotate window placement | C-w x |
sv | 𝐍 | Horizontal split | :split |
sg | 𝐍 | Vertical split | :vsplit |
st | 𝐍 | Open new tab | :tabnew |
so | 𝐍 | Close other windows | :only |
sb | 𝐍 | Previous buffer | :b# |
sc | 𝐍 | Close current buffer | :close |
sd | 𝐍 | Delete buffer | :bdelete |
sq | 𝐍 | Quit window | :quit |
sx | 𝐍 | Delete buffer, leave blank window | :enew │ bdelete |
sz | 𝐍 | Toggle window zoom | :vertical resize │ resize |
sh | 𝐍 | Toggle colorscheme background=dark/light | :set background … |
Plugin: Mini.Surround
See echasnovski/mini.surround for more mappings and usage information.
Key | Mode | Action |
---|---|---|
ds | 𝐍 | Delete around with query |
dss | 𝐍 | Delete around automatically |
cs | 𝐍 | Change around with query |
css | 𝐍 | Change around automatically |
sa | 𝐍 𝐕 𝐎 | Trigger add operator |
sd | 𝐍 𝐕 | Trigger delete operator |
sdb | 𝐍 | Delete around automatically |
sr | 𝐍 𝐕 | Trigger replace operator |
srb | 𝐍 | Replace around automatically |
ir | 𝐕 𝐎 | Inner automatically |
ab | 𝐕 𝐎 | Around automatically |
Plugin: Gitsigns
See lewis6991/gitsigns.nvim for more mappings and usage information.
Key | Mode | Action |
---|---|---|
]g or ]g | 𝐍 | Next/previous Git hunk |
gs | 𝐍 | Preview hunk |
Space hp | 𝐍 | Preview hunk inline |
Space hb | 𝐍 | Blame line |
Space hs | 𝐍 𝐕 | Stage hunk |
Space hu | 𝐍 | Undo stage hunk |
Space hr | 𝐍 𝐕 | Reset hunk |
Space hR | 𝐍 | Reset buffer |
Space hd | 𝐍 | Toggle deleted |
Space hw | 𝐍 | Toggle word diff |
Space hl | 𝐍 | Publish hunks to location-list |
Plugin: Telescope
See telescope.nvim for more mappings and usage information.
Key | Mode | Action |
---|---|---|
;r | 𝐍 | Results of the previous picker |
;R | 𝐍 | List of the previous pickers |
;f | 𝐍 | File search |
;g | 𝐍 | Grep search |
;b | 𝐍 | Buffers |
;x | 𝐍 | Old files |
;v | 𝐍 𝐕 | Yank history |
;m | 𝐍 | Marks |
;n | 𝐍 | Plugins |
;j | 𝐍 | Jump points |
;k | 𝐍 | Thesaurus |
;u | 𝐍 | Spelling suggestions |
;o | 𝐍 | Vim options |
;s | 𝐍 | Sessions |
;t | 𝐍 | LSP workspace symbols |
;h | 𝐍 | Highlights |
;w | 𝐍 | Zk notes |
;z | 𝐍 | Zoxide directories |
;; | 𝐍 | Command history |
;/ | 𝐍 | Search history |
;dd | 𝐍 | LSP definitions |
;di | 𝐍 | LSP implementations |
;dr | 𝐍 | LSP references |
;da | 𝐍 𝐕 | LSP code actions |
Space / | 𝐍 | Buffer fuzzy find |
Space gs | 𝐍 | Git status |
Space gr | 𝐍 | Git branches |
Space gl | 𝐍 | Git commits |
Space gL | 𝐍 | Git buffer commits |
Space gh | 𝐍 | Git stashes |
Space gt | 𝐍 | Find symbols matching word under cursor |
Space gf | 𝐍 | Find files matching word under cursor |
Space gg | 𝐍 𝐕 | Grep word under cursor |
Space sd | 𝐍 | Document diagnostics |
Space sD | 𝐍 | Workspace diagnostics |
Space sh | 𝐍 | Help tags |
Space sk | 𝐍 | Key-maps |
Space sm | 𝐍 | Man pages |
Space ss | 𝐍 | LSP document symbols |
Space sS | 𝐍 | LSP workspace symbols |
Space st | 𝐍 | Todo list |
Space sT | 𝐍 | Todo/Fix/Fixme list |
Space sw | 𝐍 | Grep string |
Space sc | 𝐍 | Colorschemes |
Within Telescope window | ||
? | 𝐍 | Keymaps help screen |
Ctrl+Space | 𝐍 | Move from none fuzzy search to fuzzy |
jj or Escape | 𝐈 | Leave Insert mode |
i | 𝐍 | Enter Insert mode (filter input) |
q or Escape | 𝐍 | Exit denite window |
Tab or Shift+Tab | 𝐍 𝐈 | Next/previous candidate |
Ctrl+d/u | 𝐍 𝐈 | Scroll down/upwards |
Ctrl+f/b | 𝐍 𝐈 | Scroll preview down/upwards |
J or K | 𝐍 | Select candidates up/downwards |
st | 𝐍 | Open in a new tab |
sg | 𝐍 | Open in a vertical split |
sv | 𝐍 | Open in a split |
w | 𝐍 | Smart send to quickfix list |
e | 𝐍 | Send to quickfix list |
dd | 𝐍 | Delete entry (buffer list) |
Plugin: Neo-Tree
See nvim-neo-tree/neo-tree.nvim for more mappings and usage information.
Key | Mode | Action |
---|---|---|
;e | 𝐍 | Open file-explorer (toggle) |
;a | 𝐍 | Focus current file in file-explorer |
Within Neo-Tree window | ||
g? | 𝐍 | Show help |
q | 𝐍 | Close window |
j or k | 𝐍 | Move up and down the tree |
> or < | 𝐍 | Next or previous source |
]g or [g | 𝐍 | Jump to next/previous git modified node |
l | 𝐍 | Toggle collapse/expand directory or open file |
h | 𝐍 | Collapse directory tree |
Return | 𝐍 | Select window to open file |
gr | 𝐍 | Grep in current position |
gf | 𝐍 | Find files in current position |
. | 𝐍 | Set as root directory |
Backspace | 𝐍 | Change into parent directory |
sv or S | 𝐍 | Open file in a horizontal split |
sg or s | 𝐍 | Open file in a vertical split |
st or t | 𝐍 | Open file in new tab |
p | 𝐍 | Preview node |
a | 𝐍 | Create new directories and/or files |
N | 𝐍 | Create new directory |
r | 𝐍 | Rename file or directory |
dd | 𝐍 | Delete |
c / m | 𝐍 | Copy/move |
y / x / P | 𝐍 | Clipboard copy/cut/paste |
! | 𝐍 | Filter |
D | 𝐍 | Filter directories |
# | 𝐍 | Fuzzy sorter |
/ | 𝐍 | Filter on submit |
Ctrl+c | 𝐍 | Clear filter |
Ctrl+r or R | 𝐍 | Refresh |
fi / fe | 𝐍 | Include/exclude |
H | 𝐍 | Toggle hidden files |
e | 𝐍 | Toggle auto-expand window width |
w | 𝐍 | Toggle window width |
z | 𝐍 | Collapse all nodes |
Plugin: Zk
See mickael-menu/zk-nvim and zk for more mappings and usage information.
Key | Mode | Action |
---|---|---|
Space+zn | 𝐍 | Ask for title and create new note |
Space+zo | 𝐍 | Browse notes sorted by modification time |
Space+zt | 𝐍 | Browse tags |
Space+zf | 𝐍 | Search notes |
Space+zf | 𝐕 | Search notes with selection |
Space+zb | 𝐍 | Show backlinks |
Space+zl | 𝐍 | Show links |
Plugin: Spectre
See nvim-pack/nvim-spectre for more mappings and usage information.
Key | Mode | Action |
---|---|---|
Space+sp | 𝐍 | Open spectre window (search & replace) |
Space+sp | 𝐕 | Open spectre with selection |
Plugin: Marks
See chentau/marks.nvim for more mappings and usage information.
Key | Mode | Action |
---|---|---|
m, | 𝐍 | Set the next available alphabetical (lowercase) mark |
m; | 𝐍 | Toggle the next available mark at the current line |
m a-z | 𝐍 | Set mark |
dm a-z | 𝐍 | Remove mark |
dm- | 𝐍 | Delete all marks on the current line |
dm<Space> | 𝐍 | Delete all marks in the current buffer |
m] | 𝐍 | Move to next mark |
m[ | 𝐍 | Move to previous mark |
m: a-z | 𝐍 | Preview mark |
m/ | 𝐍 | List marks from all opened buffers |