【问题标题】:seeking autocomplete functionality in emacs在 emacs 中寻求自动完成功能
【发布时间】:2012-05-19 22:46:32
【问题描述】:

我正在寻找一个插件来为 emacs 中的 c++ 开发做自动完成弹出窗口。我尝试过的是 Cedet Semantics 和 Autocompletion mode,只要我已经有几句话,它们在完成变量和函数名称方面非常简洁。例如,我有一个名为 foo 的类和一个返回整数 1 的函数

class foo{
   int getInt(){return 1};
};

在main方法中,只要我开始输入这个

int main(){
 foo bar;
 bar.get...
}

插件弹出 bar.getInt() 之类的建议没有问题。然而,我真正想要的是在 Eclipse 中,只要我按下“点”,就可以为我生成可能的选择。这在 Emacs 中可能吗?谢谢

【问题讨论】:

    标签: c++ emacs cedet


    【解决方案1】:

    这取决于您的自动完成和 CEDET 设置。看起来自动完成设置为仅在输入几个字符后才显示可能的完成。您可以检查 ac-auto-start 变量的值 - 如果这是一个数字,则在此字符数之后将调用自动完成功能。 另一个重要的事情是您的 ac-sources 变量中的内容 - 要使用 CEDET,您需要使用 ac-source-semantic-rawac-source-semantic 完成源。 要在 .-> 之后自动完成,您可以尝试使用 Semantic 的内置完成,例如:

    (defun my-c-mode-cedet-hook ()
     (local-set-key "." 'semantic-complete-self-insert)
     (local-set-key ">" 'semantic-complete-self-insert))
    (add-hook 'c-mode-common-hook 'my-c-mode-cedet-hook)
    

    附:你见过my article on CEDET & C++吗?

    【讨论】:

    • 嗨,亚历克斯!实际上,我看到了您的文章,并试图模仿您所做的但无法正确配置它。好吧,我有几个问题。关于 dot 插入,我按照你上面的建议做了,但每次我输入 dot 就像上面的情况一样,在 bar 之后,我收到了这条消息 Symbol's function definition is void: eieio-build-class-alist 甚至根本无法插入正常的点号。另外 ac-source,我正在使用自动完成数据包,似乎 ac-source 是它的一部分。他们之间是什么关系,我有点困惑。谢谢
    • 顺便说一句,我将 ac-auto-start 变量设置为 4,但是每次启动 Emacs 时,我都需要手动检查通过首先输入 C-H v ac-auto-start 来获取变量的值,然后我的 dot 插入将起作用,否则我一直得到定义无效错误。顺便说一句,dot 似乎也很难找到系统标题,就像我在 Vector 对象后输入一个点一样,我看不到 size() 函数如我所愿弹出。非常感谢
    • 嗯,这很奇怪 - 看起来 eieio 没有正确加载。您使用的是哪个版本的 Semantic?
    • Regadring ac-source - 此变量包含将用于检索数据的数据源列表。默认情况下,它应该包含一些在当前和其他缓冲区中执行查找的函数,并使用此信息完成。要使用语义数据源,您需要将其添加到此变量中。查看我的配置的第 44 行(对于新的 CEDET)-github.com/alexott/emacs-configs/blob/master/rc/…
    • 感谢您回复我。好吧,我使用的是最新的 cedet 1.1,我真的不知道它包含哪个版本的语义。 ac-source 在缓冲区中查找变量和函数没有问题,但有时间查找系统标头,即使我包含 (semantic-add-system-include "/usr/include/c++/4.6 .3" 'c++-模式)。即我使用的是来自 STL 的向量,我希望它在插入点后弹出建议,例如 push_back(),但它找不到我猜的 STL 标头。谢谢
    【解决方案2】:

    我发现 cedet 真的很不起眼,尤其是在 cmake 项目下。

    我建议使用 https://github.com/Andersbakken/rtags 它会在您键入以及使用智能补全时突出显示错误。获取所需的 emacs 包后,只需将其添加到您的 init 文件中即可

    (require 'rtags)
    (require 'popup)
    (require 'rtags-ac)
    (setq rtags-completions-enabled t)
    (rtags-enable-standard-keybindings c-mode-base-map)
    (add-hook 'c++-mode-hook
              (lambda ()
                (setq ac-sources '(ac-source-rtags)
    )))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2013-03-17
      • 2014-05-17
      • 1970-01-01
      相关资源
      最近更新 更多