Как мне запустить программу на C из VIM? - PullRequest
37 голосов
/ 13 апреля 2010

Есть ли способ скомпилировать и запустить программу на C из VIM без ввода имени файла?

Ответы [ 10 ]

98 голосов
/ 13 апреля 2010

:!gcc -o somename % && ./somename
При использовании :!,% будет заменено именем текущего открытого файла.

Когда ваш проект становится больше, вы также можете написать make-файл и скомпилировать текущий проект с помощью :make, если есть какие-либо ошибки, vim автоматически перейдет к ним.

40 голосов
/ 16 апреля 2010

Используйте следующий код сопоставления в файле .vimrc для компиляции и запуска файла программирования c.

 map <F8> : !gcc % && ./a.out <CR>

Клавиша F8 предназначена для запуска отображения. % должен взять текущее имя файла.

Или, если вы хотите сохранить текущий файл перед его компиляцией, используйте

map <F8> :w <CR> :!gcc % && ./a.out <CR>

Или, в идеале, если вы хотите использовать базовое имя файла, а не имя по умолчанию «a.out», в качестве имени исполняемого файла, используйте следующее:

map <F8> :w <CR> :!gcc % -o %< && ./%< <CR>

В приведенной выше команде «<» после «%» удаляет расширение и точку (foo.c => foo), поэтому «% <» является базовым именем файла. </p>

Вы можете найти эту и аналогичную информацию в cmdline.txt. Команда в vim: help: cmdline.txt. Вы также можете найти конкретные сведения об использовании «%», используя :help filename-modifiers в vim.

6 голосов
/ 29 февраля 2016

TL; DR Не требуется Makefile, настройка &makeprg также совершенно бесполезна, и все же :make %< достаточно для компиляции из Vim.

Длинный ответ:

Я дублирую ответ, который дал в закрытом «дублирующем вопросе».

Учитывая, что мы используем vim, а не vi, :make - это путь.

В Linux-подобных (это также относится к cygwin, но не к mingw на windows - в случае mingw, посмотрите другие ответы, которые меняют &makeprg, оставьте его в покое в противном случае), в которых установлен gnumake, если вы не используете В вашем проекте нет Makefile, и если ваш проект состоит только из одного файла, просто наберите :make %<. Этого будет достаточно (вы можете играть с $CXXFLAGS, $CFLAGS и $LDFLAGS, чтобы настроить параметры компиляции). Затем, чтобы запустить программу, введите :!./%< или, с более поздними версиями vim, запустите :terminal ./%<.

Если ваш проект состоит из нескольких файлов, вам понадобится Makefile, чтобы воспользоваться :make.

Если вы управляете своим проектом с помощью CMake и если вы компилируете свой проект в каталоге (или нескольких -> debug, release, ...) вне дерева исходных текстов, то для интеграции потребуется плагин. AFAIK, я единственный, кто предлагает такой плагин: BuildToolsWrapper интегрирует управление CMake (выбор каталога сборки, возможность выбора между отладкой, выпуском или любым другим каталогом сборки). Он должен быть связан с одним из плагинов local_vimrc .

Во всех случаях, вызывая компилятор напрямую из (или снаружи) Vim с помощью :!g++ -o %< % или чего-то еще, что мы делали 15 лет назад на vi. У Vim есть замечательная особенность: он может интегрировать (да, как в IDE) компилятор. Смотри :h quickfix. Навигация между ошибками непосредственно из редактора намного проще, чем извлечение одной строки ошибки нашими глазами, ввод номера строки обратно в редактор, возврат к оболочке, чтобы увидеть, что именно было отклонено, ... Этого может быть достаточно в C, но в C ++, когда мы «пытаемся вызвать перегрузку, которая не существует», мы не можем работать таким образом (переключаясь между редактором и оболочкой).

Наконец, если вы хотите скомпилировать эти монофайловые проекты одним нажатием клавиши, вы можете добавить в .vimrc:

