Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lazy-lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -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" },
Expand Down
10 changes: 10 additions & 0 deletions lua/core/keymaps/lsp.lua
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,11 @@ function M.setup_lsp_keymaps()
end
end
end

-- LSP toggle keymap
map("n", "<leader>lt", function()
require("lsp.toggle").toggle_lsp()
end, vim.tbl_extend("force", opts, { desc = "Toggle LSP" }))
end,
})

Expand All @@ -321,4 +326,9 @@ function M.setup_lsp_keymaps()
})
end

-- Add global LSP toggle keymap
vim.keymap.set("n", "<leader>lT", function()
require("lsp.toggle").toggle_lsp_globally()
end, { desc = "Toggle LSP globally" })

return M
9 changes: 9 additions & 0 deletions lua/lsp/shared.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
142 changes: 142 additions & 0 deletions lua/lsp/toggle.lua
Original file line number Diff line number Diff line change
@@ -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
Loading