From 9ad2a8e0486e6f8b522d303c54a0fb8294b79cd0 Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Tue, 23 Jun 2026 13:57:40 +0300 Subject: Sort jdtls code actions and completions based on packages I prefer, and add static import to certain Kapi procs --- .config/nvim/lua/plugins/nvim-jdtls.lua | 64 +++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to '.config/nvim/lua/plugins/nvim-jdtls.lua') diff --git a/.config/nvim/lua/plugins/nvim-jdtls.lua b/.config/nvim/lua/plugins/nvim-jdtls.lua index 4929199..6f55aef 100644 --- a/.config/nvim/lua/plugins/nvim-jdtls.lua +++ b/.config/nvim/lua/plugins/nvim-jdtls.lua @@ -1,3 +1,11 @@ +local java_package_weights = { + ['codes%.kyren'] = 100, + ['org%.bukkit'] = 100, + ['io%.papermc'] = 100, + ['org%.jspecify'] = 80, + ['org%.jetbrains'] = 80, + ['net%.minecraft'] = 50, +} return { 'mfussenegger/nvim-jdtls', ft = { 'java' }, @@ -22,6 +30,15 @@ return { -- Safely mix standard blink capabilities with internal jdtls mappings local lsp_capabilities = require('blink.cmp').get_lsp_capabilities() + local function get_action_weight(title) + for pattern, weight in pairs(java_package_weights) do + if title:match(pattern) then + return weight + end + end + return 0 -- Neutral weight for untracked packages + end + local opts = { cmd = { 'jdtls', '-data', workspace_dir }, root_dir = root_dir, @@ -57,6 +74,12 @@ return { -- Stops jdtls from injecting variable placeholders when autocompleting guessMethodArguments = 'off', + favoriteStaticMembers = { + 'codes.kyren.kapi.Kapi.expect', + 'codes.kyren.kapi.Kapi.panic', + 'codes.kyren.kapi.Kapi.unreachable', + }, + filteredTypes = { 'edu.umd.cs.findbugs.*', 'javax.annotation.*', @@ -79,6 +102,46 @@ return { }, }, }, + + on_attach = function(client, bufnr) + if client._code_action_sorted then + return + end + client._code_action_sorted = true + + -- Hook into the absolute lowest-level RPC pipe. + -- This catches 100% of traffic, bypassing any plugin API overrides. + local orig_rpc_request = client.rpc.request + + client.rpc.request = function(method, params, handler, ...) + if method == 'textDocument/codeAction' then + local wrapped_handler = function(err, result, ctx, config) + if not err and result and type(result) == 'table' then + -- Sort the raw array (Respected by native vim.ui.select) + table.sort(result, function(a, b) + local title_a = a.title or '' + local title_b = b.title or '' + local weight_a = get_action_weight(title_a) + local weight_b = get_action_weight(title_b) + + if weight_a ~= weight_b then + return weight_a > weight_b + end + return title_a < title_b + end) + end + + if handler then + return handler(err, result, ctx, config) + end + end + + return orig_rpc_request(method, params, wrapped_handler, ...) + end + + return orig_rpc_request(method, params, handler, ...) + end + end, } require('jdtls').start_or_attach(opts) @@ -91,4 +154,5 @@ return { callback = setup_jdtls, }) end, + java_package_weights = java_package_weights, } -- cgit v1.3.1