nnoremap <silent> <f7> :make %<<cr>

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

Последнее примечание: &makeprg лучше оставить в покое, по крайней мере, не устанавливайте g ++ / gcc / clang / clang ++ / gfortran / ... Потому что каждый раз, когда вы меняете свой язык, вам придется его менять (если только Вы используете :setlocal). С решением, которое я рекомендую, если я хочу использовать clang ++ вместо g ++, все, что мне нужно сделать, это установить: :let $CXX='clang++' (или $CC в C), а затем вызвать :make %<. Я даже могу определить :let $CXXFLAGS='-std=c++11' для компиляции в C ++ 11 - эта же переменная будет использоваться для включения предупреждений, использования дезинфицирующего средства и т. Д.

6 голосов
/ 18 марта 2012

, так как большую часть времени вы будете использовать Makefile, в дополнение к данным ответам, я также хотел бы видеть свои результаты на "очищенном" экране:

map <F10> :w<CR> :!clear; make<CR> :!./%<<CR>

  • :w<CR> сохраняет файл

  • :!clear; make<CR> очищает экран и запускает make

  • :!./%<<CR>запускает программу (%) без расширения (<)

4 голосов
/ 30 апреля 2018

Сейчас 2018 год, vim 8 выпускается в течение 2 лет и поставляется со всеми дистрибутивами Linux и Mac OS X. Но многие руководства vim все еще учат людей чему-то десять лет назад.

Вы можете скомпилировать ваши программы на C ++ / Java в vim для удобства, например, Sublime Text или NotePad ++ с некоторыми выделенными плагинами для Vim 8 или NeoVim.

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

Как и при компиляции программ в IDE, ошибки компиляции будут сопоставляться по формату ошибок, выделяться и становиться доступными для выбора. Вы можете перемещаться по ошибкам в окне быстрого исправления или продолжить редактирование во время компиляции.

Быстрая настройка

Скопируйте и вставьте строки ниже в ваш vimrc:

Plug 'skywind3000/asyncrun.vim'

" open quickfix window automatically when AsyncRun is executed
" set the quickfix window 6 lines height.
let g:asyncrun_open = 6

" ring the bell to notify you job finished
let g:asyncrun_bell = 1

" F10 to toggle quickfix window
nnoremap <F10> :call asyncrun#quickfix_toggle(6)<cr>

Когда вы вводите «: AsyncRun echo hello» в командной строке:

см. Здесь захват

Вы увидите вывод команды реального времени в открытом окне быстрого исправления.

Скомпилируйте и запустите один файл

Компиляция одного файла с помощью AsyncRun намного проще, чем система сборки Sublime Text. Мы можем настроить F9 для этого:

noremap <silent> <F9> :AsyncRun gcc -Wall -O2 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>

Макросы в форме $(..) будут развернуты как настоящее имя файла или каталога, а затем у нас будет F5 для запуска исполняемого файла:

noremap <silent> <F5> :AsyncRun -raw -cwd=$(VIM_FILEDIR) "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>

Двойная кавычка используется для обработки имен путей, содержащих пробелы. Опция -cwd=$(VIM_FILEDIR) означает запуск файла в каталоге файла. Абсолютный путь $(VIM_FILEDIR)/$(VIM_FILENOEXT) используется потому, что linux нужен префикс ./ для запуска исполняемых файлов в текущем каталоге, а Windows - нет. Использование абсолютного пути к двоичному файлу может решить проблему с кросс-платформой.

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

Сборка проектов C / C ++

Независимо от того, какой инструмент сборки вы используете, make или cmake, сборка проекта означает работу с группой файлов. Требуется найти корневой каталог проекта. AsyncRun использует простой метод, называемый корневыми маркерами, для определения корня проекта. Корень проекта определяется как каталог ближайшего предка текущего файла, который содержит один из следующих каталогов или файлов:

