Как сделать из vim ide c

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

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

Сегодня я хочу рассказать, как я использую 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, которая содержит список папок для поиска, разделенный запятыми.

Заметка

Джавистам следует обратить внимание на опцию includeexpr. Она содержит выражение, которое будет использовано для преобразования строки в имя файла. Следующая строка заменяет все точки на слеши для gf. Таким образом, можно прыгать по import’ам.

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

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

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

Подсказка

Если path опция уже заполнена, то можно легко вставить список I-флагов с помощью следующей нехитрой комбинации клавиш

«=’-I’.substitute(&path, ‘,’, ‘n-I’, ‘g’) 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.

Но так как нам этого мало, можно повесить эту комманду на одну из ненужных кнопок. Например:

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

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

Конечно, это тоже нужно упростить!

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

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

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

Например, fugitive. Если вы работаете с git, вы абсолютно должны посмотреть вимкасты fugitive.

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

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

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

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

Наверняка вы уже слышали, что 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, лучше ставить по инструкции с официальной страницы проекта, вкратце:

На этом можно было бы и закончить статью, но просто установить плагины мало, теперь нужно настроить Vim так, чтобы его было удобно использовать, и не только для разработки на С/C++. Для этого немного изменим свой ~/.vimrc

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

Теперь в корень проекта можно положить файл с именем .vimrc и переопределить там некоторые параметры, например textwidth и &path. Теперь давайте настроим параметры форматирования по-умолчанию:

Ещё неплохо было бы все красиво подсветить: синтаксис, номера строк и максимальную ширину столбца:

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

Так же в командном режиме удобно, когда работают bash-подобные подсказки (по нажатию Tab)

По-умолчанию, vim пытается сделать все окна одинакового размера в том числе и панели, так что выключим эту опцию и заодно зададим размер окна по-умолчанию:

Зададим кодировку по-умолчанию:

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

С основными настройками покончено, осталось настроить плагины, первым настроим clang completer:

С такими настройками clang completer будет выдавать подсказки после ввода .,->. чтобы попросить его подсказать прямо сейчас нужно будет нажать Ctr+x — Ctrl+u (по-очереди). Чтобы открыть окно с расшифровкой ошибок нужно набрать :copen. Также можно увидеть декларацию функции нажав Ctrl+]

Теперь настроим наше дерево проектов, напоминаю, что для этого используется плагин NERDTree:

Для открытия файла достаточно выбрать его в дереве и нажать s, если вы хотите, чтобы новое окно разделяло экран вертикально или Enter для горизонтального разделения. Остался плаигн Snippets, в нем настраивать практически ничего не надо, кроме комбинаций клавиш:

-DDEBUG -Isubmodule1 -Isubmodule2

Об удобной навигации и отладке C++ кода в Vim

Компания, где я работаю, разрабатывает программное обеспечение на C++ под Linux. Долгое время мы использовали Qt Creator, с редкими ребятами работающими из Emacs и Vim. Когда я сам попытался пересесть на Vim, я понял, что ситуация с плагинами для разработки на С++ очень не простая. Поработав немного с C, я быстро понял, что без напильника работать в Vim будет очень сложно.

К сожалению, с ростом опыта работы с Vim редактор в Qt Creator в режиме эмуляции устраивал меня все меньше, и в какой-то момент я решил потратить немного времени и разобраться, как же сделать из Vim нормальную среду.

Я очертил для себя четыре вещи, которые я бы хотел от среды разработки, и которых мне бы хватило в Vim, чтобы полностью на него перейти:

2. Навигация по коду

3. Отладка прямо из среды

4. Интеграция с Git (в частности Blame прямо в редакторе, и Git Grep)

Автодополнение в Vim — это решенная проблема, и название у решения YouCompleteMe. Это очень качественный плагин, который реализует автодополнение для большого количества языков программирования, в частности Python и C++. Ходят слухи, что внутри Google YouCompleteMe решает и вторую проблему с навигацией кода, но использует для этого внутренные инструменты гугла для индексирования.

