clang_complete的异步代码完成

Kan*_* Li 6 vim autocomplete clang-complete

最近我clang_complete用来做C++代码完成.这对于小程序来说是好的和快速的,但对于我的情况来说太慢了(我正在处理大型代码库,通常一个文件需要几秒钟来编译),即使我使用了libclang,它可以缓存一些已解析的结果以加速以后的解析,如果我理解正确的话.

目前clang_complete将阻止ClangComplete直到libclang完成解析.即使它启动了一个工作线程,主线程仍然会反复检查用户是否按下CTRLC或工作线程是否成功完成.在此期间,vim变得反应迟钝,从而使这个插件难以使用.

我想对这种行为做一些改进,例如,ClangComplete不会阻塞,但如果花费的时间超过0.2秒,则返回空结果,而线程仍然在运行.当libclang完成其解析,并且它检测到我仍然在输入相同的文字完成,它会弹出一个菜单完成.

这方面的困难是:

  1. 如何在当时弹出菜单,而不会在不同的线程之间造成一些微妙的竞争条件,
  2. 怎么知道我还在输入相同的完成字?我认为vim本身会跟踪这个,因为当我输入错误的内容时,例如,std::strang而不是std::string,我键入退格键以删除错误ang,完成菜单将再次显示.那么如何访问这个内部标志?

Ing*_*kat 0

  1. Vimscript 是单线程的;您不必担心比赛。

  2. Vim 会将基数(即已输入/完成的完成词的部分)传递到您的函数中。查看:help complete-functions详细信息和示例。

一般来说,您的方法(假设您使用 Python 或 Perl 等嵌入式语言进行多线程)应该是可行的;然而,我还没有看到类似的尝试。