diff --git a/nvim/ftplugin/java.lua b/nvim/ftplugin/java.lua new file mode 100644 index 0000000..083a368 --- /dev/null +++ b/nvim/ftplugin/java.lua @@ -0,0 +1,33 @@ +local markers = { '.git', 'mvnw', 'gradlew', 'pom.xml', 'build.gradle', 'build.gradle.kts', 'settings.gradle', 'settings.gradle.kts' } +local file_path = vim.api.nvim_buf_get_name(0) +local root_dir = vim.fs.root(0, markers) or vim.fs.dirname(file_path) + +if not root_dir then + vim.notify('JDTLS was not started: the current buffer has no file path.', vim.log.levels.WARN) + return +end + +local jdtls_cmd = vim.fn.exepath('jdtls') +if jdtls_cmd == '' then + vim.notify('JDTLS was not started: install jdtls and make it available on PATH.', vim.log.levels.WARN) + return +end + +local workspace_dir = vim.fn.stdpath('data') .. '/jdtls-workspaces/' .. vim.fn.sha256(root_dir) +vim.fn.mkdir(workspace_dir, 'p') + +local handlers = require('user.lsp.handlers') +local config = { + cmd = { jdtls_cmd, '-data', workspace_dir }, + root_dir = root_dir, + capabilities = handlers.capabilities, + on_attach = function(client, bufnr) + handlers.on_attach(client, bufnr) + local opts = { buffer = bufnr, silent = true } + vim.keymap.set('n', 'oi', require('jdtls').organize_imports, opts) + end, + init_options = { bundles = {} }, + settings = { java = {} }, +} + +require('jdtls').start_or_attach(config) diff --git a/nvim/lua/user/cmp.lua b/nvim/lua/user/cmp.lua index 125df21..8fc3ae5 100644 --- a/nvim/lua/user/cmp.lua +++ b/nvim/lua/user/cmp.lua @@ -66,13 +66,19 @@ cmp.setup { end, }, window = { - documentation = cmp.config.window.bordered() + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered({ + max_height = 10, + max_width = 80, + }), }, mapping = { [''] = cmp.mapping.select_prev_item(), [''] = cmp.mapping.select_next_item(), [''] = cmp.mapping(cmp.mapping.scroll_docs(-1), { 'i', 'c' }), [''] = cmp.mapping(cmp.mapping.scroll_docs(1), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }), [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), [''] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. [''] = cmp.mapping { diff --git a/nvim/lua/user/lsp/handlers.lua b/nvim/lua/user/lsp/handlers.lua index 931da21..1506cc3 100644 --- a/nvim/lua/user/lsp/handlers.lua +++ b/nvim/lua/user/lsp/handlers.lua @@ -77,7 +77,7 @@ local function lsp_keymaps(bufnr) vim.api.nvim_buf_set_keymap(bufnr, 'n', '', "lua vim.lsp.buf.signature_help()", opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'rn', 'lua vim.lsp.buf.rename()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gr', 'lua vim.lsp.buf.references()', opts) - -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', 'lua vim.lsp.buf.code_action()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', 'lua vim.lsp.buf.code_action()', opts) -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'f', 'lua vim.diagnostic.open_float()', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', '[d', 'lua vim.diagnostic.goto_prev({ border = "rounded" })', opts) vim.api.nvim_buf_set_keymap(bufnr, 'n', ']d', 'lua vim.diagnostic.goto_next({ border = "rounded" })', opts) diff --git a/nvim/lua/user/lsp/lsp_installer.lua b/nvim/lua/user/lsp/lsp_installer.lua index 752d24b..84af643 100644 --- a/nvim/lua/user/lsp/lsp_installer.lua +++ b/nvim/lua/user/lsp/lsp_installer.lua @@ -20,6 +20,8 @@ local opts = { -- lua_ls config lspconfig.lua_ls.setup { + on_attach = opts.on_attach, + capabilities = opts.capabilities, settings = { Lua = { runtime = { @@ -41,14 +43,14 @@ lspconfig.lua_ls.setup { -- python local pyright_settings = require('user.lsp.settings.pyright').settings lspconfig.pyright.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, settings = pyright_settings } local pylsp_settings = require('user.lsp.settings.pylsp').settings lspconfig.pylsp.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, settings = pylsp_settings } @@ -56,38 +58,39 @@ lspconfig.pylsp.setup { -- json local jsonls_settings = require('user.lsp.settings.jsonls').settings lspconfig.jsonls.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, settings = jsonls_settings } -- ruby lspconfig.solargraph.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, } -- md lspconfig.marksman.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, } -- astro lspconfig.astro.setup({ + on_attach = opts.on_attach, capabilities = require("cmp_nvim_lsp").default_capabilities(), filetypes = { "astro" }, }) -- ts lspconfig.ts_ls.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, } -- eslint lspconfig.eslint.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, } @@ -101,13 +104,13 @@ lspconfig.gopls.setup { -- css lspconfig.cssls.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, } -- bash lspconfig.bashls.setup { - attach = opts.on_attach, + on_attach = opts.on_attach, capabilities = opts.capabilities, } diff --git a/nvim/lua/user/plugins.lua b/nvim/lua/user/plugins.lua index 3538d9a..0906d20 100644 --- a/nvim/lua/user/plugins.lua +++ b/nvim/lua/user/plugins.lua @@ -69,6 +69,7 @@ return packer.startup(function(use) -- lsp use 'neovim/nvim-lspconfig' use 'williamboman/nvim-lsp-installer' + use 'mfussenegger/nvim-jdtls' use ({ 'nvimdev/lspsaga.nvim', after = 'nvim-lspconfig', @@ -240,6 +241,7 @@ return packer.startup(function(use) use 'ThePrimeagen/vim-be-good' use { 'echasnovski/mini.map', branch = 'stable' } use "sbdchd/neoformat" + use 'stevearc/conform.nvim' if PACKER_BOOTSTRAP then require('packer').sync() diff --git a/nvim/lua/user/plugins_configs/conform.lua b/nvim/lua/user/plugins_configs/conform.lua new file mode 100644 index 0000000..afec791 --- /dev/null +++ b/nvim/lua/user/plugins_configs/conform.lua @@ -0,0 +1,24 @@ +local ok, conform = pcall(require, 'conform') +if not ok then + return +end + +conform.setup { + formatters = { + project_google_java_format = { + command = 'google-java-format', + condition = function() + return vim.fn.executable('google-java-format') == 1 + end, + stdin = true, + }, + }, + formatters_by_ft = { + java = { 'project_google_java_format' }, + }, + format_on_save = function(bufnr) + if vim.bo[bufnr].filetype == 'java' then + return { timeout_ms = 3000, lsp_format = 'never' } + end + end, +} diff --git a/nvim/lua/user/plugins_configs/init.lua b/nvim/lua/user/plugins_configs/init.lua index 8084999..4d4257e 100644 --- a/nvim/lua/user/plugins_configs/init.lua +++ b/nvim/lua/user/plugins_configs/init.lua @@ -1,4 +1,5 @@ require('user.plugins_configs.bufferline') +require('user.plugins_configs.conform') require('user.plugins_configs.floaterm') require('user.plugins_configs.gitsigns') require('user.plugins_configs.blame') @@ -24,4 +25,3 @@ require('user.plugins_configs.ts_autotag') -- require('user.plugins_configs.solar_client') -- winbar requires NeoVim nightly, aka 0.9.x -- require('user.plugins.winbar') - diff --git a/nvim/lua/user/plugins_configs/treesitter.lua b/nvim/lua/user/plugins_configs/treesitter.lua index b6b68c8..5599a9d 100644 --- a/nvim/lua/user/plugins_configs/treesitter.lua +++ b/nvim/lua/user/plugins_configs/treesitter.lua @@ -14,6 +14,7 @@ configs.setup { 'ruby', 'python', 'go', + 'java', 'sql', 'markdown', 'astro',