Интеграция с Git в какой-то степени решена с помощью vim-fugitive. Это не такая комплексная интеграция, как бывает у Jet Brains, или в Visual Studio, но сравнимая с тем, что предлагает Qt Creator. Те два сценария, которые нужны были мне: blame и grep — работают хорошо.

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

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

В интернете как несколько лет назад, так и сейчас, единственное, что находится на тему навигации по C++ коду — это вот эта статья. Я настроил этот плагин, и он в принципе работал. Но было много нареканий, из которых два самых больших:

1. Процесс индексирования надо запускать руками

2. Нельзя найти символ по его названию

В конечном итоге, это все закончилось разработкой собственного плагина для Vim, который позволяет перемещаться по C++ коду. Он требует наличия Compilation Database. Если в проекте используется CMake, то чтобы его получить достаточно вызвать

Иначе можно либо воспользоваться Bear, либо построить его руками, формат очень простой.

Плагин называется CtrlK, и позволяет делать следующие вещи:

1. Перейти к определению символа под курсором.

2. Поиск всех вхождений символа под курсором.

3. Поиска символа по его названию (для этого используется FuzzyFinder, но поиск, к сожалению, не Fuzzy, а только по подстроке). Поиск работает для функций, методов, классов, глобальных переменных, макросов, и даже аргументов функций и локальных переменных.

4. Отображение названия функции, внутри которой находится курсор, в строке состояния. Очень удобно при редактировании больших функций, когда ее объявление находится за пределами экрана.

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

Плагин использует libclang для парсинга кода и leveldb для индекса.

Как и YouCompleteMe, плагин состоит из серверной части и клиента. Здесь под серверной частью подразумевается некоторый процесс, который запущен параллельно с Vim, и который общается с Vim. Для установки мы пошли немного другим путем, чем YCM. Если YouCompleteMe просит запустить руками Make после установки через Vundle, мы вместо этого сделали установку серверной части через pip.

Сначала казалось, что можно написать весь плагин на Python, и не делать серверной части, но скорость парсинга большого количества файлов через clang библиотеку для python очень низкая, и пришлось ее писать на C++, что требует выноса этой функциональности в запущенный отдельно процесс, и немного осложняет установку.

В итоге, установка сводится к установке питоновских библиотек clang, leveldb и серверной части ctrlk:

sudo pip install leveldb sudo pip install clang sudo pip install ctrlk

(Если sudo pip install ctrlk не сработал)

Исторически сложилось так, что pip package для ctrlk принадлежит не мне. В текущем package есть две недоработки — не указана зависимость от ez_setup, ее можно разрешить руками

sudo pip install ez_setup

И отсутствуют заголовочные файлы и библиотеки clang. Это с большим шансом приводит к ошибке компиляции, потому что стандартная установка clang/llvm не помещает их туда, где компилятор нашел бы их без подсказки.

Обе эти проблемы решены в репозитории, но пока pip package не обновлен. Если sudo pip install ctrlk упал с ошибкой компиляции, то можно просто установить его руками

Установке плагина (а также L9 и FuzzyFinder, от которых CtrlK зависит). Для этого проще всего использовать Vundle:

Plugin ‘L9’ Plugin ‘FuzzyFinder’ Plugin ‘SkidanovAlex/CtrlK’

И небольшим настройкам в vimrc

Где g_ctrlk_clang_library_path должен указывать на путь к libclang.so. Его можно найти, например, запустив

После этого vim, запущенный из директории с compilation database (или любой ее поддиректории) начнет индексировать файлы, и через некоторое время по ним можно начать навигацию. F3 покажет текущий статус парсера, Ctrl+K открывает FuzzyFinder, в котором можно искать символы, F2 перепрыгивает на определение символа, и F12 показывает все места в коде, где символ под курсором используется.

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

