nvim/completion.lua
2024-01-25 20:22:20 +01:00

121 lines
4.4 KiB
Lua

-- Set completeopt to have a better completion experience
-- :help completeopt
-- menuone: popup even when there's only one match
-- noinsert: Do not insert text until a selection is made
-- noselect: Do not select, force to select one from the menu
-- shortness: avoid showing extra messages when using completion
-- updatetime: set updatetime for CursorHold
vim.opt.completeopt = {'menuone', 'noselect', 'noinsert'}
vim.opt.shortmess = vim.opt.shortmess + {c = true}
vim.api.nvim_set_option('updatetime', 300)
-- Fixed column for diagnostics to appear
-- Show autodiagnostic popup on cursor hover_range
-- Goto previous / next diagnostic warning / error
-- Show inlay_hints more frequently
vim.cmd([[
set signcolumn=yes
autocmd CursorHold * lua vim.diagnostic.open_float(nil, { focusable = false })
]])
vim.opt.spell = true
vim.opt.spelllang = {'en_us'}
vim.lsp.handlers["textDocument/publishDiagnostics"] =
vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics,
{virtual_text = true})
-- Completion Plugin Setup
local cmp = require 'cmp'
cmp.setup({
-- Enable LSP snippets
snippet = {expand = function(args) vim.fn["vsnip#anonymous"](args.body) end},
-- <C> = CTRL
-- <S> = SHIFT
mapping = {
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-n>'] = cmp.mapping.select_next_item(),
-- Add tab support
['<S-Tab>'] = cmp.mapping.select_prev_item(),
['<Tab>'] = cmp.mapping.select_next_item(),
['<C-S-f>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete(),
['<C-e>'] = cmp.mapping.close(),
['<CR>'] = cmp.mapping.confirm({
behavior = cmp.ConfirmBehavior.Insert,
select = true
})
},
-- Installed sources:
sources = {
{name = 'nvim_lsp', keyword_length = 1}, -- from language server
{name = 'nvim_lsp_signature_help'}, -- display function signatures with current parameter emphasized
{name = 'nvim_lua', keyword_length = 2}, -- complete neovim's Lua runtime API such vim.lsp.*
{
name = 'omni',
option = {disable_omnifuncs = {'v:lua.vim.lsp.omnifunc'}}
}, {name = 'async_path', keyword_length = 3}, -- file paths
{name = 'buffer', keyword_length = 3}, -- source current buffer
{name = 'calc'}, -- source for math calculation
{
name = 'spell',
keyword_length = 4,
option = {
keep_all_entries = false,
enable_in_context = function() return true end
}
}, {name = 'conventionalcommits', keyword_length = 1}, {name = 'crates'}
},
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered()
},
formatting = {
fields = {'menu', 'abbr' --[[ 'kind' ]] },
format = function(entry, item)
local menu_icon = {
nvim_lsp = 'λ',
vsnip = '',
buffer = '',
async_path = '',
spell = '',
calc = '',
crates = ''
}
item.menu = menu_icon[entry.source.name]
if entry.source.name == "calc" then item.kind = "Math" end
return item
end
}
})
cmp.setup.cmdline('/', {sources = {{name = 'buffer'}}})
cmp.setup.cmdline(':', {
mapping = cmp.mapping.preset.cmdline(),
sources = cmp.config.sources({{name = 'path'}}, {
{name = 'cmdline', option = {ignore_cmds = {'Man', '!'}}}
})
})
vim.cmd(':set winhighlight=' .. cmp.config.window.bordered().winhighlight)
-- Setup language servers.
local lspconfig = require('lspconfig')
local deps = require("nvim-deps")
lspconfig.tsserver.setup({
cmd = {
(deps["typescript-language-server_path"] ..
"/bin/typescript-language-server"), "--stdio"
}
})
lspconfig.clangd.setup({cmd = {(deps["clang-tools_path"] .. "/bin/clangd")}})
lspconfig.bashls.setup({
cmd = {(deps["bash-language-server_path"] .. "/bin/bash-language-server")}
})
lspconfig.pylsp.setup({
cmd = { (deps["python-lsp-server_path"] .. "/bin/pylsp") },
})
lspconfig.lua_ls.setup({
cmd = { (deps["lua-lsp_path"] .. "/bin/lua-lsp") },
})
lspconfig.yamlls.setup({
cmd = { (deps["yaml-language-server_path"] .. "/bin/yaml-language-server"), "--stdio" },
})