Получить AsyncCommand работать с маркером ошибок? - PullRequest
2 голосов
/ 01 ноября 2011

Я нашел AsyncCommand на StackOverflow и обнаружил, что это потрясающий инструмент! Я пытаюсь заставить его работать с плагином errormarker , но столкнулся с некоторой проблемой.

Я не знаю точно, в чем проблема. Я проследил сценарий маркера ошибок и обнаружил, что ошибка использует следующий сценарий для привязки QuickFixCmdPost к событию и установки маркеров для строк исходных файлов.

augroup errormarker
    autocmd QuickFixCmdPost make call <SID>SetErrorMarkers()
augroup END

Согласно :help, второй аргумент (make) - это pattern файла (например: *.html). Я не знаю, что такое make шаблон файла, я пытался

autocmd QuickFixCmdPost AsyncMake call <SID>SetErrorMarkers()

не работает (обязательно). Но я не знаю, что еще я могу сделать. Я гуглю "AsyncCommand errormarker", но ничего не получаю.

Есть ли комментарии? Любое предложение приветствуется. Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

AsyncCommand использует cgetfile под обложками, чтобы заполнить окно быстрого исправления.Кажется, что cgetfile не вызывает событие QuickFixCmdPost.Чтобы заставить SetErrorMarkers() стрелять в нужный момент (или вообще).Нам нужно либо создать новое событие, либо подключить плагин markmarker в AsyncCommand.Поскольку все мы здесь хорошие и не ленивые программисты, я собираюсь предложить четкий подход, поскольку он предлагает больше гибкости.

Поскольку вы уже редактируете плагин, я надеюсь, что вы этого не делаетеНе забудьте сделать небольшое дополнение к плагину AsyncCommand.Я предполагаю, что у вас установлена ​​последняя версия github .

Мы собираемся создать новое пользовательское событие, которое AsyncCommand будет запускать после cgetfile.В файле: autoload/asynchandler.vim после строки 63 вставьте следующую строку.

doautocmd User AsyncCommandQuickFixCmdPost

Должно выглядеть примерно так:

exe 'botright ' . self.mode . "open"
let cmd = self.command . ' ' . a:temp_file_name
exe cmd
doautocmd User AsyncCommandQuickFixCmdPost
if type(self.title) == type("") && self.title != ""

Теперь вы можете отредактировать ошибку, чтобы плагин маркера ошибки выглядел следующим образомэто:

augroup errormarker
    autocmd QuickFixCmdPost make call <SID>SetErrorMarkers()
    autocmd User AsyncCommandQuickFixCmdPost call <SID>SetErrorMarkers()
augroup END
0 голосов
/ 02 ноября 2011

Я нашел решение.

Решение работает, но безобразно.

Клавиша должна автоматически вызывать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...