diff --git a/init.lua b/init.lua index 16ddd26..80fdb0b 100644 --- a/init.lua +++ b/init.lua @@ -29,7 +29,10 @@ vim.pack.add({ { src = "https://github.com/JoosepAlviste/nvim-ts-context-commentstring" }, -- java support - { src = "https://github.com/mfussenegger/nvim-jdtls" } + { src = "https://github.com/mfussenegger/nvim-jdtls" }, + + { src = "https://github.com/folke/which-key.nvim" }, + { src = "https://github.com/sphamba/smear-cursor.nvim" } }) require('nvim_comment').setup({ @@ -173,6 +176,61 @@ require "nvim-treesitter.configs".setup({ } }) +-- Treesitter Java class + method lookup +local ts = vim.treesitter + +local function java_symbol_under_cursor() + local parser = ts.get_parser(0, "java") + if not parser then return nil, nil end + + local tree = parser:parse()[1] + local root = tree:root() + + local cursor = vim.api.nvim_win_get_cursor(0) + local row, col = cursor[1] - 1, cursor[2] + + local node = root:named_descendant_for_range(row, col, row, col) + if not node then return nil, nil end + + local class_name = nil + local method_name = nil + + -- Walk up the syntax tree + while node do + local type = node:type() + if type == "class_declaration" and not class_name then + local name_node = node:field("name")[1] + if name_node then + class_name = ts.get_node_text(name_node, 0) + end + elseif type == "method_declaration" and not method_name then + local name_node = node:field("name")[1] + if name_node then + method_name = ts.get_node_text(name_node, 0) + end + end + node = node:parent() + end + + return class_name, method_name +end + +local function run_selected_gradle_tests() + local class_name, method_name = java_symbol_under_cursor() + if class_name and method_name then + local cmd = string.format("./gradlew clean test --tests %s.%s", class_name, method_name) + vim.cmd("vsplit | terminal " .. cmd) + end +end + +local function run_all_gradle_tests() + local cmd = string.format("./gradlew clean test") + vim.cmd("vsplit | terminal " .. cmd) +end + + +-- Keymap to print class + method under cursor + vim.api.nvim_create_autocmd('TextYankPost', { desc = 'Hightlight selection on yank', pattern = '*', @@ -197,8 +255,12 @@ vim.api.nvim_create_autocmd('BufWritePre', { vim.filetype.add({ extension = { templ = "templ" } }) + +require('smear_cursor').setup({}) + vim.g.mapleader = " " + vim.keymap.set('i', '', vim.lsp.completion.get, {}) vim.keymap.set('i', '', "", {}) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, {}) @@ -206,23 +268,40 @@ vim.keymap.set('n', 'gr', vim.lsp.buf.references, {}) vim.keymap.set('n', '', vim.lsp.buf.rename, {}) vim.keymap.set('n', '', vim.lsp.buf.code_action, {}) -vim.keymap.set('n', 'q', ':q', {}) -vim.keymap.set('n', 'w', ':w', {}) -vim.keymap.set('n', 'c', ':noh', {}) +vim.keymap.set('n', 'q', ':q', { desc = "Quit current Buffer" }) +vim.keymap.set('n', 'w', ':w', { desc = "Write current Buffer" }) +vim.keymap.set('n', 'c', ':noh', { desc = "Clear search selection" }) vim.keymap.set('n', '', vim.diagnostic.goto_next, {}) -vim.keymap.set('n', 'ff', ":Pick files", {}) -vim.keymap.set('n', 'fg', ":Pick grep", {}) --- vim.keymap.set('n', 'fb', telescope.buffers, {}) -vim.keymap.set('n', 'fh', ":Pick help", {}) +vim.keymap.set("n", "", "h") +-- Terminal is sending Backspace instead of , so this needs to be different +vim.keymap.set("n", "", "h") +vim.keymap.set("n", "", "j") +vim.keymap.set("n", "", "k") +vim.keymap.set("n", "", "l") + +vim.keymap.set('n', 'ff', ":Pick files", { desc = "Find files" }) +vim.keymap.set('n', 'fg', ":Pick grep", { desc = "Search in files" }) +-- vim.keymap.set('v', 'fg', ":Pick grep'<,'>", { desc = "Search in files" }) +vim.keymap.set('n', 'fb', ":Pick buffers", { desc = "Find buffers" }) +vim.keymap.set('n', 'fh', ":Pick help", { desc = "Search vim help" }) vim.keymap.set("n", "-", "Oil", { desc = "Open parent directory" }) -vim.keymap.set("n", "oi", require 'jdtls'.organize_imports) -vim.keymap.set("n", "ev", require 'jdtls'.extract_variable) -vim.keymap.set("n", "ec", require 'jdtls'.extract_constant) -vim.keymap.set("n", "em", require 'jdtls'.extract_method) -vim.keymap.set("v", "em", ":lua require'jdtls'.extract_method(true)", { silent = true }) +vim.keymap.set("n", "oi", require 'jdtls'.organize_imports, { desc = "Organize imports" }) +vim.keymap.set("n", "ev", require 'jdtls'.extract_variable, { desc = "Extract variable" }) +vim.keymap.set("n", "ec", require 'jdtls'.extract_constant, { desc = "Extract constant" }) +vim.keymap.set("n", "em", require 'jdtls'.extract_method, { desc = "Extract method" }) +vim.keymap.set("v", "em", ":lua require'jdtls'.extract_method(true)", + { desc = "Extract method", silent = true }) + +vim.keymap.set("n", "rtc", run_selected_gradle_tests, { desc = "Run Gradle tests under cursor" }) +vim.keymap.set("n", "rta", run_all_gradle_tests, { desc = "Run all Gradle tests" }) + +vim.keymap.set({ "n", "v", "i" }, "?", function() require("which-key").show({ global = false }) end, + { desc = "Buffer Local Keymaps (which-key)" }) + -- TODO: Snippets like new java class +--