diff --git a/neovim/init.lua b/neovim/init.lua index ab2d4b4..4f639b1 100644 --- a/neovim/init.lua +++ b/neovim/init.lua @@ -19,17 +19,17 @@ vim.opt.backup = false vim.opt.undodir = os.getenv("HOME") .. "/.vim/undodir" vim.opt.undofile = true vim.opt.completeopt = 'menuone,noselect' - vim.g.mapleader = ' ' -- basic keymaps -vim.keymap.set({'n','v'}, '', '', {silent=true}) -- since we're using space for leader +vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) -- since we're using space for leader +vim.keymap.set('t', '', ')') -- make :terminal escape out -- diagnostics (errors/warnings to be shown) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) vim.keymap.set('n', ']d', vim.diagnostic.goto_next) vim.keymap.set('n', 'e', vim.diagnostic.open_float) -- opens diag in box (floating) -vim.keymap.set('n', 'q', vim.diagnostic.setloclist) +vim.keymap.set('n', 'q', vim.diagnostic.setloclist) -- opens list of diags -- vim-plug @@ -46,10 +46,10 @@ vim.call('plug#begin', '~/.config/nvim/plugged') -- libs and dependencies Plug('nvim-lua/plenary.nvim') --- plugins +-- plugins Plug('nvim-treesitter/nvim-treesitter') -- language parser engine Plug('nvim-treesitter/nvim-treesitter-textobjects') -- more text objects -Plug('nvim-telescope/telescope.nvim', {tag = '0.1.0'}) -- fuzzy search thru files +Plug('nvim-telescope/telescope.nvim', { tag = '0.1.0' }) -- file browser -- cmp: auto-complete/suggestions Plug('neovim/nvim-lspconfig') -- built-in LSP configurations Plug('hrsh7th/cmp-nvim-lsp') @@ -57,9 +57,11 @@ Plug('hrsh7th/cmp-buffer') Plug('hrsh7th/nvim-cmp') Plug('onsails/lspkind-nvim') -- DevExp -Plug('numToStr/Comment.nvim') -- "gc" to comment visual regions/lines +Plug('numToStr/Comment.nvim') -- "gc" to comment visual regions/lines Plug('lewis6991/gitsigns.nvim') -- add git info to sign columns Plug('tpope/vim-fugitive') -- git commands in nvim +Plug('williamboman/mason.nvim') -- LSP, debuggers,... package manager +Plug('williamboman/mason-lspconfig.nvim') -- lsp config for mason -- UI & colorscheme Plug('gruvbox-community/gruvbox') @@ -67,7 +69,9 @@ Plug('nvim-lualine/lualine.nvim') -- fancy status line Plug('lukas-reineke/indent-blankline.nvim') -- identation lines on blank lines -- other -Plug('nvim-treesitter/nvim-treesitter', {run = ':TSUpdate'}) +Plug('nvim-treesitter/nvim-treesitter', { run = ':TSUpdate' }) +Plug('saadparwaiz1/cmp_luasnip') -- snippet engine +Plug('L3MON4D3/LuaSnip') -- snippet engine --------- vim.call('plug#end') @@ -76,10 +80,11 @@ vim.call('plug#end') vim.cmd.colorscheme('gruvbox') -- plugin keymaps -function remap(mode, key_cmd, binded_fn, opts) - opts = opts or {remap = true} +local function remap(mode, key_cmd, binded_fn, opts) + opts = opts or { remap = true } return vim.keymap.set(mode, key_cmd, binded_fn, opts) end + -- Comment.nvim require('Comment').setup() -- lukas-reineke/indent-blankline.nvim @@ -99,27 +104,27 @@ require('telescope').setup { } } pcall(require('telescope').load_extension, 'fzf') -remap('n', '','Telescope', {desc = 'Open Telescope general search'}) -remap('n', 'ff',function() +remap('n', '', 'Telescope', { desc = 'Open Telescope general search' }) +remap('n', 'ff', function() require('telescope.builtin').find_files() -end, {desc = '[F]ind [F]iles'}) -remap('n', 'fg',function() +end, { desc = '[F]ind [F]iles' }) +remap('n', 'fg', function() require('telescope.builtin').live_grep() -end, {desc = '[F]ind by [G]rep'}) -remap('n', 'fb',function() +end, { desc = '[F]ind by [G]rep' }) +remap('n', 'fb', function() require('telescope.builtin').buffers() -end, {desc = '[F]ind existing [B]uffers'}) -remap('n', 'fh',function() +end, { desc = '[F]ind existing [B]uffers' }) +remap('n', 'fh', function() require('telescope.builtin').help_tags() -end, {desc = '[F]ind [H]elp'}) -remap('n', 'fd',function() +end, { desc = '[F]ind [H]elp' }) +remap('n', 'fd', function() require('telescope.builtin').live_grep() -end, {desc = '[F]ind [D]iagnostics'}) +end, { desc = '[F]ind [D]iagnostics' }) -- treesitter require('nvim-treesitter.configs').setup { - ensure_installed = {'lua', 'typescript', 'rust', 'go', 'python'}, - highlight = {enable = true}, - indent = {enable = true}, + ensure_installed = { 'lua', 'typescript', 'rust', 'go', 'python' }, + highlight = { enable = true }, + indent = { enable = true }, incremental_selection = { enable = true, keymap = { @@ -143,5 +148,152 @@ require('nvim-treesitter.configs').setup { } +-- 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('rn', vim.lsp.buf.rename, '[R]e[n]ame') + nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') + + -- symbols and gotos + 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('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') + nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') + + -- documentations. See `:help K` for why this keymap + nmap('K', vim.lsp.buf.hover, 'Hover Documentation') + nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') + + -- Lesser used LSP functionality + nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') + nmap('ja', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') + nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') + nmap('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()) +-- default language servers +local servers = { 'clangd', 'rust_analyzer', 'pyright', 'tsserver', 'sumneko_lua' } +require("mason").setup({ + ui = { + icons = { + package_installed = "✓", + package_pending = "➜", + package_uninstalled = "✗" + } + } +}) +require('mason-lspconfig').setup({ + ensure_installed = servers, + -- automatic_installation = true +}) +for _, lsp in ipairs(servers) do + require('lspconfig')[lsp].setup { + on_attach = on_attach, + capabilities = capabilities, + } +end +-- config overwrites +require('lspconfig').sumneko_lua.setup { + on_attach = on_attach, + capabilities = capabilities, + settings = { + Lua = { + runtime = { + version = "LuaJIT", + path = vim.split(package.path, ";"), + }, + diagnostics = { + globals = {"vim"} + }, + workspace = { + library = vim.api.nvim_get_runtime_file('', true) + }, + telemetry = {enable = false} + } + } +} +-- nvim-cmp +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 { + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete(), + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }, + [''] = 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' }), + [''] = 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' }, + }, +} + +-- Gitsigns +require('gitsigns').setup { + signs = { + add = { text = '+' }, + change = { text = '~' }, + delete = { text = '_' }, + topdelete = { text = '‾' }, + changedelete = { text = '~' }, + } +} +require('lualine').setup { + options = { + icons_enabled = true, + theme = 'onedark', + component_separators = '|', + section_separators = '', + }, +}