LINUX.ORG.RU

Emacs: автозавершение (code completion)


0

0

Можно это как-нибудь приделать? Чтобы по

this->

появлялся бы списочек (это в идеале), ну или хотя бы после некоторого набора символов и какой-нибудь магической клавиши вставлялось имя, соответствующее набранному, т.е. набираю, положим

this->load_

после этого жму волшебное сочетание клавиш и оно дополняется до

this->load_data_from_file

Пробовал использовать TAGS с M-Tab но оно как-то странно работает: не хочет подставлять поля структуры как минимум и, по-моему, не понимает this. Возможно, что при запуске etags надо указать какие-нибудь спец параметры для этого, если так, то прошу просветить.

Ответ на: комментарий от anonymous

версия из cvs у меня неплохо работает

fghj ★★★★★
()
Ответ на: комментарий от tailgunner

Да ? А вот в модуле vhdl нормально работает. Набираешь начало название сигнала, ф-ции, служебного слова и т.д. далее TAB и дополняется, если с похожим названием несколько слов, то TAB'ом выбераешь нужное. Единственно, что списком было бы удобней.

brahman
()

В имаксе автозавершение нормально работает только для лиспа (cl, elisp, scheme), для остальных языков, в общем случае, никакое автозавершение не работает (ну кроме автозавершения из этого же буффера) или работает очень ограниченно и на него полагаться нельзя.

hyc
()
Ответ на: комментарий от Burbaka

> Это так кажется от ограниченности.

Ну разумеется.

mv ★★★★★
()

а я уже хотел с емаксью поближе познакомиться ..

Syncro ★★★★★
()
Ответ на: комментарий от dont

> Исользуй вим с omniCompletion и будет тебе счастье.

Если он по ctags-базе работает, то счастье будет непродолжительным. До первого плюсового шаблона с частичной специализацией.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

По ctags.
Не думаю, что это так критично. stl на ура. с бустом вроде тоже проблем не было. Единственное, что мне пока не нравится, это если написать 
 namespace po = boost::program_options; и потом
 po::<C+X><C+O> ничего подходящего не найдет (
Или сначала написать using std::string; и потом 
string bla; 
bla.<C+X><C+O> так же не получишь вариантов возможных.(

Хотя ничего лучше работающего под никсами не видел, если есть - тыкни пальцем. Если нет - незачем придираться.

Вот кстати решение придумал, как генерить нужные теги  для вима:
Создаем простой скриптец
dont@localhost ~ $ cat /bin/ctags.sh
#!/bin/bash
a=$@
if [ -z "${a}" ]; then
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q `cat /tmp/.vim_tags`
else
    ctags -R --c++-kinds=+p --fields=+iaS --extra=+q "${@}"
    echo "${@}" > /tmp/.vim_tags
fi

В .vimrc прописал следующее:

map <F5> :!echo "Updating ctags database for directory " && echo `cat /tmp/.vim_tags` && /bin/ctags.sh<CR>

#Подключить stl-ые теги, что бы каждый раз не сканить, здесь же и буст можно подключать, если необходимо
set tags+=/home/dont/.vim/tags

Теперь находясь в каком-то файле, вам нужно допустим теги log4cpp и текущего проекта, запускаете команду
:!ctags.sh /usr/include/log4cpp ~/work/myproj
Необходимые директории будут просканены, в текущем каталоге создастся tags-файл, что даст возможность использовать нужные теги. 
Если во время работы вы дописали некоторые классы к текущему проекту, вам стоит лишь нажать F5 и скрипт просканит те директории, которые сканил в прошлый раз. 
Как по мне - очень удобно, хотя есть куча вариантов развить или по-другому применить эту идею.

dont
()
Ответ на: комментарий от dont

Лично у меня на вот на такой код 


template <typename X>
class Test {

 public:

  int a;
  int b;

};

template <typename X>
class Test<X*> {

  public:

  int c;
  int d;

};

template <> 
class Test<int> {

  public:

  int e;
  int f;

};

template <> 
class Test<int*> {

  public:

  int g;
  int h;

};


int main() {

 Test<int *> t;
 
 t.%%% подсказко %%%%

}

выдеается результат неадекватный, хотя и ctags и omnicompletion и vim у меня не особо странные.

Burbaka ★★
()
Ответ на: комментарий от Burbaka

>>  t.%%% подсказко %%%%
Что под этим имелось ввиду? 
Какой результат? Все переменные от a до h?
У меня такой же, в принципе во свем виновен ctags: 

dont@localhost ~/work/test/ctags $ cat tags
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.7     //
Test    ctags.h /^class Test {$/;"      c
Test    ctags.h /^class Test<X*> {$/;"  c
Test    ctags.h /^class Test<int*> {$/;"        c
Test    ctags.h /^class Test<int> {$/;" c
Test::a ctags.h /^  int a;$/;"  m       class:Test      access:public
Test::b ctags.h /^  int b;$/;"  m       class:Test      access:public
Test::c ctags.h /^  int c;$/;"  m       class:Test      access:public
Test::d ctags.h /^  int d;$/;"  m       class:Test      access:public
Test::e ctags.h /^  int e;$/;"  m       class:Test      access:public
Test::f ctags.h /^  int f;$/;"  m       class:Test      access:public
Test::g ctags.h /^  int g;$/;"  m       class:Test      access:public
Test::h ctags.h /^  int h;$/;"  m       class:Test      access:public
a       ctags.h /^  int a;$/;"  m       class:Test      access:public
b       ctags.h /^  int b;$/;"  m       class:Test      access:public
c       ctags.h /^  int c;$/;"  m       class:Test      access:public
d       ctags.h /^  int d;$/;"  m       class:Test      access:public
e       ctags.h /^  int e;$/;"  m       class:Test      access:public
f       ctags.h /^  int f;$/;"  m       class:Test      access:public
g       ctags.h /^  int g;$/;"  m       class:Test      access:public
h       ctags.h /^  int h;$/;"  m       class:Test      access:public
main    ctags.h /^int main() {$/;"      f       signature:()

Но как я уже говорил, под никсами лучшей альтернативы ctags я не знаю(

dont
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.