Моя проблема заключается в том, что imenu или speedbar / семантический сбой из-за отступа Для этого простого файла это нормально:
#include <iostream>
void bar() {
std::cout << "bar" << std::endl;
}
Но если я хочу поместить панель функций в пространство имен и сделать отступ для ее кода:
со спидбаром (require 'semantic/sb)
в init.el) у меня нет меток файла в рамке спидбара, и я получил «Ошибка спецификации режима файла: (void-function c-subword-mode)» в минибуфере
с именем M-X в минибуфере я получил сообщение «Нет элементов, подходящих для индекса, найденного в этом буфере»
Пример кода, который не работает:
#include <iostream>
namespace foo {
void bar() {
std::cout << "bar" << std::endl;
}
}
Это не пространство имен, которое делает его неудачным, а идентификация. Следующие ошибки тоже:
#include <iostream>
void bar() {
std::cout << "bar" << std::endl;
}
Есть идеи почему и как заставить это работать?
Спасибо!!
РЕДАКТИРОВАТЬ: Хорошо, решение действительно спидбар + семантика. Это на самом деле работает (у меня что-то не так в моем init.el …)
Может быть, пример регулярного выражения из 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
, (В настоящее время у меня мало свободного времени. Извините.)