Async code completion for clang_complete

Недавно я использовал clang_complete для завершения кода C++. Это хорошо и быстро для небольших программ, но слишком медленно для моего случая (я работаю с большой базой кода и обычно один файл занимает несколько секунд для компиляции), даже если я использовал libclang, который может кэшировать некоторые результаты разбора для ускорения последующего разбора, если я правильно понимаю.

В настоящее время clang_complete блокирует ClangComplete, пока libclang не закончит разбор. Даже несмотря на запуск рабочего потока, основной поток все еще неоднократно проверяет, нажал ли пользователь CTRLC или рабочий поток успешно завершился. В этот период vim становится невосприимчивым, что затрудняет использование этого плагина.

Я хочу немного улучшить это поведение, например, ClangComplete не будет блокироваться, а будет возвращать пустые результаты, если это займет больше 0.2 секунды, в то время как поток все еще запущен. Когда libclang закончит разбор и обнаружит, что я все еще набираю одно и то же слово завершения, он выведет меню завершения.

Трудности для этого:

  1. как вывести меню в это время, не вызывая тонких условий гонки между различными потоками,
  2. как он узнает, что я все еще набираю одно и то же слово завершения? Я думаю, что vim сам отслеживает это, потому что если я набираю что-то неправильно, например, std::strang вместо std::string, затем набираю backspace, чтобы удалить неправильный ang, меню завершения появится снова. Как мне получить доступ к этому внутреннему флагу?
6
задан Peeter Joot 9 January 2013 в 17:25
поделиться