hi User1 ctermbg=darkgreen ctermfg=black guibg=darkgreen guifg=black hi User2 ctermbg=gray ctermfg=black guibg=gray guifg=black hi User3 ctermbg=darkgray ctermfg=gray guibg=darkgray guifg=gray set usline=%1* % %2* %F%m%r%h %w %3* %r%%h%=%l:%c set lastus=2

Вот два примера работы. В первом примере мы запускаем Vim из папки с проектом, нажимаем Ctrl+K, и переходим к файлу. Это не очень удачный пример, потому что к файлу перейти можно и просто используя Fuzzy Finder или CtrlP, но в CtrlK таким же образом можно перейти и к любом классу или другому символу.

Во втором примере мы опять использум Ctrl+K чтобы найти функцию RestoreStartWorker, в ней позиционируем курсор на классе CodePrinter, и находим все упоминания этого класса в коде, нажав F12. Если бы мы нажали F2, то Vim бы сразу прыгнул на определение класса.

В этом примере есть небольшая задержка при поиске всех вхождений. На самом деле, она работает моментально, но после первого открытия любого файла проходит 1-3 секунды на его парсинг, и до того, как парсинг закончится, переход на определение и поиск вхождений не работают.

В завершении, немного про отладку. Для отладки есть несколько плагинов, и они все очень плохие. Я потратил несколько дней, и все-таки сумел установить PyClewn и заставить его работать. PyClewn позволяет устанавливать точки останова, смотреть на локальные переменные, наблюдать за выводом программы прямо из Vim, и позволяет вводить команды для GDB. Это значительно менее удобно, чем интеграция у QtCreator, например, или у любой другой полноценной среды разработки, но немного лучше, чем запускать GDB в отдельном терминале. PyClewn в целом решал проблему, но хотелось большего.

Мой коллега написал плагин для Vim, который использует TMux, чтобы запустить GDB рядом с Vim на одном экране, и либо управлять им прямо из Vim (например, ставить точки останова, смотреть значения переменных), либо переключаться в окно GDB и просто работать с GDB. Локальные переменные, или поля объектов, можно смотреть в виде дерева в nerd tree. К сожалению, у плагина нет никакой документации, но его установка достаточно проста. Надо установить два плагина через Vundle, а затем настроить vimrc.

Plugin ‘ManOfTeflon/exterminator’ Plugin ‘ManOfTeflon/nerdtree-json’

Если уже используется стандартное nerdtree, то его надо убрать. nerttree-json — это форк nerdtree, который позволяет расширять его возможности, и делать lazy-вычисление элементов дерева.

Затем вот пример настройки exterminator у автора плагина:

:GdbExec up noremap

:GdbExec down ! s:start_debugging(cmd) cd $PATH_TO_EXECUTABLE exec ‘Dbg ‘ . a:cmd end command! -nargs=1 DbgWrapper call s:start_debugging( ) nnoremap B :DbgWrapper ./executable

Где $PATH_TO_EXECUTABLE и ./executable — путь к программе для отладки и ее название.

С такой конфигурацией в запущенном из TMux Vim можно запустить отладку через B, в результате чего TMux разделит экран на два, и запустит во втором GDB, связанный с Vim. В частности, при передвижении по фреймам в GDB Vim будет показывать код в текущем фрейме, и из Vim с помощью горячих клавиш можно передвигаться по фреймам, ставить точки останова, выполнять программу по шагам, и показывать значения переменных в nerdtree. В частности, F5 покажет значения всех локальных переменных, а F6 — переменной под курсором.

Код плагина для навигации по C++ и его серверной части открыты и доступны на GitHub под MIT License:

Я уже некоторое время настраиваю свою среду разработки в Vim. Поскольку все мои проекты написаны на C ++ 11, я нашел несколько плагинов, которые сделали мою жизнь проще и почти так же хорошо, как времена Intellij и Java. Однако кое-чего еще не хватает.

Основная функция, которую мне не хватает, - это утилиты рефакторинга (переименование в проекте, рефакторинг кода в функции / классы, удаление классов и т. Д.). Любые рекомендации о том, как я могу получить такую ​​функциональность в vim?

