clang_complete的异步代码完成

时间:2012-01-29 12:10:25

标签: vim autocomplete clang-complete

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

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

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

这方面的困难是:

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

1 个答案:

答案 0 :(得分:0)

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

  2. Vim会将 base (即已经输入/完成的完成单词的一部分)传递到您的函数中。查看:help complete-functions了解详情和示例。

  3. 通常,您的方法(假设您使用Python或Perl等嵌入式语言进行多线程处理)应该是可行的;但是,我还没有看到过类似的尝试。