前言:
用vim也有几年了,从windows开发到Linux,从在校大学生到在职员工,始终想为这个过程记录点什么,为一直陪伴自己的vim,也为自己。
之前在百度贴吧混迹过,结果发的代码全被判定为非法字符,于是打消了在百度发展的计划,而只在上面留了一个QQ号码,结果问问题的人却络绎不绝,我想也许,是该开个博客,不敢说教授,就是分享一下自己的经验吧,希望对感兴趣的各位有所帮助。
这是这个博客的第一篇日志,所以就写个Vimer们经常会遇到的一个需求吧—-一键编译单个源文件。ps:本站所有文章都是直接通过vim编写的哦。
具体功能如下:
1.按F5编译单个文件,支持C,C++,C#,也可以支持java。
2.获取编译器错误描述,在错误描述上回车,可以直接跳转到错误行。
先贴上代码,可以看出,我把C#相关的注释掉了,实际上C#也是支持的,只是后来由于不再做C#相关开发,有需要的朋友可以去掉注释,还是可以编译C#的。

主要介绍如下几点:
1.如果是windows用户,需要安装mingw,并且将他的bin目录添加到对应的环境变量里。
2.g:iswindows 是个我定义的全局变量,用来判断系统是linux还是windows,这样就不用写两套vimrc了,实现如下:

3.makeprg 是vim内置的编译命令,可以通过更改来实现编译对应类型文件。具体可参考vim官方说明文件。
4.最后的copen是打开quickfix,在错误描述上回车,可以直接跳转到错误行。

鉴于有些朋友说的网页会自动转化某些字符,我在这里把txt版的文档放在这里供大家下载:txt版文档下载

版权所有,转载请注明出处。http://www.vimer.cn

windows下使用vim(gvim)的不便及解决方案(1)-文件查找和软链接

相信不少朋友像我一样,无论在linux还是windows下都用vim来办公,但是毕竟vim原生于linux,windows下的某些支持还是做的不太好。 这个系列的文章,我们就一起...

阅读全文

vim(gvim)一键执行python脚本的bug

前一段时间在博客中和fuadam讨论过python中调用print的时候,是否可以直接打印decode之后的字符的问题。(原文:python-django的中文编码总结) 一开始我...

阅读全文

windows下搭建python+apache环境(for python2.6 special)

