Я нашел решение.
Решение работает, но безобразно.
Клавиша должна автоматически вызывать errormarker
SetErrorMarkers()
функцию в нужное время.
Я попробовал решение Питера Ринкера, но оказалось, что AsyncCommandQuickFixCmdPost
выстрелил слишком рано. Список быстрых исправлений еще не установлен. Так что SetErrorMarkers()
ничего не делает.
Я прочитал некоторое руководство AsyncCommand
и отследил некоторый код, AsyncMake
на самом деле является оберткой, которая вызывает
asynccommand#run(cmd, handler)
с
asynccommand#run("make", asynchandler#qf)
// where asynchandler#qf is the handler to read quick fix list back.
Итак, поскольку asynchandler#qf
можно вызвать в нужное время, я проследил точку вызова asynchandler#qf
и нашел функцию asynccommand#done
в файле asynccommand.vim
, строка 92, вызов asynchandler#qf
.
function! asynccommand#done(temp_file_name)
" Called on completion of the task
let r = s:receivers[a:temp_file_name] "handlers are registered in s:receivers
if type(r.dict) == type({})
call call(r.func, [a:temp_file_name], r.dict)
else
call call(r.func, [a:temp_file_name])
endif
unlet s:receivers[a:temp_file_name]
delete a:temp_file_name
endfunction
Понял!
Давайте добавим немного кода в строку 101, чтобы вызвать функцию SetErrorMarkers()
...
unlet s:receivers[a:temp_file_name]
if exists("*ExposeSetErrorMarkers")
call ExposeSetErrorMarkers()
endif
delete a:temp_file_name
...
Обратите внимание, что функция, которую мы здесь вызвали, ExposeSetErrorMarkers()
, а не SetErrorMarkers()
. Поскольку SetErrorMarkers()
является локальной функцией сценария, ее нельзя вызывать извне сценария. поэтому я добавляю делегированную функцию ExposeSetErrorMarkers()
в errormarker.vim
для предоставления этой функции.
function! ExposeSetErrorMarkers()
call s:SetErrorMarkers()
endfunction
Более того, я добавляю некоторые автоматические команды в мой .vimrc
au BufWritePost *cpp AsyncMake
au BufWritePost *cc AsyncMake
au BufWritePost *h AsyncMake
для автоматического вызова AsyncMake каждый раз, когда я сохраняю исходный файл.
Это работает! Хотя уродливо: P