最后更新于 .

前言: 用vim也有几年了,从windows开发到Linux,从在校大学生到在职员工,始终想为这个过程记录点什么,为一直陪伴自己的vim,也为自己。

之前在百度贴吧混迹过,结果发的代码全被判定为非法字符,于是打消了在百度发展的计划,而只在上面留了一个QQ号码,结果问问题的人却络绎不绝,我想也许,是该开个博客,不敢说教授,就是分享一下自己的经验吧,希望对感兴趣的各位有所帮助。

这是这个博客的第一篇日志,所以就写个Vimer们经常会遇到的一个需求吧----一键编译单个源文件。ps:本站所有文章都是直接通过vim编写的哦。

具体功能如下:

1.按F5编译单个文件,支持C,C++,C#,也可以支持java。

2.获取编译器错误描述,在错误描述上回车,可以直接跳转到错误行。

先贴上代码,可以看出,我把C#相关的注释掉了,实际上C#也是支持的,只是后来由于不再做C#相关开发,有需要的朋友可以去掉注释,还是可以编译C#的。

"单个文件编译
map <F5> :call Do_OneFileMake()<CR>
function Do_OneFileMake()
    if expand("%:p:h")!=getcwd()
        echohl WarningMsg | echo "Fail to make! This file is not in the current dir! Press <F7> to redirect to the dir of this file." | echohl None
        return
    endif
    let sourcefileename=expand("%:t")
    if (sourcefileename=="" || (&filetype!="cpp" && &filetype!="c"))
        echohl WarningMsg | echo "Fail to make! Please select the right file!" | echohl None
        return
    endif
    let deletedspacefilename=substitute(sourcefileename,' ','','g')
    if strlen(deletedspacefilename)!=strlen(sourcefileename)
        echohl WarningMsg | echo "Fail to make! Please delete the spaces in the filename!" | echohl None
        return
    endif
    if &filetype=="c"
        if g:iswindows==1
            set makeprg=gcc\ -o\ %<.exe\ %
        else
            set makeprg=gcc\ -o\ %<\ %
        endif
    elseif &filetype=="cpp"
        if g:iswindows==1
            set makeprg=g++\ -o\ %<.exe\ %
        else
            set makeprg=g++\ -o\ %<\ %
        endif
        "elseif &filetype=="cs"
        "set makeprg=csc\ \/nologo\ \/out:%<.exe\ %
    endif
    if(g:iswindows==1)
        let outfilename=substitute(sourcefileename,'\(\.[^.]*\)' ,'.exe','g')
        let toexename=outfilename
    else
        let outfilename=substitute(sourcefileename,'\(\.[^.]*\)' ,'','g')
        let toexename=outfilename
    endif
    if filereadable(outfilename)
        if(g:iswindows==1)
            let outdeletedsuccess=delete(getcwd()."\\".outfilename)
        else
            let outdeletedsuccess=delete("./".outfilename)
        endif
        if(outdeletedsuccess!=0)
            set makeprg=make
            echohl WarningMsg | echo "Fail to make! I cannot delete the ".outfilename | echohl None
            return
        endif
    endif
    execute "silent make"
    set makeprg=make
    execute "normal :"
    if filereadable(outfilename)
        if(g:iswindows==1)
            execute "!".toexename
        else
            execute "!./".toexename
        endif
    endif
    execute "copen"
endfunction
"进行make的设置
map <F6> :call Do_make()<CR>
map <c-F6> :silent make clean<CR>
function Do_make()
    set makeprg=make
    execute "silent make"
    execute "copen"
endfunction

主要介绍如下几点:

1.如果是windows用户,需要安装mingw,并且将他的bin目录添加到对应的环境变量里。

2.g:iswindows 是个我定义的全局变量,用来判断系统是linux还是windows,这样就不用写两套vimrc了,实现如下:

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

3.makeprg 是vim内置的编译命令,可以通过更改来实现编译对应类型文件。具体可参考vim官方说明文件。

4.最后的copen是打开quickfix,在错误描述上回车,可以直接跳转到错误行。

