From 59ec8d490bf83aa6843f4f172d1acca2665614ef Mon Sep 17 00:00:00 2001 From: Alexander Gehrke Date: Sun, 26 Feb 2023 22:07:32 +0100 Subject: [PATCH] Migrate to mason.nvim and setup jdtls --- after/ftplugin/java.vim | 13 +++++++++---- ftplugin/java.lua | 22 +++++++++++++++++++++ lua/lsp/installer.lua | 43 +++++++++++++++++++++++++++++++++++------ lua/lsp/metals.lua | 2 +- lua/my-lsp.lua | 35 +++++++++++++++++++-------------- packages.vim | 4 +++- 6 files changed, 92 insertions(+), 27 deletions(-) create mode 100644 ftplugin/java.lua diff --git a/after/ftplugin/java.vim b/after/ftplugin/java.vim index 5beb8f9..fd1c415 100644 --- a/after/ftplugin/java.vim +++ b/after/ftplugin/java.vim @@ -4,13 +4,18 @@ setlocal foldmethod=syntax setlocal foldenable setlocal textwidth=120 -nnoremap jc :JavaCorrect nnoremap jd :JavaDocComment nnoremap :JavaDocPreview nnoremap :JavaSearchContext -nnoremap jf :%JavaFormat -nnoremap ji :JavaImportOrganize -nnoremap jr :JavaRename +nnoremap ev lua require('jdtls').extract_variable() +vnoremap ev lua require('jdtls').extract_variable(true) +nnoremap ec lua require('jdtls').extract_constant() +vnoremap ec lua require('jdtls').extract_constant(true) +vnoremap em lua require('jdtls').extract_method(true) +nnoremap ro lua require('jdtls').organize_imports() + +nnoremap tc lua require'jdtls'.test_class() +nnoremap tm lua require'jdtls'.test_nearest_method() inoremap pumvisible() \|\| &omnifunc == '' ? \ "\C-n>" : diff --git a/ftplugin/java.lua b/ftplugin/java.lua new file mode 100644 index 0000000..cf81c69 --- /dev/null +++ b/ftplugin/java.lua @@ -0,0 +1,22 @@ +local mylsp = require("my-lsp") +local path = require("mason-core.path") + +local function mason_package(...) + return path.concat{vim.fn.stdpath("data"), "mason", "packages", ...} +end + +local bundles = vim.fn.glob(mason_package("java-debug-adapter", "extension", "server", "com.microsoft.java.debug.plugin-*.jar"), true, true) +local extra_bundles = vim.fn.glob(mason_package("java-test", "extension", "server", "*.jar"), true, true) +vim.list_extend(bundles, extra_bundles) + +require('jdtls').start_or_attach({ + cmd = {mason_package("jdtls", "bin", "jdtls") }, + on_attach = function(client, bufnr) + require'jdtls.setup'.add_commands() + require'jdtls'.setup_dap() + mylsp.on_attach(client, bufnr) + end, + init_options = { + bundles = extra_bundles + } +}) diff --git a/lua/lsp/installer.lua b/lua/lsp/installer.lua index 6214255..e0da00c 100644 --- a/lua/lsp/installer.lua +++ b/lua/lsp/installer.lua @@ -1,8 +1,39 @@ -local status, lsp_installer = pcall(require,"nvim-lsp-installer") -if (not status) then return end +local status1, mason = pcall(require, "mason") +local status2, mason_lspconfig = pcall(require, "mason-lspconfig") +if (not (status1 and status2)) then return end -lsp_installer.on_server_ready(function(server) - local opts = {} +return function(on_attach) + mason.setup {} + mason_lspconfig.setup { + ensure_installed = { 'jdtls', 'lua_ls' } + } - server:setup(opts) -end) + local no_autosetup = { + jdtls = true + } + + local extra_config = { + lua_ls = { + on_attach = on_attach, + settings = { + Lua = { + diagnostics = { globals = { 'vim' } }, + workspace = { + library = vim.api.nvim_get_runtime_file("", true), + }, + telemetry = { enable = false }, + }, + }, + } + } + + mason_lspconfig.setup_handlers { + function(server_name) + if (not no_autosetup[server_name]) then + require("lspconfig")[server_name].setup( + extra_config[server_name] or { on_attach = on_attach } + ) + end + end, + } +end diff --git a/lua/lsp/metals.lua b/lua/lsp/metals.lua index 6d13c40..fe7416d 100644 --- a/lua/lsp/metals.lua +++ b/lua/lsp/metals.lua @@ -42,7 +42,7 @@ return function(on_attach) -- NOTE: You may or may not want java included here. You will need it if you -- want basic Java support but it may also conflict if you are using -- something like nvim-jdtls which also works on a java filetype autocmd. - pattern = { "scala", "sbt", "java" }, + pattern = { "scala", "sbt" }, callback = function() require("metals").initialize_or_attach(metals_config) end, diff --git a/lua/my-lsp.lua b/lua/my-lsp.lua index c9c3602..01be8fe 100644 --- a/lua/my-lsp.lua +++ b/lua/my-lsp.lua @@ -2,18 +2,20 @@ --lsp_status.register_progress() +local map = vim.keymap.set +map("n", "dr", function() require("dap").repl.toggle() end, { silent = true }) + -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_attach = function(client, bufnr) - local map = vim.keymap.set local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end --Enable completion triggered by vim.bo[bufnr].omnifunc = 'v:lua.vim.lsp.omnifunc' -- Mappings. - local opts = { silent=true, buffer=bufnr } - local loud = { buffer=bufnr } + local opts = { silent = true, buffer = bufnr } + local loud = { buffer = bufnr } -- See `:help vim.lsp.*` for documentation on any of the below functions map('n', 'gD', vim.lsp.buf.declaration, opts) @@ -24,16 +26,15 @@ local on_attach = function(client, bufnr) map('n', '', vim.lsp.buf.signature_help, opts) map('n', 'D', vim.lsp.buf.type_definition, opts) map('n', 'rn', vim.lsp.buf.rename, opts) - map('n', '', vim.lsp.buf.code_action, loud) + map('n', '', vim.lsp.buf.code_action, loud) map('n', '', vim.lsp.codelens.run, loud) map('n', 'gr', vim.lsp.buf.references, opts) map('n', '', vim.diagnostic.open_float, opts) map('n', '[d', vim.diagnostic.goto_prev, opts) map('n', ']d', vim.diagnostic.goto_next, opts) map('n', '', vim.diagnostic.setloclist, opts) - map("n", "f", vim.lsp.buf.formatting, opts) + map("n", "f", function() vim.lsp.buf.format { async = true } end, opts) map("n", "dc", function() require("dap").continue() end, opts) - map("n", "dr", function() require("dap").repl.toggle() end, opts) map("n", "dK", function() require("dap.ui.widgets").hover() end, opts) map("n", "dt", function() require("dap").toggle_breakpoint() end, opts) map("n", "dso", function() require("dap").step_over() end, opts) @@ -44,28 +45,32 @@ local on_attach = function(client, bufnr) map("n", "aw", function() vim.diagnostic.setqflist({ severity = "W" }) end, opts) map("n", "ae", function() vim.diagnostic.setqflist({ severity = "E" }) end, opts) - vim.cmd [[autocmd BufEnter,CursorHold,InsertLeave lua vim.lsp.codelens.refresh()]] --- vim.cmd [[autocmd CursorHoldI * silent! lua vim.lsp.buf.signature_help()]] + vim.cmd [[autocmd BufEnter,BufWrite lua vim.lsp.codelens.refresh()]] + vim.cmd [[autocmd CursorHoldI * silent! lua vim.lsp.buf.signature_help()]] vim.cmd [[autocmd CursorHold * lua vim.diagnostic.open_float({max_width = 100, focusable = false})]] + + vim.lsp.codelens.refresh() end +require("lsp.installer")(on_attach) require("lsp.metals")(on_attach) - require("lsp.typescript")(on_attach) vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( vim.lsp.diagnostic.on_publish_diagnostics, { - virtual_text = false, - underline = true, - signs = true, - } + virtual_text = false, + underline = true, + signs = true, +} ) vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with( vim.lsp.handlers.signature_help, { - silent = true, focusable = false - } + silent = true, focusable = false +} ) local signature_help_cfg = {} require "lsp_signature".setup(signature_help_cfg) + +return { on_attach = on_attach } diff --git a/packages.vim b/packages.vim index 1ec69ce..a8e8d94 100644 --- a/packages.vim +++ b/packages.vim @@ -39,7 +39,8 @@ Plug 'hrsh7th/vim-vsnip' Plug 'hrsh7th/vim-vsnip-integ' Plug 'nvim-lua/plenary.nvim' Plug 'scalameta/nvim-metals' -Plug 'williamboman/nvim-lsp-installer' +Plug 'williamboman/mason.nvim' +Plug 'williamboman/mason-lspconfig.nvim' Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} Plug 'nvim-lua/lsp-status.nvim' @@ -52,6 +53,7 @@ Plug 'nvim-telescope/telescope.nvim' Plug 'nvim-telescope/telescope-fzf-native.nvim', { 'do': 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' } Plug 'gbrlsnchs/telescope-lsp-handlers.nvim' Plug 'ray-x/lsp_signature.nvim' +Plug 'mfussenegger/nvim-jdtls' Plug 'mfussenegger/nvim-dap'