Привет, коллеги. Интегрированные среды разработки, кратко IDE, часто идут в комплекте с компилятором для того или иного языка и облегчают процесс разработки программного обеспечения. Я тоже начинал с таких, но потом, когда пришлось работать, в основном, на кластере через ssh или на Перл, привык к командной строке. А потом освоил Вим и теперь мне не нужны никакие IDE: Вим дает все возможности, сам являясь отличной IDE. При минимуме настройки.
Да, небольшая настройка нужна, зато вы получите свою IDE, заточенную под вас лично. Порог входа в Вим довольно высок, и если вы потратили некоторые усилия на овладение инструментом, заточить его вы сможете без проблем.
Итак, что мы ждем от IDE?
Редактор исходного текста
Ну, прежде всего. Нам нужен удобный редактор кода, чтобы настучать новый или редактировать старый. Чтобы размечал синтаксис цветом, отмечал явные ошибки, давал возможность редактировать сразу несколько файлов, позволял сравнивать два файла, показывал номера строк, умел сворачивать блоки кода, по синтаксису или вручную, обладал средствами поиска и замены по регулярному выражению, делал отступы.
Все это в Виме есть. Подсветка синтаксиса имеется (:syntax on), причем для большинства языков, о которых вы слыхали. Если нет для какой-то экзотики, можно скачать. Если вдруг и скачать еще нельзя, можно сделать файл синтаксиса самому, это не так сложно, особенно по образцу. Явные ошибки подсвечиваются тревожно-красным.
Вкладки (:tabnew) позволяют независимо редактировать много файлов, а в каждой вкладке можно открыть несколько окон (:split или :vsplit). Кроме того, есть список файлов (:args), длина которого вообще не ограничена, и можно переходить от одного к другому (:next, :prev).
Для сравнения файлов есть инструмент vimdiff, но те же возможности можно настроить для двух окон вручную (:set diff, :set foldmethod=diff, :set cursorbind в каждом из двух окон).
Номера строк, абсолютные и относительные, тоже есть (:set number, :set relativenumber).
Фолдинг, сворачивание блоков кода, есть ручной (:set foldmethod=manual), по синтаксису (set foldmethod=syntax) и иные. Для начала работы с автоматическим фолдингом хватит команд zo и zc (одна раскравает фолд, другая закрывает).
Про поиск и замену даже не буду повторяться. Таких возможностей нигде больше нет (или я ошибаюсь?). Помимо простой глобальной замены, можно задать условие через фильтр строк, совершая замену только на строках, удовлетворяющих (или не удовлетворяющих) условию.
Отступы делаются автоматически или восстанавливаются одной командой =. Например, gg=G расставит отступы во всем файле.
Добавим в к этому многочисленные регистры для копирования/вставки.
Цикл компиляции-исправления ошибок
Вот это признак именно среды разработки, а не продвинутого редактора. Вим так тоже может, причем еще как! Правда, с применением make. Возможности этого средства стоит освоить, но в простейшем случае все довольно просто. Можно просто написать:
all: *.prog
<Tab>compiler -options file1.prog file2.prog file3.prog
Табуляция литерально, символ таба. Вместо prog ставьте расширение вашего языка. Вместо compiler — команду компилятора.
Но это грубо, можно сделать намного тоньше, чтобы собирать только изменившиеся файлы, учитывать зависимости, вынести настройки в переменные, использовать предопределенные переменные, да и вообще творить чудеса.
Имея Makefile, вы даете команду :make и получаете в списке QuickFix ошибки, причем Вим откроет файл с первой ошибкой, перейдет на нужную строку и выведет внизу диагностическое сообщение об ошибке. Далее можно перемещаться вперед по списку (:cnext) и, если надо, возвращаться (:cprev). Если вы не хотите прыжка на первую ошибку, используйте :make!.
Глобальный поиск и глобальная замена
Тоже популярная возможность IDE: найти и заменить имя переменной, скажем. У Вима есть глобальный поиск :vimgrep, тоже основанный на QuickFix: вы можете найти все вхождения и потом спокойно заменить то, что нужно. Можно и автоматизировать этот процесс, применяя пакетные операции: можно выполнить замену во всех вкладках (:tabdo), окнах (:windo) или во всех открытых файлах (:argdo).
Я бы на всякий случай сохранил резервную копию, благо делается это очень легко прямо из Вим:
:!tar -zcf backup_`date +%F`.tar.gz *.prog *.doc *.txt
Список файлов, конечно, ваш. Можно повесить это на клавишу или вставить в makefile, например, как цель backup (потом :make backup).
Переходы между файлами
При помощи внешней утилиты вроде ctags можно создать файл тэгов: описаний основных конструкций вашего исходного кода. Там будут классы, функции, переменные и т.п., и можно легко переходить по ним и обратно. Для перехода на тэг под курсором служит команда <C-]>, а для возврата <C-T>. Это помимо глобального поиска!
Есть еще переход в файл, имя которого под курсором (это полезно для команд типа include): gf или gF. Последняя еще и переходит на нужную строку, если после имени файла стоит число, например, filename 52. Можно открыть файл в отдельном окошке: <C-W>f или <C-W>F.
А есть поиск файла :find или :tabfind. Это как открытие файла, только не в текущем каталоге, а во всех подкаталогах каталогов переменной path (где они разделены запятыми). См. справку, а я посвящу этому вопросу отдельный материал. Кстати, gf тоже использует эту переменную.
Запуск
Еще одна возможность IDE — это запуск скомпилированного исполняемого файла, непосредственно или на отладчике. Что до запуска, проблем здесь нет, есть несколько возможностей.
Во-первых, можно запустить программу прямо из командной строки Вим:
:!./proggo.x 1 2 3
Во-вторых, можно сделать особую цель в Makefile, скажем, run:
run: proggo.x
<Tab>./proggo.x 1 2 3
И потом запускать через :make run
В третьих, можно выйти в bash посредством команды :sh и делать там что придет в голову.
Наконец, можно открыть окно терминала :term и с комфортом запускать что угодно не отходя от исходного кода.
Работа с отладчиком
В Вим есть средства для взаимодействия с отладчиком gdb. Прежде всего, подключите пакет termdebug посредством команды :packadd termdebug
Далее, команда :Termdebug proggo.x запустит ваш исполняемый файл на отладчике. Откроется два окна: одно для взаимодействия с отладчиком, другое окно терминала, куда будет попадать вывод программы (STDOUT и STDERR) и откуда она будет брать ввод (STDIN).
Окно с исходным кодом тоже останется, и при паузе курсор будет перемещаться на нужную позицию (если отладчик ее сообщит). Позиция будет подсвечена согласно группе debugPC,
Если исходный текст будет изменен, откроется новое окно для отслеживания текущей позиции.
Команды отладчика выходят за рамки этой заметки; возможно, посвящу отдельную заметку этому вопросу.
Учет синтаксиса языка
Вим кое-что знает про блоки, скобки, абзацы и т.п. Мы уже обсуждали, что gd и gD, переходы к первому определению, учитывают синтаксис Си (gd, на самом деле, так как gD переходит к первому вхождению слова в файле). Команда % прыгает на парную скобку.
Существуют плагины, позволяющие перемещения по коду с учетом синтаксиса: например, matchit, который идет в поставке. Вы включаете плагин:
:packadd matchit
и получаете в свое распоряжение новые команды. Например, % теперь прыгает не только по скобкам, но и по конструкциям языка: if-end if, и все в таком роде.
Существуют и другие плагины, которые надо скачивать, и настраивать себе рабочую среду по вкусу.
Удачи, коллеги!