Сейчас 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, попробуйте что-нибудь новое.