Я использую следующие плагины:

Gmarik / vundle
Валлорик / YouCompleteMe
a.vim
wincent / Command-T
DoxygenToolkit.vim
глупый / задрот
godlygeek / табличный
tpope / vim-разумный
tpope / vim-неповрежденный
tpope / vim-конец
tpope / vim-беглец
jeffkreeftmeijer / vim-numbertoggle
Локальтог / vim-easymotion
рстакруз / спаркап
Mizuchi / STL-синтаксис

Если вам нужна полная информация, вот мой .vimrc (не стесняйтесь вносить свой вклад в его суть):

Есть два популярных модуля управления, а именно Vundle и Pathogen.

Патоген простой и удобный, эффективный, установленный в плагине:

Сначала создайте две папки :

Установка успешна, присоединиться к ./VIMRC:

Способ добавления плагина прямо в Github:

Далее введите: HELPTAGS генерируют файлы справки в VIM, вы можете ввести: помочь VIM-разумной справочной справочной документ

Это установлено в этом, откройте документ справки, а затем выполните подробную конфигурацию следующего шага.

3. Установите плагин Nerdtree

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

Установка, введите команду на терминале:

После установки, Re-Open VIM, Тип: Helptags Открыть: Help Nerd_tree.txt можно настроить .vimrc

Введите команду в Vim: Nerdtree может просматривать файл.

Мой файл .vimrc добавляет следующий код:

Ярлык Nerdtree
O Включите файл OFF или каталог
T Открыть на вкладке
T Открыть на вкладке «Фон
! Выполните этот файл
P в верхний список
P в корневой каталог
К первому узлу
J до последнего узла
Вы открываете верхний список
M Меню отображения файловой системы (добавить, удалить, мобильную работу)
? помощь
Q закрыто

Часто используется: Ctrl +] Ctrl + T o

4. Автоматическое завершение: плагин Supertab

С VS2010 и Code :: Blocks, их автоматическое завершение их автоматического макияжа действительно сильна, а SuperTab имеет хорошую грамматическую полную функцию (ссылка:supertab)

После завершения установки добавьте код в .VIMRC:

Есть еще много полных способов, которые вы можете войти: Help Ins-Company или: Help Come Amni Больше

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

5.CCTAGS и Plugins Taglist

Чтобы облегчить использование исходного кода чтения VIM, список тегов этот плагин VIM незаменим. Это плагин VIM для просмотра исходного кода. Очень удобно использовать его, мы можем обзорной структуре исходного кода и просмотра прыжка в каждом исходном файле. Плагин списка тегов требует поддержки CTAGS (динамически сгенерированный файл тега).

Есть два способа установки CTAGS:

Введите команду для установки: sudo apt-get install ctags

Введите папку и введите в терминал:

  1. $./configure
  2. $make
  3. $sudo make install

Введите команду в папке исходного кода вашего проекта:

После декомпрессии находится непосредственно ниже ~ / .vim / bundle, (возникшая проблема не открывать: helptags) может открывать taglist.txt для настройки в соответствии с информацией внутри

То же самое в .vimrc плюс следующий код конфигурации

  1. Информация о конфигурации Taglist
  2. let Tlist_Auto_Open=1 " Let the tag list open automatically
  3. let Tlist_Auto_Update=1 " Update the tag list automatically
  4. let Tlist_Compact_Format=1 " Hide help menu
  5. let Tlist_Ctags_Cmd='ctags' " Location of ctags
  6. let Tlist_Enable_Fold_Column=0 "do show folding tree
  7. let Tlist_Process_File_Always=1 " Always process the source file
  8. let Tlist_Show_One_File=1 " Only show the tag list of current file
  9. let Tlist_Exist_OnlyWindow=1 " If you are the last, kill yourself
  10. let Tlist_File_Fold_Auto_Close=0 " Fold closed other trees
  11. let Tlist_Sort_Type="name" " Order by name
  12. let Tlist_WinWidth=30 " Set the window 40 cols wide.
  13. let Tlist_Close_On_Select=1 " Close the list when a item is selected
  14. let Tlist_Use_SingleClick=1 "Go To Target By SingleClick
  15. Пусть tlist_use_right_window = 1 "отображение справа
  16. «Открыть закрыть ярлык
  17. map :TlistToggle

