21 мая 2010 г.

Использование VIm, как IDE для языка C.

Несмотря на утверждение, что Vim это всего лишь текстовый редактор и использовать его как IDE глупо, я довольно продолжительное время успешно использую Vim как IDE для языка C. В этом мне помогает набор удобных плагинов и периодически улучшаемый мною .vimrc.
К сожалению, я не встречал в Интернете статей, посвященных превращению Vim в IDE для C. Поэтому я решил написать свою :-).
Для начала рассмотрим, что нам предлагает Vim "из коробки" для редактирования исходников на C. Возможностей не так уж и много и большая их часть описана здесь: http://tldp.org/HOWTO/C-editing-with-VIM-HOWTO/index.html.
Появляется больше возможностей, когда мы начинаем редактировать конфигурационный файл ~/.vimrc под свои нужды. В качестве примера, можно сказать мой .vimrc (и сопутствующий каталог .vim) здесь. В дальнейшем, в статье все примеры буду на основе моего .vimrc.
В самом начале конфига, я включаю поддержку красивого вывода man-страниц, посвященных словам под курсором. Выглядит это вот так:
Затем идет куча мелких твиков и настроек, начинающихся с ключевого слова set. Что они делают написано в комментариях к ним; я лишь покажу как у меня отображаются символы табуляции и конечные пробелы (приведен скриншот простейшего Makefile'а):
Далее идут разнообразные настройки для GVim'а и для плагинов. Настройки для плагинов я рассмотрю позже, а в настройках для GVim'а нет ничего интересного - я убрал панели и полосы прокрутки и включил подсветку текущей строки для удобства (видно на скриншотах).
Вполне полезно ограничивать длину строки кода 80 символами - так проще читать исходники. Для этого тоже есть настройка в моем .vimrc - все символы > 80 подсвечиваются красным фоном:
Иногда, когда пишешь простейшую тестовую программу, нет смысла писать еще и Makefile. Если я пишу программу на C, к которой не предусмотрено Makefile'а, то Vim распознает это и компилирует текущий исходный файл при помощи gcc, командой gcc\ -Wall\ -o\ %<\ %. Если я редактировал файл test.c, то после компиляции я получу все предупреждения компилятора и, может быть, исполняемый файл test.
Далее, в тексте .vimrc идут различные биндинги для C и LaTeX'а позволяющие упростить набор кода. К сожалению, передавать словами, что делают эти биндинги, долго и трудно, поэтому я записал небольшой скринкаст, в котором я стремился показать как работают сишные биндинги:

Одна из основных (и любимых мною) частей моего ~/.vimrc - это хоткеи. Практически все используемые у меня хоткеи имеют префикс Ctrl+C - от слова command. Например <C-c>l означает, что надо нажать на Ctrl+С, отпустить и нажать на клавишу l. Все биндинги горячих клавиш закомментированы и разобраться, что они делают, не составит труда.
Некоторые из биндингов предназначены для вызова самописных функций, которые расположены рядом с ними Такими являются функции для добавления файлов из текущего каталога в дерево проектов (существующие средства в плагине Project весьма неудобны) и для вставки заголовка в файл с исходным кодом (внешний вид показан на скриншоте ниже).
Естественно, для более удобного редактирования кода, используются плагины. Один из них уже был здесь упомянут - это плагин Project. Он предназначен для использования в Vim'е дерева проектов, выглядит это примерно так:
Я уже писал об этом плагине на welinux'е, почитать можно здесь.
Еще один, достаточно функциональный плагин, это taglist. Он позволяет просматривать в отдельном буфере все функции, классы и т.п., связанные с текущим проектом; и быстро перескакивать между ними.
Для настроек taglist'а отведена часть .vimrc:

Для подсветки ошибок прямо в коде, используется плагин errormarker. Для него в .vimrc должна быть лишь одна запись, описывающая формат строки с ошибкой или предупреждением компилятора. Эта строка расположена в моем .vimrc прямо над настройками для taglist'а.
Еще два, используемых мною, плагина это a.vim и mark.vim. Первый плагин позволяет быстро переключаться между *.c и *.h файлами. У меня, для этого действия используется сочетание клавиш <C-c>sw.
Второй плагин позволяет подсвечивать все слова в файле, которые совпадают с словом под курсором, причем для каждого нового слова используется свой цвет. Это удобно при просмотре ассемблерных кодов. Для выделения слова используется сочетание клавиш \m.

9 комментариев:

  1. Относительно пробелов в конце строк и табуляции. А не лучше ли вместо отображения этого на экран повесить обработчик на сохранения файла, что бы автоматически чистил файлики?

    >> Например l означает, что надо нажать на Ctrl+С

    Не сочти за холивар, но в чём отличие от емакса, если вим с такими биндингами? Они являются "режимо-зависимыми" или нет?

    То единственное, что в виме действительно лучше сделано - это фолды, как ты мог о них промолчать?

    ОтветитьУдалить
  2. >> А не лучше ли вместо отображения этого на экран повесить обработчик на сохранения файла, что бы автоматически чистил файлики?

    Зачем? Иногда мне просто необходимо знать, есть ли в конце строки пробел, например при создании LaTeX документа.

    >>Не сочти за холивар, но в чём отличие от емакса, если вим с такими биндингами? Они являются "режимо-зависимыми" или нет?

    Часть биндингов режимо-зависимы, часть нет.
    Не думал, что та же идея с биндингами используется и в емаксе. Я ее придумал сам и счел достаточно удобной.

    >>То единственное, что в виме действительно лучше сделано - это фолды, как ты мог о них промолчать?

    Никогда не пользовался фолдингом, а то как он сделан в vim'е ужасно - при открытии файла, все фолды по умолчанию свернуты. Если заставить vim разворачивать все фолды при открытии файла, то он разворачивает фолды и в окне плагина Project, что достаточно неудобно...

    ОтветитьУдалить
  3. >> Зачем? Иногда мне просто необходимо знать, есть ли в конце строки пробел, например при создании LaTeX документа.

    Как правило, отображение таких вещей делают для того, что бы код был правильно отформатирован. А это, имхо, работа компутера. К тому же, что мешает делать разные правила для разных типов файлов.

    А зачем пробелы в LaTeX?

    >> Не думал, что та же идея с биндингами используется и в емаксе. Я ее придумал сам и счел достаточно удобной.

    Вообще, разница между вимом и емаксом примерно такая (резюмирую, так как пользовался обоими, и много читал). Простые клавишные сочетания + режимы против жестоких кинбидингов на все случаи жизни, по редактору на фаил против один емакс на всех (запустил и работаешь не выходя), редактирование внешних текстов против собрать все текстовые задачи вместе. Как видно, деление весьма условное, разве что в емакс более фичастый (почта, im...). А судя по тому как ты его используешь, тебе емакс может оказаться и ближе. (я его выбрал из-за невнимательности, которая мешает ужиться с режимами (месяца 4-5 мучался)).

    ОтветитьУдалить
  4. Анонимный7 авг. 2010 г., 2:14:00

    спасибо больше, много нового для себя вынес. сам пост не читал правда :3
    посмотрел скринкаст, посомтрел .vimrc, для новичка самое то.

    позволю себе добавить, для включения cursorline в консоле необходимо добавить:
    hi CursorLine ctermbg=240 cterm=none " 240 - бледно-серый

    ОтветитьУдалить
  5. почему .vimrc по ссылке не открывается(

    ОтветитьУдалить
  6. все разобрался. нужно было зайти под своим логином

    ОтветитьУдалить
  7. Знаю, использовал. Увы там был какой-то маленький баг, уже и не помню с чем связанный, который вынудил меня с него уйти.
    Впрочем, все это уже неактуально - я сейчас пользуюсь Emacs'ом))

    ОтветитьУдалить
  8. Ну, для тебя уже не актуально, а для кого-то актуально =) Поэтому и оставил камент - может, кому-то поможет.
    А баги фиксятся, несколько дней назад новая версия появилась.

    ОтветитьУдалить
  9. Спасибо Вам, что делитесь опытом. Перехожу с VisualStudio и C# на VIM и C. Многое взял на вооружение.

    ОтветитьУдалить