引用来自:
http://blog.chinaunix.net/uid-21202106-id-2406761.html;
事先声明,我使用的VIM完全是基于终端的,而不是gvim或vim-x11。因为后两者不具有平台移植性,花哨的目录和鼠标点击并非必须。
在vim中编程,退出来再敲命令编译是一件痛苦的事情。如果能够像VC那样一键编译和一键运行就爽了。
事实上,在vim中实现这种功能并不困难,所需要的只是在配置文件~/.vimrc中加一些过程,然后将这些过程与某些快捷键进行绑定即可。
第一步,写编译函数。
事实上,vim的配置脚本完全可以称得上一门语言,因此定制一些功能是完全没问题的。
|
func! CompileGcc() exec "w" let compilecmd="!gcc " let compileflag="-o %< " if search("mpi\.h") != 0 let compilecmd = "!mpicc " endif if search("glut\.h") != 0 let compileflag .= " -lglut -lGLU -lGL " endif if search("cv\.h") != 0 let compileflag .= " -lcv -lhighgui -lcvaux " endif if search("omp\.h") != 0 let compileflag .= " -fopenmp " endif if search("math\.h") != 0 let compileflag .= " -lm " endif exec compilecmd." % ".compileflag endfunc func! CompileGpp() exec "w" let compilecmd="!g++ " let compileflag="-o %< " if search("mpi\.h") != 0 let compilecmd = "!mpic++ " endif if search("glut\.h") != 0 let compileflag .= " -lglut -lGLU -lGL " endif if search("cv\.h") != 0 let compileflag .= " -lcv -lhighgui -lcvaux " endif if search("omp\.h") != 0 let compileflag .= " -fopenmp " endif if search("math\.h") != 0 let compileflag .= " -lm " endif exec compilecmd." % ".compileflag endfunc
|
这样就定义两个函数,分别编译C和C++,其含义应该是比较明显的了。注意,这里用到的两个变量compilecmd和compileflag都是局部变量。search函数用来搜索字符串,我根据源码的头文件来判断编译所需要的库。连接两个字符串的运行符是一个句点。%为内部变量,表示文件名,而%<表示没有后缀的文件名。
上面的函数只是定义了C/C++语言的编译,如果需要编译其它语言,则也需要编写对应的函数。而把这些不同语言的函数组合到一起则还需要另外一个函数。
第二步,组合成一个函数
|
func! CompileCode() exec "w" if &filetype == "cpp" exec "call CompileGpp()" elseif &filetype == "c" exec "call CompileGcc()" endif endfunc
|
该函数根据文件类别来选定不同的编译函数。&filetype是一个内部变量,前缀&起标识内部变量的作用。
filetype不光是cpp和c,还可以是python,java等等。
第三步,键绑定
|
map <F5> :call CompileCode()<CR> imap <F5> <ESC>:call CompileCode()<CR> vmap <F5> <ESC>:call CompileCode()<CR>
|
这里绑定了三次,分别对应普通模式,插入模式和可视模式。显然起到的作用是从这些模式中退出来,而表示carriage return,即敲命令时的回车。
现在,大功告成了,你只需要按F5键,源码就会自动保存,然后进行编译。运行可执行文件做法也是一样的。
下面贴出我的完整的解决方案,除了C/C++,还涉及到java和python。并且按F6就能执行编译生成的可执行文件。
|
func! CompileGcc() exec "w" let compilecmd="!gcc " let compileflag="-o %< " if search("mpi\.h") != 0 let compilecmd = "!mpicc " endif if search("glut\.h") != 0 let compileflag .= " -lglut -lGLU -lGL " endif if search("cv\.h") != 0 let compileflag .= " -lcv -lhighgui -lcvaux " endif if search("omp\.h") != 0 let compileflag .= " -fopenmp " endif if search("math\.h") != 0 let compileflag .= " -lm " endif exec compilecmd." % ".compileflag endfunc func! CompileGpp() exec "w" let compilecmd="!g++ " let compileflag="-o %< " if search("mpi\.h") != 0 let compilecmd = "!mpic++ " endif if search("glut\.h") != 0 let compileflag .= " -lglut -lGLU -lGL " endif if search("cv\.h") != 0 let compileflag .= " -lcv -lhighgui -lcvaux " endif if search("omp\.h") != 0 let compileflag .= " -fopenmp " endif if search("math\.h") != 0 let compileflag .= " -lm " endif exec compilecmd." % ".compileflag endfunc
func! RunPython() exec "!python %" endfunc func! CompileJava() exec "!javac %" endfunc
func! CompileCode() exec "w" if &filetype == "cpp" exec "call CompileGpp()" elseif &filetype == "c" exec "call CompileGcc()" elseif &filetype == "python" exec "call RunPython()" elseif &filetype == "java" exec "call CompileJava()" endif endfunc
func! RunResult() exec "w" if search("mpi\.h") != 0 exec "!mpirun -np 4 ./%<" elseif &filetype == "cpp" exec "! ./%<" elseif &filetype == "c" exec "! ./%<" elseif &filetype == "python" exec "call RunPython" elseif &filetype == "java" exec "!java %<" endif endfunc
map <F5> :call CompileCode()<CR> imap <F5> <ESC>:call CompileCode()<CR> vmap <F5> <ESC>:call CompileCode()<CR>
map <F6> :call RunResult()<CR>
|
- Vim C/C++的一键编译
开始用Vim差不多有两个月的时间, 一开始用Makefile 编译一整个项目无压力, 但是当写到单个文件的时候, 编译就比较麻烦了, 每次都得 :w :!gcc -o 1.exe 1.c :!1 非常 ...
- gVim/Vim 一键编译、连接、运行 C/C++ 单文件
用于Gvim 或 Vim 配置文件的一键编译与运行函数(注:需要机器上安装了GCC才行) 本代码只加入了对C/C++的编译与运行,如果要加入其语言的可以参考此代码加入即可 同时,本代码加入了对Wind ...
- 如何使用Jetbrains Clion 在一个工程里 编译单个C++源文件 (实现一键编译且运行)
这篇文章主要在下面这篇文章的基础上,先是实现了一键编译和一键运行两个单个功能,最后又进一步使用Clion自带的Custom Build Application实现编译且运行一键实现. https:// ...
- 一键编译go文件命令.bat
一键编译go文件命令.bat , 请新建 一键编译go文件命令.bat 文件,放到你的xxx.go文件目录下 ( 欢迎加入go语言群: 218160862 , 群内有实践) 点击加入 @e ...
- [C] tcharall(让所有平台支持TCHAR)v1.1。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释
作者:zyl910 v1.1版的改动如下—— 将源码上传到github. 调整目录结构. 添加CMake编译配置文件. 使用doxygen规范注释. 文件清单—— docs\ docs\images\ ...
- [C] c99int(让VC等编译器自动兼容C99的整数类型)V1.02。源码托管到github、添加CMake编译配置文件、使用doxygen规范注释
新版本—— http://www.cnblogs.com/zyl910/p/zlstdint_v100.html[C] zlstdint(让VC.TC等编译器自动兼容C99的整数类型)V1.0.支持T ...
- bat脚本:Java一键编译(Javac java)
bat脚本:Java一键编译(Javac java) D: 是指D盘 javat是要编译的.java文件所在的文件夹 也就是D:\javat bat代码: :start COLOR 0A cls ...
- Sublime Text 3(中文)添加Lua编译环境
Sublime Text 3(中文)添加Lua编译环境 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 没有 ...
- 01 Maven构建的项目中,把.xml等配置文件添加到编译目录
Maven构建的项目,默认只会把src/main/resources目录下的xml配置文件添加到编译目录. 如果需要把src/main/java目录下的xml配置文件也添加到编译目录,需要在pom.x ...
随机推荐
- 向PE文件植入后门代码技术讨论
写在前面的话 这篇文章将介绍使用codecaves对PE文件植入后门代码.有几个很好的工具可以帮到你了.比如BackdoorFactory和Shelter将完成相同的工作,甚至绕过一些静态分析几个防病 ...
- C# 中的单精度与双精度区别
单精度浮点数(float)与双精度浮点数(double)的区别: (1)在内存中占有的字节数不同 * 单精度浮点数在机内占4个字节 *双精度浮点数在机内占8个字节 (2)有效数字位数不同 *单精度浮点 ...
- Vuex内容解析和vue cli项目中使用状态管理模式Vuex
中文文档:vuex官方中文网站 一.vuex里面都有些什么内容? const store = new Vuex.Store({ state: { name: 'weish', age: }, gett ...
- Android SDK Manager 更新
Android SDK Manager 更新 解决国内访问Google服务器的困难: 1.启动 Android SDK Manager : 2.打开主界面,依次选择「Tools」.「Options…」 ...
- minic 类型声明与变量定义句型处理
#include "token_define.h" //这个文件是用来处理句型的,对于算术表达式都是放在前面的那个头文件中来处理 typedef struct _handle_tr ...
- Android性能优化的方方面面
通常项目比较大的APP都面临着如下性能问题,APP启动慢.界面跳转慢.事件相应慢.滑动和动画卡顿.展现内容慢等,有的公司处理的很好,有的还有很大的优化空间,对于性能优化,怎么去做,我总结了一下性能优化 ...
- 【转】linux性能相关的命令和概念
1. top命令结果解读 23:31:27:系统时间 up 8 days: 表示从开机到现在,一共运行了8天 1 user:1个用户正在使用系统 load average:系统负载,即任务队列的平均长 ...
- PyQt4的一些问题汇总
(1)PyQt4获取中文路径名字乱码问题 网址可以参见:http://permalink.gmane.org/gmane.comp.python.chinese/9916 处理方式的代码可以参考如下 ...
- ES6 let用法
1.实现块作用域 2.不存在变量提升. ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声明之前就使用这些变量,就会报错.
- raspberry pi install iceweasel
sudo apt-get update sudo apt-get upgrade sudo apt-get install iceweasel