diff --git a/lua/basics.lua b/lua/basics.lua index 28a94cd..4dd40fa 100644 --- a/lua/basics.lua +++ b/lua/basics.lua @@ -8,7 +8,7 @@ set.termguicolors = true set.swapfile = false set.cursorline = true set.cursorlineopt = "number" -set.scrolloff = 10 +set.scrolloff = 5 vim.cmd [[filetype plugin indent on]] set.tabstop = 2 diff --git a/lua/plugins.lua b/lua/plugins.lua index 4852abd..b89a609 100644 --- a/lua/plugins.lua +++ b/lua/plugins.lua @@ -203,9 +203,11 @@ return require("packer").startup( { "jameshiew/nvim-magic", config = function() - require("nvim-magic").setup({ - use_default_keymap = false - }) + require("nvim-magic").setup( + { + use_default_keymap = false + } + ) end, tag = "v0.2.1", -- recommended to pin to a tag and update manually as there may be breaking changes requires = { @@ -214,5 +216,19 @@ return require("packer").startup( } } ) + use { + "mfussenegger/nvim-jdtls", + config = function() + vim.cmd( + [[ + augroup jdtls_lsp + autocmd! + autocmd FileType java lua require'plugins/java-lsp'.setup() + augroup end + ]] + ) + end, + requires = {"mfussenegger/nvim-dap"} + } end ) diff --git a/lua/plugins/java-lsp.lua b/lua/plugins/java-lsp.lua new file mode 100644 index 0000000..cac92ba --- /dev/null +++ b/lua/plugins/java-lsp.lua @@ -0,0 +1,238 @@ +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 diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua index 0d2e16f..720748f 100644 --- a/lua/plugins/lsp.lua +++ b/lua/plugins/lsp.lua @@ -127,6 +127,10 @@ require "lspconfig".tsserver.setup { } } +--[[ require "lspconfig".java_language_server.setup { + on_attach = on_attach, + cmd = {"java-language-server"} +} ]] local servers = {"pyright", "bashls", "clangd", "cssls"} for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { diff --git a/spell/de.utf-8.add b/spell/de.utf-8.add index 2316276..3e24e00 100644 --- a/spell/de.utf-8.add +++ b/spell/de.utf-8.add @@ -8,3 +8,4 @@ Mojang config #echnic technic/! +ConfigManager diff --git a/spell/de.utf-8.add.spl b/spell/de.utf-8.add.spl index a100184..f2b59db 100644 Binary files a/spell/de.utf-8.add.spl and b/spell/de.utf-8.add.spl differ