feat(mini.files): make file system actions LSP aware#2340
feat(mini.files): make file system actions LSP aware#2340TheLeoP wants to merge 1 commit intonvim-mini:mainfrom
Conversation
|
To test the PR using with the following content -- main.lua
local something = require("something").something
something()
-- something.lua
local M = {}
M.something = function()
print("something")
end
return Myou can then |
|
The tests errors seem to go away if I comment out Line 2898 in 134f9dd and Line 2911 in 134f9dd But I'm not sure why. In particular, the problematic lines seem to be Line 2754 in 134f9dd and Line 2802 in 134f9dd changing them to local clients = {}seems to also make the test pass. Are these tests specially time sensitive? I can't think of another reason of why they would be failing |
echasnovski
left a comment
There was a problem hiding this comment.
Thanks for the PR!
There are at least two good things: the LSP complexity seems to be understood and managed (the worst part for me :) ) and there is a room for making it more concise.
| uri = vim.uri_from_fname(path), | ||
| } }, | ||
| } | ||
| H.lsp_will_fs_do('create', lsp_params) |
There was a problem hiding this comment.
It seems that willCreateFiles is for files only, right? This will also send a request for a directory.
| for _, filter in ipairs(filters) do | ||
| local ignore_case = filter.pattern.options and filter.pattern.options.ignoreCase | ||
| local glob = filter.pattern.glob | ||
| if ignore_case then glob = glob:lower() end |
There was a problem hiding this comment.
string.lower() works only for Latin characters. Using vim.fn.tolower() is more robust.
| rename = 'willRename', | ||
| } | ||
|
|
||
| H.lsp_will_fs_do = function(action, params) |
There was a problem hiding this comment.
I have so many questions (mostly due to LSP complexity, not only due to the PR itself) ...
- It seems that it is possible to make requests/notifications in bulk for every three operation kinds. I'd say it is worth taking advantage of that: it is less talking back-and-forth between the client and the server, less computation based on the client capabilities, etc.
- There is a lot of code duplication between two functions. Either moving that to a separate function is better. Or even probably just using a single function that has something like
if method:sub(1, 3) == 'did' then ... else ... end. - I think
H.lsp_{will,did}_fs_do_methodis a bit too much. Maybe supplying a method directly when calling a function is more explicit.
So all in all, my first instinct is that adding all LSP related stuff (done in bulk) in the H.fs_actions_apply() (so that it is "willXxx requests", "action", "didXxx notifications") should be less complex and more concise. Yes, it will probably require an duplicating check about if the actions is predicted to be successful, but can be worked around later. This way it can also reuse computed parameters.
| local full_method = 'workspace/' .. method .. 'Files' | ||
| local clients = vim.lsp.get_clients({ method = full_method }) | ||
|
|
||
| -- TODO(TheLeoP): configurable timeout |
There was a problem hiding this comment.
I don't think this is huge deal. The plan is to add something like boolean config.options.lsp, so that it can be disabled if there is a slow server. But not sure, maybe a table config.lsp = { enable = true, ... } is better. Just don't like another table-like option.
I don't think so. Probably, some logic has been broken. Didn't read too much into the code.
Restricting this functionality to only Neovim<0.11 is fine.
I am okay with these checks for I'll also take a look into how to better handle the "close on lost focus" in 'mini.files'. It will probably have to be "don't close if inside non-normal buffer in a floating window" type of exception. |
Addresses #2215
This is a proof of concept to test the idea of including this kind of LSP support inside of mini.files. It may not be merged at all or it may help to add new autocmds to allow users/other plugins to implement this themselves.
A few things to take into account
H.fs_do.deletehad to be changed to allow checkingsuccessa single time before triggeringdidDeleteFilenotifications (actually, it seems like I broke something)timeoutforclient:request_syncis harcodedvim.glob.to_lpeghas a bug prior to 0.11 that requires manually sorting items inside brackets as a workaround,client:request_sync/client:notifyare not methods prior to 0.11, etc)libuvdoes not offer an abstraction on top of it. Maybefs_statrelated function would work on Windows with the same semantics, I haven't tested it yet)