Created
June 24, 2022 03:37
-
-
Save qianwch/6ef447bd06453870b377f7165495763e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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