Pull to refresh

Использование Vim в качестве C/C++ IDE

Reading time4 min
Views113K
Привет, Хабрахабр. Меня зовут Алексей и я занимаюсь тем, что разрабатываю встраиваемые операционные системы.

Сегодня я хочу рассказать, как я использую Vim в качестве IDE для C/C++ проектов.

Несмотря на то, что я использую Vim для C/C++, многие из рекоммендаций довольно общие и могут использоваться в любом проекте.

Первый шаг


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

В Vim есть подходящая для нас опция — exrc. Она говорит vim'у искать дополнительный .vimrc в текущей рабочей директории. Таким образом, мы можем иметь один файлик в корне каждого проекта с его специфическими настройками.

Так как vim будет подключать .vimrc из любой директории, из которой вы его запустите, желательно предпринять некоторые меры защиты и установить опцию secure. В основном, она запрещает внешним .vimrc писать что-то в файлы, выполнять комманды шелла и отображает маппинги, которые создаются.

В общем, нам нужно добавить следующие две строчки в наш главный .vimrc:
set exrc
set secure

Настройки конкретного проекта


После того, как мы получили возможность сохранять опции для каждого проекта в отдельности, почему бы нам этим не заняться.

У всех проектов есть какие-то свои правила касательно тех же отступов, так что просто пеместите нужные настройки в .vimrc в корне вашего проекта:
set tabstop=4
set softtabstop=4
set shiftwidth=4
set noexpandtab


Кроме этого, я стараюсь держать свои строки в пределах 110 символов. Но так как это очень специфично и сильно зависит от контекста, я не могу доверить такое важное дело как разбиение строк какому-либо редактору (даже vim). Но vim может помочь мне просто подсветив нужный столбец.
set colorcolumn=110
highlight ColorColumn ctermbg=darkgray

Определений типов файлов


По умолчанию, Vim предпологает, что все .h файлы это C++. Однако, часть моих проектов написаны на чистом C. Поэтому я хочу, чтобы тип файла был C. Кроме того, в моих проектах используется doxygen, так что я не против включить очень клевую подсветку doxygen в vim.

Для того, нужно добавить пару строк в локальный .vimrc:
augroup project
    autocmd!
    autocmd BufRead,BufNewFile *.h,*.c set filetype=c.doxygen
augroup END


Установка переменной path


В vim есть чудесная комманда gf (и родственные к ней), которая открывает файл, чье имя находится под курсором. Это неимоверно полезно при навигации по заголовочным файлам.

По умолчанию, vim смотрит файлы в текущей папке, а так же в /usr/include. Однако почти все проекты имеют заголовочные файлы, которые хранятся в других папках. Поэтому, нужно установить переменную path, которая содержит список папок для поиска, разделенный запятыми.
let &path.="src/include,/usr/include/AL,"

Заметка

Джавистам следует обратить внимание на опцию includeexpr. Она содержит выражение, которое будет использовано для преобразования строки в имя файла. Следующая строка заменяет все точки на слеши для gf. Таким образом, можно прыгать по import'ам.
set includeexpr=substitute(v:fname,'\\.','/','g')

Автодополнение


Лучший(Устарело. Сейчас я использую YouCompleteMe. Обратитесь к моему посту за деталями) Хороший плагин для автодополнения C/C++ кода, который я нашел, это clang_complete (инструкции для установки смотри на страничке плагина).

Он использует clang для того, чтобы сгенерировать список дополнений. И работает отлично для C и C++ (а так же еще пары языков).

Для того, чтобы clang знал о ваших папках с заголовочными файлами, нужно добавить -I и -D флаги в файл .clang_complete в корне вашего проекта. После этого, clang_complete будет автоматически вызываться при нажатии "." или "->".

Подсказка

Если path опция уже заполнена, то можно легко вставить список I-флагов с помощью следующей нехитрой комбинации клавиш
"='-I'.substitute(&path, ',', '\n-I', 'g')<CR>p


Другие clang плагины


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

Навигатор


Для того чтобы отображать дерево проекта можно воспользоваться либо отдельными плагинами (NERD Tree например), либо встроеным netrw.

Я не использую ни один из способов, так как мне вполне комфортно выбирать файлы прямо из коммандного режима vim. (если установить wildmode в longest:list,full, то vim показывает подходящие файлы как нормальный шелл)

Настройка системы сборки


После того, как мы разобрались с редактированием и навигацией по файлам, можно собирать проект. В vim есть комманда make. По умолчанию, она запускает make в текущей директории и парсит вывод на наличие ошибок.

Фактическая комманда для выполнения хранится в makeprg. Если проект собирается в другой папке, использует другие параметры make или вообще использует другую систему сборки, нужно просто изменить makeprg чтобы отобразить это:
set makeprg=make\ -C\ ../build\ -j9


После этого, можно собирать проект просто напечатав :make.
Но так как нам этого мало, можно повесить эту комманду на одну из ненужных кнопок. Например:
nnoremap <F4> :make!<cr>

("!" предотвращает от прыгания на первую ошибку)

Настройки системы запуска


После того, как проект собран, вполне логично запустить его. Vim может запускать любую программу, для этого всего лишь нужно добавить восклицательный знак перед ее именем в коммандном режиме. Так, чтобы запустить мою супер-пупер программу, нужно набрать :!./my_great_program.

Конечно, это тоже нужно упростить!
nnoremap  :!./my_great_program<cr>


Система контроля версий


Так как vim предоставляет прямой доступ к коммандной строке, я не использую какой-либо специальный плагин для этих задач и просто управляю своим git-деревом прямо из шелла.

Но я должен отметить, что есть множество отличных vim плагинов для работы с разными системами контроля версий.
Например, fugitive. Если вы работаете с git, вы абсолютно должны посмотреть вимкасты fugitive.

Забытый пункт: отладка


Так как я чувствую себя комфортно в command-line gdb, да и специфика операционных систем делает почти невозможным отладку их отладчиками, за прошедший год я запускал gdb лишь однажды. В основном, все мои проекты я отлаживаю обычными print'ами и капелькой мозгов. Так что в моем vim нет ничего, чтобы напоминало отладчик.

Однако, я должен сказать, что существуют несколько плагинов для интеграции gdb и vim. Например, clewn, gdbvim.

Итог


После серии несложных оперций, vim превратился в вполне себе сносную IDE. Буду рад услышать о дополнительных настройках, которые облегчили вашу жизнь в vim и позволили лучше интегрировать его с окружающими инструментами.
Tags:
Hubs:
+27
Comments16

Articles

Change theme settings