Skip to content

Instantly share code, notes, and snippets.

@qianwch
Created June 24, 2022 03:37
Show Gist options
  • Save qianwch/6ef447bd06453870b377f7165495763e to your computer and use it in GitHub Desktop.
Save qianwch/6ef447bd06453870b377f7165495763e to your computer and use it in GitHub Desktop.
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'lspkind'.init()
-- require'lspsaga'.init_lsp_saga()
-- Kommentary
vim.api.nvim_set_keymap("n", "<leader>/", "<plug>kommentary_line_default", {})
vim.api.nvim_set_keymap("v", "<leader>/", "<plug>kommentary_visual_default", {})
require'formatter'.setup{
filetype = {
java = {
function()
return {
exe = '/Library/Java/JavaVirtualMachines/java11/Contents/Home/bin/java',
args = { '-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', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts)
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
buf_set_keymap('n', '<leader>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<leader>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
buf_set_keymap('n', '<leader>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
buf_set_keymap('n', '<leader>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)
buf_set_keymap('n', '<leader>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references() && vim.cmd("copen")<CR>', opts)
buf_set_keymap('n', '<leader>e', '<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>', opts)
buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
buf_set_keymap('n', '<leader>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts)
-- Java specific
buf_set_keymap("n", "<leader>di", "<Cmd>lua require'jdtls'.organize_imports()<CR>", opts)
buf_set_keymap("n", "<leader>dt", "<Cmd>lua require'jdtls'.test_class()<CR>", opts)
buf_set_keymap("n", "<leader>dn", "<Cmd>lua require'jdtls'.test_nearest_method()<CR>", opts)
buf_set_keymap("v", "<leader>de", "<Esc><Cmd>lua require('jdtls').extract_variable(true)<CR>", opts)
buf_set_keymap("n", "<leader>de", "<Cmd>lua require('jdtls').extract_variable()<CR>", opts)
buf_set_keymap("v", "<leader>dm", "<Esc><Cmd>lua require('jdtls').extract_method(true)<CR>", opts)
buf_set_keymap("n", "<leader>cf", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
buf_set_keymap("n", "<leader>ac", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts)
buf_set_keymap("v", "<leader>ac", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts)
vim.api.nvim_exec([[
hi LspReferenceRead cterm=bold ctermbg=red guibg=#555555
hi LspReferenceText cterm=bold ctermbg=red guibg=#555555
hi LspReferenceWrite cterm=bold ctermbg=red guibg=#555555
" augroup lsp_document_highlight
" autocmd!
" autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
" autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
" augroup END
]], false)
require('jdtls').setup_dap({ hotcodereplace = 'auto' })
end
local root_markers = {'gradlew', 'pom.xml', '.git', 'build.gradle'}
local root_dir = require('jdtls.setup').find_root(root_markers)
local home = os.getenv('HOME')
local jdtls_home = home .. '/.local/share/nvim/lsp_servers/jdtls'
local capabilities = {
workspace = {
configuration = true
},
textDocument = {
completion = {
completionItem = {
snippetSupport = true
}
}
}
}
if not (root_dir == nill or root_dir == '') then
vim.cmd('cd '.. root_dir)
end
local workspace_folder = home .. '/.local/var/jdt-ls/' .. 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/eclipse-java-google-style.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}}"
}
};
configuration = {
runtimes = {
{
name = 'JavaSE-11',
path = '/Library/Java/JavaVirtualMachines/java11/Contents/Home/'
},
{
name = 'JavaSE-17',
path = '/Library/Java/JavaVirtualMachines/java17/Contents/Home/'
},
{
name = 'JavaSE-1.8',
path = '/Library/Java/JavaVirtualMachines/java8/Contents/Home/',
default = true
}
}
};
};
}
config.cmd = {
'java',
-- '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044',
'-javaagent:' .. home .. '/.local/jars/lombok.jar',
'-Xbootclasspath/a:' .. home .. '/.local/jars/lombok.jar',
'-Declipse.application=org.eclipse.jdt.ls.core.id1',
'-Dosgi.bundles.defaultStartLevel=4',
'-Declipse.product=org.eclipse.jdt.ls.core.product',
'-Dlog.protocol=true',
'-Dlog.level=ALL',
'-Xms256m',
'-Xmx2g',
'-jar', vim.fn.glob(jdtls_home .. '/plugins/org.eclipse.equinox.launcher_*.jar'),
'-configuration', jdtls_home .. '/config_mac',
'--add-modules=ALL-SYSTEM',
'--add-opens', 'java.base/java.util=ALL-UNNAMED',
'--add-opens', 'java.base/java.lang=ALL-UNNAMED',
'-data',
workspace_folder
}
config.on_attach = on_attach
config.on_init = function(client, _)
client.notify('workspace/didChangeConfiguration', { settings = config.settings })
end
local jar_patterns = {
'/.local/jars/com.microsoft.java.debug.plugin-*.jar',
'/.local/jars/decompiler/*.jar',
'/.local/jars/java-test/*.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-with-dependencies.jar') then
table.insert(bundles, bundle)
end
end
end
local extendedClientCapabilities = require'jdtls'.extendedClientCapabilities
extendedClientCapabilities.resolveAdditionalTextEditsSupport = true
config.init_options = {
bundles = bundles;
extendedClientCapabilities = extendedClientCapabilities;
}
-- Server
require('jdtls').start_or_attach(config)
end
return M
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment