如何在vim中自动完成c或c ++关键字

时间:2011-11-18 01:38:04

标签: vim plugins autocomplete

例如,当我输入'inclu'时,是否有一种方法可以将其填写为'include'? 谢谢。

6 个答案:

答案 0 :(得分:3)

大多数vim的(复杂)自动完成都是通过^X键映射完成的。 ^X^]会根据ctags(1)生成的代码自动完成。 ^X^P查找文件中可用于完成的先前关键字。 ^X^K查看可配置dictionary的完成字词。 ^X^I查看包含的文件,然后弹出一个菜单,用于完成这些文件中的关键字。 ^X^D#define完成。

获得所需内容的最简单方法可能是在文件中完全输入#include <...>一次。然后可以通过#incl^X^P处理要包含的第二个文件,然后继续。

如果您想稍加努力,请使用要自动填充的关键字创建~/.vim/dict文件,将文件添加到dictionary变量(:help dictionary),然后使用^X^K插入它。

答案 1 :(得分:2)

也许,像Snipmate或UltiSnips这样的插件对你有帮助。

答案 2 :(得分:2)

您可能想尝试使用Vim插件Supertab。如果您这样做,我建议您使用Pathogen安装它。

答案 3 :(得分:1)

Snipmate默认执行此操作。输入'inc'并按Tab键,它将转换为
#include <stdio.h>

答案 4 :(得分:1)

您可以设置一些Vim缩写来为您执行此操作。

iab inc #include ""
iab Inc #include <>

然后输入inc<SPACE> Vim会自动将其展开为#include ""。您可以添加各种缩写以减少所需的击键次数。

如果你想进一步推动这一点,我将分享一些正在进行的实验,以创建一个C ++&#39; shorthand&#39;。虽然它确实减少了输入代码所需的击键次数,但我还没有用足够长的时间来确定记住速记的额外心理复杂性是否值得。 (可能不是!)

您需要安装UltiSnips才能生效。您可以使用Vim的缩写功能完成大部分工作,但我发现它最适合使用专用代码段完成。

安装UltiSnips后,您已经可以使用一些C和C ++代码段,包括上面提到的#include ""示例。

我已将以下内容(以及更多,更多!)添加到我的cpp.snippets文件中。

snippet sptr "std::shared_ptr< type >"
std::shared_ptr< ${1:type} >
endsnippet

当我需要shared_ptr时,我键入sptr并按下代码段完成键。 UltiSnips以“std::shared_ptr< type >完成此选项并选择了type,因此我可以继续输入模板类型而不会暂停。

这个人为的例子展示了更多的简写。这就是我可以输入的内容:

// <C> is where I would press the UltiSnip complete/next key.
fun<C>sptr<C><C>load_widget<C>cu32<C>offset<C>, cc<C>name<C>ret<C>msptr<C>widget<C>offset<C>name<C>;

扩展为:

std::shared_ptr< widget > load_widget( const std::uint32_t offset, const char* name )
{
    return std::make_shared< widget >( offset, name );
}

粗略计数显示这会将大约136次击键减少到100次。使用Omnicomplete或YouCompleteMe插件,由于变量和函数名称通常可以在输入前2或3个字符后完成,因此可以进一步减少。

在创建类型的简写时,我尝试坚持使用此模式:[c]type[r|p][c]是可选的const [r][p],用于可选的引用或指针。 (rp,我输入的内容比&*更容易。例如,std::string有以下简写:

str   = std::string
strp  = std::string*
strr  = std::string&
cstr  = const std::string
cstrp = const std::string*
cstrr = const std::string&

所以cstrr,在我的代码中最常见的是{19},减少了19次击键(其中有一个尾随空格),只有6次。

答案 5 :(得分:0)

你应该安装omni插件:omni autocompletion