From 9a6fd3fa049802287a99f104683299b2526481f0 Mon Sep 17 00:00:00 2001 From: Marty Oehme Date: Tue, 16 Mar 2021 15:54:14 +0100 Subject: [PATCH] nvim: Move to treesitter and lspsaga Added lspsaga to enhance some of the lsp actions I can do - mappings are mostly the same as before, pretty much all lsp actions can be invoked by g (e.g. `gr` for rename, `gh` for symbol help, `gd` for go definition, `K` for help hover, `gc` for code completion and some more). `[e` and `]e` move between lsp diagnostic errors. Switched out many syntax highlighting plugins for treesitter, which is an experiment for now, but I would love to keep it like this if it works out. --- nvim/.config/nvim/lua/_treesitter.lua | 8 +++ nvim/.config/nvim/lua/nvim-lspconfig/init.lua | 66 ++++++++++++++----- nvim/.config/nvim/plugin/completion-nvim.vim | 2 +- nvim/.config/nvim/plugins.vim | 13 ++-- 4 files changed, 67 insertions(+), 22 deletions(-) create mode 100644 nvim/.config/nvim/lua/_treesitter.lua diff --git a/nvim/.config/nvim/lua/_treesitter.lua b/nvim/.config/nvim/lua/_treesitter.lua new file mode 100644 index 0000000..6514ca3 --- /dev/null +++ b/nvim/.config/nvim/lua/_treesitter.lua @@ -0,0 +1,8 @@ +require'nvim-treesitter.configs'.setup { + -- one of "all", "maintained" (parsers with maintainers), or a list of languages + ensure_installed = "maintained", + highlight = { enable = true }, + incremental_selection = { enable = true }, + textobjects = { enable = true }, + indent = { enable = true }, +} diff --git a/nvim/.config/nvim/lua/nvim-lspconfig/init.lua b/nvim/.config/nvim/lua/nvim-lspconfig/init.lua index dd94705..af466db 100644 --- a/nvim/.config/nvim/lua/nvim-lspconfig/init.lua +++ b/nvim/.config/nvim/lua/nvim-lspconfig/init.lua @@ -1,27 +1,62 @@ -local on_attach = function(client, bufnr) +local saga = require 'lspsaga' + + +local on_attach = function(_, _) -- Keybindings for LSPs -- Note these are in on_attach so that they don't override bindings in a non-LSP setting - vim.fn.nvim_set_keymap("n", "gd", "lua vim.lsp.buf.definition()", + vim.api.nvim_set_keymap("n", "gh", "lua require 'lspsaga.provider'.lsp_finder()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "gD", - "lua vim.lsp.buf.implementation()", + vim.api.nvim_set_keymap("n", "gd", "lua require'lspsaga.provider'.preview_definition()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "K", "lua vim.lsp.buf.hover()", + vim.api.nvim_set_keymap("n", "gc", "lua require 'lspsaga.codeaction'.code_action()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "gK", - "lua vim.lsp.buf.signature_help()", + vim.api.nvim_set_keymap("v", "gc", "'<,'>lua require 'lspsaga.codeaction'.range_code_action()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "1gD", - "lua vim.lsp.buf.type_definition()", + vim.api.nvim_set_keymap("n", "K", "lua require('lspsaga.hover').render_hover_doc()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "gr", "lua vim.lsp.buf.references()", + vim.api.nvim_set_keymap("n", "gK", "lua require('lspsaga.signaturehelp').signature_help()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "g0", - "lua vim.lsp.buf.document_symbol()", + vim.api.nvim_set_keymap("n", "gr", "lua require('lspsaga.rename').rename()", {noremap = true, silent = true}) - vim.fn.nvim_set_keymap("n", "gW", - "lua vim.lsp.buf.workspace_symbol()", + + vim.api.nvim_set_keymap("n", "ge", "lua require('lspsaga.diagnostic').show_line_diagnostics()", {noremap = true, silent = true}) + vim.api.nvim_set_keymap("n", "[e", "lua require('lspsaga.diagnostic').lsp_jump_diagnostic_next()", + {noremap = true, silent = true}) + vim.api.nvim_set_keymap("n", "]e", "lua require('lspsaga.diagnostic').lsp_jump_diagnostic_prev()", + {noremap = true, silent = true}) + + vim.api.nvim_set_keymap("n", "C-f", "lua require('lspsaga.action').smart_scroll_with_saga(1)", + {noremap = true, silent = true}) + vim.api.nvim_set_keymap("n", "C-b", "lua require('lspsaga.action').smart_scroll_with_saga(-1)", + {noremap = true, silent = true}) + + require("lspsaga").init_lsp_saga { + error_sign = 'X', + warn_sign = '⚠️', + hint_sign = '⚡', + infor_sign = 'ℹ️', + code_action_icon = '💡', + finder_definition_icon = '📖 ', + finder_reference_icon = '🔖 ', + finder_action_keys = { + open = '', + split = 's', + vsplit = 'v', + quit = '', + scroll_down = '', + scroll_up = '' + }, + code_action_keys = { + quit = '', + exec = '' + }, + rename_action_keys = { + quit = '', + exec = '' + }, + definition_preview_icon = '📖 ' + } end require'lspconfig'.pyls.setup {on_attach = on_attach} @@ -30,7 +65,7 @@ require'lspconfig'.bashls.setup {on_attach = on_attach} require'lspconfig'.gopls.setup {on_attach = on_attach} require'lspconfig'.texlab.setup {on_attach = on_attach} --- requires the lua-language-server package to be installed +-- requires the lua-language-server package to be installed -- The arch package defaults to the following directory local sumneko_root_path = "/usr/share/lua-language-server" require'lspconfig'.sumneko_lua.setup { @@ -58,3 +93,4 @@ require'lspconfig'.sumneko_lua.setup { }, on_attach = on_attach, } +saga.init_lsp_saga() diff --git a/nvim/.config/nvim/plugin/completion-nvim.vim b/nvim/.config/nvim/plugin/completion-nvim.vim index f68eca3..3a089e1 100644 --- a/nvim/.config/nvim/plugin/completion-nvim.vim +++ b/nvim/.config/nvim/plugin/completion-nvim.vim @@ -64,7 +64,7 @@ let g:completion_chain_complete_list = { \ { 'mode': ''} \], \ 'default': [ - \ { 'complete_items': [ 'lsp', 'snippet' ]}, + \ { 'complete_items': [ 'ts', 'lsp', 'snippet' ]}, \ { 'complete_items': [ 'buffers' ] }, \ { 'complete_items': [ 'path' ], 'triggered_only': ['/'] }, \ { 'mode': ''}, diff --git a/nvim/.config/nvim/plugins.vim b/nvim/.config/nvim/plugins.vim index 3116b1b..27a6f0e 100644 --- a/nvim/.config/nvim/plugins.vim +++ b/nvim/.config/nvim/plugins.vim @@ -40,10 +40,17 @@ Plug 'junegunn/vim-peekaboo' Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --bin' } Plug 'junegunn/fzf.vim' + " neovim goodies: treesitter and lsp Plug 'neovim/nvim-lspconfig' " some commong language server configurations Plug 'glepnir/lspsaga.nvim' " nice and fast ui for lsp actions + Plug 'nvim-lua/completion-nvim' " simple completion engine built specifically for nvim and lsp Plug 'steelsojka/completion-buffers' " completion source from words found in current buffers + +Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} +Plug 'nvim-treesitter/completion-treesitter' + + Plug 'desmap/ale-sensible' | Plug 'w0rp/ale' " asynchronous linting - might be superseded by lsp or coc.nvim at some point " statusline Plug 'vim-airline/vim-airline' @@ -71,12 +78,6 @@ Plug 'junegunn/goyo.vim', { 'for': ['pandoc', 'markdown', 'txt'], 'on': 'Goyo' } Plug 'junegunn/limelight.vim', { 'for': ['pandoc', 'markdown', 'txt'], 'on': 'Goyo' } " provide even distraction free-er writing (lowlight paragraphs) " Language Integration Plug 'euclidianAce/BetterLua.vim' " better syntax highlighting for lua -Plug 'sheerun/vim-polyglot' " syntax plugins for almost every language -Plug 'stephpy/vim-yaml' -Plug 'mhartington/nvim-typescript', {'for': 'typescript','do': './install.sh'} - -Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' } -Plug 'aliou/bats.vim' if !has('nvim') Plug 'tpope/vim-sensible'