From d5654a2d290e68bdaf11265df446cebab05c4933 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Fri, 28 Aug 2026 20:20:07 -0500 Subject: [PATCH] reduced dependencies --- Dockerfile | 8 +- nvim/lua/darcula/lsp/lightbulb.lua | 177 +++++++++++++++++++++++ nvim/lua/darcula/plugins.lua | 1 - nvim/lua/darcula/setup/500_lightbulb.lua | 21 +-- 4 files changed, 179 insertions(+), 28 deletions(-) create mode 100644 nvim/lua/darcula/lsp/lightbulb.lua diff --git a/Dockerfile b/Dockerfile index 76e5c26..7bf59ef 100644 --- a/Dockerfile +++ b/Dockerfile @@ -243,13 +243,7 @@ RUN \ RUN \ if [ "$NV_DARCULA_ENABLE_COC" = "false" ]; then \ - nvim --headless "+MasonToolsInstallSync" "+qall" && \ - nvim --headless "+LspInstall bashls" "+qall" && \ - nvim --headless "+LspInstall clangd" "+qall" && \ - nvim --headless "+LspInstall cspell_ls" "+qall" && \ - nvim --headless "+LspInstall gopls" "+qall" && \ - nvim --headless "+LspInstall lua_ls" "+qall" && \ - nvim --headless "+LspInstall vimls" "+qall"; \ + nvim --headless "+MasonToolsInstallSync" "+qall"; \ fi ENTRYPOINT ["/entrypoint.sh"] diff --git a/nvim/lua/darcula/lsp/lightbulb.lua b/nvim/lua/darcula/lsp/lightbulb.lua new file mode 100644 index 0000000..ac4006b --- /dev/null +++ b/nvim/lua/darcula/lsp/lightbulb.lua @@ -0,0 +1,177 @@ +-- The MIT License (MIT) +-- +-- Copyright © 2026 Scott E. Graves +-- +-- Permission is hereby granted, free of charge, to any person obtaining a copy of this software +-- and associated documentation files (the “Software”), to deal in the Software without restriction, +-- including without limitation the rights to use, copy, modify, merge, publish, distribute, +-- sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is +-- furnished to do so, subject to the following conditions: +-- +-- The above copyright notice and this permission notice shall be included in all copies or +-- substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +-- BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +-- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +-- DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +local M = {} + +local namespace = vim.api.nvim_create_namespace("DarculaLightbulb") +local requests = {} +local revisions = {} + +local config = { + priority = 10, + sign = { + enabled = true, + text = "💡", + hl = "DiagnosticSignInfo" + }, + virtual_text = { + enabled = false, + text = "💡", + hl = "DiagnosticVirtualTextInfo" + } +} + +local function cancel_request(bufnr) + local cancel = requests[bufnr] + requests[bufnr] = nil + if cancel then + pcall(cancel) + end +end + +local function clear_indicator(bufnr) + if vim.api.nvim_buf_is_valid(bufnr) then + vim.api.nvim_buf_clear_namespace(bufnr, namespace, 0, -1) + end +end + +local function render(bufnr, line) + clear_indicator(bufnr) + if not vim.api.nvim_buf_is_valid(bufnr) then + return + end + + line = math.max(0, math.min(line, vim.api.nvim_buf_line_count(bufnr) - 1)) + + vim.api.nvim_buf_set_extmark( + bufnr, + namespace, + line, + 0, + { + strict = false, + priority = config.priority, + sign_text = config.sign.enabled and config.sign.text or nil, + sign_hl_group = config.sign.enabled and config.sign.hl or nil, + virt_text = config.virtual_text.enabled and + {{config.virtual_text.text, config.virtual_text.hl}} or + nil, + virt_text_pos = config.virtual_text.enabled and "eol" or nil, + hl_mode = config.virtual_text.enabled and "combine" or nil + } + ) +end + +function M.clear(bufnr) + bufnr = bufnr or vim.api.nvim_get_current_buf() + revisions[bufnr] = (revisions[bufnr] or 0) + 1 + cancel_request(bufnr) + clear_indicator(bufnr) +end + +function M.update() + local bufnr = vim.api.nvim_get_current_buf() + local win = vim.api.nvim_get_current_win() + local cursor = vim.api.nvim_win_get_cursor(win) + local line = cursor[1] - 1 + local revision = (revisions[bufnr] or 0) + 1 + revisions[bufnr] = revision + + cancel_request(bufnr) + + local clients = vim.lsp.get_clients( + {bufnr = bufnr, method = "textDocument/codeAction"} + ) + if #clients == 0 then + clear_indicator(bufnr) + return + end + + local diagnostics = vim.lsp.diagnostic.from( + vim.diagnostic.get(bufnr, {lnum = line}) + ) + + requests[bufnr] = vim.lsp.buf_request_all( + bufnr, + "textDocument/codeAction", + function(client) + local params = vim.lsp.util.make_range_params(win, client.offset_encoding) + params.context = {diagnostics = diagnostics} + return params + end, + function(responses) + if + revisions[bufnr] ~= revision or + not vim.api.nvim_buf_is_valid(bufnr) + then + return + end + requests[bufnr] = nil + + local has_actions = false + for _, response in pairs(responses) do + if response.result ~= nil and not vim.tbl_isempty(response.result) then + has_actions = true + break + end + end + + if has_actions then + render(bufnr, line) + else + clear_indicator(bufnr) + end + end + ) +end + +function M.setup(opts) + config = vim.tbl_deep_extend("force", config, opts or {}) + + local group = vim.api.nvim_create_augroup("DarculaLightbulb", {clear = true}) + vim.api.nvim_create_autocmd( + {"CursorHold", "CursorHoldI"}, + { + callback = M.update, + group = group + } + ) + vim.api.nvim_create_autocmd( + "WinLeave", + { + callback = function(args) + M.clear(args.buf) + end, + group = group + } + ) + vim.api.nvim_create_autocmd( + "BufWipeout", + { + callback = function(args) + cancel_request(args.buf) + requests[args.buf] = nil + revisions[args.buf] = nil + end, + group = group + } + ) +end + +return M diff --git a/nvim/lua/darcula/plugins.lua b/nvim/lua/darcula/plugins.lua index 09acfe9..7314ee9 100644 --- a/nvim/lua/darcula/plugins.lua +++ b/nvim/lua/darcula/plugins.lua @@ -85,7 +85,6 @@ else {src = "https://github.com/rafamadriz/friendly-snippets"}, {src = "https://github.com/neovim/nvim-lspconfig"}, {src = "https://github.com/akinsho/flutter-tools.nvim"}, - {src = "https://github.com/kosayoda/nvim-lightbulb"}, {src = "https://github.com/ray-x/lsp_signature.nvim"} } ) diff --git a/nvim/lua/darcula/setup/500_lightbulb.lua b/nvim/lua/darcula/setup/500_lightbulb.lua index 1710daf..3e009b4 100644 --- a/nvim/lua/darcula/setup/500_lightbulb.lua +++ b/nvim/lua/darcula/setup/500_lightbulb.lua @@ -23,10 +23,8 @@ end local symbols = require("darcula.utils.symbols") -require("nvim-lightbulb").setup( +require("darcula.lsp.lightbulb").setup( { - hide_in_unfocused_buffer = true, - link_highlights = false, sign = { enabled = not NV_DARCULA_ENABLE_VIRTUAL_TEXT, text = symbols.status.info, @@ -36,23 +34,6 @@ require("nvim-lightbulb").setup( enabled = NV_DARCULA_ENABLE_VIRTUAL_TEXT, text = symbols.status.info, hl = "DiagnosticVirtualTextInfo" - }, - float = { - enabled = false - }, - status_text = { - enabled = false - }, - number = { - enabled = false - }, - line = { - enabled = false - }, - autocmd = { - enabled = true, - events = {"CursorHold", "CursorHoldI"}, - pattern = {"*"} } } )