基本上我想要的是vim中的键盘快捷键,它允许我[编译]运行当前正在编辑的C,C++或Python程序.在伪代码中:
when a shortcut key is pressed:
if current_extension == 'c' then
shell: gcc this_filename.c -o this_filename_without_extension
if retcode == 0 then shell: ./this_filename_without_extension
else if current_extension == 'cpp' then
shell: g++ this_filename.cpp -o this_filename_without_extension
if retcode == 0 then shell: ./this_filename_without_extension
else if current_extension == 'py' then
shell: python this_filename.py
end if
end key
Run Code Online (Sandbox Code Playgroud)
我意识到我可能会问一点但是如果可能的话就会喜欢它!
FDi*_*off 29
像这样的东西会起作用.只需创建maptype autocmd即映射<F4>或您想要保存的任何内容,然后编译并运行该程序.它使用exec构建字符串并使用shellescape来转义文件名.
autocmd filetype python nnoremap <F4> :w <bar> exec '!python '.shellescape('%')<CR>
autocmd filetype c nnoremap <F4> :w <bar> exec '!gcc '.shellescape('%').' -o '.shellescape('%:r').' && ./'.shellescape('%:r')<CR>
autocmd filetype cpp nnoremap <F4> :w <bar> exec '!g++ '.shellescape('%').' -o '.shellescape('%:r').' && ./'.shellescape('%:r')<CR>
Run Code Online (Sandbox Code Playgroud)
%是当前的缓冲区文件名.%:r是没有扩展名的缓冲区文件名
http://singlecompile.topbug.net似乎比你想要的更多.对于更简单的解决方案,您还可以将以下内容添加到vimrc中
au BufEnter *.cpp set makeprg=g++\ -g\ %\ -o\ %<
au BufEnter *.c set makeprg=gcc\ -g\ %\ -o\ %<
au BufEnter *.py set makeprg=python\ %
au BufEnter *.[rR] set makeprg=Rscript\ %
map <F5> :call CompileGcc()<CR>
func! CompileGcc()
exec "w"
silent make
endfunc
Run Code Online (Sandbox Code Playgroud)
HTH
现在是 2018 年,vim 8 已经发布了 2 年,并随所有平均流 Linux 发行版和 Mac OS X 一起提供。但是很多 vim 教程仍然在十年前教人们一些东西。
你可以在 vim 中编译你的 C++/Java 程序,就像 Sublime Text 或 NotePad++ 一样方便,使用 Vim 8 或 NeoVim 的一些专用插件。
例如,AsyncRun插件将允许您在后台运行 shell 命令并实时从 quickfix 窗口读取输出。 请参阅屏幕截图。
就像在 IDE 中编译程序一样,编译错误将通过 errorformat 进行匹配并突出显示并变为可选。您可以在 quickfix 窗口中导航错误或在编译时继续编辑。
快速设置
将以下行复制并粘贴到您的 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>
Run Code Online (Sandbox Code Playgroud)
当你在命令行中输入“:AsyncRun echo hello”时:
您将在打开的 quickfix 窗口中看到实时命令输出。
编译并运行单个文件
使用 AsyncRun 编译单个文件比 Sublime Text 的构建系统简单得多。我们可以为此设置 F9:
noremap <silent> <F9> :AsyncRun gcc -Wall -O2 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>
Run Code Online (Sandbox Code Playgroud)
$(..)form 中的宏会被扩展为真实的文件名或目录,然后我们将有 F5 来运行可执行文件:
noremap <silent> <F5> :AsyncRun -raw -cwd=$(VIM_FILEDIR) "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>
Run Code Online (Sandbox Code Playgroud)
双引号用于处理包含空格的路径名。该选项-cwd=$(VIM_FILEDIR)表示在文件目录中运行文件。使用绝对路径名$(VIM_FILEDIR)/$(VIM_FILENOEXT)是因为 linux 需要一个./前缀才能在当前目录中运行可执行文件,但 windows 不需要。使用二进制文件的绝对路径名可以处理这个跨平台问题。
另一个选项-raw意味着输出将不会与 vim 的错误格式匹配,并将在 quickfix 中显示为原样。现在你可以用 F9 编译你的文件,检查 quickfix 窗口中的编译错误,然后按 F5 运行二进制文件。
构建 C/C++ 项目
无论您使用什么构建工具,make 还是 cmake,项目构建都意味着对一组文件进行操作。它需要找到项目根目录。AsyncRun 使用一种称为根标记的简单方法来标识项目根。项目根目录被标识为当前文件的最近祖先目录,其中包含以下目录或文件之一:
let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs']
Run Code Online (Sandbox Code Playgroud)
如果没有父目录包含这些根标记,则将当前文件的目录用作项目根。这使我们能够使用<root>或$(VIM_ROOT)代表项目根。可以设置 F7 来构建当前项目:
noremap <silent> <F7> :AsyncRun -cwd=<root> make <cr>
Run Code Online (Sandbox Code Playgroud)
如果您当前的项目不在任何 git 或 subversion 存储库中怎么办?如何找出我的项目根在哪里?解决方法很简单,只要在你的项目根目录下放一个空的 .root 文件,就很容易找到了。
让我们继续,设置 F8 来运行当前项目:
noremap <silent> <F8> :AsyncRun -cwd=<root> -raw make run <cr>
Run Code Online (Sandbox Code Playgroud)
该项目将在其根目录中运行。当然,您需要在自己的 makefile 中定义运行规则。然后重新映射 F6 进行测试:
noremap <silent> <F6> :AsyncRun -cwd=<root> -raw make test <cr>
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 cmake,可以映射 F4 来更新您的 Makefile:
nnoremap <silent> <F4> :AsyncRun -cwd=<root> cmake . <cr>
Run Code Online (Sandbox Code Playgroud)
由于c runtime的实现,如果进程运行的是非tty环境,stdout中的所有数据都会被缓存,直到进程退出。因此,如果您想查看实时输出,则必须有一个fflush(stdout)afterprintf语句。或者您可以在开始时关闭标准输出缓冲区
setbuf(stdout, NULL);
Run Code Online (Sandbox Code Playgroud)
同时,如果您正在编写 C++ 代码,则可以将 std::endl 附加到 std::cout 的末尾。它可以强制刷新标准输出缓冲区。如果你是在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>
Run Code Online (Sandbox Code Playgroud)
-mode=4在 windows 上使用该选项将打开一个新的提示窗口来运行命令,就像在 Visual Studio 中运行命令行程序一样。最后,我们在下面有这些键映射:
它更像是 NotePad++ 和 GEdit 中的构建系统。如果你大量使用 cmake,你可以写一个简单的 shell 脚本~/.vim/script/build.sh将 F4 和 F7 组合在一起:如果 CMakeList.txt 已经改变,它会更新 Makefile,然后执行 make。
高级用法
您还可以在 dotfiles 存储库中定义 shell 脚本并使用 F3 执行脚本:
nnoremap <F3> :AsyncRun -cwd=<root> sh /path/to/your/dotfiles/script/build_advanced.sh <cr>
Run Code Online (Sandbox Code Playgroud)
以下 shell 环境变量由 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
Run Code Online (Sandbox Code Playgroud)
以上所有环境变量都可以在你的build_advanced.sh. 使用外部 shell 脚本文件可以完成比单个命令更复杂的工作。
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
Run Code Online (Sandbox Code Playgroud)
上面的脚本将在您的项目根目录中运行 grep 或 findstr,并仅在.c,.cpp和.h文件中查找符号。现在我们移动光标并按F2,当前项目中的符号引用将立即显示在quickfix窗口中。
大多数情况下,这个简单的键盘映射已经足够了。您可以改进此脚本以在 vimrc 中支持更多文件类型或其他 grep 工具。
这是在 Vim 8 或 NeoVim 中构建/运行 C/C++ 项目的实用方法。就像 Sublime Text 的构建系统和 NotePad++ 的 NppExec。
不再有过时的 vim 教程,尝试新的东西。