如何在vim中自动完成c或C++关键字
大部分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
插入它。
也许,像Snipmate或UltiSnips之类的任何插件都会对你有所帮助。
Snipmate默认执行此操作。键入'inc'然后按Tab,它会转换成#include <stdio.h>
你可以设置一些Vim的缩写来为你做这个。
iab inC#include ""
iab InC#include <>
然后键入inc<SPACE>
Vim会自动扩展为#include ""
。您可以添加各种缩写以减少所需的击键次数。
如果你想进一步推进,我将分享一个小小的正在进行的实验来创建一个C++'shorthand'。虽然它确实减少了输入代码所需的按键次数,但我还没有足够长的时间来确定记住速记所增加的复杂性是否值得。 (可能不是!)
您需要安装UltiSnips才能正常工作。你可以使用Vim的缩写功能做大部分工作,但我发现它最适合用专门的片段完成器。
一旦安装了UltiSnips,您已经可以使用一些C和C++代码片段,包括上面提到的#include ""
示例。
我在cpp.snippets文件中添加了以下内容(加上很多很多!)。
snippet sptr "std::shared_ptr<type>"
std::shared_ptr< ${1:type} >
endsnippet
当我想一个shared_ptr I型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插件,这是为进一步降低可变并且功能名称通常可以在输入前两个或三个字符后完成。
我尝试在创建类型的简写时使用此模式:[c]type[r|p]
。对于可选的参考或指针,[c]
是可选的const,[r]
或[p]
。 (r
和p
,我的输入比&
和*
更容易)。例如,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
在vim wiki网站上有关于C++ omni-completion的[this](http://vim.wikia.com/wiki/C%2B%2B_code_completion)文章。 – dave
':help ins-completion'是最权威的参考。 – sarnold