Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/rafi/vim-config

Lean mean Neovim machine, carefully crafted with :heart: Use with latest Neovim.
https://github.com/rafi/vim-config

css dotfiles golang html ide javascript language-server-protocol lsp neovim nvim nvim-lsp nvim-lua nvim-telescope php python vim vimrc

Last synced: 3 days ago
JSON representation

Lean mean Neovim machine, carefully crafted with :heart: Use with latest Neovim.

Awesome Lists containing this project

README

        

# Rafael Bodill's Neovim Config

Lean mean Neovim machine, 30-45ms startup time. Works best with [Neovim] β‰₯0.10

:gear: See "[Extending](#extending)" for customizing configuration and adding
plugins.

> 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](#features)
* [Screenshot](#screenshot)
* [Prerequisites](#prerequisites)
* [Install](#install)
* [Install LSP, DAP, Linters, Formatters](#install-lsp-dap-linters-formatters)
* [Language-Server Protocol (LSP)](#language-server-protocol-lsp)
* [Recommended LSP](#recommended-lsp)
* [Recommended Linters](#recommended-linters)
* [Recommended Formatters](#recommended-formatters)
* [Recommended Fonts](#recommended-fonts)
* [Upgrade](#upgrade)
* [Structure](#structure)
* [Extending](#extending)
* [Extend: Config](#extend-config)
* [Extend: Plugins](#extend-plugins)
* [Extend: Defaults](#extend-defaults)
* [Extend: LSP Settings](#extend-lsp-settings)
* [Plugin Highlights](#plugin-highlights)
* [Plugins Included](#plugins-included)
* [Completion & Code-Analysis](#completion--code-analysis)
* [Editor Plugins](#editor-plugins)
* [Coding Plugins](#coding-plugins)
* [Colorscheme Plugins](#colorscheme-plugins)
* [Git Plugins](#git-plugins)
* [Misc Plugins](#misc-plugins)
* [Treesitter & Syntax](#treesitter--syntax)
* [UI Plugins](#ui-plugins)
* [Extra Plugins](#extra-plugins)
* [Extra Plugins: Coding](#extra-plugins-coding)
* [Extra Plugins: Colorscheme](#extra-plugins-colorscheme)
* [Extra Plugins: Editor](#extra-plugins-editor)
* [Extra Plugins: Git](#extra-plugins-git)
* [Extra Plugins: Lang](#extra-plugins-lang)
* [Extra Plugins: LSP](#extra-plugins-lsp)
* [Extra Plugins: Org](#extra-plugins-org)
* [Extra Plugins: Treesitter](#extra-plugins-treesitter)
* [Extra Plugins: UI](#extra-plugins-ui)
* [LazyVim Extras](#lazyvim-extras)
* [Language](#language)
* [DAP (Debugging)](#dap-debugging)
* [Test](#test)
* [Custom Key-mappings](#custom-key-mappings)
* [Toggle Features](#toggle-features)
* [Navigation](#navigation)
* [Selection](#selection)
* [Jump To](#jump-to)
* [Buffers](#buffers)
* [Clipboard](#clipboard)
* [Auto-Completion](#auto-completion)
* [LSP](#lsp)
* [Diagnostics](#diagnostics)
* [Coding](#coding)
* [Search, Substitute, Diff](#search-substitute-diff)
* [Command & History](#command--history)
* [File Operations](#file-operations)
* [Window Management](#window-management)
* [Plugins](#plugins)
* [Plugin: Mini.Surround](#plugin-minisurround)
* [Plugin: Gitsigns](#plugin-gitsigns)
* [Plugin: Diffview](#plugin-diffview)
* [Plugin: Telescope](#plugin-telescope)
* [Plugin: Neo-Tree](#plugin-neo-tree)
* [Plugin: Marks](#plugin-marks)
* [Plugin: Zk](#plugin-zk)

## 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 [hedyhli/outline.nvim]
* Git features using [lewis6991/gitsigns.nvim], [sindrets/diffview.nvim], and [more](#git-plugins)
* Session management with [folke/persistence.nvim]
* Unobtrusive, yet informative status & tab lines
* Premium color-schemes
* Remembers last-used colorscheme

## Screenshot

![Vim screenshot](http://rafi.io/img/project/vim-config/features.png)

## Prerequisites

* [git](https://git-scm.com/) β‰₯ 2.19.0 (`brew install git`)
* [Neovim](https://github.com/neovim/neovim/wiki/Installing-Neovim) β‰₯ v0.10.0
(`brew install neovim`)

**Optional**, but highly recommended:

* [bat](https://github.com/sharkdp/bat) (`brew install bat`)
* [fd](https://github.com/sharkdp/fd) (`brew install fd`)
* [fzf](https://github.com/junegunn/fzf) (`brew install fzf`)
* [ripgrep](https://github.com/BurntSushi/ripgrep) (`brew install ripgrep`)
* [zoxide](https://github.com/ajeetdsouza/zoxide) (`brew install zoxide`)

## Install

1. Let's clone this repo! Clone to `~/.config/nvim`

```bash
mkdir -p ~/.config
git clone [email protected]:rafi/vim-config.git ~/.config/nvim
cd ~/.config/nvim
```

1. 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.

1. Inside Neovim, run `:LazyExtras` and use x to install extras.

Enjoy! :smile:

## Install LSP, DAP, Linters, Formatters

Use `:Mason` (or Space+mm) 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 `,
or `:LspInstall ` (use Tab to list available servers).
See Mason's [PACKAGES.md](https://mason-registry.dev/registry/list)
for the official list, and the [Language server mapping](https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md)
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](https://github.com/williamboman/mason.nvim#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

```vim
: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](https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md)…

### Recommended Linters

```vim
:MasonInstall vint shellcheck editorconfig-checker flake8 gitlint hadolint
:MasonInstall markdownlint mypy selene shellharden write-good yamllint
```

### Recommended Formatters

```vim
: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:

```sh
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
```

[Pragmata Pro]: https://www.fsd.it/shop/fonts/pragmatapro/
[Nerd Fonts]: https://www.nerdfonts.com

## Upgrade

To upgrade packages and plugins:

* Neovim plugins: `:Lazy update`
* Mason packages: `:Mason` and press U

To update Neovim configuration from my repo:

```bash
git pull --ff --ff-only
```

## Structure

* [after/](./after) β€” Language specific custom settings and plugins.
* [lua/](./lua) β€” Lua configurations
* **`config/`** β€” Custom user configuration
* **`plugins/`** β€” Custom user plugins (or `lua/plugins.lua`)
* [rafi/](./lua/rafi)
* [config/](./lua/config) β€” Neovim configurations
* [autocmd.lua](./lua/rafi/config/autocmd.lua) β€” Auto-commands
* [init.lua](./lua/rafi/config/init.lua) β€” Initialization
* [keymaps.lua](./lua/rafi/config/keymaps.lua) β€” Key-mappings
* [lazy.lua](./lua/rafi/config/lazy.lua) β€” Entry-point initialization
* [options.lua](./lua/rafi/config/options.lua) β€” Editor settings
* [plugins/](./lua/plugins) β€” Plugins and configurations
* [util/](./lua/rafi/util) β€” Utility library
* [snippets/](./snippets) β€” Personal code snippets

## Extending

### Extend: Config

Fork this repository and create a directory
`lua/config` with one or more of these files: (Optional)

* `lua/config/autocmds.lua` β€” Custom auto-commands
* `lua/config/options.lua` β€” Custom options
* `lua/config/keymaps.lua` β€” Custom key-mappings
* `lua/config/setup.lua` β€” Override config,
see [extend defaults](#extend-defaults).

Adding plugins or override existing options:

* `lua/plugins/*.lua` or `lua/plugins.lua` β€” Plugins (See [lazy.nvim] specs
for syntax)

### Extend: Plugins

Install "extras" plugins using `:LazyExtras` and installing with x.
This saves choices in `lazyvim.json` which you can also edit manually, here's a
recommended starting point:

```json
{
"extras": [
"lazyvim.plugins.extras.ai.copilot",
"lazyvim.plugins.extras.dap.core",
"lazyvim.plugins.extras.dap.nlua",
"lazyvim.plugins.extras.lang.docker",
"lazyvim.plugins.extras.lang.json",
"lazyvim.plugins.extras.lang.typescript",
"lazyvim.plugins.extras.lang.yaml",
"lazyvim.plugins.extras.test.core",
"rafi.plugins.extras.coding.align",
"rafi.plugins.extras.editor.harpoon2",
"rafi.plugins.extras.git.cmp-git",
"rafi.plugins.extras.lang.ansible",
"rafi.plugins.extras.lang.go",
"rafi.plugins.extras.lang.helm",
"rafi.plugins.extras.lang.markdown",
"rafi.plugins.extras.lang.python",
"rafi.plugins.extras.lang.tmux",
"rafi.plugins.extras.ui.deadcolumn"
],
"news": [],
"version": 2
}
```

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:

```lua
return {

-- Disable default tabline
{ 'akinsho/bufferline.nvim', enabled = false },

-- And choose a different one!
-- { 'itchyny/lightline.vim' },
-- { 'vim-airline/vim-airline' },
-- { 'glepnir/galaxyline.nvim' },
-- { 'glepnir/spaceline.vim' },
-- { 'liuchengxu/eleline.vim' },

-- Enable GitHub's Copilot
{ import = 'lazyvim.plugins.extras.ai.copilot' },

-- Enable incline, displaying filenames on each window
{ import = 'rafi.plugins.extras.ui.incline' },

-- Disable built-in plugins
{ 'shadmansaleh/lualine.nvim', enabled = false },
{ 'folke/persistence.nvim', enabled = false },

-- Change built-in 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',
},
},
},

}
```

### Extend: Defaults

1. Create `lua/config/options.lua` and set any Neovim/RafiVim/LazyVim features:
(Default values are shown)

```lua
-- Elite-mode (hjkl mode. arrow-keys resize window)
vim.g.elite_mode = false

-- External file diff program
vim.g.diffprg = 'bcompare'

-- Auto format on-save
vim.g.autoformat = false

-- Snacks animations
vim.g.snacks_animate = false
```

1. You can override LazyVim options. For example in `lua/plugins/lazyvim.lua`:

```lua
return {
{
'LazyVim/LazyVim',
opts = {
icons = {
diagnostics = {
Error = '',
Warn = '',
Info = '',
},
status = {
diagnostics = {
error = 'E',
warn = 'W',
info = 'I',
hint = 'H',
},
},
},
},
},
}
```

1. You can override lazy.nvim (package-manager) global options.
Create `lua/config/setup.lua` and return this function:

* `lazy_opts()` β€” override LazyVim setup options

For example:

```lua
local M = {}

---@return table
function M.lazy_opts()
return {
-- See https://github.com/folke/lazy.nvim/#%EF%B8%8F-configuration
concurrency = jit.os:find('Windows') and (vim.uv.available_parallelism() * 2) or nil,
}
end

return M
```

1. You can completely override lazy.nvim setup by creating `lua/config/lazy.lua`
to replace `lua/rafi/config/lazy.lua` with your own procedure.

### Extend: LSP Settings

Override server options with [nvim-lspconfig] plugin, for example:

```lua
{
'neovim/nvim-lspconfig',
opts = {
servers = {
yamlls = {
filetypes = { 'yaml', 'yaml.ansible', 'yaml.docker-compose' },
},
lua_ls = {
settings = {
Lua = {
workspace = { checkThirdParty = false },
completion = { callSnippet = 'Replace' },
},
},
},
},
}
}
```

## 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 |
| [williamboman/mason.nvim] | Portable package manager for Neovim |
| [williamboman/mason-lspconfig.nvim] | Mason extension for easier lspconfig integration |
| [stevearc/conform.nvim] | Lightweight yet powerful formatter plugin |
| [mfussenegger/nvim-lint] | Asynchronous linter plugin |

### Editor Plugins

| Name | Description |
| -------------- | ---------------------- |
| [folke/lazy.nvim] | Modern plugin manager for Neovim |
| [nmac427/guess-indent.nvim] | Automatic indentation style detection |
| [tweekmonster/helpful.vim] | Display vim version numbers in docs |
| [lambdalisue/suda.vim] | An alternative sudo for Vim and Neovim |
| [folke/persistence.nvim] | Simple lua plugin for automated session management |
| [mbbill/undotree] | Ultimate undo history visualizer |
| [folke/flash.nvim] | Search labels, enhanced character motions |
| [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 |
| [hedyhli/outline.nvim] | Code outline sidebar powered by LSP |
| [s1n7ax/nvim-window-picker] | Fancy Window picker |
| [dnlhc/glance.nvim] | Pretty window for navigating LSP locations |
| [MagicDuck/grug-far.nvim] | Search/replace in multiple files |

### Coding Plugins

| Name | Description |
| -------------- | ---------------------- |
| [hrsh7th/nvim-cmp] | Completion plugin for neovim written in Lua |
| [hrsh7th/cmp-nvim-lsp] | nvim-cmp source for neovim builtin LSP client |
| [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 |
| [rafamadriz/friendly-snippets] | Preconfigured snippets for different languages |
| [windwp/nvim-autopairs] | Powerful auto-pair plugin with multiple characters support |
| [echasnovski/mini.surround] | Fast and feature-rich surround actions |
| [JoosepAlviste/nvim-ts-context-commentstring] | Set the commentstring based on the cursor location |
| [numToStr/Comment.nvim] | Powerful line and block-wise commenting |
| [echasnovski/mini.splitjoin] | Split and join arguments |
| [echasnovski/mini.trailspace] | Trailing whitespace highlight and remove |
| [AndrewRadev/linediff.vim] | Perform diffs on blocks of code |
| [echasnovski/mini.ai] | Extend and create `a`/`i` textobjects |
| [folke/lazydev.nvim] | Faster LuaLS setup |
| [Bilal2453/luvit-meta] | Manage libuv types with lazy |

### Colorscheme Plugins

| Name | Description |
| -------------- | ---------------------- |
| [rafi/theme-loader.nvim] | Use last-used colorscheme |
| [rafi/neo-hybrid.vim] | Modern dark colorscheme, hybrid improved |
| [rafi/awesome-colorschemes] | Awesome color-schemes |

### Git Plugins

| Name | Description |
| -------------- | ---------------------- |
| [lewis6991/gitsigns.nvim] | Git signs written in pure lua |
| [sindrets/diffview.nvim] | Tabpage interface for cycling through diffs |
| [NeogitOrg/neogit] | Magit clone for Neovim |
| [FabijanZulj/blame.nvim] | Git blame visualizer |
| [rhysd/committia.vim] | Pleasant editing on Git commit messages |

### Misc Plugins

| Name | Description |
| -------------- | ---------------------- |
| [folke/snacks.nvim] | Collection of small QoL plugins |
| [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 for a word |
| [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 |
| [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 |
| [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 |

### UI Plugins

| Name | Description |
| -------------- | ---------------------- |
| [echasnovski/mini.icons] | Icon provider |
| [MunifTanjim/nui.nvim] | UI Component Library |
| [stevearc/dressing.nvim] | Improve the default vim-ui interfaces |
| [akinsho/bufferline.nvim] | Snazzy tab/bufferline |
| [folke/noice.nvim] | Replaces the UI for messages, cmdline and the popupmenu |
| [SmiteshP/nvim-navic] | Shows your current code context in winbar/statusline |
| [chentau/marks.nvim] | Interacting with and manipulating marks |
| [lukas-reineke/indent-blankline.nvim] | Visually display indent levels |
| [echasnovski/mini.indentscope] | Visualize and operate on indent scope |
| [folke/which-key.nvim] | Create key bindings that stick |
| [tenxsoydev/tabs-vs-spaces.nvim] | Hint and fix deviating indentation |
| [t9md/vim-quickhl] | Highlight words quickly |

[neovim/nvim-lspconfig]: https://github.com/neovim/nvim-lspconfig
[williamboman/mason.nvim]: https://github.com/williamboman/mason.nvim
[williamboman/mason-lspconfig.nvim]: https://github.com/williamboman/mason-lspconfig.nvim
[stevearc/conform.nvim]: https://github.com/stevearc/conform.nvim
[mfussenegger/nvim-lint]: https://github.com/mfussenegger/nvim-lint

[folke/lazy.nvim]: https://github.com/folke/lazy.nvim
[nmac427/guess-indent.nvim]: https://github.com/nmac427/guess-indent.nvim
[tweekmonster/helpful.vim]: https://github.com/tweekmonster/helpful.vim
[lambdalisue/suda.vim]: https://github.com/lambdalisue/suda.vim
[folke/persistence.nvim]: https://github.com/folke/persistence.nvim
[mbbill/undotree]: https://github.com/mbbill/undotree
[folke/flash.nvim]: https://github.com/folke/flash.nvim
[folke/todo-comments.nvim]: https://github.com/folke/todo-comments.nvim
[folke/trouble.nvim]: https://github.com/folke/trouble.nvim
[s1n7ax/nvim-window-picker]: https://github.com/s1n7ax/nvim-window-picker
[dnlhc/glance.nvim]: https://github.com/dnlhc/glance.nvim
[MagicDuck/grug-far.nvim]: https://github.com/MagicDuck/grug-far.nvim

[hrsh7th/nvim-cmp]: https://github.com/hrsh7th/nvim-cmp
[hrsh7th/cmp-nvim-lsp]: https://github.com/hrsh7th/cmp-nvim-lsp
[hrsh7th/cmp-buffer]: https://github.com/hrsh7th/cmp-buffer
[hrsh7th/cmp-path]: https://github.com/hrsh7th/cmp-path
[hrsh7th/cmp-emoji]: https://github.com/hrsh7th/cmp-emoji
[rafamadriz/friendly-snippets]: https://github.com/rafamadriz/friendly-snippets
[windwp/nvim-autopairs]: https://github.com/windwp/nvim-autopairs
[echasnovski/mini.surround]: https://github.com/echasnovski/mini.surround
[JoosepAlviste/nvim-ts-context-commentstring]: https://github.com/JoosepAlviste/nvim-ts-context-commentstring
[numToStr/Comment.nvim]: https://github.com/numToStr/Comment.nvim
[echasnovski/mini.splitjoin]: https://github.com/echasnovski/mini.splitjoin
[echasnovski/mini.trailspace]: https://github.com/echasnovski/mini.trailspace
[AndrewRadev/linediff.vim]: https://github.com/AndrewRadev/linediff.vim
[echasnovski/mini.ai]: https://github.com/echasnovski/mini.ai
[folke/lazydev.nvim]: https://github.com/folke/lazydev.nvim
[Bilal2453/luvit-meta]: https://github.com/Bilal2453/luvit-meta

[rafi/theme-loader.nvim]: https://github.com/rafi/theme-loader.nvim
[rafi/neo-hybrid.vim]: https://github.com/rafi/neo-hybrid.vim
[rafi/awesome-colorschemes]: https://github.com/rafi/awesome-vim-colorschemes

[lewis6991/gitsigns.nvim]: https://github.com/lewis6991/gitsigns.nvim
[sindrets/diffview.nvim]: https://github.com/sindrets/diffview.nvim
[NeogitOrg/neogit]: https://github.com/NeogitOrg/neogit
[FabijanZulj/blame.nvim]: https://github.com/FabijanZulj/blame.nvim
[rhysd/committia.vim]: https://github.com/rhysd/committia.vim

[folke/snacks.nvim]: https://github.com/folke/snacks.nvim
[hoob3rt/lualine.nvim]: https://github.com/hoob3rt/lualine.nvim
[nvim-neo-tree/neo-tree.nvim]: https://github.com/nvim-neo-tree/neo-tree.nvim
[nvim-telescope/telescope.nvim]: https://github.com/nvim-telescope/telescope.nvim
[jvgrootveld/telescope-zoxide]: https://github.com/jvgrootveld/telescope-zoxide
[rafi/telescope-thesaurus.nvim]: https://github.com/rafi/telescope-thesaurus.nvim
[nvim-lua/plenary.nvim]: https://github.com/nvim-lua/plenary.nvim

[nvim-treesitter/nvim-treesitter]: https://github.com/nvim-treesitter/nvim-treesitter
[nvim-treesitter/nvim-treesitter-textobjects]: https://github.com/nvim-treesitter/nvim-treesitter-textobjects
[windwp/nvim-ts-autotag]: https://github.com/windwp/nvim-ts-autotag
[andymass/vim-matchup]: https://github.com/andymass/vim-matchup
[iloginow/vim-stylus]: https://github.com/iloginow/vim-stylus
[mustache/vim-mustache-handlebars]: https://github.com/mustache/vim-mustache-handlebars
[lifepillar/pgsql.vim]: https://github.com/lifepillar/pgsql.vim
[MTDL9/vim-log-highlighting]: https://github.com/MTDL9/vim-log-highlighting
[reasonml-editor/vim-reason-plus]: https://github.com/reasonml-editor/vim-reason-plus

[echasnovski/mini.icons]: https://github.com/echasnovski/mini.icons
[MunifTanjim/nui.nvim]: https://github.com/MunifTanjim/nui.nvim
[stevearc/dressing.nvim]: https://github.com/stevearc/dressing.nvim
[akinsho/bufferline.nvim]: https://github.com/akinsho/bufferline.nvim
[folke/noice.nvim]: https://github.com/folke/noice.nvim
[SmiteshP/nvim-navic]: https://github.com/SmiteshP/nvim-navic
[chentau/marks.nvim]: https://github.com/chentau/marks.nvim
[lukas-reineke/indent-blankline.nvim]: https://github.com/lukas-reineke/indent-blankline.nvim
[echasnovski/mini.indentscope]: https://github.com/echasnovski/mini.indentscope
[folke/which-key.nvim]: https://github.com/folke/which-key.nvim
[tenxsoydev/tabs-vs-spaces.nvim]: https://github.com/tenxsoydev/tabs-vs-spaces.nvim
[t9md/vim-quickhl]: https://github.com/t9md/vim-quickhl

## Extra Plugins

List of extras (πŸ”Ž Click to expand/collapse)

You can view all LazyVim's extras at [www.lazyvim.org/extras].

These plugins aren't enabled by default. You'll have to install them using
`:LazyExtras` and installing with x. (Or import them using specs)
See [Extend: Plugins](#extend-plugins) on how to add plugins and examples.

Following are extra-extras available with Rafi's Neovim on-top of LazyVim's:

### Extra Plugins: Coding

Spec: `rafi.plugins.extras.coding.`

| Name | Repository | Description |
| -------------- | -------------- | ---------------------- |
| `align` | [echasnovski/mini.align] | Align text interactively |
| `chainsaw` | [chrisgrieser/nvim-chainsaw] | Create log statements on the fly |
| `editorconfig` | [sgur/vim-editorconfig] | EditorConfig plugin written entirely in Vimscript |
| `emmet` | [mattn/emmet-vim] | Provides support for expanding abbreviations alΓ‘ emmet |
| `luasnip` | [L3MON4D3/LuaSnip] [saadparwaiz1/cmp_luasnip] | Snippet Engine and cmp source |
| `mini-pairs` | [echasnovski/mini.pairs] | Automatically manage character pairs |
| `neogen` | [danymat/neogen] | Annotation generator |
| `sandwich` | [machakann/vim-sandwich] | Search, select, and edit sandwich text objects |

[echasnovski/mini.align]: https://github.com/echasnovski/mini.align
[chrisgrieser/nvim-chainsaw]: https://github.com/chrisgrieser/nvim-chainsaw
[sgur/vim-editorconfig]: https://github.com/sgur/vim-editorconfig
[mattn/emmet-vim]: https://github.com/mattn/emmet-vim
[L3MON4D3/LuaSnip]: https://github.com/L3MON4D3/LuaSnip
[saadparwaiz1/cmp_luasnip]: https://github.com/saadparwaiz1/cmp_luasnip
[echasnovski/mini.pairs]: https://github.com/echasnovski/mini.pairs
[danymat/neogen]: https://github.com/danymat/neogen
[machakann/vim-sandwich]: https://github.com/machakann/vim-sandwich

### Extra Plugins: Colorscheme

Spec: `rafi.plugins.extras.colorscheme.`

| Name | Repository | Description |
| -------------- | -------------- | ---------------------- |
| `nordic` | [AlexvZyl/nordic.nvim] | Nord for Neovim, but warmer and darker |
| `tokyonight` | [folke/tokyonight.nvim] | Clean, dark Neovim theme |
| `kanagawa` | [rebelot/kanagawa.nvim] | Inspired by the colors of the famous painting by Katsushika Hokusai |
| `onedarkpro` | [olimorris/onedarkpro.nvim] | OneDarkPro theme |
| `nightfox` | [EdenEast/nightfox.nvim] | Highly customizable theme |
| `oxocarbon` | [nyoom-engineering/oxocarbon.nvim] | Dark and light theme inspired by IBM Carbon |
| `bamboo` | [ribru17/bamboo.nvim] | Warm green theme |
| `catppuccin` | [catppuccin/nvim] | Soothing pastel theme |

[AlexvZyl/nordic.nvim]: https://github.com/AlexvZyl/nordic.nvim
[folke/tokyonight.nvim]: https://github.com/folke/tokyonight.nvim
[rebelot/kanagawa.nvim]: https://github.com/rebelot/kanagawa.nvim
[olimorris/onedarkpro.nvim]: https://github.com/olimorris/onedarkpro.nvim
[EdenEast/nightfox.nvim]: https://github.com/EdenEast/nightfox.nvim
[nyoom-engineering/oxocarbon.nvim]: https://github.com/nyoom-engineering/oxocarbon.nvim
[ribru17/bamboo.nvim]: https://github.com/ribru17/bamboo.nvim
[catppuccin/nvim]: https://github.com/catppuccin/nvim

### Extra Plugins: Editor

Spec: `rafi.plugins.extras.editor.`

| 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 |
| `harpoon` | [ThePrimeagen/harpoon] | Marks for navigating your project |
| `mini-visits` | [echasnovski/mini.visits] | Track and reuse file system visits |
| `rest` | [rest-nvim/rest.nvim] | Fast Neovim http client written in Lua |
| `sidebar` | [sidebar-nvim/sidebar.nvim] | Generic and modular lua sidebar |
| `ufo` | [kevinhwang91/nvim-ufo] | Make folds look modern and keep a high performance |

[pechorin/any-jump.vim]: https://github.com/pechorin/any-jump.vim
[glepnir/flybuf.nvim]: https://github.com/glepnir/flybuf.nvim
[ThePrimeagen/harpoon]: https://github.com/ThePrimeagen/harpoon
[echasnovski/mini.visits]: https://github.com/echasnovski/mini.visits
[rest-nvim/rest.nvim]: https://github.com/rest-nvim/rest.nvim
[sidebar-nvim/sidebar.nvim]: https://github.com/sidebar-nvim/sidebar.nvim
[kevinhwang91/nvim-ufo]: https://github.com/kevinhwang91/nvim-ufo

### Extra Plugins: Git

Spec: `rafi.plugins.extras.git.`

| Name | Repository | Description |
| -------------| -------------- | ---------------------- |
| `cmp-git` | [petertriho/cmp-git] | Git source for nvim-cmp |
| `fugitive` | [tpope/vim-fugitive] | Git client, including [junegunn/gv.vim] |

[petertriho/cmp-git]: https://github.com/petertriho/cmp-git
[tpope/vim-fugitive]: https://github.com/tpope/vim-fugitive
[junegunn/gv.vim]: https://github.com/junegunn/gv.vim

### Extra Plugins: Lang

Spec: `rafi.plugins.extras.lang.`

| Name | Description |
| ---------------- | ---------------------- |
| `ansible` | imports `lazyvim.plugins.extras.lang.ansible`, add syntax and [pearofducks/ansible-vim] |
| `go` | imports `lazyvim.plugins.extras.lang.go`, add tools, patterns, etc. |
| `helm` | imports `lazyvim.plugins.extras.lang.helm`, add filetype patterns |
| `kubernetes` | imports `lazyvim.plugins.extras.lang.yaml`, add filetype patterns and [ramilito/kubectl.nvim] |
| `markdown` | imports `lazyvim.plugins.extras.lang.markdown`, disable headlines, add [mzlogin/vim-markdown-toc] |
| `python` | imports `lazyvim.plugins.extras.lang.python`, add syntax and filetype patterns |
| `tmux` | syntax, completion [andersevenrud/cmp-tmux], keymaps [christoomey/tmux-navigator] |

[pearofducks/ansible-vim]: https://github.com/pearofducks/ansible-vim
[ramilito/kubectl.nvim]: https://github.com/ramilito/kubectl.nvim
[mzlogin/vim-markdown-toc]: https://github.com/mzlogin/vim-markdown-toc
[andersevenrud/cmp-tmux]: https://github.com/andersevenrud/cmp-tmux
[christoomey/tmux-navigator]: https://github.com/christoomey/vim-tmux-navigator

### Extra Plugins: LSP

Spec: `rafi.plugins.extras.lsp.`

| Key | Name | Description |
| ---------------- | -------------- | ---------------------- |
| `gtd` | [hrsh7th/nvim-gtd] | LSP's go-to definition plugin |
| `lightbulb` | [kosayoda/nvim-lightbulb] | VSCode πŸ’‘ for neovim's built-in LSP |
| `yaml-companion` | [yaml-companion.nvim] | Get, set and autodetect YAML schemas in your buffers |

[hrsh7th/nvim-gtd]: https://github.com/hrsh7th/nvim-gtd
[kosayoda/nvim-lightbulb]: https://github.com/kosayoda/nvim-lightbulb
[yaml-companion.nvim]: https://github.com/someone-stole-my-name/yaml-companion.nvim

### Extra Plugins: Org

Spec: `rafi.plugins.extras.org.`

| Key | Name | Description |
| -------------- | -------------- | ---------------------- |
| `calendar` | [itchyny/calendar.vim] | Calendar application |
| `kiwi` | [serenevoid/kiwi.nvim] | Stripped down VimWiki |
| `telekasten` | [renerocksai/telekasten.nvim] | Manage text-based, markdown zettelkasten or wiki with telescope |
| `vimwiki` | [vimwiki/vimwiki] | Personal Wiki for Vim |
| `zk-nvim` | [zk-org/zk-nvim] | Extension for the zk plain text note-taking assistant |

[itchyny/calendar.vim]: https://github.com/itchyny/calendar.vim
[serenevoid/kiwi.nvim]: https://github.com/serenevoid/kiwi.nvim
[renerocksai/telekasten.nvim]: https://github.com/renerocksai/telekasten.nvim
[vimwiki/vimwiki]: https://github.com/vimwiki/vimwiki
[zk-org/zk-nvim]: https://github.com/zk-org/zk-nvim

### Extra Plugins: Treesitter

Spec: `rafi.plugins.extras.treesitter.`

| Key | Name | Description |
| -------------- | ---------------------------- | ---------------------- |
| `endwise` | [RRethy/nvim-treesitter-endwise] | Wisely add "end" in various filetypes |
| `treesj` | [Wansmer/treesj] | Splitting and joining blocks of code |

[RRethy/nvim-treesitter-endwise]: https://github.com/RRethy/nvim-treesitter-endwise
[Wansmer/treesj]: https://github.com/Wansmer/treesj

### Extra Plugins: UI

Spec: `rafi.plugins.extras.ui.`

| Key | Name | Description |
| ----------------- | -------------- | ---------------------- |
| `alpha` | [goolord/alpha-nvim] | Fast and fully programmable greeter |
| `barbecue` | [utilyre/barbecue.nvim] | VS Code like winbar |
| `bookmarks` | [tomasky/bookmarks.nvim] | Bookmarks plugin with global file store |
| `bqf` | [kevinhwang91/nvim-bqf] | Better quickfix window |
| `ccc` | [uga-rosa/ccc.nvim] | Super powerful color picker/colorizer plugin |
| `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 |
| `headlines` | [lukas-reineke/headlines.nvim] | Adds horizontal highlights for headlines and code background. |
| `illuminate` | [RRethy/vim-illuminate] | Highlights other uses of the word under the cursor |
| `incline` | [b0o/incline.nvim] | Floating statuslines |
| `marks` | [chentoast/marks.nvim] | Interacting with and manipulating marks |
| `mini-clue` | [echasnovski/mini.clue] | Show next key clues |
| `mini-map` | [echasnovski/mini.map] | Window with buffer text overview, scrollbar and highlights |
| `symbols-outline` | [simrat39/symbols-outline.nvim] | Tree like view for symbols using LSP |

[goolord/alpha-nvim]: https://github.com/goolord/alpha-nvim
[utilyre/barbecue.nvim]: https://github.com/utilyre/barbecue.nvim
[tomasky/bookmarks.nvim]: https://github.com/tomasky/bookmarks.nvim
[kevinhwang91/nvim-bqf]: https://github.com/kevinhwang91/nvim-bqf
[uga-rosa/ccc.nvim]: https://github.com/uga-rosa/ccc.nvim
[itchyny/cursorword]: https://github.com/itchyny/vim-cursorword
[ghillb/cybu.nvim]: https://github.com/ghillb/cybu.nvim
[Bekaboo/deadcolumn.nvim]: https://github.com/Bekaboo/deadcolumn.nvim
[rmagatti/goto-preview]: https://github.com/rmagatti/goto-preview
[lukas-reineke/headlines.nvim]: https://github.com/lukas-reineke/headlines.nvim
[RRethy/vim-illuminate]: https://github.com/RRethy/vim-illuminate
[b0o/incline.nvim]: https://github.com/b0o/incline.nvim
[chentoast/marks.nvim]: https://github.com/chentoast/marks.nvim
[echasnovski/mini.clue]: https://github.com/echasnovski/mini.clue
[echasnovski/mini.map]: https://github.com/echasnovski/mini.map
[simrat39/symbols-outline.nvim]: https://github.com/simrat39/symbols-outline.nvim

### LazyVim Extras

LazyVim is imported in specs (see [lua/rafi/config/lazy.lua](./lua/rafi/config/lazy.lua))
Therefore, you can import any of the "Extras" plugins defined at
[LazyVim/LazyVim](https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins/extras)
and documented in [lazyvim.org](https://www.lazyvim.org).

**These are only highlights:**

#### Language

* `lazyvim.plugins.extras.lang.json`
* `lazyvim.plugins.extras.lang.markdown`
* `lazyvim.plugins.extras.lang.terraform`
* `lazyvim.plugins.extras.lang.typescript`

#### DAP (Debugging)

* Spec: `lazyvim.plugins.extras.dap.`
* See [lazyvim/plugins/extras/dap](https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins/extras/dap)

#### Test

* Spec: `lazyvim.plugins.extras.test.`
* See [lazyvim/plugins/extras/test](https://github.com/LazyVim/LazyVim/tree/main/lua/lazyvim/plugins/extras/test)

## 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 `vim.g.elite_mode`.


Key-mappings
(πŸ”Ž Click to expand/collapse)

Legend: | Ⓝormal | β“‹isual | β“ˆelect | β’Ύnsert | β“„perator | β’Έommand |

### Toggle Features

| Key | Mode | Action |
| ----- |:----:| ------------------ |
| Space dph | Ⓝ | Toggle profiler highlights |
| Space dpp | Ⓝ | Toggle profiler |
| Space uA | Ⓝ | Toggle animation |
| Space uA | Ⓝ | Toggle tabline |
| Space ub | Ⓝ | Toggle background dark/light |
| Space uc | Ⓝ | Toggle conceal level |
| Space ud | Ⓝ | Toggle buffer diagnostics |
| Space uD | Ⓝ | Toggle text dim |
| Space uf | Ⓝ | Toggle format on Save |
| Space uF | Ⓝ | Toggle format on Save (Global) |
| Space ug | Ⓝ | Toggle indentation lines |
| Space uh | Ⓝ | Toggle inlay-hints |
| Space ui | Ⓝ | Show highlight groups for word |
| Space ul | Ⓝ | Toggle line numbers |
| Space uL | Ⓝ | Toggle relative line numbers |
| Space un | Ⓝ | Dismiss all notifications |
| Space up | Ⓝ | Disable auto-pairs |
| Space ur | Ⓝ | Redraw, clear hlsearch, and diff update |
| Space us | Ⓝ | Toggle spell-checker |
| Space uS | Ⓝ | Toggle scroll |
| Space uT | Ⓝ | Toggle tree-sitter |
| Space uw | Ⓝ | Toggle wrap |
| Space uz | Ⓝ | Toggle distraction-free zen writing |
| Space uZ | Ⓝ | Toggle window zoom |

### Navigation

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| j / k | Ⓝ β“‹ | Cursor moves through display-lines | `g` `j/k` |
| ]i / [i | Ⓝ β“‹ | Jump to scope edges | [folke/snacks.nvim] |
| gh / gl | Ⓝ β“‹ | Easier line-wise movement | `g^` `g$` |
| zl / zh | Ⓝ | Scroll horizontally and vertically wider | `z4` `l/h` |
| Ctrl+j | Ⓝ | Move to split below | `j` or [christoomey/tmux-navigator] |
| Ctrl+k | Ⓝ | Move to upper split | `k` or [christoomey/tmux-navigator] |
| Ctrl+h | Ⓝ | Move to left split | `h` or [christoomey/tmux-navigator] |
| Ctrl+l | Ⓝ | Move to right split | `l` or [christoomey/tmux-navigator] |
| Return | Ⓝ | Toggle fold under cursor | `za` |
| Shift+Return | Ⓝ | Focus the current fold by closing all others | `zMzv` |
| 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 |
| Ctrl+Tab | Ⓝ | Go to next tab | `:tabnext` |
| Ctrl+ShiftTab | Ⓝ | Go to previous tab | `:tabprevious` |
| Alt+j or ] | Ⓝ | Go to next tab | `:tabnext` |
| Alt+k or [ | Ⓝ | Go to previous tab | `:tabprevious` |
| Alt+{ | Ⓝ | Move tab backward | `:-tabmove` |
| Alt+} | Ⓝ | Move tab forward | `:+tabmove` |

### Selection

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| Space+Space | Ⓝ β“‹ | Toggle visual-line mode | `V` / Escape |
| v / V | β“‹ | Increment/shrink selection | [nvim-treesitter] |
| vsp | Ⓝ | Select last paste | [config/keymaps.lua] |
| sg | β“‹ | Replace within selected area | [config/keymaps.lua] |
| Ctrl+r | β“‹ | Replace selection with step-by-step confirmation | [config/keymaps.lua] |
| > / < | β“‹ | Indent and re-select | [config/keymaps.lua] |
| Tab / Shift+Tab | β“‹ | Indent and re-select | [config/keymaps.lua] |
| I / gI / A | β“‹ | Force blockwise operation | [config/keymaps.lua] |

### Jump To

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| ], or [, | Ⓝ | Next/previous parameter | [akinsho/bufferline.nvim] |
| ]q or [q | Ⓝ | Next/previous on quick-fix | `:cnext` / `:cprev` |
| ]a or [a | Ⓝ | Next/previous on location-list | `:lnext` / `:lprev` |
| ]d or [d | Ⓝ | Next/previous diagnostics | [config/keymaps.lua] |
| ]e or [e | Ⓝ | Next/previous error | [config/keymaps.lua] |
| ]w or [w | Ⓝ | Next/previous warning | [config/keymaps.lua] |
| ]b or [b | Ⓝ | Next/previous buffer | [akinsho/bufferline.nvim] |
| ]f or [f | Ⓝ | Next/previous function start | [echasnovski/mini.ai] |
| ]F or [F | Ⓝ | Next/previous function end | [echasnovski/mini.ai] |
| ]c or [c | Ⓝ | Next/previous class start | [echasnovski/mini.ai] |
| ]C or [C | Ⓝ | Next/previous class end | [echasnovski/mini.ai] |
| ]m or [m | Ⓝ | Next/previous method start | [echasnovski/mini.ai] |
| ]M or [M | Ⓝ | Next/previous method end | [echasnovski/mini.ai] |
| ]g or [g | Ⓝ | Next/previous Git hunk | [lewis6991/gitsigns.nvim] |
| ]i or [i | Ⓝ | Next/previous indent scope | [echasnovski/mini.indentscope] |
| ]t or [t | Ⓝ | Next/previous TODO | [folke/todo-comments.nvim] |
| ]z or [z | Ⓝ | Next/previous whitespace error | [config/keymaps.lua] |

### Buffers

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| Space+bd | Ⓝ | Delete buffer | [folke/snacks.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] |

### Auto-Completion

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| Tab / Shift-Tab | β’Ύ β“ˆ | Navigate/open completion-menu | [nvim-cmp] |
| Tab / Shift-Tab | β’Ύ β“ˆ | Navigate snippet placeholders | [L3MON4D3/LuaSnip] |
| Ctrl+Space | β’Ύ | Open completion menu | [nvim-cmp] |
| Enter | β’Ύ | Select completion item or expand snippet | [nvim-cmp] |
| Shift+Enter | β’Ύ | Select and replace with completion item | [nvim-cmp] |
| Ctrl+n/p | β’Ύ | Movement in completion pop-up | [nvim-cmp] |
| Ctrl+f/b | β’Ύ | Scroll documentation | [nvim-cmp] |
| Ctrl+d/u | β’Ύ | Scroll candidates | [nvim-cmp] |
| Ctrl+e | β’Ύ | Abort selection and close pop-up | [nvim-cmp] |
| Ctrl+l | β’Ύ | Expand snippet at cursor | [L3MON4D3/LuaSnip] |
| Ctrl+c | β’Ύ | Close completion menu | [nvim-cmp] |

### LSP

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| gr | Ⓝ | Go to references | [plugins/lsp/keymaps.lua] |
| gR | Ⓝ | List references with Trouble | [folke/trouble.nvim] |
| gd | Ⓝ | Go to definition | [plugins/lsp/keymaps.lua] |
| gD | Ⓝ | Go to declaration | [plugins/lsp/keymaps.lua] |
| gI | Ⓝ | Go to implementation | [plugins/lsp/keymaps.lua] |
| gy | Ⓝ | Go to type definition | [plugins/lsp/keymaps.lua] |
| K | Ⓝ | Show hover help or collapsed fold | [plugins/lsp/keymaps.lua] |
| gK | Ⓝ | Show signature help | [plugins/lsp/keymaps.lua] |
| Space cl | Ⓝ | Open LSP info window | [plugins/lsp/keymaps.lua] |
| Space cr | Ⓝ | Rename | [plugins/lsp/keymaps.lua] |
| Space ce | Ⓝ | Open diagnostics window | [plugins/lsp/keymaps.lua] |
| Space co | Ⓝ | Formatter menu selection | [plugins/lsp/keymaps.lua] |
| Space ca | Ⓝ β“‹ | Code action | [plugins/lsp/keymaps.lua] |
| Space cA | Ⓝ | Source action | [plugins/lsp/keymaps.lua] |
| Space chi | Ⓝ | LSP incoming calls | [plugins/lsp/keymaps.lua] |
| Space cho | Ⓝ | LSP outgoing calls | [plugins/lsp/keymaps.lua] |
| Space fwa | Ⓝ | Add workspace folder | [plugins/lsp/keymaps.lua] |
| Space fwr | Ⓝ | Remove workspace folder | [plugins/lsp/keymaps.lua] |
| Space fwl | Ⓝ | 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] |

### Diagnostics

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| Space ud | Ⓝ | Toggle buffer diagnostics | [plugins/lsp/keymaps.lua] |
| Space xt | Ⓝ | List TODO with Trouble | [folke/todo-comments.nvim] |
| Space xT | Ⓝ | List TODO/FIXME with Trouble | [folke/todo-comments.nvim] |
| Space st | Ⓝ | Select TODO with Telescope | [folke/todo-comments.nvim] |
| Space sT | Ⓝ | Select TODO/FIXME with Telescope | [folke/todo-comments.nvim] |
| Space xx | Ⓝ | Toggle Trouble | [folke/trouble.nvim] |
| Space xd | Ⓝ | Toggle Trouble document | [folke/trouble.nvim] |
| Space xw | Ⓝ | Toggle Trouble workspace | [folke/trouble.nvim] |
| Space xq | Ⓝ | Toggle Quickfix via Trouble | [folke/trouble.nvim] |
| Space xl | Ⓝ | Toggle Locationlist via Trouble | [folke/trouble.nvim] |

### Coding

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| Ctrl+q | Ⓝ | Start recording macro | `q` |
| Space cf | Ⓝ β“‹ | Format | [plugins/formatting.lua] |
| Space cF | Ⓝ β“‹ | Format injected langs | [plugins/formatting.lua] |
| Space cc | Ⓝ | Generate doc annotations | [danymat/neogen] |
| Shift+Return | β’Ύ | Start new line from any cursor position | `o` |
| ] Space | Ⓝ | Add new line below | `o` |
| [ Space | Ⓝ | Add new line above | `O` |
| gc | Ⓝ β“‹ | Comment prefix | [numToStr/Comment.nvim] |
| gcc | Ⓝ β“‹ | Toggle comments | [numToStr/Comment.nvim] |
| Space+j or k | Ⓝ β“‹ | Move lines down/up | `:m` … |
| Space+v | Ⓝ β“‹ | Toggle line-wise comments | [numToStr/Comment.nvim] |
| Space+V | Ⓝ β“‹ | Toggle block-wise comments | [numToStr/Comment.nvim] |
| Space+dd | Ⓝ β“‹ | Duplicate line or selection | [config/keymaps.lua] |
| Space+cw | Ⓝ | Remove all spaces at EOL | [echasnovski/mini.trailspace] |
| Space+cid | Ⓝ | LazyDev | [folke/lazydev.nvim] |
| Space+cif | Ⓝ | LazyFormatterInfo | [LazyVim/LazyVim] |
| Space+cir | Ⓝ | LazyRoot | [LazyVim/LazyVim] |
| sj / sk | Ⓝ | Join/split arguments | [echasnovski/mini.splitjoin] |

### Search, Substitute, Diff

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| \* / # | Ⓝ β“‹ | Search partial words | `g*` / `g#` |
| g\* / g# | Ⓝ β“‹ | Search whole-word forward/backward | `*` / `#` |
| Ctrl+c | Ⓝ | Change inner word | `ciw` |
| Escape | Ⓝ | Clear search highlight | `:nohlsearch` |
| Backspace | Ⓝ | Match bracket | `%` |
| Space+bf | Ⓝ | Diff current windows in tab | `windo diffthis` |
| Space+bF | Ⓝ | External diff | `!vim.g.diffprg % #` |
| ss | Ⓝ β“‹ β“„ | Flash jump | [folke/flash.nvim] |
| S | Ⓝ β“‹ β“„ | Flash treesitter | [folke/flash.nvim] |
| r | β“„ | Flash remote | [folke/flash.nvim] |
| R | β“‹ β“„ | Flash treesitter search | [folke/flash.nvim] |
| Ctrl+s | β’Έ | Toggle flash in search input | [folke/flash.nvim] |

### Command & History

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| g! | Ⓝ | Read vim command into buffer | `:put=execute('⌴')` |
| Ctrl+n / p | β’Έ | Switch history search pairs | ↓ / ↑ |
| ↓ / ↑ | β’Έ | Switch history search pairs | `Ctrl` `n`/`p` |

### File Operations

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| Space+cd | Ⓝ | Switch tab to the directory of current buffer | `:tcd %:p:h` |
| Space+w or M+s | Ⓝ | Write buffer to file | `:write` |
| Ctrl+s | Ⓝ β“‹ β’Έ | Write buffer to file | `:write` |

### 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` |
| Space qq | Ⓝ | Quit all and exit | `:quitall` |
| sp | Ⓝ | Choose a window to edit | [s1n7ax/nvim-window-picker] |
| sw | Ⓝ | Switch editing window with selected | [s1n7ax/nvim-window-picker] |
| 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` … |

### Plugins

| Key | Mode | Action | Plugin or Mapping |
| ----- |:----:| ------------------ | ------ |
| ;+c | Ⓝ | Open context-menu | [lua/rafi/util/contextmenu.lua] |
| gCtrl+o | Ⓝ | Navigate to previous file on jumplist | [util/edit.lua] |
| gCtrl+i | Ⓝ | Navigate to next file on jumplist | [util/edit.lua] |
| Ctrl+/ | Ⓝ | Toggle terminal | [folke/snacks.nvim] |
| Space l | Ⓝ | Open Lazy | [folke/lazy.nvim] |
| Space o | Ⓝ | Open Outline side | [hedyhli/outline.nvim] |
| Space ? | Ⓝ | Open the macOS dictionary on current word | `:!open dict://` |
| Space cp | Ⓝ | Toggle Markdown preview | iamcco/markdown-preview.nvim |
| Space mc | Ⓝ | 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 gt | Ⓝ | Open Lazygit (root dir) | [config/keymaps.lua] |
| Space gT | Ⓝ | Open Lazygit (cwd) | [config/keymaps.lua] |
| Space gF | Ⓝ | Open Lazygit on current file history | [config/keymaps.lua] |
| Space gl | Ⓝ | Open Lazygit log | [config/keymaps.lua] |
| Space gL | Ⓝ | Open Lazygit log (cwd) | [config/keymaps.lua] |
| Space gb | Ⓝ | Git blame | [FabijanZulj/blame.nvim] |
| Space gB | Ⓝ | Git blame in window | [FabijanZulj/blame.nvim] |
| Space gm | Ⓝ | Reveal commit under cursor | [config/keymaps.lua] |
| Space go | Ⓝ β“‹ | Open source-code URL in browser | [config/keymaps.lua] |
| Space gY | Ⓝ β“‹ | Copy source-code URL | [config/keymaps.lua] |
| Space gu | Ⓝ | Open undo-tree | [mbbill/undotree] |
| Space mg | Ⓝ | Open Neogit | [NeogitOrg/neogit] |
| 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 mo | Ⓝ | Update Markdown TOC | [mzlogin/vim-markdown-toc] |

#### Plugin: Mini.Surround

See [echasnovski/mini.surround] for more mappings and usage information.

| Key | Mode | Action |
| -------------- |:-----:| ---------------------------- |
| sa & movement | Ⓝ β“‹ | Add surrounding |
| cs & movement | Ⓝ | Replace surrounding |
| ds & movement | Ⓝ | Delete surrounding |
| gzf & movement | Ⓝ | Find surrounding (to the right) |
| gzF & movement | Ⓝ | Find surrounding (to the left) |
| gzh & movement | Ⓝ | Highlight surrounding |
| gzn & movement | Ⓝ | Update neighbor lines |

#### 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 hr | Ⓝ β“‹ | Reset hunk |
| Space hu | Ⓝ | Undo stage hunk |
| Space hS | Ⓝ | Stage buffer |
| Space hR | Ⓝ | Reset buffer |
| Space hd | Ⓝ | Diff against the index |
| Space hD | Ⓝ | Diff against the last commit |
| Space hw | Ⓝ | Toggle word diff |
| Space hl | Ⓝ | Publish hunks to location-list |
| Space htb | Ⓝ | Toggle git current line blame |
| Space htd | Ⓝ | Toggle git deleted |
| Space htw | Ⓝ | Toggle git word diff |
| Space htl | Ⓝ | Toggle git line highlight |
| Space htn | Ⓝ | Toggle git number highlight |
| Space hts | Ⓝ | Toggle git signs |
| ih | β“„ | Select inner hunk operator |

#### Plugin: Diffview

See [sindrets/diffview.nvim] for more mappings and usage information.

| Key | Mode | Action |
| ----- |:----:| ------------------ |
| Space gd | Ⓝ | Diff view file history |
| Space gv | Ⓝ | Diff view open |
| | | Β  |
| **Within _diffview_ "view" window** | | Β  |
| | | Β  |
| Tab / Shift+Tab | Ⓝ | Select next/previous entry |
| ; a | Ⓝ | Focus file |
| ; e | Ⓝ | Toggle files panel |
| | | Β  |
| **Within _diffview_ "file" panel** | | Β  |
| | | Β  |
| q | Ⓝ | Close |
| h | Ⓝ | Previous entry |
| o | Ⓝ | Focus entry |
| gf | Ⓝ | Open file |
| sg | Ⓝ | Open file in split |
| st | Ⓝ | Open file in new tab |
| Ctrl+r | Ⓝ | Refresh files |
| ; e | Ⓝ | Toggle panel |
| | | Β  |
| **Within _diffview_ "history" panel** | | Β  |
| | | Β  |
| q | Ⓝ | Close diffview |
| o | Ⓝ | Focus entry |
| O | Ⓝ | Show options |

#### Plugin: Telescope

See [telescope.nvim] for more mappings and usage information.

| Key | Mode | Action |
| ----- |:----:| ------------------ |
| ;r | Ⓝ | Results of the previous picker |
| ;p | Ⓝ | List of the previous pickers |
| ;f | Ⓝ | File search |
| ;g | Ⓝ | Grep search |
| ;b | Ⓝ | Buffers |
| ;h | Ⓝ | Highlights |
| ;j | Ⓝ | Jump points |
| ;m | Ⓝ | Marks |
| ;o | Ⓝ | Vim options |
| ;t | Ⓝ | LSP workspace symbols |
| ;v | Ⓝ β“‹ | Yank history |
| ;n | Ⓝ | Plugins |
| ;k | Ⓝ | Thesaurus |
| ;u | Ⓝ | Spelling suggestions |
| ;s | Ⓝ | Sessions |
| ;x | Ⓝ | Old files |
| ;w | Ⓝ | Zk notes |
| ;z | Ⓝ | Zoxide directories |
| ;; | Ⓝ | Command history |
| ;: | Ⓝ | Commands |
| ;/ | Ⓝ | 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 gh | Ⓝ | Git stashes |
| Space gf | Ⓝ | Find files matching word under cursor |
| Space gg | Ⓝ β“‹ | Grep word under cursor |
| Space sc | Ⓝ | Colorschemes |
| 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 |
| | | Β  |
| **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 Telescope |
| Tab or Shift+Tab | Ⓝ β’Ύ | Next/previous candidate |
| Ctrl+d/u | Ⓝ β’Ύ | Scroll down/upwards |
| Ctrl+f/b | Ⓝ β’Ύ | Scroll preview down/upwards |
| Ctrl+j/k | Ⓝ β’Ύ | Scroll preview vertically |
| Ctrl+h/l | Ⓝ β’Ύ | Scroll preview horizontally |
| J or K | Ⓝ | Select candidates up/downwards |
| st | Ⓝ | Open in a new tab |
| sg | Ⓝ | Open in a vertical split |
| sv | Ⓝ | Open in a split |
| * | Ⓝ | Toggle selection |
| u | Ⓝ | Drop all |
| w | Ⓝ | Smart send to quickfix list |
| e | Ⓝ | Send to quickfix list |
| Ctrl+q | β’Ύ | Send to quickfix list |
| dd | Ⓝ | Delete entry (buffer list) |
| ! | Ⓝ | Edit in command line |

#### Plugin: Neo-Tree

See [nvim-neo-tree/neo-tree.nvim] for more mappings and usage information.

| Key | Mode | Action |
| ----- |:----:| ------------------ |
| fe / Spacee | Ⓝ | Toggle file explorer (root) |
| fE / SpaceE | Ⓝ | Toggle file explorer (cwd) |
| ge | Ⓝ | Open Git explorer |
| be | Ⓝ | Open Buffer explorer |
| xe | Ⓝ | Open Document explorer |
| ;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 |
| Tab or Shift+Tab | Ⓝ | 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 toggle |
| 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 |
| F | Ⓝ | 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: 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\ | Ⓝ | 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 |

#### Plugin: Zk

See [zk-org/zk-nvim] and [zk](https://github.com/zk-org/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 |

[Neovim]: https://github.com/neovim/neovim
[lazy.nvim]: https://github.com/folke/lazy.nvim
[lua/rafi/plugins/lsp/init.lua]: ./lua/rafi/plugins/lsp/init.lua
[nvim-lspconfig]: https://github.com/neovim/nvim-lspconfig
[nvim-cmp]: https://github.com/hrsh7th/nvim-cmp
[telescope.nvim]: https://github.com/nvim-telescope/telescope.nvim
[config/keymaps.lua]: ./lua/rafi/config/keymaps.lua
[util/edit.lua]: ./lua/rafi/util/edit.lua
[plugins/lsp/keymaps.lua]: ./lua/rafi/plugins/lsp/keymaps.lua
[lua/rafi/util/contextmenu.lua]: ./lua/rafi/util/contextmenu.lua
[nvim-treesitter]: https://github.com/nvim-treesitter/nvim-treesitter
[www.lazyvim.org/extras]: https://www.lazyvim.org/extras