From 9792c683bc8e1d6f60183e6c2ae4bb200a305e72 Mon Sep 17 00:00:00 2001 From: mavantgarderc Date: Sun, 4 Jan 2026 06:37:21 +0330 Subject: [PATCH] feat(lsp): toggle lsp on/off for zen/practice --- lazy-lock.json | 2 + lua/core/keymaps/lsp.lua | 10 +++ lua/lsp/shared.lua | 9 +++ lua/lsp/toggle.lua | 142 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 lua/lsp/toggle.lua diff --git a/lazy-lock.json b/lazy-lock.json index c3ea800..9455800 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -33,12 +33,14 @@ "nvim-lspconfig": { "branch": "master", "commit": "41ceb6bba3a40128b7841f5b7f5a9dae7201e823" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, "nvim-treesitter": { "branch": "main", "commit": "c6dd314086f7b471bf6c9110092a94ce1c06d220" }, + "nvim-treesitter-context": { "branch": "master", "commit": "64dd4cf3f6fd0ab17622c5ce15c91fc539c3f24a" }, "nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" }, "nvim-web-devicons": { "branch": "master", "commit": "6788013bb9cb784e606ada44206b0e755e4323d7" }, "obsidian.nvim": { "branch": "main", "commit": "ae1f76a75c7ce36866e1d9342a8f6f5b9c2caf9b" }, "oil.nvim": { "branch": "master", "commit": "81b8a91735ad5cd24a6b3137f14a89f19176364f" }, "oxocarbon.nvim": { "branch": "main", "commit": "9f85f6090322f39b11ae04a343d4eb9d12a86897" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "rainbow-delimiters.nvim": { "branch": "master", "commit": "8aafe2cbd89cd4090f573a98cab6b20366576fde" }, "snap.nvim": { "branch": "main", "commit": "781d05a9727206f3c47181d89a58ee77520d0bda" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, diff --git a/lua/core/keymaps/lsp.lua b/lua/core/keymaps/lsp.lua index b8bbec7..be62c87 100644 --- a/lua/core/keymaps/lsp.lua +++ b/lua/core/keymaps/lsp.lua @@ -305,6 +305,11 @@ function M.setup_lsp_keymaps() end end end + + -- LSP toggle keymap + map("n", "lt", function() + require("lsp.toggle").toggle_lsp() + end, vim.tbl_extend("force", opts, { desc = "Toggle LSP" })) end, }) @@ -321,4 +326,9 @@ function M.setup_lsp_keymaps() }) end +-- Add global LSP toggle keymap +vim.keymap.set("n", "lT", function() + require("lsp.toggle").toggle_lsp_globally() +end, { desc = "Toggle LSP globally" }) + return M diff --git a/lua/lsp/shared.lua b/lua/lsp/shared.lua index 6284de8..e142a62 100644 --- a/lua/lsp/shared.lua +++ b/lua/lsp/shared.lua @@ -186,4 +186,13 @@ function M.setup_workspace_caching() }) end +-- LSP toggle command +vim.api.nvim_create_user_command("LspToggle", function() + require("lsp.toggle").toggle_lsp() +end, { desc = "Toggle LSP for current buffer" }) + +vim.api.nvim_create_user_command("LspToggleGlobal", function() + require("lsp.toggle").toggle_lsp_globally() +end, { desc = "Toggle LSP globally" }) + return M diff --git a/lua/lsp/toggle.lua b/lua/lsp/toggle.lua new file mode 100644 index 0000000..686addd --- /dev/null +++ b/lua/lsp/toggle.lua @@ -0,0 +1,142 @@ +local M = {} + +local lsp_enabled = true +local buffer_lsp_states = {} + +function M.disable_lsp() + if not lsp_enabled then + vim.notify("LSP is already disabled", vim.log.levels.WARN) + return + end + + local bufnr = vim.api.nvim_get_current_buf() + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + + if not buffer_lsp_states[bufnr] then + buffer_lsp_states[bufnr] = {} + end + + for _, client in ipairs(clients) do + table.insert(buffer_lsp_states[bufnr], { + id = client.id, + name = client.name, + }) + + pcall(client.rpc.notify, client, "textDocument/didClose", { + textDocument = { uri = vim.uri_from_bufnr(bufnr) }, + }) + + vim.lsp.buf_detach_client(bufnr, client.id) + end + + vim.diagnostic.disable(bufnr) + + lsp_enabled = false + vim.notify("LSP disabled", vim.log.levels.INFO) +end + +-- Function to enable all LSP clients for current buffer +function M.enable_lsp() + if lsp_enabled then + vim.notify("LSP is already enabled", vim.log.levels.WARN) + return + end + + local bufnr = vim.api.nvim_get_current_buf() + + vim.diagnostic.enable(bufnr) + + local filetype = vim.api.nvim_buf_get_option(bufnr, "filetype") + + local filename = vim.api.nvim_buf_get_name(bufnr) + + local group = vim.api.nvim_create_augroup("LspToggleReattach", { clear = false }) + vim.api.nvim_create_autocmd("BufEnter", { + group = group, + buffer = bufnr, + callback = function() + vim.api.nvim_clear_autocmds({ + group = group, + buffer = bufnr, + }) + + vim.defer_fn(function() + vim.cmd("edit!") + end, 10) + end, + once = true, + }) + + lsp_enabled = true + vim.notify("LSP enabled (re-attaching...)", vim.log.levels.INFO) +end + +-- Toggle function that switches between enabled/disabled states +function M.toggle_lsp() + if lsp_enabled then + M.disable_lsp() + else + M.enable_lsp() + end +end + +-- Check if LSP is currently enabled +function M.is_lsp_enabled() + return lsp_enabled +end + +-- Get LSP status +function M.get_lsp_status() + local clients = vim.lsp.get_clients({ bufnr = vim.api.nvim_get_current_buf() }) + local status = { + enabled = lsp_enabled, + client_count = #clients, + clients = {}, + } + + for _, client in ipairs(clients) do + table.insert(status.clients, { + id = client.id, + name = client.name, + attached = client.attached_buffers[vim.api.nvim_get_current_buf()] ~= nil, + }) + end + + return status +end + +-- Global toggle function to work across all buffers +function M.toggle_lsp_globally() + local buffers = vim.api.nvim_list_bufs() + + if lsp_enabled then + for _, bufnr in ipairs(buffers) do + if vim.api.nvim_buf_is_valid(bufnr) and vim.api.nvim_buf_get_option(bufnr, "buflisted") then + local clients = vim.lsp.get_clients({ bufnr = bufnr }) + if #clients > 0 then + for _, client in ipairs(clients) do + pcall(client.rpc.notify, client, "textDocument/didClose", { + textDocument = { uri = vim.uri_from_bufnr(bufnr) }, + }) + vim.lsp.buf_detach_client(bufnr, client.id) + end + vim.diagnostic.disable(bufnr) + end + end + end + lsp_enabled = false + vim.notify("LSP globally disabled", vim.log.levels.INFO) + else + for _, bufnr in ipairs(buffers) do + if vim.api.nvim_buf_is_valid(bufnr) and vim.api.nvim_buf_get_option(bufnr, "buflisted") then + vim.api.nvim_buf_call(bufnr, function() + vim.cmd("edit!") + end) + end + end + lsp_enabled = true + vim.notify("LSP globally enabled (re-attaching...)", vim.log.levels.INFO) + end +end + +return M