Это очень удобно использовать: используйте команду: $ ctags -r введите vim откройте f2

Сегодня я настроен здесь, уровень программирования не высокий, я не улучшил IDE, чтобы улучшить этап эффективности или сначала перейти к программе, сначала копайте яму, я верну ее .

6. Мой файл .vimrc и фактическая диаграмма эффекта


Фактическое изображение эффекта заключается в следующем, Hotkeys F2, F3 (включите дерево каталога тегов и Taglist), вкладку клавишу (автоматическое многократное)



Есть еще много отличных плагинов, эта яма ждет и т. Д.

Больше инструкций можно ввести в VIM: Помощь Просмотр различных ручной справочники

Vim : Редактор для программистов

Введение

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

Позвольте мне повторить, что навыки набора текста крайне важны для программиста. Если наши предыдущие обсуждения не убедили вас, надеюсь, статья Jeff Atwood с названием ' We Are Typists First, Programmers Second ' убедит вас.

Если вы не имеете опыта программирования, вы можете пропустить этот раздел.

Те же, кто любит программировать, увидят, как Vim может помочь в написании кода.

Простые вещи

Самая простая возможность в Vim, которую вы можете использовать при написании кода - это использовать подсветку синтаксиса. Это позволяет вам визуализировать, т.е. "видеть" ваш код, подсветка помогает вам в быстром чтении и написании вашего кода, а также помогает избежать очевидных ошибок.

Подсветка синтаксиса

Предположим вы редактируете файл синтаксиса Vim, запустите :set filetype=vim и посмотрите как Vim добавит цвета. Аналогично, если вы редактируете файл на Python, запустите :set filetype=python .



Для просмотра списка доступных типов языков, загляните в каталог $VIMRUNTIME/syntax/ .

На заметку: Если вы хотите включить подсветку синтаксиса для любого вывода Unix оболочки, просто перенаправьте вывод через канал в Vim, например, так: svn diff | vim -R - . Обратите внимание на тире в конце, которое говорит Vim, что он должен читать текст со стандартного ввода.

Умные отступы

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

Если вы отступаете до определенной линии и хотите, чтобы следующие строки были с таким же отступом, то вы можете использовать установку :set autoindent .

Если вы начинаете новый блок операторов и хотите, чтобы последующие строки автоматически шли с отступом еще на один уровень, то вы можете использовать :set smartindent . Обратите внимание, что поведение этого параметра зависит от использования конкретного языка программирования.

Скачки

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

Команды оболочки

Вы можете запустить команды оболочки из Vim, используя команду ' :! '.

Например, если команда date доступна в вашей операционной системе, запустите :!date и вы увидите строку с текущей датой и временем.

Это удобно в ситуации, когда вы хотите проверить что-то в вашей файловой системе, например, быстро узнать, какие файлы находятся в текущем каталоге :!ls или :!dir, и так далее.

Если вы хотите получить доступ ко всем возможностям оболочки, запустите :sh .

Мы можем использовать эти объекты для запуска внешних фильтров для редактируемого текста. Например, если вы имеете набор строк, которые вы хотите отсортировать, вы можете запустить :%!sort , эта команда передаст текущий текст команде sort в оболочке и затем вывод команды заменит текущее содержание файла.

Переходы

Есть много способов перемещаться по коду.

• Разместите ваш курсор на имени файла в коде и затем нажмите gf для открытия файла.

• Разместите ваш курсор на имени переменной и нажмите gd для перехода к локальному определению имени переменной. gD производит то же для глобального объявления, производя поиск с начала файла.

