#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
. (В настоящее время у меня не так много свободного времени. Извините.)