vim.opt.number = true vim.opt.relativenumber = true vim.opt.smartcase = true vim.opt.ignorecase = true vim.opt.ts = 4 vim.opt.sw = 0 vim.opt.foldmethod = "indent" vim.opt.foldlevel = 99 vim.opt.clipboard = "unnamedplus" vim.opt.signcolumn = "yes" vim.opt.termguicolors = true vim.pack.add({ { src = "https://github.com/stevearc/oil.nvim" }, { src = "https://github.com/echasnovski/mini.pick" }, { src = "https://github.com/echasnovski/mini.icons" }, { src = "https://github.com/nvim-treesitter/nvim-treesitter" }, { src = "https://github.com/neovim/nvim-lspconfig" }, { src = "https://github.com/sainnhe/everforest" }, { src = "https://github.com/nvim-lualine/lualine.nvim" }, { src = "https://github.com/stevearc/conform.nvim" }, -- autoclosing tags { src = "https://github.com/windwp/nvim-ts-autotag" }, { src = "https://github.com/terrortylor/nvim-comment" }, -- required by nvim-comment { src = "https://github.com/JoosepAlviste/nvim-ts-context-commentstring" }, -- java support { src = "https://github.com/mfussenegger/nvim-jdtls" }, { src = "https://github.com/folke/which-key.nvim" }, }) require('nvim_comment').setup({ hook = function() require('ts_context_commentstring.internal').update_commentstring() end, }) require('nvim-ts-autotag').setup() -- local function hello() -- local x = vim.fn["nvim_treesitter#statusline(90)"]() -- -- print(x) -- return "test" -- end require('lualine').setup({ options = { theme = "everforest", }, -- sections = { -- -- lualine_a = { 'mode' }, -- -- lualine_b = { 'branch', 'diff', 'diagnostics' }, -- -- lualine_c = { 'filename' }, -- lualine_c = { 'filename', hello }, -- -- lualine_x = { 'encoding', 'fileformat', 'filetype' }, -- -- lualine_y = { 'progress' }, -- -- lualine_z = { 'location' } -- }, }) vim.cmd([[colorscheme everforest]]) require('mini.icons').setup() require('oil').setup({ view_options = { show_hidden = false, sort = { { "type", "asc" }, { "name", "asc" }, }, }, keymaps = { ["o"] = { desc = "Recursively Open directores", callback = function() local oil = require("oil") local dir = oil.get_current_dir() local cursor = oil.get_cursor_entry() local function openRecursively() oil.open(dir .. cursor.name) vim.wait(50) dir = oil.get_current_dir() cursor = oil.get_cursor_entry() local bn = vim.fn.bufnr() local lines = vim.api.nvim_buf_line_count(bn) if lines == 1 and cursor ~= nil and cursor.type == "directory" then openRecursively() end end openRecursively() end, }, }, }) vim.api.nvim_create_autocmd('LspAttach', { callback = function(ev) local client = vim.lsp.get_client_by_id(ev.data.client_id) if client == nil then return end if client:supports_method('textDocument/completion') then vim.lsp.completion.enable(true, client.id, ev.buf, { autotrigger = true }) end if client:supports_method("textDocument/inlayHint") or client.server_capabilities.inlayHintProvider then vim.lsp.inlay_hint.enable(true, { bufnr = ev.buf }) end end, }) vim.cmd("set completeopt+=menuone,noselect,popup") vim.lsp.config('gopls', { settings = { ['gopls'] = { hints = { assignVariableTypes = true, parameterNames = true } }, }, }) vim.lsp.config('tailwindcss', { settings = { tailwindCSS = { colorDecorators = false }, } }) vim.lsp.config('lua_ls', { settings = { Lua = { runtime = { version = 'LuaJIT', }, workspace = { library = vim.api.nvim_get_runtime_file("", true), } }, } }) vim.lsp.config('jdtls', { cmd = { "jdtls", "--jvm-arg=-javaagent:/usr/share/java/lombok/lombok.jar" }, settings = { java = { completion = { favoriteStaticMembers = { "org.assertj.core.api.Assertions.*", "org.assertj.core.api.BDDAssertions.*", "org.mockito.Mockito.*", "org.mockito.ArgumentMatchers.*", "org.mockito.BDDMockito.*", "org.hamcrest.MatcherAssert.*", "org.hamcrest.Matchers.*", "java.util.Collections.*", "java.util.Comparator.*", "java.util.stream.Collectors.*", "java.util.Arrays.*", "java.lang.Math.*", "org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*", "org.springframework.test.web.servlet.result.MockMvcResultMatchers.*", "org.springframework.test.web.servlet.setup.MockMvcBuilders.*", }, }, }, }, }) vim.lsp.enable({ "lua_ls", "gopls", "templ", "ts_ls", "tailwindcss", "bashls", "jdtls", }) -- Enables filtered completions for tailwindcss class names, e.g. "mt-". -- Otherwise the completion contains EVERYTHING vim.api.nvim_create_autocmd("FileType", { pattern = { "html", "templ", "javascript", "typescript", "css" }, callback = function() vim.opt_local.iskeyword:append("-") end, }) require "mini.pick".setup() require "nvim-treesitter.configs".setup({ auto_install = true, highlight = { enable = true, }, incremental_selection = { enable = true, } }) -- 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 = '*', callback = function() vim.highlight.on_yank { higroup = 'IncSearch', timeout = 500 } end, }) require("conform").setup({ formatters_by_ft = { html = { "prettier" }, }, default_format_opts = { lsp_format = "fallback", }, }) vim.api.nvim_create_autocmd('BufWritePre', { desc = 'Autoformat code on save', pattern = '*', callback = function(args) require("conform").format({ bufnr = args.buf }) end, }) vim.filetype.add({ extension = { templ = "templ" } }) vim.g.mapleader = " " vim.keymap.set('i', '', vim.lsp.completion.get, {}) vim.keymap.set('i', '', "", {}) vim.keymap.set('n', 'gd', vim.lsp.buf.definition, {}) 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', { 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", "", "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, { 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" }, "?", function() require("which-key").show({ global = false }) end, { desc = "Buffer Local Keymaps (which-key)" }) -- TODO: Snippets like new java class