mirror of
				https://github.com/KevinMidboe/chsh.git
				synced 2025-10-29 12:30:13 +00:00 
			
		
		
		
	neovim config
This commit is contained in:
		
							
								
								
									
										516
									
								
								nvim/init.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										516
									
								
								nvim/init.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,516 @@ | ||||
| -- 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.system { 'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path } | ||||
|   vim.cmd [[packadd packer.nvim]] | ||||
| end | ||||
|  | ||||
| require('packer').startup(function(use) | ||||
|   -- Package manager | ||||
|   use 'wbthomason/packer.nvim' | ||||
|  | ||||
|   use { -- LSP Configuration & Plugins | ||||
|     'neovim/nvim-lspconfig', | ||||
|     requires = { | ||||
|       -- Automatically install LSPs to stdpath for neovim | ||||
|       'williamboman/mason.nvim', | ||||
|       'williamboman/mason-lspconfig.nvim', | ||||
|  | ||||
|       -- Useful status updates for LSP | ||||
|       'j-hui/fidget.nvim', | ||||
|  | ||||
|       -- Additional lua configuration, makes nvim stuff amazing | ||||
|       'folke/neodev.nvim', | ||||
|     }, | ||||
|   } | ||||
|  | ||||
|   use { -- Autocompletion | ||||
|     'hrsh7th/nvim-cmp', | ||||
|     requires = { 'hrsh7th/cmp-nvim-lsp', 'L3MON4D3/LuaSnip', 'saadparwaiz1/cmp_luasnip' }, | ||||
|   } | ||||
|  | ||||
|   use { -- Highlight, edit, and navigate code | ||||
|     'nvim-treesitter/nvim-treesitter', | ||||
|     run = function() | ||||
|       pcall(require('nvim-treesitter.install').update { with_sync = true }) | ||||
|     end, | ||||
|   } | ||||
|  | ||||
|   use { -- Additional text objects via treesitter | ||||
|     'nvim-treesitter/nvim-treesitter-textobjects', | ||||
|     after = 'nvim-treesitter', | ||||
|   } | ||||
|  | ||||
|   -- Git related plugins | ||||
|   use 'tpope/vim-fugitive' | ||||
|   use 'tpope/vim-rhubarb' | ||||
|   use 'lewis6991/gitsigns.nvim' | ||||
|  | ||||
| --  use 'navarasu/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 'numToStr/Comment.nvim' -- "gc" to comment visual regions/lines | ||||
|   use 'tpope/vim-sleuth' -- Detect tabstop and shiftwidth automatically | ||||
|  | ||||
|   -- Fuzzy Finder (files, lsp, etc) | ||||
|   use { 'nvim-telescope/telescope.nvim', branch = '0.1.x', requires = { 'nvim-lua/plenary.nvim' } } | ||||
|  | ||||
|   -- 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 } | ||||
|  | ||||
|   -- nvim tree package: https://github.com/romgrk/barbar.nvim | ||||
|   use 'nvim-tree/nvim-web-devicons' | ||||
|   use {'romgrk/barbar.nvim', wants = 'nvim-web-devicons'} | ||||
|  | ||||
|   -- Custom color schema | ||||
|   use { 'bluz71/vim-moonfly-colors', branch = 'cterm-compat' } | ||||
|  | ||||
|   -- Svelte setup | ||||
|   use 'evanleck/vim-svelte' | ||||
|   use 'pangloss/vim-javascript' | ||||
|   use 'HerringtonDarkholme/yats.vim' | ||||
|  | ||||
|   -- Svelte coc | ||||
|   use { 'neoclide/coc.nvim', branch = 'release' } | ||||
|  | ||||
|   -- Prettier | ||||
|   use('jose-elias-alvarez/null-ls.nvim') | ||||
|   use('MunifTanjim/prettier.nvim') | ||||
|  | ||||
|   -- Add custom plugins to packer from ~/.config/nvim/lua/custom/plugins.lua | ||||
|   local has_plugins, plugins = pcall(require, 'custom.plugins') | ||||
|   if has_plugins then | ||||
|     plugins(use) | ||||
|   end | ||||
|  | ||||
|   if is_bootstrap then | ||||
|     require('packer').sync() | ||||
|   end | ||||
| 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> | silent! LspStop | silent! LspStart | 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]] | ||||
| vim.cmd [[colorscheme moonfly]] | ||||
|  | ||||
| -- Set completeopt to have a better completion experience | ||||
| vim.o.completeopt = 'menuone,noselect' | ||||
|  | ||||
| -- set tab key to two spaces | ||||
| vim.o.expandtab = true | ||||
| vim.o.tabstop = 2 | ||||
| vim.o.softtabstop = 2 | ||||
| vim.o.shiftwidth = 2 | ||||
|  | ||||
| vim.o.relativenumber = true | ||||
|  | ||||
| -- [[ 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 = 'moonfly', | ||||
|     component_separators = '|', | ||||
|     section_separators = '', | ||||
|   }, | ||||
| } | ||||
|  | ||||
| -- Configure prettier | ||||
| local prettier = require("prettier") | ||||
|  | ||||
| prettier.setup({ | ||||
|   bin = 'prettier', -- or `'prettierd'` (v0.22+) | ||||
|   filetypes = { | ||||
|     "css", | ||||
|     "graphql", | ||||
|     "html", | ||||
|     "javascript", | ||||
|     "javascriptreact", | ||||
|     "json", | ||||
|     "less", | ||||
|     "markdown", | ||||
|     "scss", | ||||
|     "typescript", | ||||
|     "typescriptreact", | ||||
|     "yaml", | ||||
|   }, | ||||
| }) | ||||
|  | ||||
| local null_ls = require("null-ls") | ||||
|  | ||||
| local group = vim.api.nvim_create_augroup("lsp_format_on_save", { clear = false }) | ||||
| local event = "BufWritePre" -- or "BufWritePost" | ||||
| local async = event == "BufWritePost" | ||||
|  | ||||
| null_ls.setup({ | ||||
|   on_attach = function(client, bufnr) | ||||
|     if client.supports_method("textDocument/formatting") then | ||||
|       vim.keymap.set("n", "<Leader>f", function() | ||||
|         vim.lsp.buf.format({ bufnr = vim.api.nvim_get_current_buf() }) | ||||
|       end, { buffer = bufnr, desc = "[lsp] format" }) | ||||
|  | ||||
|       -- format on save | ||||
|       vim.api.nvim_clear_autocmds({ buffer = bufnr, group = group }) | ||||
|       vim.api.nvim_create_autocmd(event, { | ||||
|         buffer = bufnr, | ||||
|         group = group, | ||||
|         callback = function() | ||||
|           vim.lsp.buf.format({ bufnr = bufnr, async = async }) | ||||
|         end, | ||||
|         desc = "[lsp] format on save", | ||||
|       }) | ||||
|     end | ||||
|  | ||||
|     if client.supports_method("textDocument/rangeFormatting") then | ||||
|       vim.keymap.set("x", "<Leader>f", function() | ||||
|         vim.lsp.buf.format({ bufnr = vim.api.nvim_get_current_buf() }) | ||||
|       end, { buffer = bufnr, desc = "[lsp] format" }) | ||||
|     end | ||||
|   end, | ||||
| }) | ||||
|  | ||||
| -- 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 telescope` 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 = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'typescript', 'help', 'vim' }, | ||||
|  | ||||
|   highlight = { enable = true }, | ||||
|   indent = { enable = true, disable = { 'python' } }, | ||||
|   incremental_selection = { | ||||
|     enable = true, | ||||
|     keymaps = { | ||||
|       init_selection = '<c-space>', | ||||
|       node_incremental = '<c-space>', | ||||
|       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 | ||||
|         ['aa'] = '@parameter.outer', | ||||
|         ['ia'] = '@parameter.inner', | ||||
|         ['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 | ||||
|  | ||||
|   -- barbar.nvim | ||||
|   local map = vim.api.nvim_set_keymap | ||||
|   local opts = { noremap = true, silent = true } | ||||
|   map('n', '<A-,>', '<Cmd>BufferPrevious<CR>', opts) | ||||
|   map('n', '<A-.>', '<Cmd>BufferNext<CR>', opts) | ||||
|  | ||||
|   nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame') | ||||
|   nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction') | ||||
|  | ||||
|   nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') | ||||
|   nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') | ||||
|   nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') | ||||
|   nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition') | ||||
|   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>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', function(_) | ||||
|     vim.lsp.buf.format() | ||||
|   end, { desc = 'Format current buffer with LSP' }) | ||||
| end | ||||
|  | ||||
| -- Enable the following language servers | ||||
| --  Feel free to add/remove any LSPs that you want here. They will automatically be installed. | ||||
| -- | ||||
| --  Add any additional override configuration in the following tables. They will be passed to | ||||
| --  the `settings` field of the server config. You must look up that documentation yourself. | ||||
| local servers = { | ||||
|   -- clangd = {}, | ||||
|   -- gopls = {}, | ||||
|   -- pyright = {}, | ||||
|   -- rust_analyzer = {}, | ||||
|   -- tsserver = {}, | ||||
|  | ||||
|   sumneko_lua = { | ||||
|     Lua = { | ||||
|       workspace = { checkThirdParty = false }, | ||||
|       telemetry = { enable = false }, | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
|  | ||||
| -- Setup neovim lua configuration | ||||
| require('neodev').setup() | ||||
| -- | ||||
| -- nvim-cmp supports additional completion capabilities, so broadcast that to servers | ||||
| local capabilities = vim.lsp.protocol.make_client_capabilities() | ||||
| capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) | ||||
|  | ||||
| -- Setup mason so it can manage external tooling | ||||
| require('mason').setup() | ||||
|  | ||||
| -- Ensure the servers above are installed | ||||
| local mason_lspconfig = require 'mason-lspconfig' | ||||
|  | ||||
| mason_lspconfig.setup { | ||||
|   ensure_installed = vim.tbl_keys(servers), | ||||
| } | ||||
|  | ||||
| mason_lspconfig.setup_handlers { | ||||
|   function(server_name) | ||||
|     require('lspconfig')[server_name].setup { | ||||
|       capabilities = capabilities, | ||||
|       on_attach = on_attach, | ||||
|       settings = servers[server_name], | ||||
|     } | ||||
|   end, | ||||
| } | ||||
|  | ||||
| -- Turn on lsp status information | ||||
| require('fidget').setup() | ||||
|  | ||||
| -- 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 | ||||
		Reference in New Issue
	
	Block a user