Emacs imenu и speedbar семантический сбой из-за отступа в режиме c

#c #emacs #emacs-semantic #emacs-speedbar

#c #emacs #emacs-семантический #emacs-speedbar

Вопрос:

Моя проблема в том, что imenu или speedbar / semantic терпят неудачу из-за отступа. Для этого простого файла все в порядке:

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

Но если я хочу поместить панель функций в пространство имен и сделать отступ в его коде:

  • при использовании speedbar (имеющегося (require 'semantic/sb) в init.el) у меня нет тегов файлов во фрейме speedbar, и я получил «Ошибку спецификации режима файла: (void-function c-subword-mode)» в минибуфере
  • с помощью M-X imenu я получил «Нет элементов, подходящих для индекса, найденного в этом буфере» в минибуфере

Пример кода, который завершается с ошибкой:

 #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. Я бы порекомендовал вам взглянуть на многообещающий rtags проект @ github.com/Andersbakken/rtags ; он имеет встроенную функциональность imenu: rtags-imenu / C-x r I

Ответ №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] \)?"
   "\([*amp;] [ t]*\)?"         ; pointer
   "\([a-zA-Z0-9_*] \)[ t]*("    ; name
   ))
 

Курсор ^ в начале означает начало строки. Если вы вставляете [[:blank:]]* за ним, индексируются также определения функций с начальными пробелами.

Я не знаю, такие ли вещи, как

 else if(...) {
...
}
 

в этом случае выдает ложные срабатывания. (Вы должны попробовать.)

На самом деле, если бы у меня было достаточно времени, я бы попытался использовать semantic or ctags для индексации. Это было бы намного надежнее.

Обратите внимание, я этого не пробовал. Я только что посмотрел imenu.el . (В настоящее время у меня не так много свободного времени. Извините.)