vim中的调试和补全(windows平台)

vim一个历史悠久的字符界面编辑器,可以说是GUI编辑器横行时代的一个少数派。(与其类似的自然还有emacs。)在没有用过vim的人那里,看到有人在用vim必然十分惊讶,居然还有人在用这样非主流的东西,看起来一点都不好用。但是,喜欢的人,却非常喜欢,常常拉出一大堆理由和牛人,来支持自己的观点。
作为到现在为止1/2的代码都是用vim写的人,我倒是想先来比较一下vim和vc(大约1/4的代码是用vc写的。)。一般人常将vim和vc的扩展性做比较,来说明vim的扩展性好,因为,vim自带脚本解释器可以自己设置命令来完成一些事情。但实际上vc的扩展性也很好,但是不常见,比如:你可以写vba脚本来扩展它的功能,比如,加入一个注释函数的功能,因为,vc自带代码分析工具,所以在vba中是可以看到编辑的代码的代码结构,也就可以从中抽取出函数名,函数参数等等。总的来说功能更加强大,但是,现成脚本不多。另外,vim还有两大致命弱点 。1.函数,变量补全。vim本身自带非常弱的补全功能,几乎就是在匹配出现过的字符串。如果,工程写的比较大,只有神才可能将所有的函数名,函数参数和变量名,都记下来。如果,反复的查找,那么就太低效率了。2.调试。在vim中是没有办法的,自己到外面找gdb吧。更加不明白为什么有人会喜欢用命令行调试,一次就只能看到那么几行代码,调试到哪了有时也犯糊涂,一点都不直观。相比较汇编调试,那是强上了百倍。

那为什么我还要想用vim,而不是vc呢?因为,vc太大了,一跑起来,机器都颤抖了。相比较vim就小的多了,而且十分喜欢它的简洁,不喜欢到处挂满对话框的样子。无论如何,至少他可以成为众多IDE的选择之一。

我这个做的还和一般人不太一样,一般人做的是linux平台,那个相对要简单一点,因为插件作者都是先考虑到linux,之后才是windows。但是,对于我而言,我只是看中了linux的命令行以及命令行中的工具。所以,希望在windows下实现这些,当然,在linux做,其实也是一个类似的过程。

vim中的调试:

在vim中实现调试有三种方案,vimdbg,clewn,pyclewn,下面的表格来自http://pyclewn.sourceforge.net/

Comparison of clewn, vimGdb and pyclewn

The following table lists the differences between clewn, vimGdb and pyclewn(clewn and vimGdb are hosted atclewn).

  vimGdb clewn pyclewn
platform unix unix

all unix platformssupported by python -requires GNU gdb frommacports on Mac Os X

Windows (python 3 only)

language C C

python 2.4 and above

python 3

C language for thepdb-clone pythonextension module, _bdb

vim mode vim in aterminal,gvim gvim gvim and vim in aterminal (vim 7.3or above required)
vim interface a vim patch a standalone programconnected to gvim witha netbeans socket

a standalone programconnected to vim witha netbeans socket

pyclewn may be startedfrom within vim sincevim 7.3

vim version a differentpatch foreach vimversion vim 6.3 and above vim 7.0 and above
debuggers gdb gdb gdb, pdb
gdb features  
  • watched variables
  • project file
  • tight integrationwith vim
  • gdb/mi interface
  • asynchronous gdbcommands
  • watched variables
  • project file
pdb features    
  • interrupt thedebuggee
  • attach to a runningpython process
  • the threadstackcommand

本文选择的是第三种,不单单说是第三种能力强大,也在于第一种我尝试在cygwin中重新编译vim,但是失败了。倒不是编译失败,而是运行vimGdb时,它说gdb fork 失败之类的,我想应该是cygwin还没有兼容到这种程度。我也想尝试第二种,但是它要求vim是gvim,但是这个在cygwin中,目前还做不到,因为它还没有移植gtk等桌面环境。不过,我看到cygwin,正在做这件事,在之后可以行了吧。所以,就只剩下第三条了,而且它官方自己都说支持windows,那么应该是可行了。不过,它说的windows并不是cygwin甚至连mingw也不行,而是指纯正的windows,就是安装windows版vim的,windows版python的。

安装过程:

