From 3bf101624e1069354b700a291ce6190bdb2414b4 Mon Sep 17 00:00:00 2001 From: oupson Date: Fri, 23 Sep 2022 17:28:26 +0200 Subject: [PATCH] Add base config --- README.md | 17 +++- nvim/init.lua | 3 + nvim/lua/plugins/config/cmpconfig.lua | 75 ++++++++++++++ nvim/lua/plugins/config/lspconfig.lua | 141 ++++++++++++++++++++++++++ nvim/lua/plugins/init.lua | 68 +++++++++++++ 5 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 nvim/init.lua create mode 100644 nvim/lua/plugins/config/cmpconfig.lua create mode 100644 nvim/lua/plugins/config/lspconfig.lua create mode 100644 nvim/lua/plugins/init.lua diff --git a/README.md b/README.md index e0d65ec..b9eae3a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ # nvim-config - +## Structure +``` +nvim +├── init.lua +└── lua + ├── personal + │   ├── init.lua + │   ├── lspservers.lua + │   └── plugins.lua + └── plugins + ├── config + │   ├── cmpconfig.lua + │   └── lspconfig.lua + └── init.lua +``` +See the wiki for personal config \ No newline at end of file diff --git a/nvim/init.lua b/nvim/init.lua new file mode 100644 index 0000000..7d6ac91 --- /dev/null +++ b/nvim/init.lua @@ -0,0 +1,3 @@ +require('plugins.init') + +pcall(require, 'personal.init') \ No newline at end of file diff --git a/nvim/lua/plugins/config/cmpconfig.lua b/nvim/lua/plugins/config/cmpconfig.lua new file mode 100644 index 0000000..5bd9cc3 --- /dev/null +++ b/nvim/lua/plugins/config/cmpconfig.lua @@ -0,0 +1,75 @@ +local module = {} + +function module.config() + local cmp_status_ok, cmp = pcall(require, 'cmp') + if not cmp_status_ok then + return + end + + local luasnip_status_ok, luasnip = pcall(require, 'luasnip') + if not luasnip_status_ok then + return + end + + cmp.setup { + -- Load snippet support + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end + }, + + -- Completion settings + completion = { + -- completeopt = 'menu,menuone,noselect' + keyword_length = 2 + }, + + -- Key mapping + mapping = { + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.close(), + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true + }, + + -- Tab mapping + [''] = function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, + [''] = function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end + }, + + -- Load sources, see: https://github.com/topics/nvim-cmp + sources = {{ + name = 'nvim_lsp' + }, { + name = 'luasnip' + }, { + name = 'path' + }, { + name = 'buffer' + }} + } +end + +return module diff --git a/nvim/lua/plugins/config/lspconfig.lua b/nvim/lua/plugins/config/lspconfig.lua new file mode 100644 index 0000000..4d6c5f0 --- /dev/null +++ b/nvim/lua/plugins/config/lspconfig.lua @@ -0,0 +1,141 @@ +local module = {} + +function module.config() + local lsp_status_ok, lspconfig = pcall(require, 'lspconfig') + if not lsp_status_ok then + return + end + + local cmp_status_ok, cmp_nvim_lsp = pcall(require, 'cmp_nvim_lsp') + if not cmp_status_ok then + return + end + + -- Diagnostic options, see: `:help vim.diagnostic.config` + vim.diagnostic.config({ + update_in_insert = true, + float = { + focusable = false, + style = "minimal", + border = "rounded", + source = "always", + header = "", + prefix = "" + } + }) + + -- Show line diagnostics automatically in hover window + vim.cmd([[ + autocmd CursorHold,CursorHoldI * lua vim.diagnostic.open_float(nil, { focus = false }) +]]) + + -- Add additional capabilities supported by nvim-cmp + -- See: https://github.com/neovim/nvim-lspconfig/wiki/Autocompletion + local capabilities = vim.lsp.protocol.make_client_capabilities() + -- capabilities = cmp_nvim_lsp.update_capabilities(capabilities) + + capabilities.textDocument.completion.completionItem.documentationFormat = {'markdown', 'plaintext'} + capabilities.textDocument.completion.completionItem.snippetSupport = true + capabilities.textDocument.completion.completionItem.preselectSupport = true + capabilities.textDocument.completion.completionItem.insertReplaceSupport = true + capabilities.textDocument.completion.completionItem.labelDetailsSupport = true + capabilities.textDocument.completion.completionItem.deprecatedSupport = true + capabilities.textDocument.completion.completionItem.commitCharactersSupport = true + capabilities.textDocument.completion.completionItem.tagSupport = { + valueSet = {1} + } + capabilities.textDocument.completion.completionItem.resolveSupport = { + properties = {'documentation', 'detail', 'additionalTextEdits'} + } + + -- Use an on_attach function to only map the following keys + -- after the language server attaches to the current buffer + 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 + + -- Highlighting references + if client.resolved_capabilities.document_highlight then + vim.api.nvim_exec([[ + augroup lsp_document_highlight + autocmd! * + autocmd CursorHold lua vim.lsp.buf.document_highlight() + autocmd CursorMoved lua vim.lsp.buf.clear_references() + augroup END + ]], false) + end + + -- Enable completion triggered by + buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- Mappings. + local opts = { + noremap = true, + silent = true + } + + -- See `:help vim.lsp.*` for documentation on any of the below functions + buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) + buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) + buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) + buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) + buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) + buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) + buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) + buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) + buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) + buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) + buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) + buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) + buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) + buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) + buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) + buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) + buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) + end + + -- Define `root_dir` when needed + -- See: https://github.com/neovim/nvim-lspconfig/issues/320 + -- This is a workaround, maybe not work with some servers. + local root_dir = function() + return vim.fn.getcwd() + end + + -- Default servers + local servers = {} + + -- Call setup + for _, lsp in ipairs(servers) do + lspconfig[lsp].setup { + on_attach = on_attach, + root_dir = root_dir, + capabilities = capabilities, + flags = { + -- default in neovim 0.7+ + debounce_text_changes = 150 + } + } + end + + -- Load servers from user config + user_servers_ok, user_servers = pcall(require, "personal.lspservers") + if user_servers_ok then + for _, lsp in ipairs(user_servers) do + lspconfig[lsp].setup { + on_attach = on_attach, + root_dir = root_dir, + capabilities = capabilities, + flags = { + -- default in neovim 0.7+ + debounce_text_changes = 150 + } + } + end + end +end + +return module diff --git a/nvim/lua/plugins/init.lua b/nvim/lua/plugins/init.lua new file mode 100644 index 0000000..fa04a54 --- /dev/null +++ b/nvim/lua/plugins/init.lua @@ -0,0 +1,68 @@ +local ensure_packer = function() + local fn = vim.fn + local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' + if fn.empty(fn.glob(install_path)) > 0 then + fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path}) + vim.cmd [[packadd packer.nvim]] + return true + end + return false +end + +local packer_bootstrap = ensure_packer() + +return require('packer').startup(function(use) + use 'wbthomason/packer.nvim' + + use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate' } + + -- LSP + use { + "neovim/nvim-lspconfig", + config = function() + require("plugins.config.lspconfig").config() + end + } + + -- Autocomplete + use { + "hrsh7th/nvim-cmp", + requires = { + "L3MON4D3/LuaSnip", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-path", + "hrsh7th/cmp-buffer", + "saadparwaiz1/cmp_luasnip", + }, + config = function() + require("plugins.config.cmpconfig").config() + end + } + + + -- File Explorer + use { + "kyazdani42/nvim-tree.lua", + requires = { + "kyazdani42/nvim-web-devicons", -- optional, for file icon + } + } + + -- Git + use 'f-person/git-blame.nvim' + + -- LuaLine + use 'nvim-lualine/lualine.nvim' + + personal_plugins_ok, personal_plugins = pcall(require, 'personal.plugins') + if personal_plugins_ok then + personal_plugins.startup(use) + end + + + -- Automatically set up your configuration after cloning packer.nvim + -- Put this at the end after all plugins + if packer_bootstrap then + require('packer').sync() + end +end)