在vim中如何自动补全C或C++的关键字

5
例如,当我输入“inclu”时,是否有一种方法可以将其自动完成为“include”? 谢谢。

1
这篇文章介绍了在vim wiki网站上关于C++ omni-completion的相关信息。 - dave
1
:help ins-completion 作为权威参考资料。 - sarnold
6个回答

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插入它。


3
^N еПѓдї•е∞Ж inclu и°•еЕ®дЄЇ includeпЉМиАМдЄФжѓФ ^X^PпЉИжИЦ ^X^NпЉЙжЫізЯ≠гАВ - Ves
@Ves:哈!我从来没有发现过这个更好的快捷方式。这本身就应该是一个答案,值得十分。 :) - sarnold
2
@Ves:是的,但它速度较慢,因为它会搜索所有打开的缓冲区。CTRL-X CTRL-[NP]仅在当前缓冲区中搜索。 - Benoit
我真的很喜欢将<C-space>映射到<C-N>,因为我很懒,<C-SPACE>更容易按 :) - Sam Brinck
@Benoit:感谢您指出CTRL-NCTRL-X CTRL-N之间的区别。在使用较慢的硬件或通过ftp工作时,这可能非常重要。 - Ves

2
也许,像Snipmate或UltiSnips这样的插件会对您有所帮助。

2

你可以尝试使用Vim插件Supertab,如果你想使用它,我建议你使用Pathogen进行安装。


1

Snipmate默认可以实现这个功能。输入'inc'并按Tab键,它将转换为
#include <stdio.h>


0

0
你可以设置一些Vim缩写来帮助你完成这个任务。
iab inc #include ""
iab Inc #include <>

然后通过输入inc<SPACE>,Vim会自动展开为#include ""。你可以添加各种缩写来减少所需的按键次数。
如果你想进一步推进,我将分享我的一个小实验,创建一个C++ '速记'。虽然它确实减少了输入代码所需的按键次数,但我还没有使用它长到足以确定记忆速记的额外心理复杂性是否值得(可能不值得!)。
你需要安装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个按键(有一个尾随空格)减少到仅6个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接