• Смотри :help 29.3, :help 29.4, и :help 29.5 по использованию команд. Например, [ I покаж ет все строки, содержащие ключевое слово под курсором!

Просмотр части кода

Файловая система

Используйте :Vex или :Sex для просмотра файловой системы в Vim и последующего открытия нужных файлов.

ctags

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

Например, для просмотра файла мы можем использовать плагин taglist.vim .

1. Установим программу Exuberant ctags .

2. Установим плагин taglist.vim . Подробное описание установки — на странице скрипта.

3. Запустите :TlistToggle для открытия окна taglist. Класно, теперь вы можете просматривать части вашей программы, такие как макросы, определения типов, переменных и функций.

4. Вы можете использовать :tag foo для перехода к определению foo.



Taglist в действии.

5. Разместите ваш курсор на любом символе и нажмите ctrl-] для перехода к определению символа.

• Нажмите ctrl-t для возврата к предыдущему коду, который вы читали.

6. Используйте ctrl-w ] для перехода к определению символа в разделенном окне.

7. Используйте :tnext , :tprev , :tfirst , :tlast для движения между соответствующими тегами.

Обратите внимание, что Ctags богат поддержкой 33 языков программирования (на момент написания статьи) и может быть легко расширен на другие языки.

Смотри :help taglist-intro для подробной информации.

cscope

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

1. Установите cscope. Обзор установки в :help cscope-info и :help cscope-win32 .

2. Скопируйте cscope_maps.vim в ваш каталог ~/.vim/plugin/ .

3. Перейдите в ваш каталог исходных кодов и запустите cscope -R -b для построения ('b'uild) рекурсивной ('r'ecursively) базы данных для всех подкаталогов.

4. Перезапустите Vim и откройте файл с исходным кодом.

5. Запустите :cscope show для подтверждения того, что cscope соединение создано.

6. Запустите :cscope find symbol foo для поиска символа foo. Вы можете сократить эту команду до :cs f s foo .

Вы также можете:

• Найти это определение - :cs f g

• Найти функции, вызываемые этой функцией - :cs f d

• Найти функции, вызовающие эту функцию - :cs f c

• Найти эту строку текста - :cs f t

• Найти этот шаблон egrep - :cs f e



Рис. cscope в действии

Предложения по использованию cscope в Vim вы найдете, запустив :help cscope-suggestions.

Также стоит установить плагин Source Code Obedience , он обеспечивает использование удобных сочетаний клавиш в плагинах cscope/ctags.

Если говорить о языке программирования Си, может быть довольно удобен плагин c.vim .

Компилирование

Мы уже видели в предыдущей главе описание :make для программ, которые мы пишем, поэтому мы не будем повторяться.

Легкое написание

Omnicompletion

Одной из наиболее востребованных функций, которая была добавлена в Vim 7, является "omnicompletion", когда текст может быть автоматически завершен в зависимости от текущего контекста. Например, если вы используете длинное имя переменной, причем используете это имя неоднократно, вы можете задать сочетание клавиш в Vim для автодополнения, и Vim будет вводить оставшуюся часть.

Vim решает эту задачу с помощью ftplugins, в частности по имени ftplugin/ complete.vim, например, pythoncomplete.vim.

Давайте запустим пример с простой программой на Python:

После ввода этой программы создайте новую строку в этом файле, наберите ' he ' и нажмите ctrl-x ctrl-o. Вам будут показаны варианты автозавершения.



Omni-completion в действии

Если вы получите ошибку E764: Option 'omnifunc' is not set , запустите :runtime! autoload/pythoncomplete.vim для загрузки плагина omnicompletion.

Чтобы не делать это каждый раз, вы можете добавить следующую строку в ваш ~/.vimrc :

autocmd FileType python runtime! autoload/pythoncomplete.vim

Vim автоматически использует первый вариант автодополнения, вы можете перейти к следующему или предыдущему с помощью ctrl-n и ctrl-p соответственно.

Если вы хотите оборвать использование omnicompletion, просто нажмите esc .

