diff --git a/nvim/nvim/config/new/lua/lsp/cmp.lua b/nvim/nvim/config/new/lua/lsp/cmp.lua new file mode 100644 index 0000000..91e07de --- /dev/null +++ b/nvim/nvim/config/new/lua/lsp/cmp.lua @@ -0,0 +1,44 @@ +local cmp_status_ok, cmp = pcall(require, "cmp") +if not cmp_status_ok then + return +end + +cmp.setup({ + snippet = { + expand = function(args) + require('luasnip').lsp_expand(args.body) + end, + }, + mapping = { + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), + [''] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + [''] = cmp.mapping({ + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }), + [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. + }, + sources = cmp.config.sources({ + { name = "nvim_lsp" }, + { name = "buffer" }, + { name = "path" }, + }) +}) + +cmp.setup.cmdline('/', { + sources = { + { name = 'buffer' } + } +}) + +cmp.setup.cmdline(':', { + sources = cmp.config.sources({ + { name = 'path' } + }, { + { name = 'cmdline' } + }) +}) diff --git a/nvim/nvim/config/new/lua/lsp/handlers.lua b/nvim/nvim/config/new/lua/lsp/handlers.lua index bcf3a25..79b3008 100644 --- a/nvim/nvim/config/new/lua/lsp/handlers.lua +++ b/nvim/nvim/config/new/lua/lsp/handlers.lua @@ -1,7 +1,76 @@ local M = {} -local on_attach = function(client, bufnr) - local wk = require("which-key") +M.icons = { + Class = " ", + Color = " ", + Constant = " ", + Constructor = " ", + Enum = "了 ", + EnumMember = " ", + Field = " ", + File = " ", + Folder = " ", + Function = " ", + Interface = "ﰮ ", + Keyword = " ", + Method = "ƒ ", + Module = " ", + Property = " ", + Snippet = "﬌ ", + Struct = " ", + Text = " ", + Unit = " ", + Value = " ", + Variable = " ", +} + +M.setup = function() + local signs = { + { name = "DiagnosticSignError", text = "" }, + { name = "DiagnosticSignWarn", text = "" }, + { name = "DiagnosticSignInfo", text = "" }, + { name = "DiagnosticSignHint", text = "" }, + } + for _, sign in ipairs(signs) do + vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" }) + end + + vim.diagnostic.config({ + virtual_text = false, + update_in_insert = true, + }) + + local kinds = vim.lsp.protocol.CompletionItemKind + for i, kind in ipairs(kinds) do + kinds[i] = M.icons[kind] or kind + end +end + +local function lsp_highlight_document(client) + if client.resolved_capabilities.document_highlight then + vim.cmd [[ + augroup lsp_document_highlight + autocmd! * + autocmd! CursorHold lua vim.lsp.buf.document_highlight() + autocmd! CursorMoved lua vim.lsp.buf.clear_references() + augroup END + ]] + end +end + +local wk = require("which-key") +wk.register({ + ["[d"] = { 'lua vim.diagnostic.goto_prev()', "Prev diagnostic" }, + ["]d"] = { 'lua vim.diagnostic.goto_next()', "Next diagnostic" }, + gl = { "lua vim.diagnostic.open_float()", "See diagnostics" }, + ["l"] = { + name = "LSP", + i = { "LspInfo", "Info" }, + I = { "LspInstallInfo", "Installer Info" }, + }, +}) + +local lsp_keymaps = function(bufnr) wk.register({ g = { D = { 'lua vim.lsp.buf.declaration()', "Go to declaration" }, @@ -12,7 +81,6 @@ local on_attach = function(client, bufnr) K = { 'lua vim.lsp.buf.hover()', "See LSP tooltip" }, [""] = { 'lua vim.lsp.buf.signature_help()', "See signature help" }, ["l"] = { - name = "LSP", r = { 'lua vim.lsp.buf.rename()', "Rename" }, a = { 'lua vim.lsp.buf.code_action()', "Code action" }, f = { 'lua vim.lsp.buf.formatting()', "Format" }, @@ -24,6 +92,17 @@ end M.on_attach = function(client, bufnr) lsp_keymaps(bufnr) + lsp_highlight_document(client) end +local capabilities = vim.lsp.protocol.make_client_capabilities() + +local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") +if not status_ok then + return M +end + +M.capabilities = cmp_nvim_lsp.update_capabilities(capabilities) + + return M diff --git a/nvim/nvim/config/new/lua/lsp/init.lua b/nvim/nvim/config/new/lua/lsp/init.lua index 9ad1cde..f80e88a 100644 --- a/nvim/nvim/config/new/lua/lsp/init.lua +++ b/nvim/nvim/config/new/lua/lsp/init.lua @@ -1,2 +1,4 @@ require "lsp.lsp-install" +require("lsp.handlers").setup() +require "lsp.cmp" diff --git a/nvim/nvim/config/new/lua/plugins.lua b/nvim/nvim/config/new/lua/plugins.lua index 98c7472..a0c2c58 100644 --- a/nvim/nvim/config/new/lua/plugins.lua +++ b/nvim/nvim/config/new/lua/plugins.lua @@ -56,6 +56,14 @@ return packer.startup(function(use) 'neovim/nvim-lspconfig', 'williamboman/nvim-lsp-installer', } + use { + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-path", + "hrsh7th/cmp-cmdline", + "hrsh7th/nvim-cmp", + "L3MON4D3/LuaSnip", + } if PACKER_BOOTSTRAP then require("packer").sync()