3

在 OS X 上,我为系统生成了一组 ctag,包括使用以下命令:

ctags -f c -h ".h" -R --c-kinds=+p --fields=+iaS --extra=+q /usr/include

这是在一个~/.vim/ctags/目录中运行的,我将我为系统范围的头文件生成的所有 ctags 放在其中(我也有条件加载的 ROS 和 CPP 的东西,但这既不是这里也不是那里)。

反正。#includectags 文件在我的 .vimrc 中设置正确,vim 肯定可以看到 ctags,但由于某种原因,如果我写出整个符号然后开始退格,自动完成弹出窗口只会显示 d 头文件的结果。举个例子,如果我#include <string.h>在一个项目中,然后我想调用strlen(),然后我开始输入str活动的 vim 缓冲区,我只会得到当前在 vim 缓冲区中的符号的结果。但是,如果我输入strlen然后开始退格一两个字符并点击<C-n>,弹出菜单将填充来自任何其他包含的头文件的匹配项。

编辑:事实证明,如果我只是按“s”然后<C-n>,它也可以。所以问题似乎是它只有在手动启动弹出菜单时才有效。这让我认为这是一个插件问题(见下文)

附加信息:

  • completeopt设定为completeopt=menuone,menu,preview,longest

  • 我有OmniCppComplete,我想这可能会干扰行为。目前没有为 C++ 文件有条件地加载它。如果您希望我从我的 .vimrc 编辑和发布我的 OmniCppComplete 设置,请询问。

  • 我还安装了AutoComplPop,但我没有对其进行任何配置,因此它以默认设置运行。还没有真正研究过这个插件,所以不知道它的某些行为是否会干扰结果。

  • 我已经安装了AutoTagTagBar,但它们应该只是摆弄当前目录的本地标记文件。

老实说,我对 Vim 很陌生,我只是不知道从哪里开始调试这个问题,无论是使用随机插件还是使用我的 .vimrc 设置。

4

2 回答 2

4

Vim 有许多特定的完成机制。

  • <C-n><C-p>使用complete选项定义的许多来源。默认情况下,它们将使用当前和所有加载和卸载的缓冲区、标签和包含的文件来提供补全。虽然您通常可以通过这些获得非常有用的建议,但它有点“包罗万象”的解决方案:如果您从事相当大的项目,它根本不可靠。

  • <C-x><C-]>使用标签,因此它可能对您更有用。

  • 还有更多,请参阅:h ins-completion

  • Omni 补全更智能:它通常运行一个自定义文件类型特定的脚本,努力提供有意义的补全。它由触发<C-x><C-o>,您可以在:h ft-c-omni. 使用代码时,Omni 补全通常是更好的选择。

因为你有两个重叠的“自动”完成插件,所以很难说什么完成机制在起作用。您应该禁用这些插件并使用您可用的不同完成机制。

于 2013-01-18T17:57:12.037 回答
0

我还没有掌握这一点,但我认为以下观察可能会有所帮助。

Vim 的默认自动完成功能可能会非常嘈杂,通常会妨碍您使用<C-x><C-o>. 具体来说,我发现自己调用了基于标签的补全,<C-x><C-o>只是将它们替换为使用我的打开缓冲区继续输入 Vim 的默认建议。

关闭其中一个插件的建议是有道理的。就我而言,关键是如何关闭 Vim 的默认行为。我见过几个人(现在包括我自己),在触发 Vim 的默认值之前将表达式的长度设置为很大的数字。对我来说就是:

    let g:deoplete#auto_complete_start_length = 99

...通过这种方式,您消除了默认的完成层,无论您打算通知您的工作的命令如何。

这仍然感觉像是一个 hack,但它有助于让我的工作专注于基于标签的完成。

仅供参考:我在 Mac 上使用 NVIM。

于 2017-12-07T22:42:29.743 回答