Neovim 0.5 在保存时整理导入项

如何实现在保存时整理导入项?我正在使用以下代码创建一个整理导入命令

_G.lsp_organize_imports =function()
    local params = {
        command = "_typescript.organizeImports",
        arguments = {vim.api.nvim_buf_get_name(0)},
        title = ""
    }
    vim.lsp.buf.execute_command(params)
end

local on_attach =function(client, bufnr)
    local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
    local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end

  --启用由<c-x><c-o>触发的自动完成
    buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')

  --映射。
    local opts = { noremap=true, silent=true }

    local buf_map = vim.api.nvim_buf_set_keymap
    vim.cmd("command! LspDef lua vim.lsp.buf.definition()")
    vim.cmd("command! LspFormatting lua vim.lsp.buf.formatting_sync()")
    vim.cmd("command! LspCodeAction lua vim.lsp.buf.code_action()")
    vim.cmd("command! LspHover lua vim.lsp.buf.hover()")
    vim.cmd("command! LspRename lua vim.lsp.buf.rename()")
    vim.cmd("command! LspOrganize lua lsp_organize_imports()")
    vim.cmd("command! LspRefs lua vim.lsp.buf.references()")
    vim.cmd("command! LspTypeDef lua vim.lsp.buf.type_definition()")
    vim.cmd("command! LspImplementation lua vim.lsp.buf.implementation()")
    vim.cmd("command! LspDiagPrev lua vim.lsp.diagnostic.goto_prev()")
    vim.cmd("command! LspDiagNext lua vim.lsp.diagnostic.goto_next()")
    vim.cmd(
        "command! LspDiagLine lua vim.lsp.diagnostic.show_line_diagnostics()")
    vim.cmd("command! LspSignatureHelp lua vim.lsp.buf.signature_help()")buf_map(bufnr, "n", "gd", ":LspDef<CR>", {silent = true})
    buf_map(bufnr, "n", "gr", ":LspRename<CR>", {silent = true})
    buf_map(bufnr, "n", "gR", ":LspRefs<CR>", {silent = true})
    buf_map(bufnr, "n", "gy", ":LspTypeDef<CR>", {silent = true})
    buf_map(bufnr, "n", "K", ":LspHover<CR>", {silent = true})
    buf_map(bufnr, "n", "gs", ":LspOrganize<CR>", {silent = true})
    buf_map(bufnr, "n", "[a", ":LspDiagPrev<CR>", {silent = true})
    buf_map(bufnr, "n", "]a", ":LspDiagNext<CR>", {silent = true})
    buf_map(bufnr, "n", "ga", ":LspCodeAction<CR>", {silent = true})
    buf_map(bufnr, "n", "<Leader>a", ":LspDiagLine<CR>", {silent = true})
    buf_map(bufnr, "i", "<C-x><C-x>", "<cmd> LspSignatureHelp<CR>",
    {silent = true})
    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
end

这让我可以使用:LspOrganize来整理导入,但它不会在保存缓冲区之前执行。自动命令组被执行,但是导入在保存文件之后被组织,因为我相信这是一个异步任务。有人可以帮我使它同步吗?我想组织导入,然后保存缓冲区。

点赞
用户13194182
用户13194182

使用 neovim lsp API 提供的同步版本,而不使用 vim.lsp.buf.execute_command。查看:help vim.lsp.buf_request_sync。使用它,你可以编写一个组织导入函数的同步版本。


_G.lsp_organize_imports_sync = function(bufnr)
    -- 如果没有传入 bufnr,则获取当前 bufnr
    if not bufnr then bufnr = vim.api.nvim_get_current_buf() end

    -- 请求所需的参数
    local params = {
        command = "_typescript.organizeImports",
        arguments = {vim.api.nvim_buf_get_name(bufnr)},
        title = ""
    }

    -- 发送同步请求,文件大小不同,超时时间也不同
    vim.lsp.buf_request_sync(bufnr, "workspace/executeCommand", params, 500)
end
2021-06-05 15:51:50