之前已经写了一篇linux下搭建python+apache的文章。但由于windows下的支持python2.6的mod_python.so一直没有找到下载(http://www.apache.org/dist/httpd/mod...

阅读全文

115则回应给“VIM-一键编译单个源文件”

  1. herryoli说道:

    恩学习啦,博主很强大,以后常来学习啦

    [回复]

  2. Dante说道:

    哈哈,多谢捧场啊~~~

    [回复]

  3. SuperSonic说道:

    Hi there,
    It agree, very amusing opinion
    Thanks
    SuperSonic

    [回复]

  4. Dougles说道:

    Greatings, Interesting, did you plan to continue this article?
    Thank you
    Dougles

    [回复]

  5. isunbo说道:

    有了这个实在是方便多了.但是有一点我有些不明白,我学习C语言的时候养成了一个坏习惯,比如定义一个变量并赋值我会这么写”int i = 10″,之后,我把上面的代码写到vimrc文件里的时候就出问题了.比如这个
    set makeprg = gcc\ -o\ %<.exe\ %;后来看到报错就把vimrc文件里所有等号两边的空格都给去掉了.哎,刚刚学着用,总是各种莫名其妙的错误啊.

    [回复]

    Dante 回复:

    呵呵,vim的脚本的确有些严格啊,呵呵,习惯了就好啦~~~

    [回复]

  6. asnahu说道:

    只要c/c++环境,MinGW需要是完整安装码?

    [回复]

    Dante 回复:

    因为我当时是直接默认全安装的,如果想要删掉一些功能还真的没有尝试过,其实也不大,全装也没有问题吧

    [回复]

  7. asnahu说道:

    谢谢这么快恢复,问题已经解决。^_^

    [回复]

  8. Loaden说道:

    楼主神人!学习来了。
    谢谢!

    [回复]

    Dante 回复:

    哈哈,不客气~

    [回复]

  9. YE说道:

    博主很强大。弱弱的问一句,我把这些代码拷贝到vimrc,把中文单双引号替换掉,但按下F5仍是会出现一些错误,比如第31行:E115缺少引号:’\(\.[^.]*\).我是菜鸟,代码看不懂,可以添加一些注释或者把这段代码做个txt作为附件吗,网页上拷贝的字符会变化

    [回复]

    Dante 回复:

    额,会这样啊,好的,我传一个txt文档在文章最后把,你再试试啊~

    [回复]

    YE 回复:

    好人啊

    [回复]

    Dante 回复:

    呵呵,分享创造价值~

    [回复]

  10. vimer新人说道:

    您好 我把您的配置加入到自己的配置文件中,结果按下F6显示“|| ‘make’ 不是内部或外部命令,也不是可运行的程序
    || 或批处理文件” 按F5显示“Fail to make! This file is not in the current dir! press to redirect to the dir of this file.“ 如何解决。我编辑的cs文件.谢谢

    [回复]

    Dante 回复:

    呃,就是你打开的文件并不是你vim工作的当前目录。
    用:pwd看一下,你当前的目录是和文件目录相同不,如果不相同需要用:cd xxx命令,cd过去

    [回复]

    vimer新人 回复:

    ok 我在试一下。谢谢,没想到这么快回复。

    [回复]

  11. wbd说道:

    学习了,楼主很强

    [回复]

  12. vim fan说道:

    楼主,你把简单的东西写的挺复杂。。。。

    [回复]

    Dante 回复:

    呵呵,很久之前的代码了……,能用就一直没有管,欢迎博友将自己的配置贴上来,我更新一下~

    [回复]

  13. david说道:

    出现如下错误,解决不了,请博主看看:
    Error detected while processing function Do_OneFileMake:
    line 35:
    E115: Missing quote: ‘\(\.[^.]*\)
    E116: Invalid arguments for function substitute(sourcefileename,’\(\.[^.]*\)
    E15: Invalid expression: substitute(sourcefileename,’\(\.[^.]*\)
    line 36:
    E20: Mark not set
    line 37:
    E121: Undefined variable: outfilename
    E15: Invalid expression: outfilename
    line 39:
    E121: Undefined variable: outfilename
    E116: Invalid arguments for function filereadable(outfilename)

    line 54:
    E121: Undefined variable: outfilename
    E116: Invalid arguments for function filereadable(outfilename)
    E15: Invalid expression: filereadable(outfilename)

    [回复]

    Dante 回复:

    你能给我发邮件看一下你copy的函数,好像我的博客会把引号变成全角符号……
    邮箱点击一下上面的留言就能看到。

    [回复]

    Lees 回复:

    楼主你好,我想问一下在windows下用VIM能够断点运行么?能的话能否告之?谢谢了

    [回复]

    wuyuan 回复:

    我也有这个问题,后来下载的txt文件再复制一下就好了

    [回复]

  14. frankvictor说道:

    line 54:
    E121: Undefined variable: outfilename
    E116: Invalid arguments for function filereadable(outfilename)
    E15: Invalid expression: filereadable(outfilename)

    出现这个错误,请问是怎么回事啊,考的附件txt中的代码

    [回复]

    Dante 回复:

    给我发下邮件我看一下?怀疑是哪个地方换行了。邮箱在博客的留言板页面~

    [回复]

    Nirocfz 回复:

    同样出现这个问题,不知道咋回事

    [回复]

    Dante 回复:

    尝试一下附件中的txt文件?

    [回复]

    Nirocfz 回复:

    我把关于 g:iswindows 的if分支语句都注释掉了,只留下else之后给linux的语句,就正常了。

    还有个问题是在终端里的vim,按F5编译结果出来之后,只有quickfix窗口的显示的还算正常,要刷新一次窗口才全部正常显示,在函数最后加了个redraw! ,效果还算满意,不过我不懂vim语法,不知道合不合适

    [回复]

    Dante 回复:

    呵呵,在终端里显示花屏是很正常的,可以用redraw!来强制刷新,不过我一般就CTRL+L来刷新一下就行了~

    [回复]

    Wenson 回复:

    解决了。。

    哈哈,少拷了点代码。。

    汗 – - !

    [回复]

    Wenson 回复:

    为什么我把那个都给注释掉,还是出现这个问题啊~~~

    抓狂

    [回复]

  15. 执着的初心说道:

    哪里有qq号。。。。

    [回复]

  16. 执着的初心说道:

    博主很强大啊。
    我是个初学者。vim的代码有的还看不懂。

    你这个是编译c++的。我是做FPGA的,要用modelsim来编译VHDL或者Verilog文件。所以还得自己动手修改才行。

    不知道能不能给源代码做个注释让我参考下?尤其是比如:\(\.[^.]*\) 真的没看懂。。。

    [回复]

    Dante 回复:

    呃,你说的语言我就听说过VHDL。。。

    \(\.[^.]*\) 的意思是.exe之类的后缀,比如.exe.bk 就会匹配.bk。

    [回复]

    Dante 回复:

    其实代码很简单的,建议简单学习一下vim的脚本,只要学过普通的脚本语言应该都不难~

    [回复]

    执着的初心 回复:

    最近稍微学习了一下,自己写了一个modesim的。
    支持verilog和vhdl,其他的编译器需要自己设置错误识别,这个比较恶心。

    最后的窗口我用的:cw命令。有错误显示,没错误就不显示了。

    [回复]

    Dante 回复:

    哈哈,恭喜恭喜。
    其实错误识别写起来还是挺容易的,在vim里面输入
    :h errorformat
    介绍的挺清楚的。

    [回复]

  17. oatmeal说道:

    博主,能不能介绍一下vim怎么联立gbd调试单个文件的?

    谢谢了,实现的功能就是查看变量,断点,分步执行就好了

    [回复]

    Dante 回复:

    呃,这个真没尝试过。。。倒是可以看看这边文章:
    http://www.vimer.cn/2010/06/%E5%9C%A8vimgvim%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%BB%88%E7%AB%AF%E5%AF%B9%E4%BD%A0%E6%B2%A1%E6%9C%89%E7%9C%8B%E9%94%99%E6%88%91%E4%B9%9F%E6%B2%A1%E6%9C%89%E5%86%99%E5%8F%8D.html
    实现了Vim中托管所有的命令行操作。。

    [回复]

    可可火山 回复:

    gbdtui 挺好用的,默认一半源代码一半调试窗。

    另外我也使用makeprg来编译单个文件或者工程,
    有个makeprgs.vim的插件也做类似的事情,能自己判断是Makefile,ant java工程。我就自己稍微改了下来编译debug的c++程序。

    [回复]

  18. xiaoquan09说道:

    跟着 博主 学习

    [回复]

  19. zhanglistar说道:

    8错哈 我都是手写makeprg的。
    lz的vim功底深厚啊。

    [回复]

  20. cigerma说道:

    楼主,问下vim如何判断前一个命令是否成功执行
    比如在这一步:
    if filereadable(outfilename)
    execute “!./”.toexename
    endif
    在它出错后执行execute “copen”
    成功的时候则不执行
    这个该怎么做?

    [回复]

    Dante 回复:

    呃,外部命令恐怕不行哦,只能通过间接的方式,比如判断命令创建的文件成功与否等等

    [回复]

    cigerma 回复:

    汗,其实改成:
    if filereadable(outfilename)
    execute “!./”.toexename
    else
    execute “copen”
    endif
    就行了!

    [回复]

  21. nan说道:

    请教博主,如果希望实现一键编译,但是要求在\build文件夹里执行make命令,应当如何修改Vim脚本呢?

    [回复]

    Dante 回复:

    不好意思,今天一直都在忙。
    想要更改编译目录的话,只需要执行:
    cd ../build
    即可,不过一键编译就是为了编译单个文件,如果要写复杂的工程的话,还是用makefile比较好。

    [回复]

  22. Springlie说道:

    博主您好,我安装了MinGW,并将bin放入系统变量。尝试编译后发现,用C++风格引入的头文件找不到,比如:

    #include
    #include

    using namespace std;

    如果将string改成C风格的string.h,就可以找到。
    我到MinGW的include中发现,只有string.h,没有string,也没有vector之类的文件。可能是由于这个原因找不到。

    弱问:如何解决上述问题,在vim里正常编译这些文件?

    [回复]

    Dante 回复:

    被转义了。。。
    呃,是不是mingw的版本问题?或者你是用gcc还是g++编译的?
    c++风格的要用g++编译。

    [回复]

    Springlie 回复:

    C++风格的文件是用g++编译的。

    mingw应该已经是最新的了,是在http://sourceforge.net/projects/mingw/files_beta/ 下载的。

    可疑的地方就是:MinGW的include中,只有string.h文件,没有string文件。我翻看UNIX和VC的相应位置,两个文件是都该具备的。

    [回复]

    Dante 回复:

    C:\MinGW\include\c++\3.4.5
    C++的头文件在这个目录下哦,里面有string文件。

    [回复]

    Springlie 回复:

    谢谢及时回复。
    但真相是:include下根本就没有C++目录。是因为mingw的版本问题么?

    [回复]

    Dante 回复:

    呃。。那就真不知道了。。我现在的版本里面是有的。。。是不是没有全部安装上?

    [回复]

    kadyz 回复:

    确实是版本问题,现在去下载的MinGW版本C++的头文件路径已经跟网络上普遍教程上说的不一样了。(我下载的是4.5.0)
    我自己尝试配置的路径是:D:\MinGW\include;D:\MinGW\lib\gcc\mingw32\4.5.0\include;D:\MinGW\lib\gcc\mingw32\4.5.0\include\c++;D:\MinGW\lib\gcc\mingw32\4.5.0\include\c++\backward;D:\MinGW\lib\gcc\mingw32\4.5.0\include\c++\mingw32

    经过验证是可以编译C++的。

    [回复]

  23. 说道:

    每次编译时要cd到相应目录,能否自动完成呢

    [回复]

  24. 说道:

    找到了
    set autochdir

    [回复]

  25. [...]   偶然发现的得超好用的vim插件——csupport,它提供的功能中我最喜欢的就是自动编译,知道emacs内置了,但是我确实是vim党派的,不会转到emacs中去,但是程序员打完代码总要回到控制台去编译和执行不觉得很可笑么?前阵子找到一个高手,它自己写了一段自动编译的函数,它的那个直接复制不行,需要打开下面提供的txt中复制设置,我这里就提供下吧: [...]

  26. noob说道:

    感谢博主的分享!但是在上面的代码中中没有不可以编译java吧?我在31行后直接加了
    elseif &filetype==”java”
    set makeprg=javac\ %
    但是没有用。是不是还要作些修改呢?我不懂vim的语法,请多指教!

    [回复]

    Dante 回复:

    在vim中执行:

    即可~~

    [回复]

    noob 回复:

    还请您详细指点一下java源代码怎么用quickfix,感激不尽,我不太想看帮助文件:)

    [回复]

  27. 吴健说道:

    你好:
    博主,按照你说的步骤我都设置好了,可编译时(按F6)会出现:call Do_make(),不知道怎么回事,快崩溃了

    [回复]

    Dante 回复:

    你好,用文末那个txt版的试一下?

    [回复]

  28. kid7st说道:

    博主,那个txt文件是不是失效了

    [回复]

    Dante 回复:

    嗯,可能迁移网站给搞丢了。。。
    直接用贴的代码就行,已经优化过的。

    [回复]

  29. aruralgeek说道:

    let outfilename=substitute(sourcefileename,’\(\.[^.]*\),’.exe’,’g’)
    这句在网页显示出来 好像有错误吧。特别是被断行了,而且少个’。
    我自己改为 let outfilename=substitute(sourcefileename,’\(\.[^.]*\)‘,’.exe’,’g’) 就可以了。
    还有,F5编译完后 如果程序修改了 再按F5就会出现错误Fail to make! Please select the right file!
    不知如何解决。

    [回复]

    Dante 回复:

    感谢提醒! 的确被换行了
    是不是设置了 autochdir?

    [回复]

    aruralgeek 回复:

    在每次F5之后 它的光标都会在调试信息的窗口,不管有没有错误,当光标在调试信息窗口的时候,整个窗口就是没有 文件名 状态,也就是上面显示是 [未命名]。如果要再通过F5编译运行 就要光标跳到编辑窗口,才有文件名。请问能不能设置 当跳到调试信息窗口的时候 文件名也是有的呢?而且,F5之前 先将当前文件保存了,不然它还是以之前的编译。谢谢了!

    [回复]

  30. 布拉德比特说道:

    楼主啊,你的文件不提供下载了….

    [回复]

    Dante 回复:

    呃,空间搬迁了几次,都没了。。

    就用贴的代码吧,可以正常运行的。

    [回复]

  31. 三十说道:

    也是初学,看到上面都在说编译的过程报错,就仔细看了一下代码。
    let outfilename=substitute(sourcefileename,’\(\.[^.]*\)’ ,’.exe’,’g’)
    let outfilename=substitute(sourcefileename,’\(\.[^.]*\)’ ,”,’g’)
    这两句博主少在’\(\.[^.]*\)的后面打了一个’加上就正常了。不知道对否

    [回复]

    Dante 回复:

    感谢提醒,已经修改~

    [回复]

    xxx 回复:

    博主啊不要乱听别人讲这个点根本就不应该加的可能它是用的LINUX才不正常,我用windows,得去掉那个点才正常,害苦我了。另外既然用到了g:iswindows博主为何不把g:iswindows这个变量加到文中呢,这个也害我弄了半天

    [回复]

    xxx 回复:

    let outfilename=substitute(sourcefileename,’\(\.[^.]*\)’ ,’.exe’,’g’)这里的那个点不应该加

    [回复]

    xxx 回复:

    博主是不是故意弄的有点问题好让我们来点击你博客啊!哈哈

    [回复]

    Dante 回复:

    哈哈,我不会那么坏啦
    呃,主要是这段代码也很久不用了,所以当时也没多想,直接加上了。。
    刚看了一下,确实不应该加,\)是一个整体,不该拆开的。

    [回复]

  32. swust_long说道:

    博主:
    谢谢你的分享!
    我刚开始用vim,你那上面贴的代码还是有一点问题,前面的人已经说过了,我也都照看了,你好像把单引号加到右元括号前面去了;
    outfilename=substitute(sourcefileename,’\(\.[^.]*\’) ,’.exe’,’g’)
    let toexename=outfilename
    else
    let outfilename=substitute(sourcefileename,’\(\.[^.]*\’) ,”,’g’)

    [回复]

    nswutong 回复:

    是这样的,希望博主改一下

    后面那个单引号的位置错了

    [回复]

    Dante 回复:

    多谢,已经修改~

    [回复]

  33. swust_long说道:

    顺便建议下楼主,把那个文件下载弄下吧;
    直接复制容易出错。。。呵呵。。

    [回复]

  34. Aikilis说道:

    赞!
    我自己也弄了一个,但是有个小问题想请教博主。
    我是F5编译,F6执行,F9编译+执行

    问题就出在F9上。。我是直接把F9映射为。这样如果编译没通过的话还是会执行。。执行的以前编译的版本。。囧。。。请问该怎么改呢?谢谢!

    [回复]

    Aikilis 回复:

    额。。尖括号被吃掉了。。我是直接把F9映射为F5+F6

    [回复]

  35. xxx说道:

    为什么不把open换成cw这样就可以有错误打开窗口,没错误不打开窗口。
    另外我刚学编程,那个F6执行是什么意思是运行的意思吗

    [回复]

  36. xxx说道:

    另外我想省了编译时要保存的这一步,所以在
    if &filetype==”c”
    ……
    w
    set makeprg=gcc\ -o\ %<\ %
    ……
    这里加了个w,这样好像可以实现直接保存后编译了,不知有什么不妥之处没有

    [回复]

    Dante 回复:

    嗯,没什么问题。

    [回复]

  37. liaic说道:

    哈哈,成功学习博主的方法,做成了编译NCL的快捷键!非常感谢!

    [回复]

    madper 回复:

    ncl=脑残了? 哈哈哈~ 玩笑~

    [回复]

  38. Isaac说道:

    首先感谢楼主,想问一下上面的配置有用到哪些vim的插件?
    还有……我想我得把那些『if g : iswindows……』删了……洁癖……:P

    [回复]

    Dante 回复:

    呃,不需要别的插件哈。你说的是我之前的一个变量定义,删掉就可以了。

    [回复]

  39. xcxinghai说道:

    我直接复制了您的代码,但是显示错误提示如下:

    第 52 行:
    E121: 未定义的变量: outfilename
    E116: Invalid arguments for function filereadable(outfilename)
    E15: 无效的表达式: filereadable(outfilename)

    我的程序应该没问题的。

    [回复]

    xcxinghai 回复:

    解决了,原来我没有将下面判断是什么系统语句加上去。

    [回复]

  40. zxiaotian说道:

    你好,请问这个代码高亮插件是什么?

    [回复]

    Dante 回复:

    wp_syntax

    [回复]

  41. MKCC说道:

    有没办法自动添加MinGW的环境变量呢?让VIM和MinGW做一个整合.
    之前看到有Code::blocks和MinGW的整合,用批处理文件过渡,想参照此法,可无奈不晓得vim如何往文件追加内容,在CMD下可以echo xxxx>>run.bat进行追加.不知博主是否有好的办法?

    [回复]

    Dante 回复:

    不理解,环境变量不是直接改系统就可以了么?

    vim确实没有提供直接追加写文件的功能,但是vim支持各种语言来写脚本,比如python,就可以。

    [回复]

    MKCC 回复:

    蛋痛想搞win32绿色版gvim,所以才会这些想法.不过后来在一个外国网站找到办法了.
    let $path=”XX;”.$path

    例如我的做法是把MinGW放在vim目录下,然后
    let $path=$VIM.”\MinGW\bin;”.$path
    这样就整合到一起了.

    [回复]

  42. zhuojun说道:

    请问可以一键编译运行多个C++文件吗?谢谢!

    [回复]

    Dante 回复:

    额,那就要自己写makefile了。。直接用make就行了。。

    [回复]

  43. ayqs说道:

    if(has(“win32″) || has(“win95″) || has(“win64″) || has(“win16″))
    let g:iswindows=1
    else
    let g:iswindows=0
    endif

    楼主,这段代码是加到上面那一大段代码后面就行了吧

    [回复]

  44. wangyang说道:

    楼主你好,我是个新手。
    按照上面说的做完之后,我按F5,终端显示的是~这个字符,然后输入原文件的名字a.c后按回车,终端却显示这种结果
    ~a.c:command not found
    这是怎么会是

    [回复]

    Dante 回复:

    命令没有绑定好。。

    [回复]

  45. 黄瓜皮说道:

    我win下的c,cpp一键运行vimrc配置哈,查找当前目录下的可执行文件,如果找到多个就让用户选一个。如果有用望发散:

    func! GetExeFilePwd()
    let exes = glob(“*.exe”)
    if stridx(exes, “\n”) != -1
    let charidx = 0
    let exes_list = []
    let prompt_idx = 1
    let len = strlen(exes)
    let t = -1
    while t != len
    let t = stridx(exes, “\n”, charidx)
    if t == -1
    let t = len
    endif
    let exes_list = exes_list + [prompt_idx.". ".strpart(exes, charidx, t - charidx)]
    let prompt_idx = prompt_idx + 1
    let charidx = t + 1
    endwhile
    let exeidx = inputlist(["select file to execute"] + exes_list) – 1
    if exeidx != -1
    let exes = matchstr(get(exes_list, exeidx), ‘[a-zA-z]\+.exe’)
    endif
    endif
    return exes
    endfun

    func! Run()
    let exes = GetExeFilePwd()
    if exes != “”
    execute “!”.exes
    endif
    endfunc

    func! Gdb()
    let exes = GetExeFilePwd()
    if exes != “”
    exec “!gdb %<"
    endif
    endfunc

    [回复]

  46. haoaina521说道:

    最后的copen其实用cw比较好,如果有错误才打开quickfix。

    [回复]

  47. 显示说道:

    为什么当程序有错时,编译后出现quickfix窗口,但程序源代码显示不出来,要用鼠标上下滑动才会显示出来?

    [回复]

  48. 木木菜说道:

    诶~~~~会中文乱码怎么办?

    [回复]

  49. song说道:

    “——————————————————————————

    “——————————————————————————
    ” F9 一键保存、编译、连接存并运行
    map :call Run()
    imap :call Run()
    ” Ctrl + F9 一键保存并编译
    map :call Compile()
    imap :call Compile()
    ” Ctrl + F10 一键保存并连接
    map :call Link()
    imap :call Link()
    let s:LastShellReturn_C = 0
    let s:LastShellReturn_L = 0
    let s:ShowWarning = 1
    let s:Obj_Extension = ‘.o’
    let s:Exe_Extension = ‘.exe’
    let s:Sou_Error = 0
    let s:windows_CFlags = ‘gcc\ -fexec-charset=gbk\ -Wall\ -g\ -O0\ -c\ %\ -o\ %<.o'
    let s:linux_CFlags = 'gcc\ -Wall\ -g\ -O0\ -c\ %\ -o\ %<.o'
    let s:windows_CPPFlags = 'g++\ -fexec-charset=gbk\ -Wall\ -g\ -O0\ -c\ %\ -o\ %<.o'
    let s:linux_CPPFlags = 'g++\ -Wall\ -g\ -O0\ -c\ %\ -o\ %<.o'
    func! Compile()
    exe ":ccl"
    exe ":update"
    if expand("%:e") == "c" || expand("%:e") == "cpp" || expand("%:e") == "cxx"
    let s:Sou_Error = 0
    let s:LastShellReturn_C = 0
    let Sou = expand("%:p")
    let Obj = expand("%:p:r").s:Obj_Extension
    let Obj_Name = expand("%:p:t:r").s:Obj_Extension
    let v:statusmsg = ''
    if !filereadable(Obj) || (filereadable(Obj) && (getftime(Obj) = getftime(Sou))
    redraw!
    if !executable(Exe) || (executable(Exe) && getftime(Exe) < getftime(Obj))
    if expand("%:e") == "c"
    setlocal makeprg=gcc\ -o\ %<\ %<.o
    echohl WarningMsg | echo " linking…"
    silent make
    elseif expand("%:e") == "cpp" || expand("%:e") == "cxx"
    setlocal makeprg=g++\ -o\ %<\ %= getftime(Obj) && getftime(Obj) >= getftime(Sou)
    redraw!
    echohl WarningMsg | echo ” running…”
    if g:iswindows
    exe “:!%<.exe"
    else
    if g:isGUI
    exe ":!gnome-terminal -e ./%<"
    else
    exe ":!./%<"
    endif
    endif
    redraw!
    echohl WarningMsg | echo " running finish"
    endif
    endfunc

    [回复]

    song 回复:

    摘自http://zhidao.baidu.com/question/541064260.html?from=pubpage&msgtype=2不过怎么不能用

    [回复]

    song 回复:

    我windows7 gvim mingw 新手不知怎么搞

    [回复]

    song 回复:

    问题解决这个是完整版的http://www.oschina.net/code/snippet_574132_13351

    [回复]

  50. 小行说道:

    || ‘g++’ 不是内部或外部命令,也不是可运行的程序|| 或批处理文件博主,我是win7下的gvim,搞不清楚问题出在哪了。

    [回复]

    朱念洋 回复:

    win下需要装一下 mingw

    [回复]

    小行 回复:

    如果已经安装了codeblocks,可以不以直接利用其目录下的mingw?

    [回复]

    朱念洋 回复:

    理论上是可以的,只是用来编译而已。

    [回复]

    小行 回复:

    谢谢博主,成功了。

    [回复]

发表评论