【问题标题】:How to autocomplete c or c++ keywords in vim如何在 vim 中自动完成 c 或 c++ 关键字
【发布时间】:2011-12-31 21:12:00
【问题描述】:

例如,当我输入'inclu'时,有没有一种方法可以将它补全为'include'? 谢谢你。

【问题讨论】:

  • 在 vim wiki 网站上有 this 关于 C++ 全能补全的文章。
  • :help ins-completion 作为最终参考。

标签: vim plugins autocomplete


【解决方案1】:

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

【讨论】:

  • ^N 也完成了incluinclude,它比^X^P(或^X^N)短
  • @Ves:哈!我从来没有找到更好的捷径。仅此一项就应该是一个答案,它值十分。 :)
  • @Ves:是的,但速度较慢,因为它会搜索所有打开的缓冲区。 CTRL-X CTRL-[NP] 仅在当前缓冲区中搜索。
  • 我真的很喜欢将 映射到 只是因为我很懒,而且 d 更容易命中 :)
  • @Benoit:感谢您指出CTRL-NCTRL-X CTRL-N 之间的区别。这在处理速度较慢的硬件或通过 ftp 时可能很重要
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你可以设置一些 Vim 缩写来为你做这件事。

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

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

        如果您想进一步推动这一点,我将分享我正在进行的一个小实验,以创建 C++ 'shorthand'。尽管它确实减少了输入代码所需的击键次数,但我还没有使用足够长的时间来确定记住速记所增加的心理复杂性是否值得。 (可能不会!)

        您需要安装UltiSnips 才能使其正常工作。您可能可以使用 Vim 的缩写功能完成大部分操作,但我发现使用专用的 sn-p 完成器效果最好。

        一旦安装了 UltiSnips,您就已经可以使用一些 C 和 C++ sn-ps,包括上面提到的 #include "" 示例。

        我在我的 cpp.sn-ps 文件中添加了以下内容(还有很多很多!)。

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

        当我想要一个 shared_ptr 时,我输入 sptr 并按 sn-p 完成键。 UltiSnips 以 std::shared_ptr&lt; type &gt; 完成此操作,并选择了单词 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&amp;* 更容易输入)。例如,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 次。

        【讨论】:

          【解决方案6】:

          你应该安装omni插件:omni autocompletion

          【讨论】:

            猜你喜欢
            • 2012-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多