-
Notifications
You must be signed in to change notification settings - Fork 411
Language Server Specific Samples
David Thievon edited this page Dec 7, 2024
·
8 revisions
require('packer').startup(function(use)
--packer
use 'wbthomason/packer.nvim'
--lsp
use 'neovim/nvim-lspconfig'
--auto complete
use 'hrsh7th/cmp-nvim-lsp'
use 'hrsh7th/cmp-buffer'
use 'hrsh7th/cmp-path'
use 'hrsh7th/cmp-cmdline'
use 'hrsh7th/nvim-cmp'
--
use 'hrsh7th/cmp-vsnip'
use 'hrsh7th/vim-vsnip'
vim.opt.completeopt = { "menu", "menuone", "noselect" }
end)
local has_words_before = function()
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil
end
local feedkey = function(key, mode)
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true)
end
local cmp = require('cmp')
cmp.setup({
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body) -- For `vsnip` users.
end,
},
mapping = {
-- ['<CR>'] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif vim.fn["vsnip#available"](1) == 1 then
feedkey("<Plug>(vsnip-expand-or-jump)", "")
elseif has_words_before() then
cmp.complete()
else
fallback() -- The fallback function sends a already mapped key. In this case, it's probably `<Tab>`.
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function()
if cmp.visible() then
cmp.select_prev_item()
elseif vim.fn["vsnip#jumpable"](-1) == 1 then
feedkey("<Plug>(vsnip-jump-prev)", "")
end
end, { "i", "s" }),
},
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'vsnip' }, -- For vsnip users.
}, {
{ name = 'buffer' },
})
})
local capabilities = require('cmp_nvim_lsp').default_capabilities() --nvim-cmp
local on_attach = function(client, bufnr)
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end
buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')
end
-- Setup lspconfig.
local nvim_lsp = require('lspconfig')
-- setup languages
-- GoLang
nvim_lsp['gopls'].setup{
cmd = {'gopls'},
-- on_attach = on_attach,
capabilities = capabilities,
settings = {
gopls = {
experimentalPostfixCompletions = true,
analyses = {
unusedparams = true,
shadow = true,
},
staticcheck = true,
},
},
init_options = {
usePlaceholders = true,
}
}
vim.opt.completeopt = "menu,menuone,noinsert"
require("packer").startup({{
{ "wbthomason/packer.nvim" },
{ "hrsh7th/nvim-cmp" },
{ "hrsh7th/cmp-buffer" },
{ "hrsh7th/cmp-nvim-lua" },
{ "hrsh7th/cmp-nvim-lsp" },
{ "hrsh7th/cmp-nvim-lsp-signature-help" },
{ "hrsh7th/cmp-path" },
{ "neovim/nvim-lspconfig" },
{ "L3MON4D3/LuaSnip" },
{ "saadparwaiz1/cmp_luasnip" },
{ "simrat39/rust-tools.nvim" },
}, config = {}})
-- Setup cmp
local cmp = require("cmp")
cmp.setup({
mapping = cmp.mapping.preset.insert({ -- Preset: ^n, ^p, ^y, ^e, you know the drill..
["<C-d>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
}),
snippet = {
expand = function(args)
require("luasnip").lsp_expand(args.body)
end,
},
sources = cmp.config.sources({
{ name = "nvim_lsp" },
{ name = "nvim_lsp_signature_help" },
{ name = "nvim_lua" },
{ name = "luasnip" },
{ name = "path" },
}, {
{ name = "buffer", keyword_length = 3 },
}),
})
-- Setup buffer-local keymaps / options for LSP buffers
local capabilities = require("cmp_nvim_lsp").default_capabilities()
local lsp_attach = function(client, buf)
-- Example maps, set your own with vim.api.nvim_buf_set_keymap(buf, "n", <lhs>, <rhs>, { desc = <desc> })
-- or a plugin like which-key.nvim
-- <lhs> <rhs> <desc>
-- "K" vim.lsp.buf.hover "Hover Info"
-- "<leader>qf" vim.diagnostic.setqflist "Quickfix Diagnostics"
-- "[d" vim.diagnostic.goto_prev "Previous Diagnostic"
-- "]d" vim.diagnostic.goto_next "Next Diagnostic"
-- "<leader>e" vim.diagnostic.open_float "Explain Diagnostic"
-- "<leader>ca" vim.lsp.buf.code_action "Code Action"
-- "<leader>cr" vim.lsp.buf.rename "Rename Symbol"
-- "<leader>fs" vim.lsp.buf.document_symbol "Document Symbols"
-- "<leader>fS" vim.lsp.buf.workspace_symbol "Workspace Symbols"
-- "<leader>gq" vim.lsp.buf.formatting_sync "Format File"
vim.api.nvim_buf_set_option(buf, "formatexpr", "v:lua.vim.lsp.formatexpr()")
vim.api.nvim_buf_set_option(buf, "omnifunc", "v:lua.vim.lsp.omnifunc")
vim.api.nvim_buf_set_option(buf, "tagfunc", "v:lua.vim.lsp.tagfunc")
end
-- Setup rust_analyzer via rust-tools.nvim
require("rust-tools").setup({
server = {
capabilities = capabilities,
on_attach = lsp_attach,
}
})
-- Keymaps for Luasnip
local ls = require("luasnip")
vim.keymap.set({ "i", "s" }, "<C-k>", function()
if ls.expand_or_jumpable() then
ls.expand_or_jump()
end
end, { silent = true })
vim.keymap.set({ "i", "s" }, "<C-j>", function()
if ls.jumpable(-1) then
ls.jump(-1)
end
end, { silent = true })
vim.keymap.set("i", "<C-l>", function()
if ls.choice_active() then
ls.change_choice(1)
end
end)