Minoru 19.06.2010 00:29

VimКомпиляция по F5, запуск по F9

До недавнего я довольствовался таким циклом написания программ:
1
2
3
4
5
6
7
$ vim code.c
. . .
:wq
$ g++ -o program code.c && ./program
. . .
$ vim code.c
. . .

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

Для самых нетерпеливых привожу соответствующий кусок ~/.vimrc:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
" If some kind of C/C++ file is opened, check for Makefile and:
" - if file is present, bind F5 to make
" - if file is absent, bind F5 to "make without Makefile"
" In any case, if compilation wasn't successful, error list will be displayed
function! BindF5_C()
"http://habrahabr.ru/blogs/vim/40369/
if filereadable("Makefile")
set makeprg=make
map <f5> :w<cr>:make<cr>:cw<cr>
imap <f5> <esc>:w<cr>:make<cr>:cw<cr>
else
map <f5> :w<cr>:make %:r<cr>:cw<cr>
imap <f5> <esc>:w<cr>:make %:r<cr>:cw<cr>
endif
endfunction
au FileType c,cc,cpp,h,hpp,s call BindF5_C()

function! BindF9_C()
"http://habrahabr.ru/blogs/vim/40369/
if filereadable("Makefile")
set makeprg=make
map <f9> :w<cr>:make<cr>:cw<cr>:!./%<<cr>
imap <f9> <esc>:w<cr>:make<cr>:cw<cr>:!./%<<cr>
else
map <f9> :w<cr>:make %:r<cr>:cw<cr>:!./%<<cr>
imap <f9> <esc>:w<cr>:make %:r<cr>:cw<cr>:!./%<<cr>
endif
endfunction
au FileType c,cc,cpp,h,hpp,s call BindF9_C()

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

Итак, мы пишем две функции, каждая из которых биндит определённое действие на определённую клавишу. В моём случае на F5 я решил повесить сборку проекта, а на F9 — его запуск, причём во втором случае если бинарника ещё нет, то он будет собран как если бы была нажата первая клавиша. Отдельным преимуществом этих биндов является тот факт, что они сначала ищут Makefile и, если он есть, собирают с его помощью; в противном случае используется дефолтный компилятор и собирается текущий файл.

Рассмотрим первую функцию. В ней происходит проверка, доступен ли Makefile на чтение. Если он читабелен, мы используем make и собираем проект (:make), после чего показываем возникшие ошибки (или не показываем ничего, если проект успешно скомпилился). Заметим, что бинды выполняются для командного режима (map) и режима вставки (imap).

Теперь второй случай, т.е. когда Makefile отсутствует или недоступен для чтения. В этом случае мы собираем текущий файл, для чего явно передаём его имя программе make. После этого, опять-таки, показываются ошибки.

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

В обоих функциях перед сборкой выполняется сохранение текущего файла.

Наконец, после каждой функции есть строка, указывающая, для каких файлов следует выполнять функции. Т.к. мои бинды написаны для C/C++, они применяются при открытии файлов с расширениями c, cc, cpp, h и hpp. Таким образом, вы можете написать произвольное количество функций для разных языков и подгружать их по мере надобности. Можно, например, написать отдельные привязки для HTML, которые будут открывать файл в разных браузерах, а в случае с LaTeX-файлами — собирать dvi и pdf. В общем, простор для фантазии неограничен — дерзайте ;)

Happy vimming!


Тэги: cpp vim
+ 5 -
Похожие Поделиться

dfx 19.06.2010 00:31 #
эм... а просто сделать
:g++ -o program code.c
:./program
из вима не судьба была?...
Minoru 19.06.2010 00:33 #
Делал и так. Все равно лень. Даже если юзать историю, а не всё руками набирать, последовательность вроде :<вероятно, ещё несколько раз Up> все равно длиннее, чем просто нажать F5.
Minoru 19.06.2010 00:35 #
Упс, покорёжило то, что было в угловызх скобках. Должно быть так:
<Esc><Up><вероятно, ещё несколько раз Up><Enter>
dfx 19.06.2010 00:32 #
и cut добавь
Minoru 19.06.2010 00:39 #
Кат был — видать, при предпросмотре унесло.

