К основному контенту

Настройка VIM'а для разработки на C/C++

Наверняка вы уже слышали, что Vim - это мощнейший текстовый редактор не уступающий в функционале и удобстве большим тяжеловесным аналогам, наподобие Eclipse или XCode. Вот и я слышал, однако в базовой комплектации Vim умеет очень мало, подсвечивать синтаксис, расставлять отступы и подсказывать код на основе тэгов (но это не совсем то автодополнение которое мне бы нравилось).

В этой статье я бы хотел рассказать, как Vim можно превратить в полноценную IDE для C/C++ с поддержкой проектов, автодополнения кода, поиском и подсвечиванием ошибок и генерацией по шаблонам.

Предполагается, что у вас есть базовые умения в работе с Vim'ом.

Vim легко расширается при помощи плагинов, собственно с их помощью я и собираюсь превратить Vim в IDE.

Для начала немного расскажу о том, какие и для чего плагины планируется использовать:
  • Vundle - плагин для управления плагинами (и такое бывает). С его помощью можно ставить плагины просто указывая их имена в ~/.vimrc.
  • Ultisnips - генератор кода по шаблонам.
  • Clang complete - плагин анализирующий код проекта при помощи Clang и позволяющий сделать дополнять код на основе типов аргументов возвращаемых значений и т.д. Плюс умеет подсвечивать ошибки прямо в редакторе.
  • NERD Tree - файловый браузер.
Clang complete требует установленной библиотеки libclang, поэтому перед установкой плагинов нужно проверить, что на есть (обычно она является частью пакета clang).
Начнем с установки Vundle, лучше ставить по инструкции с официальной страницы проекта, вкратце:
  1. Скачиваем плагин
  2. git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    
  3. В ~/.vimrc добавляем следующие строчки, можно сразу же добавить нужные нам плагины:
  4. set nocompatible              " be improved, required for Vundle
    filetype off                  " required for Vundle
    
    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " " let Vundle manage Vundle, required
    Plugin 'gmarik/Vundle.vim'
    
    " User defined plugins
    Plugin 'SirVer/ultisnips'                                                     
    Plugin 'honza/vim-snippets'                                                    
    Plugin 'scrooloose/nerdtree'
    Plugin 'Rip-Rip/clang_complete'
    
    " All of your Plugins must be added before the following line
    call vundle#end()            " required
    filetype plugin indent on    " required
    " " Put your non-Plugin stuff after this line
    
  5. Запускаем Vim и пишем: :PluginInstall
Если все хорошо, то вы не увидите никаких сообщений об ошибках.
На этом можно было бы и закончить статью, но просто установить плагины мало, теперь нужно настроить Vim так, чтобы его было удобно использовать, и не только для разработки на С/C++. Для этого немного изменим свой ~/.vimrc

Первым делом добавим возможность проектам переопределять некоторые праметры, например ширину отступов, заменять ли табуляцию пробелами, кодировку  т.д.
" Позволим конфигурационным файлам в проекте изменять настройки vim'a
" Включим чтение конфигурационных файлов .vimrc в текущей директории
set exrc                                                                     
" Запретим опасные команды в локальных .vimrc файлах (эта опция должна идти в вашем 
" ~/.vimrc после запрещаемых команд, таких как write)
set secure 
Теперь в корень проекта можно положить файл с именем .vimrc и переопределить там некоторые параметры, например textwidth и &path. Теперь давайте настроим параметры форматирования по-умолчанию:
" Отступы пробелами, а не табуляциями
set expandtab
" Ширина строки 80 символов
set textwidth=80
" Ширина табуляции в колонках
set ts=2
" Количество пробелов (колонок) одного отступа
set shiftwidth=2
" Новая строка будет с тем же отступом, что и предыдущая
set autoindent
" Умная расстановка отступов (например, отступ при начале нового блока)
set smartindent
Ещё неплохо было бы все красиво подсветить: синтаксис, номера строк и максимальную ширину столбца:
" Подсвечивать синтаксис
syntax on
" Указывать номера строк
set number
" Подсветить максимальную ширину строки
let &colorcolumn=&textwidth
" Цвет линии - тёмно-серый
highlight ColorColumn ctermbg=darkgray
Теперь давайте настроим поиск:
" Игнорировать регистр при поиске                                               
set ic                                                                          
" Подсвечивать поиск                                                            
set hls                                                                         
" Использовать последовательный поиск                                         
set is 
Так же в командном режиме удобно, когда работают bash-подобные подсказки (по нажатию Tab)
" Включаем bash-подобное дополнение командной строки                            
set wildmode=longest:list,full
По-умолчанию, vim пытается сделать все окна одинакового размера в том числе и панели, так что выключим эту опцию и заодно зададим размер окна по-умолчанию:
" Не делать все окна одинакового размера                                        
set noequalalways                                                               
" Высота окон по-умолчанию 20 строк                                             
set winheight=20     
Зададим кодировку по-умолчанию:
set fileencoding=utf-8
Для некоторых типов фалов параметры отличаются от других, например в make-файлах не нужно заменять табуляции пробелами и т.д.
" С/C++ файлы
" Расставлять отступы в стиле С
autocmd filetype c,cpp set cin                                                  
                                                                                
