Vim + OmniCppComplete: Завершение на участниках Класса, которые являются контейнерами STL

Завершение на участниках класса, которые являются контейнерами STL, перестало работать.

Завершение на локальных объектах, которые являются контейнерами STL, хорошо работает.

Например, учитывая следующие файлы:

// foo.h
#include <string>

class foo {
public:
    void set_str(const std::string &);

    std::string get_str_reverse( void );

private:
    std::string str;
};

// foo.cpp
#include "foo.h"

using std::string;

string
foo::get_str_reverse ( void )
{
    string temp;

    temp.assign(str);
    reverse(temp.begin(), temp.end());

    return temp;
}       /* -----  end of method foo::get_str  ----- */

void
foo::set_str ( const string &s )
{
    str.assign(s);
}       /* -----  end of method foo::set_str  ----- */

Я генерировал теги для этих двух файлов использование:

ctags -R --c++-kinds=+pl --fields=+iaS --extra=+q .

Когда я ввожу temp. в cpp я получаю список string функции членства как ожидалось. Но если я ввожу str. omnicppcomplete выкладывает "Шаблон, Не Найденный".

Я заметил что temp. завершение только работает, если я имею using std::string; объявление.

Как я заставляю завершение работать над моими участниками класса, которые являются контейнерами STL?

Править

Я нашел, что завершение на участниках, которые являются работами контейнеров STL, если я делаю следовать модификации к заголовку:

// foo.h
#include <string>

using std::string;

class foo {
public:
    void set_str(const string &);

    string get_str_reverse( void );

private:
    string str;
};

В основном, если я добавляю using std::string; и затем удалите std:: спецификатор пространства имен от string str; участник и повторно создает файл тегов затем, OmniCppComplete может сделать завершение на str..

Это, кажется, не имеет значения, имею ли я let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"] набор .vimrc.

Проблемой является то помещение using объявления в заголовочных файлах походят на большое нет - нет, таким образом, я возвращаюсь к начальной ситуации.

11
задан Robert S. Barnes 20 May 2010 в 12:56
поделиться

2 ответа

Попробуйте установить эту переменную:

let OmniCpp_NamespaceSearch=1

Если она работает, не забудьте поместить ее в свой файл конфигурации .vimrc !

0
ответ дан 3 December 2019 в 12:28
поделиться

Недавно я перешел на Ubuntu 10.04, который включает ctags 5.8, и у меня больше нет этой проблемы с классами STL, такими как строка, однако завершение по-прежнему не работает с настоящими контейнерами, такими как вектор.

Это мой старый ответ для ctags 5.7:

Хотя это немного похоже на взлом, я нашел решение, которое не загрязняет файлы заголовков директивами и предоставляет OmniCppComplete с все, что нужно для завершения членов класса, которые являются контейнерами STL.

#include <string>

#if 0
using std::string;
#else
#   define string std::string
#endif

class foo {
public:
    void set_str(const string &);

    string get_str_reverse( void );

private:
    string str;
};

#ifdef string
#   undef string
#endif

Затем измените строку в файле .vimrc , который генерирует ctags следующим образом:

map <C-F12> :!ctags -R --c++-kinds=+pl --fields=+iaS --extra=+q --if0=yes .<CR>

Как это работает? Когда ctags видит параметр - if0 = yes , он берет ветвь #if 0 директивы препроцессора и генерирует необходимую запись в теги файл:

str omnitest.h  /^    string str;$/;"   m   class:foo   access:private

OmniCppComplete видит поддельный с помощью std :: string; и, когда не может найти определение для строки , он ищет в std и находит его там.

А при компиляции с g ++ результат - это то, что нам нужно. Это можно проверить, запустив файлы через препроцессор:

$ g++ omnitest.cpp -E | less

В конце вы увидите:

# 2 "omnitest.h" 2

class foo {
public:
    void set_str(const std::string &);

    std::string get_str_reverse( void );

private:
    std::string str;
};
# 2 "omnitest.cpp" 2

using std::string;

string foo::get_str_reverse ( void )
{
    string temp;

    temp.assign(str);
    reverse(temp.begin(), temp.end());

    return temp;
}

void foo::set_str ( const string &s )
{
    str.assign(s);
}

Так, например, если я наберу this-> str. в одной из функций-членов он теперь дает мне список строковых членов для завершения.

Этот метод может использоваться для любого набора контейнеров STL и даже может быть автоматизирован для изменения заголовка при возврате или извлечении из репозитория Subversion с помощью сценария Perl.

Так товарищам по команде не нужно будет видеть ваши уродливые хаки: -)

1
ответ дан 3 December 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: