首页 > 代码库 > Vim C/C++的一键编译

Vim C/C++的一键编译

开始用Vim差不多有两个月的时间, 一开始用Makefile 编译一整个项目无压力, 但是当写到单个文件的时候, 编译就比较麻烦了, 每次都得
:w
:!gcc -o 1.exe 1.c
:!1
非常麻烦...所以我都直接用的Code::Blocks...其实比Vim快多了哈哈...

但是昨晚折腾病发作, 想好好来配置一下, 于是花了一个晚上...改了一个能看得过去的一键编译.
原来的代码出自: http://www.vimer.cn/2009/10/11.html 这个域名好羡慕...
觉得他考虑的东西太多而且不好用, 自己折腾了折腾.
所幸vim的帮助文件非常全面, 改动他并不是难事.
代码及注释如下:

  1 "单个文件编译 Linux 下大概有问题
 2 "
 3 "
 4 map <F9> :call Do_OneFileMake()<CR> 
 5 "判断操作系统
 6 if(has("win32") || has("win95") || has("win64") || has("win16"))
 7     let g:iswindows=1
 8 else
 9     let g:iswindows=0
10 endif
11 "函数体
12 function Do_OneFileMake()
13     "关闭之前可能存在的QucikFix窗口
14     execute "cclose"    
15     "判断文件路径和工作目录是否相同(其实我也不知道为什么要判断
16     if expand("%:p:h")!=getcwd()
17         echohl WarningMsg | echo "Fail to make! This file is not in the current dir! " | echohl None
18         return
19     endif
20     "sourcefilename 功能未知, 判断该类型是否被支持
21     let sourcefileename=expand("%:t")
22     if (sourcefileename=="" || (&filetype!="cpp" && &filetype!="c"))
23         echohl WarningMsg | echo "Fail to make! Please select the right file!" | echohl None
24         return
25     endif
26     "编译前先保存
27     exec "w" 
28     "设置make参数,
29     "Linux 和 Windows的情况不同, Linux的执行是./*.out Windows的是 *.exe Linux 下的没有经过测试o
30     "makeprg 是 make的参数, 如果 makeprg=make 就执行真正的make.exe,  寻找目录下的makefile, 如果不是make的话这个参数就相当于makefile 的内容, 但是无论如何错误信息都会被送到QuickFix窗口.(暂时的粗浅理解
31     "makeprg中空格和双引号都需要用反斜杠"\"转义
32     if &filetype=="c"
33         if g:iswindows==1
34            set makeprg=gcc\ -o\ \"%<.exe\"\ \"%\"
35         else
36            set makeprg=gcc\ -o\ \"%<\"\ \"%\"
37         endif
38     elseif &filetype=="cpp"
39         if g:iswindows==1
40             set makeprg=g++\ -o\ \"%<.exe\"\ \"%\"
41         else
42             set makeprg=g++\ -o\ \"%<\"\ \"%\"
43         endif
44     endif
45     "删除旧文件, outfilename是生成程序的完整路径
46     let outfilename=expand("%:r").".exe"
47     if filereadable(outfilename)
48         if(g:iswindows==1)
49             let outdeletedsuccess=delete(outfilename)
50         else
51             let outdeletedsuccess=delete("./".outfilename) "doesn‘t work
52         endif
53         "如果文件删除不了报错
54         if(outdeletedsuccess!=0)
55             set makeprg=make
56             echohl WarningMsg | echo "Fail to make! I cannot delete the ".outfilename | echohl None
57             return
58         endif
59     endif
60     "静默编译, silent 关键字用于静默执行
61     execute "silent make"
62     set makeprg=make  
63     "编译后如果文件存在,说明编译成功, 执行之
64     if filereadable(outfilename)
65         if(g:iswindows==1)
66             execute "!\"%<.exe\""
67             return 
68         else
69             execute "!\"./%<.out\""
70             return 
71         endif
72     endif
73     "不成功弹出错误信息, 即QuickFix窗口
74     execute "silent copen 6"
75 endfunction


以上.

Vim C/C++的一键编译