init: kickstart.nvim
This commit is contained in:
		
						commit
						4c4096cf30
					
				
					 6 changed files with 475 additions and 0 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | tags | ||||||
							
								
								
									
										6
									
								
								.stylua.toml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.stylua.toml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | ||||||
|  | column_width = 160 | ||||||
|  | line_endings = "Unix" | ||||||
|  | indent_type = "Spaces" | ||||||
|  | indent_width = 2 | ||||||
|  | quote_style = "AutoPreferSingle" | ||||||
|  | no_call_parentheses = true | ||||||
							
								
								
									
										34
									
								
								Dockerfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								Dockerfile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | # Build neovim separately in the first stage | ||||||
|  | FROM alpine:latest AS base | ||||||
|  | 
 | ||||||
|  | RUN apk --no-cache add \ | ||||||
|  |     autoconf \ | ||||||
|  |     automake \ | ||||||
|  |     build-base \ | ||||||
|  |     cmake \ | ||||||
|  |     ninja \ | ||||||
|  |     coreutils \ | ||||||
|  |     curl \ | ||||||
|  |     gettext-tiny-dev \ | ||||||
|  |     git \ | ||||||
|  |     libtool \ | ||||||
|  |     pkgconf \ | ||||||
|  |     unzip | ||||||
|  | 
 | ||||||
|  | # Build neovim (and use it as an example codebase | ||||||
|  | RUN git clone https://github.com/neovim/neovim.git | ||||||
|  | 
 | ||||||
|  | ARG VERSION=master | ||||||
|  | RUN cd neovim && git checkout ${VERSION} && make CMAKE_BUILD_TYPE=RelWithDebInfo install | ||||||
|  | 
 | ||||||
|  | # To support kickstart.nvim | ||||||
|  | RUN apk --no-cache add \ | ||||||
|  |     fd  \ | ||||||
|  |     ctags \ | ||||||
|  |     ripgrep \ | ||||||
|  |     git | ||||||
|  | 
 | ||||||
|  | # Copy the kickstart.nvim init.lua | ||||||
|  | COPY ./init.lua /root/.config/nvim/init.lua | ||||||
|  | 
 | ||||||
|  | WORKDIR /neovim | ||||||
							
								
								
									
										21
									
								
								LICENSE.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								LICENSE.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  | MIT License | ||||||
|  | 
 | ||||||
|  | Copyright (c) 2021 Michael Lingelbach | ||||||
|  | 
 | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | of this software and associated documentation files (the "Software"), to deal | ||||||
|  | in the Software without restriction, including without limitation the rights | ||||||
|  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  | copies of the Software, and to permit persons to whom the Software is | ||||||
|  | furnished to do so, subject to the following conditions: | ||||||
|  | 
 | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  | 
 | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||||
|  | SOFTWARE. | ||||||
							
								
								
									
										30
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | ### Introduction | ||||||
|  | 
 | ||||||
|  | A starting point for neovim that is: | ||||||
|  | 
 | ||||||
|  | * Small (~325 lines) | ||||||
|  | * Single-file | ||||||
|  | * Documented | ||||||
|  | * Modular | ||||||
|  | 
 | ||||||
|  | Kickstart targets *only* the latest stable neovim release (0.7) and the nightly. | ||||||
|  | 
 | ||||||