基本就是官方的翻译(http://pyclewn.sourceforge.net/install.html)本文写于2013-3-29,可能未来下面软件的版本会发生变化。

  1. 下载python3.2,不要图新,新的未必支持。我就是下了3.3,然后安装了好几次都不成功。然后,正常安装即可。
  2. 下载python extension,注意要选择3.2版本,也就是要跟上面那个匹配。下载之后正常安装即可。
  3. 下载MinGW,然后正常安装。
  4. 下载vim,然后安装。之后,将vim.exe所在的目录加到环境变量PATH里面。
  5. 下载pyclewn,然后安装。如果,最后看到pyclewn postinstall completed。(在我的机器上,这句话在最右边。)那么说明安装成功了,否则就可能失败了,看看失败原因。成功后在vim中输入,:Pyclewn
  6. 贴张效果图,具体命令怎么使用还是看官方文档吧。

vim中的代码补全

网上关于vim中的代码补全讲的很多,但是很多都免不了有两个问题,就是补全的不准确和补全的不及时。补全的不准去指的是直接用出现过的单词去匹配,没出现的没法补全,函数参数提示就更没办法了。还有一种使用cscope或者是ctag的,两种都是对文档先进行语法分析,然后生成相应的文件。一来,对于文档中刚写过的它是分析不出来的,二来,对于复杂的表达式他也没有办法给出提示。总的来说,这些方法,相对于现在的IDE,就显得十分古老了。要想先进一点,有两种方案,一种是gccsense,另一种是clang_complete。他们的思想都是类似,要想准确的得到补全,只有编译器自己才知道。所以,必须要在后台,让编译器自己去分析代码,从他的语法树中获取有用的信息。gccsense需要编译gcc,但是,他需要很多前提库,我在cygwin下找了一下,也没有找全那个库。只能是第二种方案了,第二种的后端编译器用的是现在刚兴起的clang,它是可以在mingw中编译的。也可以参考原作者写的,https://github.com/Rip-Rip/clang_complete/wiki

  1. 编译clang之前,需要下载python2.7,否则clang编译不了。高版本的没有用的。确保python2.7能被访问到,可能需要加到环境变量PATH中。
  2. 编译clang,按照道理上说,我们可以去下载一个编译好了的clang,然后就可以了。但是,我找了官方的编译结果,结果却发现clang一编译东西,就弹出对话框说,它已经停止工作了。所以,就不得不自己编译了。耗时比较长,估计在2小时以上,因为,我是晚上编译的,所以我也不太清楚。具体编译过程,看一篇博文吧,它写的很清楚。http://bencode.net/clangonwindows。做完后,别忘了将clang所在的目录加到环境变量PATH中。
  3. 下载https://github.com/Rip-Rip/clang_complete中的文件,点那个zip就可以了。将文件解压缩到,vim安装目录中有个叫vimfiles的地方。其实也就是将zip文件中的plugin对应到vimfiles的plugin,doc对应doc。这样clang_complete就安装好了。
  4. 但是,它似乎有点问题。clang_complete需要调用一个叫libclang.dll的文件,但是clang中并没有这样的文件,它只有clang.dll。我的做法是,到那个plugin中的cindex.py文件中搜索,libclang.dll将其改为clang.dll。
  5. 在vim的~/.vimrc中加入
  6. let g:clang_complete_copen=0
    let g:clang_periodic_quickfix=1
    let g:clang_snippets=1
    let g:clang_snippets_engine='clang_complete'
    let g:clang_close_preview=1
    let g:clang_use_library=1
    let g:clang_user_options='-stdlib=libc++ -std=c++11 -IIncludePath'
    let g:clang_library_path='E:/MinGW/bin'
  7. 其中最后一个要改成你的clang。dll所在的路径,注意/\的区别,此处没有弄错。其他,参数可以参考它的帮助文档。这时候,只能祈祷可以使用吧!我也是看了它的源代码才知道出了什么问题,特别麻烦。此处所讲更多的是要点,还有其他的一些东西,可以参考其他人的博文,比如本文参考中的一些就不错。
  8. 别忘了将python3.2加入到PATH中,而将python2.7取消掉,否则前面的调试可能出问题。
  9. 来张效果图:

后记:

在linux下做这个就十分的麻烦,在windows下就更麻烦了。经过了十多个小时的折腾,终于是将这两个功能都弄好了,就算是弄到这样子,还是与现在的IDE有一定的距离,他们在这些方面做得更为的自然。但不管怎么样,好歹这是可以称得上是比较现代的IDE了,剩下的更多是发挥vim本身的可定制性的时候了。它也可以成为IDE的选择之一了。但是,话又说回来,又有多少人愿意如此复杂的去配置一个东西呢,结果也只是得到了别人随随便便就能用上的功能。思考之后就形成了,刚写的博文,IDE的本质。之后,安装了一个之前没用过的IDE,netbeans想用来写PHP。它界面华丽,功能强大。我越发的觉着,到底有多少人会愿意花费巨大的时间,仅仅只是为了可定制性呢?恐怕是很少吧。


参考:

pyclewn的用法:http://easwy.com/blog/archives/advanced-vim-skills-vim-gdb-pyclewn/

clang_complete:http://www.cnblogs.com/egmkang/archive/2011/02/20/clang_complete.html

clang_complete:http://www.pleee.com/archives/426.html

clang_complete作者写的:https://github.com/Rip-Rip/clang_complete/wiki

将vim进一步打造成IDE:http://blog.csdn.net/wooin/article/details/1858917

另外一个将vim打造成IDE:http://blog.csdn.net/yangyang_gnu/article/details/6642271

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章