由于c ++模式中的缩进,Emacs imenu和speedbar +语义失败

时间:2014-06-25 12:40:12

标签: c++ emacs emacs-semantic emacs-speedbar

我的问题是因为缩进而导致imenu或speedbar / semantic失败。对于这个简单的文件,没关系:

#include <iostream>
void bar() {
   std::cout << "bar" << std::endl;
}

但是,如果我想将函数栏放在命名空间中并缩进其代码:

  • 使用speedbar(在init.el中有(require 'semantic/sb)),我在速度栏框架中没有文件标签,我得到了#34;文件模式规范错误:(void -function c-subword-mode)&#34;在迷你缓冲区

  • 使用M-X imenu,我得到了#34;没有适合此缓冲区中找到的索引的项目&#34;在迷你缓冲区

执行失败的代码:

#include <iostream>

namespace foo {
    void bar() {
    std::cout << "bar" << std::endl;
    }
}

使命令失败的命名空间不是标识符。以下也失败了:

#include <iostream>
    void bar() {
       std::cout << "bar" << std::endl;
    }

知道为什么以及如何让它发挥作用?

谢谢!

编辑:好的解决方案确实是speedbar + sementics。它实际上有效(我在init.el中出错了)。

1 个答案:

答案 0 :(得分:1)

也许,来自imenu.el的示例正则表达式与imenu-example--create-c-index一起使用:

(defvar imenu-example--function-name-regexp-c
  (concat
   "^[a-zA-Z0-9]+[ \t]?"        ; type specs; there can be no
   "\\([a-zA-Z0-9_*]+[ \t]+\\)?"    ; more than 3 tokens, right?
   "\\([a-zA-Z0-9_*]+[ \t]+\\)?"
   "\\([*&]+[ \t]*\\)?"         ; pointer
   "\\([a-zA-Z0-9_*]+\\)[ \t]*("    ; name
   ))

开头的插入符^表示行的开头。如果在其后面插入[[:blank:]]*,则还会为带有前导空格的函数定义编制索引。

我不知道是否像

这样的东西
else if(...) {
...
}

在这种情况下给出误报。 (你必须尝试。)

实际上,如果我有足够的时间,我会尝试使用semanticctags进行索引。那将更加强大。

注意,我没试过这个。我刚看了imenu.el。 (目前,我没有太多的业余时间。抱歉。)