Emacs imenu和speedbar+语义失败,因为在c++模式下缩进

Emacs imenu and speedbar+semantic fails because of indentation in c++ mode

本文关键字:c++ 模式 缩进 因为 imenu speedbar+ 语义 失败 Emacs      更新时间:2023-10-16

我的问题是,菜单或速度条/语义失败,因为缩进。对于这个简单的文件,可以:

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

但是如果我想把功能栏放在一个命名空间中并缩进它的代码:

  • with speedbar(在initial .el中有(require 'semantic/sb)),我在speedbar框架中没有文件标签,我在minibuffer

  • 中得到了"文件模式规范错误:(void-function c-subword-mode)"
  • 使用M-X菜单,我在minibuffer

  • 中得到"没有适合此缓冲区索引的项目"

失败的示例代码:

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

使它失败的不是名称空间,而是标识。下面的操作也失败了:

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

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

谢谢! !

编辑:好的,解决方案确实是快速条+语义。它实际上可以工作(我在init.el…中有一些错误)

也许,imenu.el中的regexp示例与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。)目前,我没有太多的业余时间。对不起。)