|  | This repo is meant to be used as a starting point for a user's own configuration; remove the things you don't use and add what you miss. This configuration serves as the reference configuration for the [lspconfig wiki](https://github.com/neovim/nvim-lspconfig/wiki). | ||||||
|  | 
 | ||||||
|  | See the [wiki](https://github.com/nvim-lua/kickstart.nvim/wiki) for additional tips, tricks, and recommended plugins. | ||||||
|  | 
 | ||||||
|  | ### Installation | ||||||
|  | * Backup your previous configuration | ||||||
|  | * Copy and paste the kickstart.nvim `init.lua` into `$HOME/.config/nvim/init.lua` | ||||||
|  | * start neovim (`nvim`) and run `:PackerInstall`, ignore any error message about missing plugins, `:PackerInstall` will fix that shortly. | ||||||
|  | * restart neovim | ||||||
|  | 
 | ||||||
|  | ### Contribution | ||||||
|  | 
 | ||||||
|  | Pull-requests are welcome. The goal of this repo is not to create a neovim configuration framework, but to offer a starting template that shows, by example, available features in neovim. Some things that will not be included: | ||||||
|  | 
 | ||||||
|  | * Custom language server configuration (null-ls templates) | ||||||
|  | * Theming beyond a default colorscheme necessary for LSP highlight groups | ||||||
|  | * Lazy-loading. Kickstart.nvim should start within 40 ms on modern hardware. Please profile and contribute to upstream plugins to optimize startup time instead. | ||||||
|  | 
 | ||||||
|  | Each PR, especially those which increase the line count, should have a description as to why the PR is necessary. | ||||||
							
								
								
									
										383
									
								
								init.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										383
									
								
								init.lua
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,383 @@ | ||||||
|  | -- Install packer | ||||||
|  | local install_path = vim.fn.stdpath 'data' .. '/site/pack/packer/start/packer.nvim' | ||||||
|  | local is_bootstrap = false | ||||||
|  | if vim.fn.empty(vim.fn.glob(install_path)) > 0 then | ||||||
|  |   is_bootstrap = true | ||||||
|  |   vim.fn.execute('!git clone https://github.com/wbthomason/packer.nvim ' .. install_path) | ||||||
|  |   vim.cmd [[packadd packer.nvim]] | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- stylua: ignore start | ||||||
|  | require('packer').startup(function(use) | ||||||
|  |   use 'wbthomason/packer.nvim'                                                    -- Package manager | ||||||
|  |   use 'tpope/vim-fugitive'                                                        -- Git commands in nvim | ||||||
|  |   use 'tpope/vim-rhubarb'                                                         -- Fugitive-companion to interact with github | ||||||
|  |   use { 'lewis6991/gitsigns.nvim', requires = { 'nvim-lua/plenary.nvim' } }       -- Add git related info in the signs columns and popups | ||||||
|  |   use 'numToStr/Comment.nvim'                                                     -- "gc" to comment visual regions/lines | ||||||
|  |   use 'nvim-treesitter/nvim-treesitter'                                           -- Highlight, edit, and navigate code | ||||||
|  |   use 'nvim-treesitter/nvim-treesitter-textobjects'                               --  Additional textobjects for treesitter | ||||||
|  |   use 'neovim/nvim-lspconfig'                                                     -- Collection of configurations for built-in LSP client | ||||||
|  |   use 'williamboman/nvim-lsp-installer'                                           -- Automatically install language servers to stdpath | ||||||
|  |   use { 'hrsh7th/nvim-cmp', requires = { 'hrsh7th/cmp-nvim-lsp' } }               -- Autocompletion | ||||||
|  |   use { 'L3MON4D3/LuaSnip', requires = { 'saadparwaiz1/cmp_luasnip' } }           -- Snippet Engine and Snippet Expansion | ||||||
|  |   use 'mjlbach/onedark.nvim'                                                      -- Theme inspired by Atom | ||||||
|  |   use 'nvim-lualine/lualine.nvim'                                                 -- Fancier statusline | ||||||
|  |   use 'lukas-reineke/indent-blankline.nvim'                                       -- Add indentation guides even on blank lines | ||||||
|  |   use 'tpope/vim-sleuth'                                                          -- Detect tabstop and shiftwidth automatically | ||||||
|  |   use { 'nvim-telescope/telescope.nvim', requires = { 'nvim-lua/plenary.nvim' } } -- Fuzzy Finder (files, lsp, etc) | ||||||
|  | 
 | ||||||
|  |   -- Fuzzy Finder Algorithm which requires local dependencies to be built. Only load if `make` is available | ||||||
|  |   use { 'nvim-telescope/telescope-fzf-native.nvim', run = 'make', cond = vim.fn.executable "make" == 1 } | ||||||
|  | 
 | ||||||
|  |   if is_bootstrap then | ||||||
|  |     require('packer').sync() | ||||||
|  |   end | ||||||
|  | end) | ||||||
|  | -- stylua: ignore end | ||||||
|  | 
 | ||||||
|  | -- When we are bootstrapping a configuration, it doesn't | ||||||
|  | -- make sense to execute the rest of the init.lua. | ||||||
|  | -- | ||||||
|  | -- You'll need to restart nvim, and then it will work. | ||||||
|  | if is_bootstrap then | ||||||
|  |   print '==================================' | ||||||
|  |   print '    Plugins are being installed' | ||||||
|  |   print '    Wait until Packer completes,' | ||||||
|  |   print '       then restart nvim' | ||||||
|  |   print '==================================' | ||||||
|  |   return | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Automatically source and re-compile packer whenever you save this init.lua | ||||||
|  | local packer_group = vim.api.nvim_create_augroup('Packer', { clear = true }) | ||||||
|  | vim.api.nvim_create_autocmd('BufWritePost', { | ||||||
|  |   command = 'source <afile> | PackerCompile', | ||||||
|  |   group = packer_group, | ||||||
|  |   pattern = vim.fn.expand '$MYVIMRC', | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | -- [[ Setting options ]] | ||||||
|  | -- See `:help vim.o` | ||||||
|  | 
 | ||||||
|  | -- Set highlight on search | ||||||
|  | vim.o.hlsearch = false | ||||||
|  | 
 | ||||||
|  | -- Make line numbers default | ||||||
|  | vim.wo.number = true | ||||||
|  | 
 | ||||||
|  | -- Enable mouse mode | ||||||
|  | vim.o.mouse = 'a' | ||||||
|  | 
 | ||||||
|  | -- Enable break indent | ||||||
|  | vim.o.breakindent = true | ||||||
|  | 
 | ||||||
|  | -- Save undo history | ||||||
|  | vim.o.undofile = true | ||||||
|  | 
 | ||||||
|  | -- Case insensitive searching UNLESS /C or capital in search | ||||||
|  | vim.o.ignorecase = true | ||||||
|  | vim.o.smartcase = true | ||||||
|  | 
 | ||||||
|  | -- Decrease update time | ||||||
|  | vim.o.updatetime = 250 | ||||||
|  | vim.wo.signcolumn = 'yes' | ||||||
|  | 
 | ||||||
|  | -- Set colorscheme | ||||||
|  | vim.o.termguicolors = true | ||||||
|  | vim.cmd [[colorscheme onedark]] | ||||||
|  | 
 | ||||||
|  | -- Set completeopt to have a better completion experience | ||||||
|  | vim.o.completeopt = 'menuone,noselect' | ||||||
|  | 
 | ||||||
|  | -- [[ Basic Keymaps ]] | ||||||
|  | -- Set <space> as the leader key | ||||||
|  | -- See `:help mapleader` | ||||||
|  | --  NOTE: Must happen before plugins are required (otherwise wrong leader will be used) | ||||||
|  | vim.g.mapleader = ' ' | ||||||
|  | vim.g.maplocalleader = ' ' | ||||||
|  | 
 | ||||||
|  | -- Keymaps for better default experience | ||||||
|  | -- See `:help vim.keymap.set()` | ||||||
|  | vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true }) | ||||||
|  | 
 | ||||||
|  | -- Remap for dealing with word wrap | ||||||
|  | vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) | ||||||
|  | vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) | ||||||
|  | 
 | ||||||
