Extra Plugins

Every plugin that works with Neovim works with LunarVim, here are some examples to get you started.

hopopen in new window

neovim motions on speed!

{
  "phaazon/hop.nvim",
  event = "BufRead",
  config = function()
    require("hop").setup()
    vim.api.nvim_set_keymap("n", "s", ":HopChar2<cr>", { silent = true })
    vim.api.nvim_set_keymap("n", "S", ":HopWord<cr>", { silent = true })
  end,
},
1
2
3
4
5
6
7
8
9

lightspeedopen in new window

jetpack codebase navigation

{
  "ggandor/lightspeed.nvim",
  event = "BufRead",
},
1
2
3
4

minimapopen in new window

blazing fast minimap/scrollbar written in Rust

{
  'wfxr/minimap.vim',
  run = "cargo install --locked code-minimap",
  -- cmd = {"Minimap", "MinimapClose", "MinimapToggle", "MinimapRefresh", "MinimapUpdateHighlight"},
  config = function ()
    vim.cmd ("let g:minimap_width = 10")
    vim.cmd ("let g:minimap_auto_start = 1")
    vim.cmd ("let g:minimap_auto_start_win_enter = 1")
  end,
},
1
2
3
4
5
6
7
8
9
10

numbopen in new window

jump to the line

{
  "nacro90/numb.nvim",
  event = "BufRead",
  config = function()
  require("numb").setup {
    show_numbers = true, -- Enable 'number' for the window while peeking
    show_cursorline = true, -- Enable 'cursorline' for the window while peeking
  }
  end,
},
1
2
3
4
5
6
7
8
9
10

nvim-bqfopen in new window

better quickfix window

