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

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

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

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

  • со спидбаром (require 'semantic/sb) в init.el) у меня нет меток файла в кадре спидбара, и я получил "Ошибка спецификации режима файла: (void-function c-subword-mode)" в минибуфере

  • с MX imenu, я получил "Нет элементов, подходящих для индекса, найденного в этом буфере" в минибуфере

Пример кода, который не работает:

#include <iostream>

namespace foo {
    void bar() {
    std::cout << "bar" << std::endl;
    }
}

Это не пространство имен, которое делает его неудачным, а идентификация. Следующие ошибки тоже:

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

Есть идеи почему и как заставить это работать?

Спасибо!!

РЕДАКТИРОВАТЬ: Хорошо, решение действительно спидбар + семантика. Это на самом деле работает (у меня что-то не так в моем init.el...)

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]+\\)?"
   "\\([*&]+[ \t]*\\)?"         ; pointer
   "\\([a-zA-Z0-9_*]+\\)[ \t]*("    ; name
   ))

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

Я не знаю, как что-то вроде

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

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

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

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

Другие вопросы по тегам