|  | -- [[ Highlight on yank ]] | ||||||
|  | -- See `:help vim.highlight.on_yank()` | ||||||
|  | local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) | ||||||
|  | vim.api.nvim_create_autocmd('TextYankPost', { | ||||||
|  |   callback = function() | ||||||
|  |     vim.highlight.on_yank() | ||||||
|  |   end, | ||||||
|  |   group = highlight_group, | ||||||
|  |   pattern = '*', | ||||||
|  | }) | ||||||
|  | 
 | ||||||
|  | -- Set lualine as statusline | ||||||
|  | -- See `:help lualine.txt` | ||||||
|  | require('lualine').setup { | ||||||
|  |   options = { | ||||||
|  |     icons_enabled = false, | ||||||
|  |     theme = 'onedark', | ||||||
|  |     component_separators = '|', | ||||||
|  |     section_separators = '', | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- Enable Comment.nvim | ||||||
|  | require('Comment').setup() | ||||||
|  | 
 | ||||||
|  | -- Enable `lukas-reineke/indent-blankline.nvim` | ||||||
|  | -- See `:help indent_blankline.txt` | ||||||
|  | require('indent_blankline').setup { | ||||||
|  |   char = '┊', | ||||||
|  |   show_trailing_blankline_indent = false, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- Gitsigns | ||||||
|  | -- See `:help gitsigns.txt` | ||||||
|  | require('gitsigns').setup { | ||||||
|  |   signs = { | ||||||
|  |     add = { text = '+' }, | ||||||
|  |     change = { text = '~' }, | ||||||
|  |     delete = { text = '_' }, | ||||||
|  |     topdelete = { text = '‾' }, | ||||||
|  |     changedelete = { text = '~' }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- [[ Configure Telescope ]] | ||||||
|  | -- See `:help telesceope` and `:help telescope.setup()` | ||||||
|  | require('telescope').setup { | ||||||
|  |   defaults = { | ||||||
|  |     mappings = { | ||||||
|  |       i = { | ||||||
|  |         ['<C-u>'] = false, | ||||||
|  |         ['<C-d>'] = false, | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- Enable telescope fzf native, if installed | ||||||
|  | pcall(require('telescope').load_extension, 'fzf') | ||||||
|  | 
 | ||||||
|  | -- See `:help telescope.builtin` | ||||||
|  | vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) | ||||||
|  | vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) | ||||||
|  | vim.keymap.set('n', '<leader>/', function() | ||||||
|  |   -- You can pass additional configuration to telescope to change theme, layout, etc. | ||||||
|  |   require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { | ||||||
|  |     winblend = 10, | ||||||
|  |     previewer = false, | ||||||
|  |   }) | ||||||
|  | end, { desc = '[/] Fuzzily search in current buffer]' }) | ||||||
|  | 
 | ||||||
|  | vim.keymap.set('n', '<leader>sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) | ||||||
|  | vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) | ||||||
|  | vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) | ||||||
|  | vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) | ||||||
|  | vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) | ||||||
|  | 
 | ||||||
|  | -- [[ Configure Treesitter ]] | ||||||
|  | -- See `:help nvim-treesitter` | ||||||
|  | require('nvim-treesitter.configs').setup { | ||||||
|  |   -- Add languages to be installed here that you want installed for treesitter | ||||||
|  |   ensure_installed = { 'lua', 'typescript', 'rust', 'go', 'python' }, | ||||||
|  | 
 | ||||||
|  |   highlight = { enable = true }, | ||||||
|  |   indent = { enable = true }, | ||||||
|  |   incremental_selection = { | ||||||
|  |     enable = true, | ||||||
|  |     keymaps = { | ||||||
|  |       init_selection = '<c-space>', | ||||||
|  |       node_incremental = '<c-space>', | ||||||
|  |       -- TODO: I'm not sure for this one. | ||||||
|  |       scope_incremental = '<c-s>', | ||||||
|  |       node_decremental = '<c-backspace>', | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  |   textobjects = { | ||||||
|  |     select = { | ||||||
|  |       enable = true, | ||||||
|  |       lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim | ||||||
|  |       keymaps = { | ||||||
|  |         -- You can use the capture groups defined in textobjects.scm | ||||||
|  |         ['af'] = '@function.outer', | ||||||
|  |         ['if'] = '@function.inner', | ||||||
|  |         ['ac'] = '@class.outer', | ||||||
|  |         ['ic'] = '@class.inner', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     move = { | ||||||
|  |       enable = true, | ||||||
|  |       set_jumps = true, -- whether to set jumps in the jumplist | ||||||
|  |       goto_next_start = { | ||||||
|  |         [']m'] = '@function.outer', | ||||||
|  |         [']]'] = '@class.outer', | ||||||
|  |       }, | ||||||
|  |       goto_next_end = { | ||||||
|  |         [']M'] = '@function.outer', | ||||||
|  |         [']['] = '@class.outer', | ||||||
|  |       }, | ||||||
|  |       goto_previous_start = { | ||||||
|  |         ['[m'] = '@function.outer', | ||||||
|  |         ['[['] = '@class.outer', | ||||||
|  |       }, | ||||||
|  |       goto_previous_end = { | ||||||
|  |         ['[M'] = '@function.outer', | ||||||
|  |         ['[]'] = '@class.outer', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |     swap = { | ||||||
|  |       enable = true, | ||||||
|  |       swap_next = { | ||||||
|  |         ['<leader>a'] = '@parameter.inner', | ||||||
|  |       }, | ||||||
|  |       swap_previous = { | ||||||
|  |         ['<leader>A'] = '@parameter.inner', | ||||||
|  |       }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- Diagnostic keymaps | ||||||
|  | vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) | ||||||
|  | vim.keymap.set('n', ']d', vim.diagnostic.goto_next) | ||||||
|  | vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float) | ||||||
|  | vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist) | ||||||
|  | 
 | ||||||
|  | -- LSP settings. | ||||||
|  | --  This function gets run when an LSP connects to a particular buffer. | ||||||
|  | local on_attach = function(_, bufnr) | ||||||
|  |   -- NOTE: Remember that lua is a real programming language, and as such it is possible | ||||||
|  |   -- to define small helper and utility functions so you don't have to repeat yourself | ||||||
|  |   -- many times. | ||||||
|  |   -- | ||||||
|  |   -- In this case, we create a function that lets us more easily define mappings specific | ||||||
|  |   -- for LSP related items. It sets the mode, buffer and description for us each time. | ||||||
|  |   local nmap = function(keys, func, desc) | ||||||
|  |     if desc then | ||||||
|  |       desc = 'LSP: ' .. desc | ||||||
|  |     end | ||||||
|  | 
 | ||||||
|  |     vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|  |   nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame') | ||||||
|  |   nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]tion') | ||||||
|  | 
 | ||||||
|  |   nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') | ||||||
|  |   nmap('gi', vim.lsp.buf.implementation, '[G]oto [I]mplementation') | ||||||
|  |   nmap('gr', require('telescope.builtin').lsp_references) | ||||||
|  |   nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') | ||||||
|  |   nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') | ||||||
|  | 
 | ||||||
|  |   -- See `:help K` for why this keymap | ||||||
|  |   nmap('K', vim.lsp.buf.hover, 'Hover Documentation') | ||||||
|  |   nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation') | ||||||
|  | 
 | ||||||
|  |   -- Lesser used LSP functionality | ||||||
|  |   nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') | ||||||
|  |   nmap('<leader>D', vim.lsp.buf.type_definition, 'Type Definition') | ||||||
|  |   nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') | ||||||
|  |   nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') | ||||||
|  |   nmap('<leader>wl', function() | ||||||
|  |     print(vim.inspect(vim.lsp.buf.list_workspace_folders())) | ||||||
|  |   end, '[W]orkspace [L]ist Folders') | ||||||
|  | 
 | ||||||
|  |   -- Create a command `:Format` local to the LSP buffer | ||||||
|  |   vim.api.nvim_buf_create_user_command(bufnr, 'Format', vim.lsp.buf.format or vim.lsp.buf.formatting, { desc = 'Format current buffer with LSP' }) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- nvim-cmp supports additional completion capabilities | ||||||
|  | local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities()) | ||||||
|  | 
 | ||||||
|  | -- Enable the following language servers | ||||||
|  | local servers = { 'clangd', 'rust_analyzer', 'pyright', 'tsserver', 'sumneko_lua' } | ||||||
|  | 
 | ||||||
|  | -- Ensure the servers above are installed | ||||||
|  | require('nvim-lsp-installer').setup { | ||||||
|  |   ensure_installed = servers, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | for _, lsp in ipairs(servers) do | ||||||
|  |   require('lspconfig')[lsp].setup { | ||||||
|  |     on_attach = on_attach, | ||||||
|  |     capabilities = capabilities, | ||||||
|  |   } | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | -- Example custom configuration for lua | ||||||
|  | -- | ||||||
|  | -- Make runtime files discoverable to the server | ||||||
|  | local runtime_path = vim.split(package.path, ';') | ||||||
|  | table.insert(runtime_path, 'lua/?.lua') | ||||||
|  | table.insert(runtime_path, 'lua/?/init.lua') | ||||||
|  | 
 | ||||||
|  | require('lspconfig').sumneko_lua.setup { | ||||||
|  |   on_attach = on_attach, | ||||||
|  |   capabilities = capabilities, | ||||||
|  |   settings = { | ||||||
|  |     Lua = { | ||||||
|  |       runtime = { | ||||||
|  |         -- Tell the language server which version of Lua you're using (most likely LuaJIT) | ||||||
|  |         version = 'LuaJIT', | ||||||
|  |         -- Setup your lua path | ||||||
|  |         path = runtime_path, | ||||||
|  |       }, | ||||||
|  |       diagnostics = { | ||||||
|  |         globals = { 'vim' }, | ||||||
|  |       }, | ||||||
|  |       workspace = { library = vim.api.nvim_get_runtime_file('', true) }, | ||||||
|  |     }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- nvim-cmp setup | ||||||
|  | local cmp = require 'cmp' | ||||||
|  | local luasnip = require 'luasnip' | ||||||
|  | 
 | ||||||
|  | cmp.setup { | ||||||
|  |   snippet = { | ||||||
|  |     expand = function(args) | ||||||
|  |       luasnip.lsp_expand(args.body) | ||||||
|  |     end, | ||||||
|  |   }, | ||||||
|  |   mapping = cmp.mapping.preset.insert { | ||||||
|  |     ['<C-d>'] = cmp.mapping.scroll_docs(-4), | ||||||
|  |     ['<C-f>'] = cmp.mapping.scroll_docs(4), | ||||||
|  |     ['<C-Space>'] = cmp.mapping.complete(), | ||||||
|  |     ['<CR>'] = cmp.mapping.confirm { | ||||||
|  |       behavior = cmp.ConfirmBehavior.Replace, | ||||||
|  |       select = true, | ||||||
|  |     }, | ||||||
|  |     ['<Tab>'] = cmp.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, { 'i', 's' }), | ||||||
|  |     ['<S-Tab>'] = cmp.mapping(function(fallback) | ||||||
|  |       if cmp.visible() then | ||||||
|  |         cmp.select_prev_item() | ||||||
|  |       elseif luasnip.jumpable(-1) then | ||||||
|  |         luasnip.jump(-1) | ||||||
|  |       else | ||||||
|  |         fallback() | ||||||
|  |       end | ||||||
|  |     end, { 'i', 's' }), | ||||||
|  |   }, | ||||||
|  |   sources = { | ||||||
|  |     { name = 'nvim_lsp' }, | ||||||
|  |     { name = 'luasnip' }, | ||||||
|  |   }, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | -- The line beneath this is called `modeline`. See `:help modeline` | ||||||
|  | -- vim: ts=2 sts=2 sw=2 et | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 TJ DeVries
						TJ DeVries