nixos: gen 45 @ lilac — 2026-09-18 08:18 26.05.20260814.02e0898 (Yarara) ----- refactoring nvim.nix and adding better java integration

This commit is contained in:
2026-09-18 08:18:18 -06:00
parent b85e10aa25
commit 77178d0b6e
3 changed files with 179 additions and 37 deletions
+76 -26
View File
@@ -1,5 +1,8 @@
{ config, pkgs, ... }:
let
javaDebug = pkgs.vscode-extensions.vscjava.vscode-java-debug;
in
{
programs.neovim = {
enable = true;
@@ -27,9 +30,8 @@
vim.opt.updatetime = 50
vim.opt.foldmethod = "indent"
vim.opt.foldlevel = 99
vim.g.mapleader = " "
vim.keymap.set("n", "<leader>", ":")
vim.keymap.set("n", "<leader>w", "<cmd>w<CR>", { silent = true })
vim.keymap.set("n", "<leader>q", "<cmd>q<CR>", { silent = true })
vim.keymap.set("n", "<leader>wq", "<cmd>wq<CR>", { silent = true })
@@ -67,7 +69,7 @@
})
require("lualine").setup({
ons = { theme = "auto" },
options = { theme = "auto" },
})
require("neocord").setup({
@@ -86,7 +88,14 @@
},
})
-- Java indentation must match Eclipse's formatter, not your 2-space default.
-- Indent is left off deliberately: treesitter's Java indent fights the
-- Eclipse-matching tab settings applied in the FileType autocmd below.
require("nvim-treesitter.configs").setup({
highlight = { enable = true },
indent = { enable = false },
})
-- Java indentation must match Eclipse's formatter, not the 2-space default.
vim.api.nvim_create_autocmd("FileType", {
pattern = "java",
callback = function()
@@ -117,24 +126,41 @@
local capabilities = require("cmp_nvim_lsp").default_capabilities()
-- .project and .classpath come first so a repo containing several
-- assignments resolves to the assignment, not the repo root.
local root_markers = { ".project", ".classpath", "pom.xml", "build.gradle", ".git" }
local bundles = vim.fn.glob(
"${javaDebug}/share/vscode/extensions/vscjava.vscode-java-debug/server/com.microsoft.java.debug.plugin-*.jar",
true, true)
if #bundles == 0 then
vim.notify("java-debug bundle not found - Java debugging disabled", vim.log.levels.WARN)
end
local java_home = os.getenv("JAVA_HOME")
if not java_home then
vim.notify("JAVA_HOME unset - jdtls will guess a runtime", vim.log.levels.WARN)
end
-- Eclipse metadata wins over build files, build files over .git, and the
-- file's own directory is the last resort so bare folders still attach.
local function find_project_root()
local setup = require("jdtls.setup")
return setup.find_root({ ".project", ".classpath" })
or setup.find_root({ "pom.xml", "build.gradle", "build.gradle.kts" })
or setup.find_root({ ".git" })
or vim.fn.expand("%:p:h")
end
local dap_configured = false
local function start_jdtls()
local jdtls = require("jdtls")
local root_dir = require("jdtls.setup").find_root(root_markers)
if not root_dir or root_dir == "" then return end
local root_dir = find_project_root()
local project_name = vim.fn.fnamemodify(root_dir, ":p:h:t")
.. "-" .. vim.fn.sha256(root_dir):sub(1, 8)
local workspace = vim.fn.stdpath("cache") .. "/jdtls-workspaces/" .. project_name
local java_settings = {
configuration = {
updateBuildConfiguration = "interactive",
runtimes = {
{ name = "JavaSE-21", path = os.getenv("JAVA_HOME"), default = true },
},
updateBuildConfiguration = "automatic",
},
-- Keep a stray pom.xml from overriding the Eclipse project model.
-- Flip these on if a course actually requires Maven or Gradle.
@@ -142,10 +168,20 @@
maven = { enabled = false },
gradle = { enabled = false },
},
project = {
outputPath = "bin",
referencedLibraries = { "lib/**/*.jar" },
},
signatureHelp = { enabled = true },
eclipse = { downloadSources = true },
}
if java_home then
java_settings.configuration.runtimes = {
{ name = "JavaSE-21", path = java_home, default = true },
}
end
-- If the repo carries an exported Eclipse formatter profile, use it verbatim.
local formatter = root_dir .. "/.settings/eclipse-formatter.xml"
if vim.uv.fs_stat(formatter) then
@@ -157,8 +193,14 @@
root_dir = root_dir,
capabilities = capabilities,
settings = { java = java_settings },
init_options = { bundles = {} },
init_options = { bundles = bundles },
on_attach = function(_, bufnr)
require("jdtls").setup_dap({ hotcodereplace = "auto" })
if not dap_configured then
dap_configured = true
require("jdtls.dap").setup_dap_main_class_configs()
end
local map = function(k, f) vim.keymap.set("n", k, f, { buffer = bufnr, silent = true }) end
map("gd", vim.lsp.buf.definition)
map("gr", vim.lsp.buf.references)
@@ -176,15 +218,25 @@
callback = start_jdtls,
})
require("neotest").setup({
adapters = {
require("neotest-java")({
junit_jar = vim.uv.os_homedir() .. "/dev/jars/junit-*.jar",
-- jvm_args = { "-Xmx512m" },
incremental_build = true,
}),
},
})
local dap, dapui = require("dap"), require("dapui")
dapui.setup()
require("nvim-dap-virtual-text").setup()
dap.listeners.after.event_initialized["dapui"] = function() dapui.open() end
dap.listeners.before.event_terminated["dapui"] = function() dapui.close() end
dap.listeners.before.event_exited["dapui"] = function() dapui.close() end
vim.keymap.set("n", "<leader>db", dap.toggle_breakpoint)
vim.keymap.set("n", "<leader>dB", function()
dap.set_breakpoint(vim.fn.input("Condition: "))
end)
vim.keymap.set("n", "<leader>dc", dap.continue)
vim.keymap.set("n", "<leader>dn", dap.step_over)
vim.keymap.set("n", "<leader>di", dap.step_into)
vim.keymap.set("n", "<leader>du", dap.step_out)
vim.keymap.set("n", "<leader>dr", dap.repl.toggle)
vim.keymap.set("n", "<leader>dq", dap.terminate)
vim.keymap.set({ "n", "v" }, "<leader>de", function() dapui.eval() end)
'';
plugins = with pkgs.vimPlugins; [
@@ -197,11 +249,9 @@
{ plugin = gitsigns-nvim; }
{ plugin = nvim-jdtls; }
{ plugin = nvim-nio; }
{ plugin = neotest; }
{ plugin = neotest-java; }
{ plugin = nvim-dap; }
{ plugin = nvim-dap-ui; }
{ plugin = nvim-nio; }
{ plugin = nvim-dap-virtual-text; }
{ plugin = nvim-cmp; }
{ plugin = cmp-nvim-lsp; }