Neovim 0.5 如何实现保存时同步整理TypeScript导入?
解决Neovim 0.5中BufWritePre触发LspOrganize异步执行的问题
这个问题我之前也碰到过,核心原因就是vim.lsp.buf.execute_command是异步执行的——当BufWritePre触发后,Neovim不等导入整理完成就直接保存了文件,导致整理后的内容没来得及写入到磁盘。要解决这个问题,我们只需要把异步调用改成同步请求,确保导入整理操作完成后再执行保存。
修改lsp_organize_imports函数
把原来的异步执行命令换成同步的LSP请求,具体代码如下:
_G.lsp_organize_imports = function() local params = { command = "_typescript.organizeImports", arguments = {vim.api.nvim_buf_get_name(0)}, title = "" } -- 使用同步请求替代异步执行,等待命令完成后再继续 -- 第三个参数是超时时间(毫秒),可根据项目大小调整 vim.lsp.buf_request_sync(0, "workspace/executeCommand", params, 1000) end
为什么这样有效?
vim.lsp.buf_request_sync会阻塞当前Neovim进程,直到LSP服务器返回请求结果或者超时,这样就能保证导入整理操作在文件保存前完全完成。- 第三个参数
1000是超时时间,单位是毫秒,对于大多数TypeScript项目来说足够用了;如果你的项目非常大,整理导入需要更长时间,可以适当调大这个值(比如2000)。
验证自动命令逻辑
你原来的自动命令部分不需要修改:
if client.resolved_capabilities.document_formatting then vim.api.nvim_exec([[ augroup LspAutocommands autocmd! * <buffer> autocmd BufWritePre <buffer> LspOrganize autocmd BufWritePre <buffer> LspFormatting augroup END ]], true) end
现在LspOrganize是同步执行的,Neovim会先完成导入整理,再执行格式化,最后才保存文件,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Aritra Dattagupta
相关产品推荐
相关产品推荐