{
  "kevinhwang91/nvim-bqf",
  event = { "BufRead", "BufNew" },
  config = function()
  require("bqf").setup({
          auto_enable = true,
          preview = {
          win_height = 12,
          win_vheight = 12,
          delay_syntax = 80,
          border_chars = { "┃", "┃", "━", "━", "┏", "┓", "┗", "┛", "█" },
          },
          func_map = {
          vsplit = "",
          ptogglemode = "z,",
          stoggleup = "",
          },
          filter = {
          fzf = {
          action_for = { ["ctrl-s"] = "split" },
          extra_opts = { "--bind", "ctrl-o:toggle-all", "--prompt", "> " },
          },
          },
          })
  end,
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

nvim-spectreopen in new window

search and replace

{
  "windwp/nvim-spectre",
  event = "BufRead",
  config = function()
    require("spectre").setup()
  end,
},
1
2
3
4
5
6
7

rnvimropen in new window

ranger file explorer window

{
  "kevinhwang91/rnvimr",
    cmd = "RnvimrToggle",
    config = function()
      vim.g.rnvimr_draw_border = 1
      vim.g.rnvimr_pick_enable = 1
      vim.g.rnvimr_bw_enable = 1
      end,
},
1
2
3
4
5
6
7
8
9

snapopen in new window

fast finder system

{
  "camspiers/snap",
  rocks = "fzy",
  config = function()
    local snap = require "snap"
    local layout = snap.get("layout").bottom
    local file = snap.config.file:with { consumer = "fzy", layout = layout }
    local vimgrep = snap.config.vimgrep:with { layout = layout }
    snap.register.command("find_files", file { producer = "ripgrep.file" })
    snap.register.command("buffers", file { producer = "vim.buffer" })
    snap.register.command("oldfiles", file { producer = "vim.oldfile" })
    snap.register.command("live_grep", vimgrep {})
  end,
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14

vim-matchupopen in new window

navigate and highlight matching words

{
  "andymass/vim-matchup",
  event = "CursorMoved",
  config = function()
    vim.g.matchup_matchparen_offscreen = { method = "popup" }
  end,
},
1
2
3
4
5
6
7

Git

diffviewopen in new window

git diff in a single tabpage

{
  "sindrets/diffview.nvim",
  event = "BufRead",
},
1
2
3
4

git-blameopen in new window

show git blame

{
  "f-person/git-blame.nvim",
  event = "BufRead",
  config = function()
    vim.cmd "highlight default link gitblame SpecialComment"
    vim.g.gitblame_enabled = 0
  end,
},
1
2
3
4
5
6
7
8

gitlinkeropen in new window

generate shareable file permalinks for several git web frontend hosts

{
  "ruifm/gitlinker.nvim",
  event = "BufRead",
  config = function()
  require("gitlinker").setup {
        opts = {
          -- remote = 'github', -- force the use of a specific remote
            -- adds current line nr in the url for normal mode
            add_current_line_on_normal_mode = true,
          -- callback for what to do with the url
            action_callback = require("gitlinker.actions").open_in_browser,
          -- print the url after performing the action
            print_url = false,
          -- mapping to call url generation
            mappings = "<leader>gy",
        },
      }
  end,
  requires = "nvim-lua/plenary.nvim",
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

octoopen in new window

edit and review GitHub issues and pull requests

{
  "pwntester/octo.nvim",
  event = "BufRead",
},
1
2
3
4

vim-fugitiveopen in new window

git wrapper

{
  "tpope/vim-fugitive",
  cmd = {
    "G",
    "Git",
    "Gdiffsplit",
    "Gread",
    "Gwrite",
    "Ggrep",
    "GMove",
    "GDelete",
    "GBrowse",
    "GRemove",
    "GRename",
    "Glgrep",
    "Gedit"
  },
  ft = {"fugitive"}
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

vim-gistopen in new window

create/edit Github gists

{
  "mattn/vim-gist",
  event = "BufRead",
  requires = "mattn/webapi-vim",
},
1
2
3
4
5

Treesitter

nvim-ts-autotagopen in new window

autoclose and autorename html tag

{
  "windwp/nvim-ts-autotag",
  event = "InsertEnter",
  config = function()
    require("nvim-ts-autotag").setup()
  end,
},
1
2
3
4
5
6
7

nvim-ts-context-commentstringopen in new window

commentstring option based on the cursor location

{
  "JoosepAlviste/nvim-ts-context-commentstring",
  event = "BufRead",
},
1
2
3
4

nvim-ts-rainbowopen in new window

rainbow parentheses

{
  "p00f/nvim-ts-rainbow",
},
1
2
3

playgroundopen in new window

view treesitter information

{
  "nvim-treesitter/playground",
  event = "BufRead",
},
1
2
3
4

Telescope Extensions

telescope-fzy-native.nvimopen in new window

fzy style sorter that is compiled

{
  "nvim-telescope/telescope-fzy-native.nvim",
  run = "make",
  event = "BufRead",
},
1
2
3
4
5

telescope-projectopen in new window

switch between projects

{
  "nvim-telescope/telescope-project.nvim",
  event = "BufWinEnter",
  setup = function()
    vim.cmd [[packadd telescope.nvim]]
  end,
},
1
2
3
4
5
6
7

Colorschemes

lsp-colorsopen in new window

lsp diagnostics highlight groups for non lsp colorschemes

{
  "folke/lsp-colors.nvim",
  event = "BufRead",
},
1
2
3
4

lush.nvimopen in new window

colorscheme creation aid

{
  "rktjmp/lush.nvim",
},
1
2
3

nvim-colorizeropen in new window

color highlighter

{
  "norcalli/nvim-colorizer.lua",
    config = function()
      require("colorizer").setup({ "*" }, {
          RGB = true, -- #RGB hex codes
          RRGGBB = true, -- #RRGGBB hex codes
          RRGGBBAA = true, -- #RRGGBBAA hex codes
          rgb_fn = true, -- CSS rgb() and rgba() functions
          hsl_fn = true, -- CSS hsl() and hsla() functions
          css = true, -- Enable all CSS features: rgb_fn, hsl_fn, names, RGB, RRGGBB
          css_fn = true, -- Enable all CSS *functions*: rgb_fn, hsl_fn
          })
  end,
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14

LSP Enhancement

compe-tabnineopen in new window

TabNine completion engine for hrsh7th/nvim-compe

{
  "tzachar/compe-tabnine",
  run = "./install.sh",
  requires = "hrsh7th/nvim-compe",
  event = "InsertEnter",
},
1
2
3
4
5
6

goto-previewopen in new window

previewing goto definition calls

{
  "rmagatti/goto-preview",
  config = function()
  require('goto-preview').setup {
        width = 120; -- Width of the floating window
        height = 25; -- Height of the floating window
        default_mappings = false; -- Bind default mappings
        debug = false; -- Print debug information
        opacity = nil; -- 0-100 opacity level of the floating window where 100 is fully transparent.
        post_open_hook = nil -- A function taking two arguments, a buffer and a window to be ran as a hook.
        -- You can use "default_mappings = true" setup option
        -- Or explicitly set keybindings
        -- vim.cmd("nnoremap gpd <cmd>lua require('goto-preview').goto_preview_definition()<CR>")
        -- vim.cmd("nnoremap gpi <cmd>lua require('goto-preview').goto_preview_implementation()<CR>")
        -- vim.cmd("nnoremap gP <cmd>lua require('goto-preview').close_all_win()<CR>")
    }
  end
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

lsp-rooteropen in new window

cwd to the project's root directory

{
  "ahmedkhalf/lsp-rooter.nvim",
  event = "BufRead",
  config = function()
    require("lsp-rooter").setup()
  end,
},
1
2
3
4
5
6
7

lsp_signature.nvimopen in new window

hint when you type

{
  "ray-x/lsp_signature.nvim",
  event = "BufRead",
  config = function()
    require "lsp_signature".setup()
  end
}
1
2
3
4
5
6
7

symbols-outline.nvimopen in new window

a tree like view for symbols

{
  "simrat39/symbols-outline.nvim",
  cmd = "SymbolsOutline",
},
1
2
3
4

trouble.nvimopen in new window

diagnostics, references, telescope results, quickfix and location lists

{
  "folke/trouble.nvim",
    cmd = "TroubleToggle",
},
1
2
3
4

Also define keybindings in config.lua

lvim.builtin.which_key.mappings["t"] = {
  name = "Diagnostics",
  t = { "<cmd>TroubleToggle<cr>", "trouble" },
  w = { "<cmd>TroubleToggle lsp_workspace_diagnostics<cr>", "workspace" },
  d = { "<cmd>TroubleToggle lsp_document_diagnostics<cr>", "document" },
  q = { "<cmd>TroubleToggle quickfix<cr>", "quickfix" },
  l = { "<cmd>TroubleToggle loclist<cr>", "loclist" },
  r = { "<cmd>TroubleToggle lsp_references<cr>", "references" },
},
1
2
3
4
5
6
7
8
9

General

autosaveopen in new window

automatically saving your work whenever you make changes to it

{
  "Pocco81/AutoSave.nvim",
  config = function()
    require("autosave").setup()
  end,
},
1
2
3
4
5
6

codi.vimopen in new window

interactive scratchpad for hackers

{
  "metakirby5/codi.vim",
  cmd = "Codi",
},
1
2
3
4

dial.nvimopen in new window

extended incrementing/decrementing

{
  "monaqa/dial.nvim",
  event = "BufRead",
  config = function()
    local dial = require "dial"
    vim.cmd [[
    nmap <C-a> <Plug>(dial-increment)
      nmap <C-x> <Plug>(dial-decrement)
      vmap <C-a> <Plug>(dial-increment)
      vmap <C-x> <Plug>(dial-decrement)
      vmap g<C-a> <Plug>(dial-increment-additional)
      vmap g<C-x> <Plug>(dial-decrement-additional)
    ]]

    dial.augends["custom#boolean"] = dial.common.enum_cyclic {
      name = "boolean",
      strlist = { "true", "false" },
    }
    table.insert(dial.config.searchlist.normal, "custom#boolean")

    -- For Languages which prefer True/False, e.g. python.
    dial.augends["custom#Boolean"] = dial.common.enum_cyclic {
      name = "Boolean",
      strlist = { "True", "False" },
    }
    table.insert(dial.config.searchlist.normal, "custom#Boolean")
  end,
},

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

glow.nvimopen in new window

preview markdown in neovim

-- You must install glow globally
-- https://github.com/charmbracelet/glow
-- yay -S glow
{
  "npxbr/glow.nvim",
  ft = {"markdown"}
  -- run = "yay -S glow"
},
1
2
3
4
5
6
7
8

indent-blanklineopen in new window

indentation guides for every line

{
  "lukas-reineke/indent-blankline.nvim",
  event = "BufRead",
  setup = function()
    vim.g.indentLine_enabled = 1
    vim.g.indent_blankline_char = "▏"
    vim.g.indent_blankline_filetype_exclude = {"help", "terminal", "dashboard"}
    vim.g.indent_blankline_buftype_exclude = {"terminal"}
    vim.g.indent_blankline_show_trailing_blankline_indent = false
    vim.g.indent_blankline_show_first_indent_level = false
  end
},
1
2
3
4
5
6
7
8
9
10
11
12

markdown-preview.nvimopen in new window

preview markdown in the browser

{
  "iamcco/markdown-preview.nvim",
  run = "cd app && npm install",
  ft = "markdown",
  config = function()
    vim.g.mkdp_auto_start = 1
  end,
},
1
2
3
4
5
6
7
8

neoscrollopen in new window

smooth scrolling

{
  "karb94/neoscroll.nvim",
  event = "WinScrolled",
  config = function()
  require('neoscroll').setup({
        -- All these keys will be mapped to their corresponding default scrolling animation
        mappings = {'<C-u>', '<C-d>', '<C-b>', '<C-f>',
        '<C-y>', '<C-e>', 'zt', 'zz', 'zb'},
        hide_cursor = true,          -- Hide cursor while scrolling
        stop_eof = true,             -- Stop at <EOF> when scrolling downwards
        use_local_scrolloff = false, -- Use the local scope of scrolloff instead of the global scope
        respect_scrolloff = false,   -- Stop scrolling when the cursor reaches the scrolloff margin of the file
        cursor_scrolls_alone = true, -- The cursor will keep on scrolling even if the window cannot scroll further
        easing_function = nil,        -- Default easing function
        pre_hook = nil,              -- Function to run before the scrolling animation starts
        post_hook = nil,              -- Function to run after the scrolling animation ends
        })
  end
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

neuronopen in new window

next generation note-taking

	{"oberblastmeister/neuron.nvim"},
1

nvim-lastplaceopen in new window

pick up where you left off

	{
		"ethanholz/nvim-lastplace",
		event = "BufRead",
		config = function()
			require("nvim-lastplace").setup({
				lastplace_ignore_buftype = { "quickfix", "nofile", "help" },
				lastplace_ignore_filetype = {
					"gitcommit", "gitrebase", "svn", "hgcommit",
				},
				lastplace_open_folds = true,
			})
		end,
	},
1
2
3
4
5
6
7
8
9
10
11
12
13

persistenceopen in new window

simple session management

{
  "folke/persistence.nvim",
    event = "BufReadPre", -- this will only start session saving when an actual file was opened
    module = "persistence",
    config = function()
      require("persistence").setup {
        dir = vim.fn.expand(vim.fn.stdpath "config" .. "/session/"),
        options = { "buffers", "curdir", "tabpages", "winsize" },
      }
  end,
},
1
2
3
4
5
6
7
8
9
10
11

Also define keybindings in your config.lua

  lvim.builtin.which_key.mappings["S"]= {
    name = "Session",
    c = { "<cmd>lua require('persistence').load()<cr>", "Restore last session for current dir" },
    l = { "<cmd>lua require('persistence').load({ last = true })<cr>", "Restore last session" },
    Q = { "<cmd>lua require('persistence').stop()<cr>", "Quit without saving session" },
  }
1
2
3
4
5
6

todo-comments.nvimopen in new window

highlight and search for todo comments

{
  "folke/todo-comments.nvim",
  event = "BufRead",
  config = function()
    require("todo-comments").setup()
  end,
},
1
2
3
4
5
6
7

vim-cursorwordopen in new window

underlines the word under the cursor

{
  "itchyny/vim-cursorword",
    event = {"BufEnter", "BufNewFile"},
    config = function()
      vim.api.nvim_command("augroup user_plugin_cursorword")
      vim.api.nvim_command("autocmd!")
      vim.api.nvim_command("autocmd FileType NvimTree,lspsagafinder,dashboard,vista let b:cursorword = 0")
      vim.api.nvim_command("autocmd WinEnter * if &diff || &pvw | let b:cursorword = 0 | endif")
      vim.api.nvim_command("autocmd InsertEnter * let b:cursorword = 0")
      vim.api.nvim_command("autocmd InsertLeave * let b:cursorword = 1")
      vim.api.nvim_command("augroup END")
      end
},
1
2
3
4
5
6
7
8
9
10
11
12
13

vim-repeatopen in new window

enable repeating supported plugin maps with "."

{ "tpope/vim-repeat" },
1

vim-sanegxopen in new window

open url with gx

{
  "felipec/vim-sanegx",
  event = "BufRead",
},
1
2
3
4

vim-surroundopen in new window

mappings to delete, change and add surroundings

{
  "tpope/vim-surround",
  keys = {"c", "d", "y"}
},
1
2
3
4

vim-wakatimeopen in new window

metrics, insights, and time tracking automatically generated from your programming activity

{
  "wakatime/vim-wakatime"
}
1
2
3

Once installed and synced, add your WakaTime API Key via :WakaTimeApiKey command

Language specific

braceyopen in new window

live edit html, css, and javascript

{
  "turbio/bracey.vim",
  cmd = {"Bracey", "BracyStop", "BraceyReload", "BraceyEval"},
  run = "npm install --prefix server",
},
1
2
3
4
5

vim-bundleropen in new window

lightweight support for ruby's bundler

{
  "tpope/vim-bundler",
  cmd = {"Bundler", "Bopen", "Bsplit", "Btabedit"}
},
1
2
3
4

vim-railsopen in new window

edit ruby on rails applications

{
  "tpope/vim-rails",
  cmd = {
    "Eview",
    "Econtroller",
    "Emodel",
    "Smodel",
    "Sview",
    "Scontroller",
    "Vmodel",
    "Vview",
    "Vcontroller",
    "Tmodel",
    "Tview",
    "Tcontroller",
    "Rails",
    "Generate",
    "Runner",
    "Extract"
  }
},

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

lua-devopen in new window

full signature help, docs and completion for the nvim lua API in config.lua and init.lua

{
  "folke/lua-dev.nvim",
  config = function()
    local luadev = require("lua-dev").setup({
      lspconfig = lvim.lang.lua.lsp.setup
    })
    lvim.lang.lua.lsp.setup = luadev
  end
}
1
2
3
4
5
6
7
8
9