mirror of
https://github.com/neovim/neovim.git
synced 2025-10-26 12:27:24 +00:00
LSP: Feature/add workspace folders (#12638)
* First implementation of workspace folders * Add completion for current directory * Add tracking of workspace folders * Add workspace folder listing * Add checks on adding/removing workspaces * Add appropriate initialization options * Add documentation * Make workspaceFolders available wherever client is
This commit is contained in:
committed by
GitHub
parent
2d5dd85eef
commit
0d83a1c43f
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user