我的问题是因为缩进而导致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中出错了)。答案 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(...) {
...
}
在这种情况下给出误报。 (你必须尝试。)
实际上,如果我有足够的时间,我会尝试使用semantic
或ctags
进行索引。那将更加强大。
注意,我没试过这个。我刚看了imenu.el
。 (目前,我没有太多的业余时间。抱歉。)