Ⅰ. 插件描述
A vim plugin designed for OIersⅡ. 基本信息
|
Ⅲ. 安装方法
使用Vundle管理器安装
在你的.vimrc下添加:Plugin '91khr/vimoi'
… 然后在Vim中运行以下命令:
:source %
:PluginInstall
对于Vundle版本 < 0.10.2,请用上面的Bundle替换Plugin。
使用NeoBundle管理器安装
在你的.vimrc下添加:NeoBundle '91khr/vimoi'
… 然后在Vim中运行以下命令:
:source %
:NeoBundleInstall
使用VimPlug管理器安装
在你的.vimrc下添加:Plug '91khr/vimoi'
… 然后在Vim中运行以下命令:
:source %
:PlugInstall
使用Pathogen管理器安装
在终端中运行以下命令:cd ~/.vim/bundle
git clone https://github.com/91khr/vimoi
Ⅳ. 文档说明
# VimOI
一个轻量级的编译-调试插件, 为OIer而生.
Install
安装VimOI及其所有依赖, 如果你使用vim-plug,
可以这么做:
Plug 'skywind3000/AsyncRun'
Plug '91khr/VimOI'Features
- 快速编译当前文件, 生成可执行文件;
灵活的重定向:
- 重定向到文件;
- 从文件中重定向;
- 重定向到VIm中的缓冲区;
- 从缓冲区中重定向;
不仅可以重定向输入/输出, 还可以重定向Log;
方便地测试程序:
- 用多组数据/答案文件测试, 记录所有测试结果;
- 从程序/脚本中获取数据和答案, 测试直到出现错误;
支持测试结果的重定向;
Commands
这些命令中以Cpp开头的只用于C++源文件.
以OI开头的可以在加载插件后的任何地方使用.
CppCompile命令
编译一个C++源文件并生成可执行文件, 不会删除任何中间文件.
如果没有给出任何参数, 编译当前文件.
如果给出了多于一个参数, 第一个参数会被当作文件名,
剩余的参数将会被作为编译的参数传递给编译器.
使用VimOI#CppCompile函数实现.
Example:
CppCompile % -Wall -Wextra将会调用:
VimOI#CppCompile('%', '-Wall', '-Wextra')OIRedirect命令
运行给定程序, 并执行重定向.
使用VimOI#OIRedirect函数实现,
关于此命令的详细信息, 请查看函数文档.
Example:
OIRedirect这将运行当前文件对应的可执行文件, 并打开一个vim终端窗口接受输入和输出.
OIStop命令
调用VimOI#OIStop函数, 停止当前正在重定向的进程.
由于当前版本不支持同时运行两个可执行文件, 所以在运行出错时也必须调用这个命令再重新运行.
Functions
VimOI#CppCompile函数
编译一个C++源文件并生成可执行文件, 不会删除任何中间文件.
编译步骤如下:
- 如果提供了参数, 第一个参数将被作为要编译的源文件名对待, 否则, 编译当前文件.
如果g:VimOI_PassFilename为0, 文件名将不会传递给编译器. - 在同一条命令中运行正式编译前要执行的命令和编译器,
中间以' && '分隔.
Example:
call VimOI#CppCompile('%', '-Wall', '-Wextra')VimOI#OIRedirect函数
运行一个可执行文件, 并将其结果重定向到给定的位置.
第一个参数是可执行文件的名称.
如果没有给出, 为空, 以空格开头或为'!', 则采用上次运行时的可执行文件名称,
如果是第一次运行或为%,
则根据g:VimOI_CompileSys生成可执行文件名称:
- 对于
mscl: 将当前缓冲区中文件的后缀替换成.exe, 作为可执行文件名称; - 对于
g++和clang: 将./a.out作为可执行文件名称.
接下来的三个参数分别是将要重定向的stdin, stdout和stderr,
以字符串表示, 按照如下规则解释:
- 如果为空, 未给出或为
'!', 将使用上一次重定向的参数
如果是第一次运行, 则不重定向这个流; - 如果为
'-', 将不重定向这个流; 如果以
$开头, 则解释为特殊的重定向:$bufn: 重定向至缓冲区n, 其中n是缓冲区id,
如果n未指定, 重定向的目标取决于g:VimOI_ReuseRedirBuf选项;
如果
n为-1, 则在创建新缓冲区, 并重定向到此处.$echo(未实现): 在Vim中输出, 如果被应用在stdin上, 将产生一个错误;$null: 抛弃重定向后的结果, 如果被应用在stdin上, 读入将为空;- 否则, 将不运行程序, 并报告一个错误;
- 否则, 将这一参数作为将重定向的文件名.
如果至少有一个流没有被重定向, 则打开一个vim终端运行程序, 并将没有被重定向的流重定向到此处.
如果g:VimOI_HoldRedirTab选项为1, 则会在新标签页中创建新缓冲区或终端.
注意: 作为stdout或stderr重定向目标的文件或缓冲区中原有的内容将被清空,
所以如果自己选择缓冲区, 请小心选择一个无用的缓冲区.
注意: Windows下无法重定向到文件, 原因见这个issue.
如果设置了自动编译, 将会在出现编译错误时显示QuickFix窗口,
显示的方式由g:VimOI_CopenOptions选项指定.
编译的时间可能有点长, 如果你使用的是vim-airline,
可以参照这里,
在状态栏上显示编译进程.
如果运行过程中出现错误(如文件没有权限等), 结果是未定义的.
但是可以保证没有提及的文件和缓冲区不会被修改.
如果运行的时间超过了限制, VimOI会强行停止这个程序.
VimOI#OIStop函数
强行停止当前由OIRedirect函数运行的可执行文件.
Options
g:VimOI_CompileSys
指定VimOI使用的编译系统.
这一变量的值将会影响所有编译设置.
可用的值有:mscl, g++和clang.
在Windows上默认为mscl, 否则默认为g++.
g:VimOI_CompileProg
指定VimOI使用的编译器.
默认值根据g:VimOI_CompileSys选项的值指定.
对于不同的编译系统:
mscl:cl;g++:g++;clang:clang++.
g:VimOI_PrecompileCmd
指定将在编译之前运行的程序.
除非有特别需要, 否则不建议更改它的值, 因为这可能导致编译出现错误.
g:VimOI_CompileArgs
指定除源文件名外将传递给编译器的额外参数.
默认值根据g:VimOI_CompSys选项的值指定.
对于不同的编译系统:
mscl:['/Od', '/nologo'];g++:['-g', '-O0'];clang:['-g', '-O0'].
g:VimOI_ReuseRedirBuf
指定VimOI如果没有在重定向时指定缓冲区, 是否重用上一次重定向的缓冲区.
如果为0, 则使用当前缓冲区, 但仍然会记录重定向的缓冲区.
上一次重定向的缓冲区存储在g:VimOI_StdinBuf, g:VimOI_StdoutBuf
和g:VimOI_StderrBuf三个选项中.
只在执行重定向时被访问.
默认值: 1
g:VimOI_ReuseRedirTab
指定VimOI在重定向时是否应该在现有的标签页中为新的缓冲区和终端创建分割.
默认值: 0
g:VimOI_HoldRedirTab
指定VimOI是否应该为重定向的缓冲区和终端创建新的标签页.
每次重定向最多创建一个标签页.
默认值: 1
g:VimOI_TimeLimit
指定每个测试程序运行的时间限制, 单位为毫秒.
如果测试程序打开了终端, 此限制无效.
默认值: 1000
g:VimOI_AutoCompile
指定VimOI是否要在运行程序之前自动保存和编译.
如果当前文件的修改时间大于要运行的程序的修改时间, 则VimOI将会自动编译.
默认值: 0
g:VimOI_PassFilename
指定VimOI是否要在编译时将文件名传递给编译器.
默认值: 1
g:VimOI_CopenOptions
指定VimOI在自动编译时如何打开QuickFix窗口.(手动编译时不会自动打开QuickFix窗口)
当前版本实现方式为execute g:VimOI_CopenOptions . "copen",
所以如果不想自动打开QuickFix窗口, 将它设置为'"'.
默认值: ""
Tips
TODO
- 实现VimOI#OIRedirect函数的
$echo特殊重定向; - 测试打开重定向buffer的功能;
- 优化代码风格.