Home

Awesome

compl.nvim

A minimal and dependency-free auto-completion plugin built on top of Vim's ins-completion mechanism.

Features

Planned Features

Design Philosophy

Focused on minimalism and performance, without the overhead of complex configurations or external dependencies. Therefore, supporting non-native features such as popup menus with fancy colors/highlights, etc., is a non-goal.

Installation

Using lazy.nvim:

{
  "brianaung/compl.nvim",
  opts = {
    -- Default options (no need to set them again)
    completion = {
      fuzzy = false,
      timeout = 100,
    },
    info = {
      enable = true,
      timeout = 100,
    },
    snippet = {
      enable = false,
      paths = {},
    },
  },
}

Recommended VIM Options

-- A set of options for better completion experience. See `:h completeopt`
vim.opt.completeopt = { "menuone", "noselect", "noinsert" }

-- Hides the ins-completion-menu messages. See `:h shm-c`
vim.opt.shortmess:append "c"

Custom Keymaps

By default, this plugin follows ins-completion mappings (See :h ins-completion-menu, :h popupmenu-keys). However, they can be easily remapped.

Below are some recipes using the vim.keymap.set() interface. See :h vim.keymap.set().

Accept completion using <CR>

vim.keymap.set("i", "<CR>", function()
  if vim.fn.complete_info()["selected"] ~= -1 then return "<C-y>" end
  if vim.fn.pumvisible() ~= 0 then return "<C-e><CR>" end
  return "<CR>"
end, { expr = true })

Change selection using <Tab> and <Shift-Tab>

vim.keymap.set("i", "<Tab>", function()
  if vim.fn.pumvisible() ~= 0 then return "<C-n>" end
  return "<Tab>"
end, { expr = true })

vim.keymap.set("i", "<S-Tab>", function()
  if vim.fn.pumvisible() ~= 0 then return "<C-p>" end
  return "<S-Tab>"
end, { expr = true })

Snippet jumps

vim.keymap.set({ "i", "s" }, "<C-k>", function()
  if vim.snippet.active { direction = 1 } then
    return "<cmd>lua vim.snippet.jump(1)<cr>"
  end
end, { expr = true })

vim.keymap.set({ "i", "s" }, "<C-j>", function()
  if vim.snippet.active { direction = -1 } then
    return "<cmd>lua vim.snippet.jump(-1)<cr>"
  end
end, { expr = true })

Using VS Code style custom snippets

You can seamlessly integrate custom snippets into your existing completion workflow without any additional dependencies. Snippets from the specified paths are parsed and formatted into appropriate LSP responses, and are passed into a lightweight internal LSP server, which then returns them as completion items when Neovim's LSP client sends a textDocument/completion request.

Example: Using Friendly Snippets

To use a collection of snippets such as those provided in rafamadriz/friendly-snippets, install it as a dependency and point to the location of its package.json manifest file. Here's how to configure it using lazy.nvim:

{
  "brianaung/compl.nvim",
  dependencies = {
    "rafamadriz/friendly-snippets"
  },
  opts = {
    -- ...
    snippet = {
      enable = true,
      paths = {
	vim.fn.stdpath "data" .. "/lazy/friendly-snippets",
	-- You can include more paths that contains the package.json manifest for your custom snippets. See below for defining your own snippets.
      },
    },
    -- ...
  },
}

Defining Your Own Snippets

If you'd like to define your own snippets for a specific language, you can create a JSON file with your snippets following this syntax.

You’ll then need to create a package.json manifest that will describe how to retrieve snippets for each filetype.

References

Similar alternatives