vim.api.nvim_exec([[ au FileType go nnoremap :GoDef au FileType go let g:go_template_autocreate = 0 au FileType go let g:go_fmt_command = "@gotools@/bin/goimports" ]], false) local api = vim.api local cmd = vim.cmd local map = vim.keymap.set ---------------------------------- -- OPTIONS ----------------------- ---------------------------------- -- global vim.opt_global.completeopt = { "menuone", "noinsert", "noselect" } vim.opt_global.shortmess:remove("F") -- LSP mappings map("n", "gD", vim.lsp.buf.definition) map("n", "K", vim.lsp.buf.hover) map("n", "gi", vim.lsp.buf.implementation) map("n", "gr", vim.lsp.buf.references) map("n", "gds", vim.lsp.buf.document_symbol) map("n", "gws", vim.lsp.buf.workspace_symbol) map("n", "cl", vim.lsp.codelens.run) map("n", "sh", vim.lsp.buf.signature_help) map("n", "rn", vim.lsp.buf.rename) map("n", "f", vim.lsp.buf.format) map("n", "ca", vim.lsp.buf.code_action) map("n", "ws", function() require("metals").hover_worksheet() end) -- all workspace diagnostics map("n", "aa", vim.diagnostic.setqflist) -- all workspace errors map("n", "ae", function() vim.diagnostic.setqflist({ severity = "E" }) end) -- all workspace warnings map("n", "aw", function() vim.diagnostic.setqflist({ severity = "W" }) end) -- buffer diagnostics only map("n", "d", vim.diagnostic.setloclist) map("n", "[c", function() vim.diagnostic.goto_prev({ wrap = false }) end) map("n", "]c", function() vim.diagnostic.goto_next({ wrap = false }) end) -- completion related settings -- This is similiar to what I use local cmp = require("cmp") cmp.setup({ sources = { { name = "nvim_lsp" }, { name = "vsnip" }, }, snippet = { expand = function(args) -- Comes from vsnip vim.fn["vsnip#anonymous"](args.body) end, }, mapping = cmp.mapping.preset.insert({ -- None of this made sense to me when first looking into this since there -- is no vim docs, but you can't have select = true here _unless_ you are -- also using the snippet stuff. So keep in mind that if you remove -- snippets you need to remove this select [""] = cmp.mapping.confirm({ select = true }), -- I use tabs... some say you should stick to ins-completion but this is just here as an example [""] = function(fallback) if cmp.visible() then cmp.select_next_item() else fallback() end end, [""] = function(fallback) if cmp.visible() then cmp.select_prev_item() else fallback() end end, }), }) ---------------------------------- -- LSP Setup --------------------- ---------------------------------- local metals_config = require("metals").bare_config() -- Example of settings metals_config.settings = { showImplicitArguments = true, excludedPackages = { "akka.actor.typed.javadsl", "com.github.swagger.akka.javadsl" }, metalsBinaryPath = "@metals@/bin/metals", javaHome = "@javaHome@", } -- *READ THIS* -- I *highly* recommend setting statusBarProvider to true, however if you do, -- you *have* to have a setting to display this in your statusline or else -- you'll not see any messages from metals. There is more info in the help -- docs about this metals_config.init_options.statusBarProvider = "on" -- Example if you are using cmp how to make sure the correct capabilities for snippets are set metals_config.capabilities = require("cmp_nvim_lsp").default_capabilities() -- Autocmd that will actually be in charging of starting the whole thing local nvim_metals_group = api.nvim_create_augroup("nvim-metals", { clear = true }) api.nvim_create_autocmd("FileType", { -- NOTE: You may or may not want java included here. You will need it if you -- want basic Java support but it may also conflict if you are using -- something like nvim-jdtls which also works on a java filetype autocmd. pattern = { "scala", "sbt", "java" }, callback = function() require("metals").initialize_or_attach(metals_config) end, group = nvim_metals_group, })