aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/buf.lua
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim/lsp/buf.lua')
-rw-r--r--runtime/lua/vim/lsp/buf.lua55
1 files changed, 55 insertions, 0 deletions
diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua
index fa62905c0a..a70581478b 100644
--- a/runtime/lua/vim/lsp/buf.lua
+++ b/runtime/lua/vim/lsp/buf.lua
@@ -238,6 +238,61 @@ function M.outgoing_calls()
end)
end
+--- List workspace folders.
+function M.list_workspace_folders()
+ local workspace_folders = {}
+ for _, client in ipairs(vim.lsp.buf_get_clients()) do
+ for _, folder in ipairs(client.workspaceFolders) do
+ table.insert(workspace_folders, folder.name)
+ end
+ end
+ return workspace_folders
+end
+
+--- Add a workspace folder.
+function M.add_workspace_folder(workspace_folder)
+ workspace_folder = workspace_folder or npcall(vfn.input, "Workspace Folder: ", vfn.expand('%:p:h'))
+ vim.api.nvim_command("redraw")
+ if not (workspace_folder and #workspace_folder > 0) then return end
+ if vim.fn.isdirectory(workspace_folder) == 0 then
+ print(workspace_folder, " is not a valid directory")
+ return
+ end
+ local params = util.make_workspace_params({{uri = vim.uri_from_fname(workspace_folder); name = workspace_folder}}, {{}})
+ for _, client in ipairs(vim.lsp.buf_get_clients()) do
+ local found = false
+ for _, folder in ipairs(client.workspaceFolders) do
+ if folder.name == workspace_folder then
+ found = true
+ print(workspace_folder, "is already part of this workspace")
+ break
+ end
+ end
+ if not found then
+ vim.lsp.buf_notify(0, 'workspace/didChangeWorkspaceFolders', params)
+ table.insert(client.workspaceFolders, params.event.added[1])
+ end
+ end
+end
+
+--- Remove a workspace folder.
+function M.remove_workspace_folder(workspace_folder)
+ workspace_folder = workspace_folder or npcall(vfn.input, "Workspace Folder: ", vfn.expand('%:p:h'))
+ vim.api.nvim_command("redraw")
+ if not (workspace_folder and #workspace_folder > 0) then return end
+ local params = util.make_workspace_params({{}}, {{uri = vim.uri_from_fname(workspace_folder); name = workspace_folder}})
+ for _, client in ipairs(vim.lsp.buf_get_clients()) do
+ for idx, folder in ipairs(client.workspaceFolders) do
+ if folder.name == workspace_folder then
+ vim.lsp.buf_notify(0, 'workspace/didChangeWorkspaceFolders', params)
+ client.workspaceFolders[idx] = nil
+ return
+ end
+ end
+ end
+ print(workspace_folder, "is not currently part of the workspace")
+end
+
--- Lists all symbols in the current workspace in the quickfix window.
---
--- The list is filtered against {query}; if the argument is omitted from the