let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs'] 

Если ни один из родительских каталогов не содержит этих корневых маркеров, каталог текущего файла используется в качестве корневого каталога проекта. Это позволяет нам использовать <root> или $(VIM_ROOT) для представления корня проекта. и F7 можно настроить для построения текущего проекта:

noremap <silent> <F7> :AsyncRun -cwd=<root> make <cr>

Что если ваш текущий проект отсутствует в каком-либо git или subversion хранилище? Как узнать, где находится мой проект? Решение очень простое, просто поместите пустой файл .root в корень вашего проекта, он будет легко расположен.

Давайте продолжим, настройте F8 для запуска текущего проекта:

noremap <silent> <F8> :AsyncRun -cwd=<root> -raw make run <cr>

Проект будет работать в своем корневом каталоге. Конечно, вам нужно определить правило запуска в вашем собственном make-файле. затем переназначить F6 для проверки:

noremap <silent> <F6> :AsyncRun -cwd=<root> -raw make test <cr>

Если вы используете cmake, F4 может быть картой для обновления вашего Makefile:

nnoremap <silent> <F4> :AsyncRun -cwd=<root> cmake . <cr>

Из-за реализации среды выполнения c, если процесс выполняется не в tty-среде, все данные в stdout будут буферизироваться до завершения процесса. Итак, после вашего оператора printf должен быть fflush(stdout), если вы хотите видеть вывод в реальном времени. или вы можете закрыть буфер stdout в начале с помощью

setbuf(stdout, NULL);

В то же время, если вы пишете код на C ++, std :: endl может быть добавлен в конец std :: cout. Это может принудительно очистить буфер stdout. Если вы разрабатываете в Windows, AsyncRun может открыть новое окно cmd для дочернего процесса:

nnoremap <silent> <F5> :AsyncRun -cwd=$(VIM_FILEDIR) -mode=4 "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>
nnoremap <silent> <F8> :AsyncRun -cwd=<root> -mode=4 make run <cr>

UsПри выборе опции -mode=4 в Windows откроется новое окно с приглашением для запуска команды, аналогично запуску программ командной строки в Visual Studio. Наконец, у нас есть следующие сопоставления клавиш:

  • F4: обновить Makefile с помощью cmake.
  • F5: запустить один файл
  • F6: запустить тест проекта
  • F7: сборка проекта
  • F8: запустить проект
  • F9: скомпилировать отдельный файл
  • F10: переключить окно быстрого исправления

Это больше похоже на систему сборки в NotePad ++ и GEdit. Если вы интенсивно используете cmake, вы можете написать простой сценарий оболочки, расположенный в ~/.vim/script/build.sh, для объединения F4 и F7: он обновит Makefile, если CMakeList.txt был изменен, а затем выполнит make.

Расширенное использование

Вы также можете определить сценарии оболочки в вашем репозитории dotfiles и выполнить сценарий с помощью F3:

nnoremap <F3> :AsyncRun -cwd=<root> sh /path/to/your/dotfiles/script/build_advanced.sh <cr>

Следующие переменные окружения оболочки определены AsyncRun:

$VIM_FILEPATH  - File name of current buffer with full path
$VIM_FILENAME  - File name of current buffer without path
$VIM_FILEDIR   - Full path of current buffer without the file name
$VIM_FILEEXT   - File extension of current buffer
$VIM_FILENOEXT - File name of current buffer without path and extension
$VIM_CWD       - Current directory
$VIM_RELDIR    - File path relativize to current directory
$VIM_RELNAME   - File name relativize to current directory 
$VIM_ROOT      - Project root directory
$VIM_CWORD     - Current word under cursor
$VIM_CFILE     - Current filename under cursor
$VIM_GUI       - Is running under gui ?
$VIM_VERSION   - Value of v:version
$VIM_COLUMNS   - How many columns in vim's screen
$VIM_LINES     - How many lines in vim's screen
$VIM_SVRNAME   - Value of v:servername for +clientserver usage

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

