local M = {} function M.setup() local on_attach = function(client, bufnr) require "jdtls.setup".add_commands() -- require "jdtls".setup_dap() -- require "lsp-status".register_progress() require "compe".setup { enabled = true, autocomplete = true, debug = false, min_length = 1, preselect = "enable", throttle_time = 80, source_timeout = 200, incomplete_delay = 400, max_abbr_width = 100, max_kind_width = 100, max_menu_width = 100, documentation = true, source = { path = true, buffer = true, calc = true, vsnip = false, nvim_lsp = true, nvim_lua = true, spell = true, tags = true, snippets_nvim = false, treesitter = true } } require "lspkind".init() require "formatter".setup { filetype = { java = { function() return { exe = "java", args = { "--add-exports", "jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", "--add-exports", "jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports", "jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", "--add-exports", "jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", "--add-exports", "jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED", "-jar", os.getenv("HOME") .. "/.local/jars/google-java-format.jar", vim.api.nvim_buf_get_name(0) }, stdin = true } end } } } vim.api.nvim_exec( [[ augroup FormatAutogroup autocmd! autocmd BufWritePost *.java FormatWrite augroup end ]], true ) 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", "", "lua vim.lsp.buf.rename()", opts) buf_set_keymap("n", "a", "lua require('jdtls').code_action()", opts) buf_set_keymap("v", "a", "lua require('jdtls').code_action(true)", opts) buf_set_keymap("n", "r", "lua require('jdtls').code_action(false, 'refactor')", opts) buf_set_keymap("n", "gr", 'lua vim.lsp.buf.references() && vim.cmd("copen")', opts) buf_set_keymap("n", "d", "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) -- Java specific buf_set_keymap("n", "rt", "lua require'jdtls'.test_class()", opts) buf_set_keymap("n", "rn", "lua require'jdtls'.test_nearest_method()", opts) buf_set_keymap("v", "ev", "lua require('jdtls').extract_variable(true)", opts) buf_set_keymap("n", "ev", "lua require('jdtls').extract_variable()", opts) buf_set_keymap("v", "em", "lua require('jdtls').extract_method(true)", opts) end local root_markers = {"gradlew", "pom.xml"} local root_dir = require("jdtls.setup").find_root(root_markers) local home = os.getenv("HOME") local capabilities = { workspace = { configuration = true }, textDocument = { completion = { completionItem = { snippetSupport = true } } } } local workspace_folder = home .. "/.workspace" .. vim.fn.fnamemodify(root_dir, ":p:h:t") local config = { flags = { allow_incremental_sync = true }, capabilities = capabilities, on_attach = on_attach } config.settings = { ["java.format.settings.url"] = home .. "/.config/nvim/language-servers/java-google-formatter.xml", ["java.format.settings.profile"] = "GoogleStyle", java = { signatureHelp = {enabled = true}, contentProvider = {preferred = "fernflower"}, completion = { favoriteStaticMembers = { "org.hamcrest.MatcherAssert.assertThat", "org.hamcrest.Matchers.*", "org.hamcrest.CoreMatchers.*", "org.junit.jupiter.api.Assertions.*", "java.util.Objects.requireNonNull", "java.util.Objects.requireNonNullElse", "org.mockito.Mockito.*" } }, sources = { organizeImports = { starThreshold = 9999, staticStarThreshold = 9999 } }, codeGeneration = { toString = { template = "${object.className}{${member.name()}=${member.value}, ${otherMembers}}" } } } } config.cmd = {"java-lsp.sh", workspace_folder} config.on_attach = on_attach config.on_init = function(client, _) client.notify("workspace/didChangeConfiguration", {settings = config.settings}) end -- local jar_patterns = { -- '/dev/microsoft/java-debug/com.microsoft.java.debug.plugin/target/com.microsoft.java.debug.plugin-*.jar', -- '/dev/dgileadi/vscode-java-decompiler/server/*.jar', -- '/dev/microsoft/vscode-java-test/server/*.jar', -- } -- local bundles = {} -- for _, jar_pattern in ipairs(jar_patterns) do -- for _, bundle in ipairs(vim.split(vim.fn.glob(home .. jar_pattern), '\n')) do -- if not vim.endswith(bundle, 'com.microsoft.java.test.runner.jar') then -- table.insert(bundles, bundle) -- end -- end -- end local extendedClientCapabilities = require "jdtls".extendedClientCapabilities extendedClientCapabilities.resolveAdditionalTextEditsSupport = true config.init_options = { -- bundles = bundles; extendedClientCapabilities = extendedClientCapabilities } -- UI --[[ local finders = require "telescope.finders" local sorters = require "telescope.sorters" local actions = require "telescope.actions" local pickers = require "telescope.pickers" require("jdtls.ui").pick_one_async = function(items, prompt, label_fn, cb) local opts = {} pickers.new( opts, { prompt_title = prompt, finder = finders.new_table { results = items, entry_maker = function(entry) return { value = entry, display = label_fn(entry), ordinal = label_fn(entry) } end }, sorter = sorters.get_generic_fuzzy_sorter(), attach_mappings = function(prompt_bufnr) actions.goto_file_selection_edit:replace( function() local selection = actions.get_selected_entry(prompt_bufnr) actions.close(prompt_bufnr) cb(selection.value) end ) return true end } ):find() end ]] -- Server require("jdtls").start_or_attach(config) end return M