LINUX.ORG.RU

Vim: автозапуск ctags или что-то получше?


0

0

Всем здравствуйте.

Пытаюсь сделать так, чтобы работать в Vim стало удобнее. Мой коллега все ржет надо мной, что я «в своем Vim» как в каменной пещере: не могу, например, так шустро скакать между вызовами и объявлениями функций, как он в своем любимом SlickEdit; еще Слик очень умело парсит код, и, например, когда пишешь название функции, показывает коммент к этой функции, подсказывает, какие она принимает параметры, и прочее.

То, что в Vim называется omnicompletion, в SlickEdit реализовано гораздо лучше. Например, успешно парсится такой Сишный код:

typedef struct {
   int iField1;
   int iField2;
} T_MyStruct;

//...

byte abMyArr[200];

((T_MyStruct *)abMyArr)->iField1 = 1;

то есть, когда я напишу "((T_MyStruct *)abMyArr)->", то редактор сразу мне покажет список элеменов структуры: iField1, iField2. Vim такое, конечно, не осилит.

Для эксперимента я даже сделал так:

#define P_MY_STRUCT   ((T_MyStruct *)abMyArr)

P_MY_STRUCT->iField1 = 1;
Но это уже SlickEdit не осилил:)

Конечно, на этом список достоинств Слика не оканчивается. В общем, я даже поставил его и попробовал в нем поработать, используя эмуляцию Vim, гы. (эмуляция, конечно, далекоооооо не полная) Да, навигация по проекту в нем превосходная, и вообще, вроде как «все для людей», но, блин, нравится мне Vim!! Уж не знаю, к счастью ли. Но все-таки нравится, поэтому я решил попытаться настроить его так, чтобы работать в нем стало еще приятнее.

На данный момент ключевое: сделать так, чтобы я мог перейти от вызова функции или переменной к ее определению, не парясь с обновлением tags. Это вообще возможно? Единственный известный мне способ: сделать так, чтобы tags обновлялся автоматически, например, раз в минуту. Или еще чаще. Но ведь это тоже нехорошо :( во-первых, генерация tags занимает совсем не микросекунды, а где-то секунду. Каждую минуту комп будет усиленно генерить tags. Ну и во-вторых, вот я редактирую файл, и пока не сохраню изменения, tags будет ссылаться на неверное место в коде. Можно еще и в-третьих припаять: даже когда я сохраню файл, tags обновятся не мгновенно, а как повезет.

А было бы очень здорово, если бы Vim при редактировании запоминал, что где, и юзал бы tags только для неоткрытых файлов. А для открытых хранил бы свою базу тэгов. Это возможно? :'(

Это сделало бы меня почти щасливым..

В общем, поможите, чем можите. Заранее спасибо.

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

> KDevelop

когда я его юзал — он вообще нихрена не умел, в буквальном смысле, бул не намного функциональнее, чем Kate.

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

> неправда

Ещё какая правда. Я тогда искренне недоумевал на тему «нафиг оно вообще нужно»

name_no ★★
()

taglist

то есть, когда я напишу "((T_MyStruct *)abMyArr)->", то редактор сразу мне покажет список элеменов структуры: iField1, iField2. Vim такое, конечно, не осилит

По-моему, в omnicppcomplete (оно работает и с C) такое упражнение предлагается для проверки работы плагина =)

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

name_no, спасибо, с taglist, конечно, лучше, чем без него, но он все равно не решает проблем:

1) когда я, например, добавляю новую структуру или переменную, то taglist о ней не узнает до тех пор, пока я не сохраню изменения. 2) даже когда я сохраню изменения, то перейти на объявление новой переменной можно только по двойному клику в окне taglist, а Ctrl+] все равно говорит, что метка не найдена :(

Может быть, можно это как-то пофиксить? В манах и факе по taglist не нашел

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

оффтопик, но все же: попробовал это в kdevelop - там можно настроить уровень complete. все как надо, тока для данного примера "->" заменят на "." . почему так?

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

> Может быть, можно это как-то пофиксить?

можно, но я не помню, как. А вообще, полистай vim.org, там, кажется, был плагин ещё лучше, но почему-то менее популярный.

name_no ★★
()

поставь емакс и настрой

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

Да, спасибо, сейчас я изображаю уже что-то вроде этого, пожалуй, по твоей ссылке самый навороченный вариант.

Но очень хотелось сделать так, чтобы это работало без сохранения файла. Ведь всякие крутые IDE могут это. Да, да, я знаю, что Vim - это не IDE, но я уверен, что потенциально он может запомнить изменения в несохраненном буфере и хранить свою временную базу тегов :)

dimonomid
() автор топика
Ответ на: комментарий от GotF

GotF, пасибо за наводку на omlicppcomplete, я и не знал об этом плагине )) Он крут

Только ИМХО у стандартного ccomplete есть хорошие вещи, которых нет в omnicppcomplete:

1) в popup-окошке показывались комментарии к элементу структуры. ommicppcomplete не показывает

2) в этом же popup-окошке имена массивов заканчивались на «[». То есть, если есть массив aPages, то он выглядел так: «aPages[» - очень наглядно. А в omnicppcomplete просто «aPages».

Доку читал, но этих настроек не нашел..

dimonomid
() автор топика

1) KDelevop похоже разрабатывают какие-то криворукие уроды, потому что версия 3.X ( одна из последних трешек ) не могла отпарсить cmake-проект, а 4.0.0 слишком наверное свежая, потому что у меня например пропала кнопка доступа к свойствам проекта и где добавляются существующие файлы в проект. Там , где на скриншотах у людей она есть, у меня ее нет.

2) ctags - изначально ущербная идея, потому что не может предоставить информацию о том, _где_ по проекту вызывается функция, или класс используется для наследования, или еще какую-то информация о свойствах или профиле использования некоторого имени. Между тем, существует некоторая программа, которой мы собираем наш проект. Скажем, пишем мы на С++ - отлично, юзается g++, он достаточно smart для того, чтобы выгрузить все об использовании каждого имени класса или метода или параметра. Далее, ничего не мешает полученные файлы cat >> result и sort -k1 < result После этого мы имеем все по всем именам в тоже виде, что и файл тегов.

Может это уже и есть где-то, но я искал в доке по g++ и сходу не ясно.

Поэтому, ответ на вопрос - такая информация должна обновляться при компиляции, засовываться в формат, близкий к tags, подхватываться прекрасным WUSIWUG - редактором...

В Vim бесит его многомодовость. Вбил текст а потом понимаешь, что не вбил текст а не нажал что-то из [iAaoOc] и сам виноват.

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

А меня многомодовость не бесит а, наоборот, нравится. И исходя из того, что вы написали:

Вбил текст а потом понимаешь, что не вбил текст а не нажал что-то из [iAaoOc] и сам виноват.

могу сделать вывод, что вы не владеете слепой печатью. Согласен, без этого навыка в Vim тяжко. Я, когда это понял, довольно быстро научился :)

dimonomid
() автор топика

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

gd же.

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