Grep символы

Иногда, если в вашем удаленном linux-окружении нет хорошо настроенной среды, grep - самый дешевый способ поиска определения символов и ссылок между источниками. Теперь у нас будет F2 для поиска по ключевому слову под курсором:

if has('win32') || has('win64')
    noremap <F2> :AsyncRun! -cwd=<root> grep -n -s -R <C-R><C-W> --include='*.h' --include='*.c*' '<root>' <cr>
else
    noremap <F2> :AsyncRun! -cwd=<root> findstr /n /s /C:"<C-R><C-W>" "\%CD\%\*.h" "\%CD\%\*.c*" <cr>
endif

Приведенный выше скрипт запускает grep или findstr в корневом каталоге вашего проекта и находит символы только в файлах .c, .cpp и .h. Теперь мы перемещаем курсор и нажимаем F2, ссылки на символы в текущем проекте будут немедленно отображены в окне быстрого исправления.

Этой простой раскладки клавиатуры достаточно для большей части времени. И вы можете улучшить этот скрипт для поддержки большего количества типов файлов или других инструментов grep в вашем vimrc.

Это практический способ создания / запуска проектов на C / C ++ в Vim 8 или NeoVim. Так же, как система сборки Sublime Text и NotePad ++ NppExec.

Больше никаких устаревших уроков vim, попробуйте что-нибудь новое.

4 голосов
/ 12 мая 2015

Добавьте эту строку в ваш vimrc файл

nnoremap <silent> <F8> :!clear;gcc % -o % && ./%<CR>

Теперь вам нужно всего лишь нажать клавишу f8, чтобы скомпилировать и запустить вашу программу c.

2 голосов
/ 17 марта 2014

Просто подумал, что я добавлю это к этим ответам здесь. Как уже упоминалось, вы можете использовать команду :make в vim. Что еще не было упомянуто, так это то, что :make может вызывать другие программы, кроме make.

:set makeprg=gcc\ %

приведет к выполнению :make gcc с заменой символа % на имя текущего файла.

Затем вы можете получить фантазию и сделать

:set makeprg=gcc\ %\ &&\ ./a.out

и простой ввод :make скомпилирует и выполнит вашу программу. Конечно, вы можете сделать это и для других языков.

:set makeprg=cabal\ repl
:set makeprg=python\ %
1 голос
/ 24 августа 2014

После некоторых исследований (включая эту страницу) я решил добавить этот ярлык:

map <F9> :w<CR> :!gcc % -o %<.x -Wall -Wextra 2>errors.err; cat errors.err<CR>

Вы также можете включить -ansi -pedantic-errors, если хотите.

Файл errors.err поможет вам с быстрым исправлением vi.

0 голосов
/ 05 января 2018

Возможно, стоит добавить, что плагин SingleCompile предлагает эту возможность для C и других языков, как указано автором:

SingleCompile - это плагин Vim, призванный сделать его более удобным для скомпилируйте или запустите один исходный файл, не выходя из Vim. Учти это ситуация: вы только что написали небольшой исходный файл C для крошечного проверить, но вы должны написать Makefile для его компиляции или выйти из Vim скомпилируйте или скомпилируйте, используя "! gcc" без функции быстрого исправления потому что команда make Vim использует только команду "make"? Этот плагин поможет вам.

Предлагаемые сопоставления для F9 и F10 :

nmap <F9> :SCCompile<cr>
nmap <F10> :SCCompileRun<cr>
0 голосов
/ 29 ноября 2014

Добавьте эти три строки в ваш .vimrc файл

au FileType c set makeprg=gcc\ % 

au FileType cpp set makeprg=g++\ %

map <F7>:make && ./a.out<CR>

Вы можете скомпилировать и запустить свою программу, нажав кнопку F7 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...