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

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

但是,如果我想将功能栏放在 namespace 中并缩进其代码,请执行以下操作:

带有speedbar的
  • (在init.el中具有(require 'semantic/sb)),在Speedbar框架中没有文件标签,并且在迷你缓冲区
  • 中收到“文件模式规范错误:(无效函数c-subword-mode)”
    带有M-X imenu的
  • ,我在迷你缓冲区
  • 中得到了“该缓冲区中找不到适合索引的项目”

    失败的示例代码:
    #include <iostream>
    
    namespace foo {
        void bar() {
        std::cout << "bar" << std::endl;
        }
    }
    

    导致失败的不是 namespace ,而是标识。以下也失败:
    #include <iostream>
        void bar() {
           std::cout << "bar" << std::endl;
        }
    

    知道为什么以及如何使其工作吗?

    谢谢!!

    编辑:好的解决方案确实是speedbar + sementics。它确实有效(我的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。 (当前,我没有太多的空闲时间。很抱歉。)

    关于c++ - 由于c++模式下的缩进,Emacs imenu和speedbar + semantic失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24408948/

    10-12 21:15