Добавил коммент в #140
Minoru 19.06.2010 00:40 #
Открываю пост для редактирования — кат уже есть. Публикую — работает. Я же вроде достаточно спал сегодня, откуда такие глюки?
xT 19.06.2010 12:41 #
Этот глюк был я ))))
razum2um 19.06.2010 01:08 #
а еще можно открыть две сессии в скрине.
сохранился в первой, во второй поискал в истории компиляция && запуск ;)
dfx 19.06.2010 01:11 #
Мусье знает толк в извращениях! :)
thebeetlebum 19.06.2010 12:08 #
Дык основная идея в том, чтобы не выходить из окна vim'a вовсе.
Только я бы повесил сочетания на Ctrl+b (Build) и Ctrl+R (Run). Vim специально написан так, чтобы руками меньше приходилось тянуться)
Minoru 19.06.2010 14:53 #
В последнее время работаю в основном на нетбуке — тут можно одновременно большим пальцем руки касаться левого контрола, а мизинцем той же руки — Delete или Backspace. Тут нет такого понятия как «тянуться к клавишам» :D

А ежели серьёзно — наверное, привык за время использования Borland'овских продуктов именно к таким хоткеям, вот и биндил на них. И настоящим vim-way был бы бинд сборки на b, а запуска — на r (в командном режиме). А сочетаниями с контролом и прочими модкеями пусть емаксеры промышляют :P
Minoru 19.06.2010 14:54 #
Скрин мне нравится, но с ним одна проблема — я его забываю запускать :)
stasikos 19.06.2010 12:23 #
Автор, поправь в комментариях apsent на absent
Minoru 19.06.2010 14:47 #
Спасибо, исправил.
liksys 19.06.2010 14:08 #
Про Makefile никто почему-то не вспоминает.
:make
Minoru 19.06.2010 14:49 #
А статью почитать лень было? Описанные бинды юзают Makefile, если он есть, иначе компилится текущий файл. Я не вижу смысла писать Makefile для лабораторки, состоящей из одного-единственного файла.
liksys 19.06.2010 15:50 #
Возьмите за привычку писать Makefile вообще для всего. Потому что если что-то компилируется, скажем, с определенным набором флагов, то через месяц вы их вообще не вспомните.
Minoru 19.06.2010 18:46 #
Если мне понадобится указать для какого-то проекта какие-то особые флаги — да, напишу Makefile. Для лабораторки же, состоящей из одного файла и не содержащей никаких особых хитростей, это не нужно.
liksys 19.06.2010 19:12 #
Ну, скажем прямо, это не ненужно, а просто лень. После выпуска из университетов бывшие студенты, которые ленились что-то документировать, давать нормальные имена переменным и разрабатывать оптимальные алгоритмы, начинают писать софт. Так появилась замечательная система ЕГАИС, потому в такой глобокой жо* находится почти все отечественное софтостроение.
Приучайтесь к порядку, это очень вам поможет в работе.
Minoru 20.06.2010 00:31 #
Мне не лень написать Makefile, просто в случае с лабораторками он не нужен, потому что программы состоят из одного файла и компилятся без использования каких-либо особых флагов.
liksys 20.06.2010 00:55 #
То есть, написать gcc -lm main.c foo быстрее, чем make?
Minoru 20.06.2010 09:37 #
Повторяю ещё раз: программы не используют никаких особых флагов и состоят из одного файла. В таком случае мне достаточно нажать в vim'е описанные комбинации, а в терминале — пролистать историю и найти gcc -o program code.c
И да, получится быстрее (по крайней мере, в первом случае), чем make
liksys 20.06.2010 13:43 #
Быстрее, да, конечно.