1

我的问题是 imenu 或 speedbar/semantic 由于缩进而失败。对于这个简单的文件,就可以了:

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

但是如果我想将函数 bar 放在命名空间中并缩进它的代码:

  • 使用 speedbar((require 'semantic/sb)在 init.el 中),我在 speedbar 框架中没有文件标签,并且在 minibuffer 中出现“文件模式规范错误:(void-function c-subword-mode)”

  • 使用 MX imenu,我在 minibuffer 中得到“没有适合在此缓冲区中找到的索引的项目”

失败的示例代码:

#include <iostream>

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

导致它失败的不是命名空间,而是标识。以下也失败了:

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

知道为什么以及如何让它工作吗?

谢谢!!

编辑:好的,解决方案确实是 speedbar+sementics。它确实有效(我的 init.el 出了点问题......)

4

1 回答 1

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。(目前,我没有太多空闲时间。对不起。)

于 2014-06-25T15:58:38.993 回答