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')