6

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

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

我想对这种行为进行一些改进,例如,ClangComplete不会阻塞,但如果花费超过 0.2 秒,而线程仍在运行,则返回空结果。当 libclang 完成解析后,它检测到我仍在输入相同的补全词,它会弹出一个补全菜单。

这样做的困难在于:

  1. 如何在那个时候弹出一个菜单,而不引起不同线程之间的一些微妙的竞争条件,
  2. 它如何知道我是否仍在输入相同的完成词?我认为 vim 本身会跟踪这一点,因为当我输入错误的东西时,例如,std::strang而不是std::string,然后我输入退格键来删除错误ang,完成菜单会再次出现。那么如何访问这个内部标志呢?
4

1 回答 1

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

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

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

于 2012-12-10T09:57:19.333 回答