Pingbacks

  1. vim的插件cvim(csupport) &laquo; My S-K-Y on #

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

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. herryoli

    herryoli on #

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

    Reply

  2. Dante

    Dante on #

    哈哈,多谢捧场啊~~~

    Reply

  3. SuperSonic

    SuperSonic on #

    Hi there,
    It agree, very amusing opinion
    Thanks
    <a href="http://www.fd3la.com/" rel="nofollow">SuperSonic</a>

    Reply

  4. Dougles

    Dougles on #

    Greatings, Interesting, did you plan to continue this article?
    Thank you
    <a href="http://www.fd3la.com/" rel="nofollow">Dougles</a>

    Reply

  5. isunbo

    isunbo on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  6. asnahu

    asnahu on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  7. asnahu

    asnahu on #

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

    Reply

  8. Loaden

    Loaden on #

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

    Reply

    1. Dante

      Dante on #

      哈哈,不客气~

      Reply

  9. YE

    YE on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. YE

        YE on #

        好人啊

        Reply

        1. Dante

          Dante on #

          呵呵,分享创造价值~

          Reply

  10. vimer新人

    vimer新人 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. vimer新人

        vimer新人 on #

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

        Reply

  11. wbd

    wbd on #

    学习了,楼主很强

    Reply

  12. vim fan

    vim fan on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  13. david

    david on #

    出现如下错误,解决不了,请博主看看:
    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)

    Reply

    1. Dante

      Dante on #

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

      Reply

    2. Lees

      Lees on #

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

      Reply

    3. wuyuan

      wuyuan on #

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

      Reply

  14. frankvictor

    frankvictor on #

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

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. Nirocfz

        Nirocfz on #

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

        Reply

        1. Dante

          Dante on #

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

          Reply

          1. Nirocfz

            Nirocfz on #

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

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

            Reply

            1. Dante

              Dante on #

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

              Reply

              1. Wenson

                Wenson on #

                解决了。。

                哈哈,少拷了点代码。。

                汗 - - !

                Reply

            2. Wenson

              Wenson on #

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

              抓狂

              Reply

  15. 执着的初心

    执着的初心 on #

    哪里有qq号。。。。

    Reply

  16. 执着的初心

    执着的初心 on #

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

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

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

    Reply

    1. Dante

      Dante on #

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

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

      Reply

    2. Dante

      Dante on #

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

      Reply

      1. 执着的初心

        执着的初心 on #

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

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

        Reply

        1. Dante

          Dante on #

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

          Reply

  17. oatmeal

    oatmeal on #

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

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

    Reply

    1. Dante

      Dante on #

      呃,这个真没尝试过。。。倒是可以看看这边文章:
      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中托管所有的命令行操作。。

      Reply

    2. 可可火山

      可可火山 on #

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

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

      Reply

  18. xiaoquan09

    xiaoquan09 on #

    跟着 博主 学习

    Reply

  19. zhanglistar

    zhanglistar on #

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

    Reply

  20. cigerma

    cigerma on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. cigerma

        cigerma on #

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

        Reply

  21. nan

    nan on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  22. Springlie

    Springlie on #

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

    #include
    #include

    using namespace std;

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

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. Springlie

        Springlie on #

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

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

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

        Reply

        1. Dante

          Dante on #

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

          Reply

          1. Springlie

            Springlie on #

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

            Reply

            1. Dante

              Dante on #

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

              Reply

            2. kadyz

              kadyz on #

              确实是版本问题,现在去下载的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++的。

              Reply

  23. 匿

    on #

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

    Reply

  24. 匿

    on #

    找到了
    set autochdir

    Reply

  25. noob

    noob on #

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

    Reply

    1. Dante

      Dante on #

      在vim中执行:

      <pre lang="vim" line="1">
      :h makeprg
      </pre>

      即可~~

      Reply

      1. noob

        noob on #

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

        Reply

  26. 吴健

    吴健 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  27. kid7st

    kid7st on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  28. aruralgeek

    aruralgeek on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. aruralgeek

        aruralgeek on #

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

        Reply

  29. 布拉德比特

    布拉德比特 on #

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

    Reply

    1. Dante

      Dante on #

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

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

      Reply

  30. 三十

    三十 on #

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

    Reply

    1. Dante

      Dante on #

      感谢提醒,已经修改~

      Reply

      1. xxx

        xxx on #

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

        Reply

        1. xxx

          xxx on #

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

          Reply

      2. xxx

        xxx on #

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

        Reply

        1. Dante

          Dante on #

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

          Reply

  31. swust_long

    swust_long on #

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

    Reply

    1. nswutong

      nswutong on #

      是这样的,希望博主改一下
      <pre>’\(\.[^.]*\')
      </pre>
      后面那个单引号的位置错了

      Reply

      1. Dante

        Dante on #

        多谢,已经修改~

        Reply

  32. swust_long

    swust_long on #

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

    Reply

  33. Aikilis

    Aikilis on #

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

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

    Reply

    1. Aikilis

      Aikilis on #

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

      Reply

  34. xxx

    xxx on #

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

    Reply

  35. xxx

    xxx on #

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

    Reply

    1. Dante

      Dante on #

      嗯,没什么问题。

      Reply

  36. liaic

    liaic on #

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

    Reply

    1. madper

      madper on #

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

      Reply

  37. Isaac

    Isaac on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  38. xcxinghai

    xcxinghai on #

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

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

    我的程序应该没问题的。

    Reply

    1. xcxinghai

      xcxinghai on #

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

      Reply

  39. zxiaotian

    zxiaotian on #

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

    Reply

    1. Dante

      Dante on #

      wp_syntax

      Reply

  40. MKCC

    MKCC on #

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

    Reply

    1. Dante

      Dante on #

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

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

      Reply

      1. MKCC

        MKCC on #

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

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

        Reply

  41. zhuojun

    zhuojun on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  42. ayqs

    ayqs on #

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

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

    Reply

  43. wangyang

    wangyang on #

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

    Reply

    1. Dante

      Dante on #

      命令没有绑定好。。

      Reply

  44. 黄瓜皮

    黄瓜皮 on #

    我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 %&lt;&quot;
    endif
    endfunc

    Reply

  45. haoaina521

    haoaina521 on #

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

    Reply

  46. 显示

    显示 on #

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

    Reply

  47. 木木菜

    木木菜 on #

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

    Reply

  48. song

    song on #

    "------------------------------------------------------------------------------
    "
    "------------------------------------------------------------------------------
    " 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\ %&lt;.o&#039;
    let s:linux_CFlags = &#039;gcc\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    let s:windows_CPPFlags = &#039;g++\ -fexec-charset=gbk\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    let s:linux_CPPFlags = &#039;g++\ -Wall\ -g\ -O0\ -c\ %\ -o\ %&lt;.o&#039;
    func! Compile()
    exe &quot;:ccl&quot;
    exe &quot;:update&quot;
    if expand(&quot;%:e&quot;) == &quot;c&quot; || expand(&quot;%:e&quot;) == &quot;cpp&quot; || expand(&quot;%:e&quot;) == &quot;cxx&quot;
    let s:Sou_Error = 0
    let s:LastShellReturn_C = 0
    let Sou = expand(&quot;%:p&quot;)
    let Obj = expand(&quot;%:p:r&quot;).s:Obj_Extension
    let Obj_Name = expand(&quot;%:p:t:r&quot;).s:Obj_Extension
    let v:statusmsg = &#039;&#039;
    if !filereadable(Obj) || (filereadable(Obj) &amp;&amp; (getftime(Obj) = getftime(Sou))
    redraw!
    if !executable(Exe) || (executable(Exe) &amp;&amp; getftime(Exe) &lt; getftime(Obj))
    if expand(&quot;%:e&quot;) == &quot;c&quot;
    setlocal makeprg=gcc\ -o\ %&lt;\ %&lt;.o
    echohl WarningMsg | echo &quot; linking...&quot;
    silent make
    elseif expand(&quot;%:e&quot;) == &quot;cpp&quot; || expand(&quot;%:e&quot;) == &quot;cxx&quot;
    setlocal makeprg=g++\ -o\ %&lt;\ %= getftime(Obj) &amp;&amp; getftime(Obj) &gt;= getftime(Sou)
    redraw!
    echohl WarningMsg | echo " running..."
    if g:iswindows
    exe ":!%&lt;.exe&quot;
    else
    if g:isGUI
    exe &quot;:!gnome-terminal -e ./%&lt;&quot;
    else
    exe &quot;:!./%&lt;&quot;
    endif
    endif
    redraw!
    echohl WarningMsg | echo &quot; running finish&quot;
    endif
    endfunc

    Reply

    1. song

      song on #

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

      Reply

      1. song

        song on #

        我windows7 gvim mingw 新手不知怎么搞

        Reply

        1. song

          song on #

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

          Reply

  49. 小行

    小行 on #

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

    Reply

    1. Dante

      Dante on #

      win下需要装一下 mingw

      Reply

      1. 小行

        小行 on #

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

        Reply

        1. Dante

          Dante on #

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

          Reply

          1. 小行

            小行 on #

            谢谢博主,成功了。

            Reply

发表评论