1

ALE 有一个用于从其他来源向其发送错误的 API。我正在使用它,如下所示,它适用于第一个错误。更具体地说,如果我进行了一次导致 LSP 错误的编辑,则 ALE 将在位置列表中显示该错误。如果我进一步击键,位置列表将再次清空。

如果我禁用 LSP、加载 ALE、手动调用ShowResults然后在插入模式下按任何其他键,我也可以触发此行为。

我的假设是 ALE 以插入模式(默认情况下)进行 linting。如果 LSP 被禁用并且没有为当前文件类型注册的 linters,它不会发现任何错误(显然,没有可以报告任何错误)和所以它再次清空我的位置列表。所以步骤是:打开没有LSP的缓冲区,调用ShowResults,位置列表打开,按i,按任意键,位置列表为空

现在我认为这是因为我没有实现完整的 ALE API。所以我添加了一个钩子(第二个片段)。我可以验证这个钩子是否被调用并且它会生成有效的消息。如果我保持位置列表打开,我什至可以看到所有预期的错误在 loclist 中闪烁。我可以使用 导航到这些错误:lolder,但我不知道为什么 ALE 总是在 LSP 完成其工作后添加另一个空位置列表。

或者我在这里做错了什么。

vim.lsp.handlers["textDocument/publishDiagnostics"] = function(_, _, params, client_id, _, config)
  local uri = params.uri
  local bufnr = vim.uri_to_bufnr(uri)
  if not bufnr then
    return
  end

  local diagnostics = params.diagnostics
  if not diagnostics or vim.tbl_isempty(diagnostics) then
    vim.fn['ale#other_source#ShowResults'](bufnr, "nvim-lsp", {})
    return
  end

  -- Important so we can pull diagnostics from this table when ALE asks for
  -- them
  vim.lsp.diagnostic.save(diagnostics, bufnr, client_id)

  local messages = {}

  for _, event in ipairs(diagnostics) do
    -- :h ale-localist-format
    local msg = {}
    msg.text = event.message
    msg.lnum = event.range.start.line
    msg.end_lnum = event.range["end"].line
    msg.col = event.range.start.character
    msg.end_col = event.range["end"].character
    msg.bufnr = bufnr
    msg.nr = event.severity
    table.insert(messages, msg)
  end

  vim.fn['ale#other_source#ShowResults'](bufnr, "nvim-lsp", messages)
end

从 Neovim LSP 的“on_attach”函数调用的第二个片段

  function ALEHook(bufnr)
      vim.fn['ale#other_source#StartChecking'](bufnr, "nvim-lsp")
      local diagnostics = vim.lsp.diagnostic.get(bufnr, client.id)
      if not diagnostics or vim.tbl_isempty(diagnostics) then
        vim.fn['ale#other_source#ShowResults'](bufnr, "nvim-lsp", {})
        return
      end

      local messages = {}

      for _, event in ipairs(diagnostics) do
        local msg = {}
        msg.text = event.message
        msg.lnum = event.range.start.line
        msg.end_lnum = event.range["end"].line
        msg.col = event.range.start.character
        msg.end_col = event.range["end"].character
        msg.bufnr = bufnr
        msg.nr = event.severity
        table.insert(messages, msg)
      end

      vim.fn['ale#other_source#ShowResults'](bufnr, "nvim-lsp", messages)
    end

    api.nvim_command('augroup ALEHookLSP')
    api.nvim_command('autocmd!')
    api.nvim_command('autocmd User ALEWantResults call v:lua.ALEHook(g:ale_want_results_buffer)')
    api.nvim_command('augroup END')
4

0 回答 0