Клеймим скот. Ой… Код.

Расскажу о вещах старых и большинству из вас, думаю, известных. Но копипаста — мать учения.

Я надеюсь, вы пишете под Vim. Так вот, есть у вас проект. Проект начинает развиваться, и вам уже хочется автодополнения.
Вы используете <C-n> или <C-p>. Эти команды автодополняют фрагмент текста. Чтобы текст дополнился, строка должна содержаться в текущем файле или в других, уже открытых.
Удобно, но не совсем. Скажем, работая с одним файлом вам надо вызвать функцию из другого. Вам надо открыть второй файл, иначе никакого автодополнения не получится.

Кроме того, такой autocompletion не видит разницы между переменными, классами, функциями и словами в комментариях. Он просто дополняет текст. Пока в проекте пара файлов — это терпимо. А дальше?

vim + ctags

История ctags уходит корнями в BSD. Поэтому почти наверняка, она у вас уже установлена.
Все на что она способна — это индексировать исходники и собирать информацию про функции, переменные, классы, структуры.

Например, заходим в корневую папку проекта. Ctags поддерживает массу языков (сейчас — 41 штука), включая C/C++/C#, Java, Python, Perl, Ruby, Lisp/Scheme, Shell и даже windows batch и assembler.
В папке проекта индексируем рекурсивно все файлы:

$ ctags -R *

После этого в папке должен появиться файл `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     //
.. потом формат такой: 
... тег файл адрес ...
... еще может идти после ;" описание: функция, число, поле структуры
BYTE_ORDER      endian.h        32;"    d
status  proto.h /^      int32_t status;$/;"     m       struct:__anon1

Vim подхватывает содержимое файла tags на лету. Если же вы его переименовали или переместили — можно в vimrc прописать путь в tags:

set tags=tags,/usr/include/tags

Что это дает?

Теперь, открываете vim. И скажем, хотите узнать, как выглядит функция main(). Делаем:

:ta main

И видите как сразу попадаете к описанию int main().
Если вы видите вызов функции, а хотите перейти к её реализации — <C-]>. Вернуться назад — <C-t>.

Так вот, теперь автодополнение можно делать двумя способами — как раньше (без учета контекста), или с помощью <C-x><C-o> Второй способ удобнее, т.к. показывает еще прототипы функций, поля структур да и в целом учитывает контекст.

А дальше?

Еще можно использовать cscope, но он менее стандартный, хотя и более мощный.
Для тех, кто пишет на Go — gotags и ctags-go.
Тем, кто пишет на Java — «умный» completion пока не вошел в состав Vim, но есть javacomplete.
Вообщем, единственный существенный недостаток — то, что файл tags надо часто перегенерировать (проект-то развивается, функции меняются). Можно сделать для этого цель «make tags» как в ядре Linux. Или написать скриптец, который перегенеривает тэги при каждом сохранении файла из Vim.
Если же вы пишете не на vim, но дочитали аж до конца — сообщу, что ctags еще поддерживается рядом редакторов, в т.ч. KDevelop, Kate, Notepad++, Gedit, Joe, QDevelop, Emacs.

Облегчайте себе жизнь!

Реклама

2 comments on “Клеймим скот. Ой… Код.

  1. Ation:

    «стока должна»

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s