" make-файлы                                                                       
" В make-файлах нам не нужно заменять табуляцию пробелами                          
autocmd filetype make set noexpandtab                                              
autocmd filetype make set nocin                                                    
                                                                                   
" html-файлы                                                                       
" Не расставлять отступы в стиле С в html файлах                                
autocmd filetype html set noexpandtab                                           
autocmd filetype html set nocin                                                 
autocmd filetype html set textwidth=160                                         
                                                                                
" css-файлы                                                                     
" Не расставлять отступы в стиле C и не заменять табуляцию пробелами            
autocmd filetype css set nocin                                                  
autocmd filetype css set noexpandtab

" python-файлы                                                                  
" Не расставлять отступы в стиле С                                              
autocmd filetype python set nocin 
С основными настройками покончено, осталось настроить плагины, первым настроим clang completer:
"Clang-completer                                                                
" Включить дополнительные подсказки (аргументы функций, шаблонов и т.д.)        
let g:clang_snippets=1                                                          
" Использоать ultisnips для дополнительных подскахок (чтобы подсказки шаблонов  
" автогенерации были в выпадающих меню)                                         
let g:clang_snippets_engine = 'ultisnips'                                       
" Периодически проверять проект на ошибки                                       
let g:clang_periodic_quickfix=1                                                 
" Подсвечивать ошибки                                                           
let g:clang_hl_errors=1
" Автоматически закрывать окно подсказок после выбора подсказки                 
let g:clang_close_preview=1                                              
" По нажатию Ctrl+F проверить поект на ошибки                                   
map <c-f> :call g:ClangUpdateQuickFix()<cr>
С такими настройками clang completer будет выдавать подсказки после ввода .,->,::, чтобы попросить его подсказать прямо сейчас нужно будет нажать Ctr+x - Ctrl+u (по-очереди). Чтобы открыть окно с расшифровкой ошибок нужно набрать :copen. Также можно увидеть декларацию функции нажав Ctrl+]
Теперь настроим наше дерево проектов, напоминаю, что для этого используется плагин NERDTree:
" NERDTree
" Открывать дерево по нажаить Ctrl+n
map <c-n> :NERDTreeToggle<cr>
" Немного магии, если мы запустим Vim без указания файла для редактирования,
" то дерево будет открыто, а если будет указан файл, то дерево 
" открыто не будет                                                   
autocmd StdinReadPre * let s:std_in=1                                           
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif     
" Открывать новые окна справа
set splitright
Для открытия файла достаточно выбрать его в дереве и нажать s, если вы хотите, чтобы новое окно разделяло экран вертикально или Enter для горизонтального разделения. Остался плаигн Snippets, в нем настраивать практически ничего не надо, кроме комбинаций клавиш:
" Snippets                                                                      
" Раскрыть шаблон
let g:UltiSnipsExpandTrigger="<c-a>"
" Отобразить список шаблонов
let g:UltiSnipsListSnippets="<c-d>"                                             
" Идти вперед по шиблонам
let g:UltiSnipsJumpForwardTrigger="<c-b>"
" Идти назад
let g:UltiSnipsJumpBackwardTrigger="<c-z>"
" Разделять окно вертикально при редактировании
let g:UltiSnipsEditSplit="vertical"            
" Версия Python (Нужно указать используемую в системе по-умолчанию)                                 
let g:UltiSnipsUsePythonVersion=2 
Настройка Vim закончена, теперь можно запускать vim в корне проекта, и пользоваться как обычной IDE. Однако в многомодульных проектах clang completer будет работать неправильно. Для того чтобы исправить это нужно создать файлик .clang_complete с параметрами компиляции (теми же что вы указываете компилятору), напрмер:
-DDEBUG
-Isubmodule1
-Isubmodule2
Если же вы указываете полный путь от корня проекта в #include, например: #include "submodule1/header.h", то вместо -Isubmodule1.. можно указать -I..

На этом все. Скачать получившейся .vimrc можно тут.

Комментарии

Популярные сообщения из этого блога

Авторизация через ldap на Linux сервере

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

Операторы && и || в bash

Доброго времени суток, сегодня я расскажу вам о операторах && и || в bash скриптинге. Итак все мы знаем что в Си эти операторы обозначают логическое И и Или . В bash в условиях оператора if while или ещё каких либо они имеют точно такое же применение. А вот что делать если мы хотим запустить одну команду, а за ней другую?