Асинхронное завершение кода для clang_complete - PullRequest
6 голосов
/ 29 января 2012

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

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

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

Сложности для этого следующие:

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

1 Ответ

0 голосов
/ 10 декабря 2012
  1. Vimscript является однопоточным;вам не придется беспокоиться о гонках.

  2. Vim передаст base (то есть часть слова завершения, уже набранного / выполненного) в вашу функцию.За подробностями и примером обращайтесь к :help complete-functions.

В целом ваш подход (при условии, что вы используете встроенный язык, такой как Python или Perl для многопоточности) должен быть осуществимым;тем не менее, я еще не видел подобных попыток.

...