Изучите :help new-omni-completion для подробной информации о поддерживаемых языках (C, HTML, JavaScript, PHP, Python, Ruby, SQL, XML, . ) а также о том, как создавать свои собственные сценарии omnicompletion.

Примечание: Если вам больше нравится использовать кнопки со стрелками для выбора в списке omnicompletion, смотри Vim Tip 1228 как их подключить.

Я предпочитаю использовать просто ctrl-space вместо громоздкой комбинации ctrl-x ctrl-o . Для реализации этого, вставьте строку в ваш vimrc:

И еще, плагин PySmell может помочь тем пользователям Vim, которые программируют на Python.

Использование фрагментов

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

2. Создайте ваш каталог ~/.vim/after/ , если он еще не существует.

3. Запустите Vim, вставив имя этого плагина в командную строку. Например, запустите Vim как gvim snippy_bundles.vba

4. Запустите :source % . Тем самым 'vimball' будет распакован и большое количество файлов будет сохранено в соответствующие каталоги.

5. Повторите то же для snippy_plugin.vba

Теперь, давайте научимся использовать этот плагин.

1. Откройте новый файл, скажем test.py .

2. Нажмите клавиши d , e , f и затем .

3. Ура! Смотрите, как snippetsEmu создает структуру вашей функции. Вы должны увидеть в вашем файле следующее:

Примечание: В случае, если вы видите def и ничего больше, то, возможно, плагин фрагментов не загружен. Запустите :runtime! ftplugin/python_snippets.vim и посмотрите, поможет ли это.

4. Ваш курсор теперь находиться на имени функции, т.е. fname .

5. Наберите имя функции, скажем, test .

6. Нажмите и курсор автоматически перейдет к аргументам. Нажмите Tab снова для перехода к заполнению следующего пункта.

7. Теперь введите комментарий: Скажем Hi (привет)

8. Нажмите Tab снова и введите ' Hello World '

10. Ваша программа готова!

Теперь вы должны увидеть вот это:

Самое приятное то, что SnippetsEmu создает стандартное форматирование, которому нужно следовать, и что ничего в команде не будет "забыто".

Создание фрагментов

Давайте посмотрим, как создать свой собственный фрагмент.

Рассмотрим пример. Предположим, что мне нужно часто писать следующий код в ActionScript3:

Это простая комбинации получения/установки с использованием переменной. Проблема в том, что очень много такого шаблонного кода приходиться писать неоднократно. Давайте посмотрим, как автоматизировать это.

Плагин фрагментов языка SnippetsEmu ассоциирует st как начальный тег и et как закрывающий тег - это направляющие символы, между которыми мы вводим наш код.

Давайте начнем с простого примера.

exec "Snippet pubfun public function ".st.et.":".st.et." < ".st.et." >"

Добавьте эту строку в ваш ~/.vim/after/ftplugin/actionscript_snippets.vim .

Теперь откройте новый файл, скажем, test.as, наберите pubfun, нажмите и смотрите как это расширяется:

Курсор будет помещен на имени функции, нажмите tab чтобы войти в возвращаемый тип функции, введите tab снова для ввода тела функции.

Возвращаясь к нашей исходной задачи, вот что я придумал:

Примечание: Все фрагменты для этого плагина должны быть введены в одной строке. Это техническое ограничение.

Выполните следующие действия, чтобы можно было использовать новый фрагмент:

1. Добавьте эту строку в ваш ~/.vim/after/ftplugin/actionscript_snippets.vim .

2. Откройте новый файл test.as.

3. Наберите getset и нажмите и вы должны увидеть следующее:

4. Наберите color и нажмите . Обратите внимание, что переменная с именем color везде заменяется.

5. Наберите Number и нажмите . Ваш код теперь должен выглядеть так:

Посмотрите как в несколько нажатий клавиш мы получили результат! Мы заменили около 11 строк повторяющегося кода одной строкой сценария Vim.

Мы можем продолжать добавлять такие фрагменты для упрощения процесса кодирования, что поможет нам сконцентрироваться на реальной работе в программировании.

