diff --git a/home/.config/nvim/lua/keybinds.lua b/home/.config/nvim/lua/keybinds.lua index 25234f6c..3299100e 100644 --- a/home/.config/nvim/lua/keybinds.lua +++ b/home/.config/nvim/lua/keybinds.lua @@ -15,8 +15,6 @@ map('n', '', 'Rg') -- Navigate completions with tab and shift tab map('i', '', 'pumvisible() ? "\\" : "\\"', {expr = true}) map('i', '', 'pumvisible() ? "\\" : "\\"', {expr = true}) --- Trigger completion -map('i', '', '(completion_trigger)', {silent = true, expr = true}) -- Navigate between buffers map('n', '', ':bn', {silent = true}) diff --git a/home/.config/nvim/lua/pluginconf/completion.lua b/home/.config/nvim/lua/pluginconf/completion.lua index 9d2c2d25..a4e34543 100644 --- a/home/.config/nvim/lua/pluginconf/completion.lua +++ b/home/.config/nvim/lua/pluginconf/completion.lua @@ -1,3 +1,4 @@ -local o = vim.o +vim.o.completeopt = 'menuone,noinsert,noselect' -o.completeopt = 'menuone,noinsert,noselect' +-- Enable for all buffers (for now) +vim.api.nvim_command('autocmd BufEnter * lua require\'completion\'.on_attach()') diff --git a/home/.config/nvim/lua/pluginconf/lsp.lua b/home/.config/nvim/lua/pluginconf/lsp.lua index 85d57868..1b73c3be 100644 --- a/home/.config/nvim/lua/pluginconf/lsp.lua +++ b/home/.config/nvim/lua/pluginconf/lsp.lua @@ -1,37 +1,108 @@ --- Rust -require'lspconfig'.rust_analyzer.setup { - on_attach = require'completion'.on_attach +-- keymaps +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 + + buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') + + -- Mappings. + local opts = { noremap=true, silent=true } + 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', '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) + + -- Set some keybinds conditional on server capabilities + if client.resolved_capabilities.document_formatting then + buf_set_keymap("n", "f", "lua vim.lsp.buf.formatting()", opts) + elseif client.resolved_capabilities.document_range_formatting then + buf_set_keymap("n", "f", "lua vim.lsp.buf.range_formatting()", opts) + end + + -- Set autocommands conditional on server_capabilities + 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 +end +-- +-- Configure lua language server for neovim development +local lua_settings = { + Lua = { + runtime = { + -- LuaJIT in the case of Neovim + version = 'LuaJIT', + path = vim.split(package.path, ';'), + }, + diagnostics = { + -- Get the language server to recognize the `vim` global + globals = {'vim'}, + }, + workspace = { + -- Make the server aware of Neovim runtime files + library = { + [vim.fn.expand('$VIMRUNTIME/lua')] = true, + [vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true, + }, + }, + } } --- Lua -require'lspconfig'.sumneko_lua.setup { - on_attach = require'completion'.on_attach, - cmd = {'/usr/bin/lua-language-server'}, - settings = { - Lua = { - runtime = { - -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) - version = 'LuaJIT', - -- Setup your lua path - path = vim.split(package.path, ';') - }, - diagnostics = { - -- Get the language server to recognize the `vim` global - globals = {'vim'} - }, - workspace = { - -- Make the server aware of Neovim runtime files - library = { - [vim.fn.expand('$VIMRUNTIME/lua')] = true, - [vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true - } - } - } - } +-- config that activates keymaps and enables snippet support +local function make_config() + local capabilities = vim .lsp.protocol.make_client_capabilities() + capabilities.textDocument.completion.completionItem.snippetSupport = true + return { + -- enable snippet support + capabilities = capabilities, + -- map buffer local keybindings when the language server attaches + on_attach = on_attach, } +end --- YAML -require'lspconfig'.yamlls.setup {on_attach = require'completion'.on_attach} +-- lsp-install +local function setup_servers() + require'lspinstall'.setup() --- JavaScript / TypeScript -require'lspconfig'.tsserver.setup {on_attach = require'completion'.on_attach} + -- get all installed servers + local servers = require'lspinstall'.installed_servers() + + -- add servers to be installed + table.insert(servers, "rust_analyzer"); + + for _, server in pairs(servers) do + local config = make_config() + + -- language specific config + if server == "lua" then + config.settings = lua_settings + end + + -- setup lspconfig for all servers + require'lspconfig'[server].setup(config) + end +end + +setup_servers() + +-- Automatically reload after `:LspInstall ` so we don't have to restart neovim +require'lspinstall'.post_install_hook = function () + setup_servers() -- reload installed servers + vim.cmd("bufdo e") -- this triggers the FileType autocmd that starts the server +end diff --git a/home/.config/nvim/lua/pluginmanager.lua b/home/.config/nvim/lua/pluginmanager.lua index 47d34941..ad450b4e 100644 --- a/home/.config/nvim/lua/pluginmanager.lua +++ b/home/.config/nvim/lua/pluginmanager.lua @@ -39,6 +39,9 @@ require('packer').startup(function() -- Configs for built-in LSP use 'neovim/nvim-lspconfig' + -- Install LSP executables + use 'kabouzeid/nvim-lspinstall' + -- Completion framework use 'nvim-lua/completion-nvim'