You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:02:32