Смотри :help snippets_emu.txt для подробной информации (данный файл помощи будет доступен только после инсталляции плагина).

Vim может использоваться в качестве IDE с помощью нескольких плагинов.

Плагин Project

Плагин Project используется для создания Project-менеджера, используемого в Vim.

1. Скачайте плагин project .

2. Разархивируйте его в ваш каталог ~/.vim/ .

3. Запустите :helptags ~/.vim/doc/.

5. Запустите :Project . Слева откроется боковая панель, которая будет работать как 'project window'.

6. Запустите \\c (обратный слэш и ' c ')

7. Дайте ответы на следующие параметры

• введите имя (Name), скажем 'vim7_src'

• каталог (Directory), скажем C:\\repo\\vim7\\src\\

• опции CD, аналогично как у каталога выше

• Опции фильтрации (Filter), скажем *.h *.c

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

9. Используйте клавиши со стрелками или клавиши j/k для перемещения вверх и вниз по списку файлов, а нажатие клавиши E nter откроет файл в главном окне.

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

Вы можете использовать стандартные команды для открытия и закрытия проектов и их частей.

Вы также можете запускать скрипты в начале и в конце использования проекта, это поможет вам установить переменную PATH или набор опций компиляции и так далее.

Смотрите :help project.txt для подробной информации.

Запуск кода из текста

Вы можете запустить код прямо из Vim с помощью плагинов, таких как EvalSelection.vim или простые плагины, такие как inc-python.vim .

Интеграция SCM

Если вы начнете редактировать файл, вы можете сделать автоматическую проверку из Perforce с помощью плагина perforce . Аналогично, есть плагины для интеграции с CVS/SVN/SVK/Git .

Для обзора остальных плагинов, созданных для реализации IDE в Vim, см.:

Есть много плагинов, созданных для конкретных языков программирования, которые могут помочь вам изящно работать. Например, для Python могут быть полезны следующие плагины:

• SuperTab позволяет вам вызывать завершения, просто нажав tab , а затем использовать клавиши со стрелками для выбора опции.

• python_calltips показывает окно в нижней части, в котором дается список возможных завершений. Удобная особенность по сравнению с обычным завершением состоит в том, что вы можете посмотреть в документации информацию по каждому из вариантов.

• VimPdb поможет вам отладить программы на Python в Vim.

Создание своих плагинов

Вы можете написать свои плагины для расширения возможностей Vim. Например, вот задача которую вы можете сделать:

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

Я расширил пособие и сделал его более общим:

Доступ к базам данных

Вы можете даже работать с 10 различными базами данных: Oracle, MySQL, PostgreSQL, Sybase, SQLite, и всё из Vim, с помощью плагина dbext.vim . Самое приятное то, что этот плагин поможет вам редактировать SQL, написанный в PHP, Perl, Java и т.д. И вы даже можете напрямую выполнять SQL запрос, даже если он встроен в другой язык программирования, и вас даже спросят о значении переменных.

Итоги

Мы изучили, как Vim можно использовать в программировании с помощью различных плагинов и установок. Если вам нужно больше, вы можете написать свои плагины для Vim (как мы уже видели в главе Scripting).

Хорошим источником дискуссий по теме будет Stack Overflow и блог Peteris Krumins's .

Мне очень сложно использовать VIM в качестве IDE для программирования.
Помогите мне найти решение.

Чтобы ответить на упомянутые аспекты:

"Строительство" обычно подразумевает, что у вас есть система сборки (например, make, scons, cmake, "solutions", ant, waf и т.д.). Эти системы сборки обычно запускаются с помощью некоторой команды (например, make, scons, cmake + в любом случае, devenv, ant, waf). Вы можете запустить систему сборки, установив опцию makeprg в vim:

Установите это для любой системы сборки. Затем вы просто используете :make для запуска buildsystem. Ошибки сообщаются в буфер, содержащий список "ошибок".

Читайте также: