dwrdx

导航

Windows下的VIM - 如何自动在后台更新cscope数据库文件

在VIM中使用cscope编辑代码的时候,会遇到以一个恼人的问题,当你对一些文件进行修改啊修改
啊的时候,忽然发现,通过cscope已经无法准确定位到一些symbol的位置,新增加的symbol也无
法进行快速的浏览,因为,cscope的数据文件不会自动更新,很长一段时间我都在忍受这种不便
,终于有一次,我要对一些源代码进行大幅度的重构,这次不能再停留在原始社会了,下决心搞
定在,在stackoverflow里边,搜到一个只星半点的方法,链接在这里:
http://stackoverflow.com/questions/2744010/update-cscope-db-from-vim
因为cscope.out的数据文件在被使用的时候是无法更新的,因此我们需要一种方法能够在正常使
用VIM的情况下,自动将cscope的连接终止,这样,我们就可以通过一个服务程序去更新这个文件
,在更新之后能,我们还需要能够在不需要人为干预的情况下,将这个数据文件add回VIM环境。
这就是大体的思路了,这就是stackoverflow里边那个回答的思路,于是按照这个思路往下走,
VIM里边有一个remote和server的工作模式,可以在VIM外边通过remote(VIM实例)发送命令给
server(VIM实例),这为我们在不认为干预的情况下,断开/增加cscope连接提供了可能,于是剩
下的事情就很简单了。
首先,我们需要在VIM里边增加两个函数,我给他们分别定义为KillCscope和AddCscope,第一个
用来断开cscope连接,后一个用来建立cscope连接,代码如下:
function! KillCscope()
cs kill -1
endfunction

function! AddCscope()
cs add cscope.out
endfunction

然后,就可以进行数据库自动更新的代码的实现了,我采用的是windows下的batch,环保实用:

@echo off
title Updating %PROJECT_NAME% cscope database
:loop
cmd /c vim --servername %1 --remote-expr "KillCscope()"
@echo off
call GenCscope.bat
@echo off
cmd /c vim --servername %1 --remote-expr "AddCscope()"
echo sleep 140s
ping -n 140 127.0.0.1 >nul
goto loop
@echo on

这个程序很简单,就是一个无限循环,定时去断开cscope连接,然后更新数据库文件,然后重新
建立连接,其中cmd /c vim --servername %1 --remote-expr "KillCscope()",其实就是发送一
个remote命令给名字为参数%1的server,让其执行KillCscope函数,而GenCscope.bat这个batch
文件就是实现对cscope数据库的更新,这个文件怎么写,我在前边的博文中有提到,而且网上随
便一搜一堆,自己也可以去看cscope的帮助,最后通过ping -n 140 127.0.0.1 >nul实现延时,
延时的长短可以根据个人的习惯来进行调整,因为,在更新数据库的时候,会有一小段时间是无
cscope连接的,所以这个时间不宜设置的过短。

最后,我们需要的只是在什么时候去启动更新脚本了,我map了F11键给这个动作,在我仅是阅读
代码的时候,并不需要进行背景更新,所以,可以通过这个键来实现启动。

这段VIM函数如下:
map <F11> :call UpdateCscope()<CR>

function! UpdateCscope()
silent execute 'AsyncCommand continuous_build' .' '. v:servername
endfunction
其中这里用到了AsyncCommand这个插件,它可以很方便的脱离VIM,调用cmd命令,并且不需要我
们进行额外的按键等操作。

本次的这个主题就这些内容了,希望大家happy vimming

posted on 2012-01-07 14:13  Rdwrdx  阅读(2193)  评论(0编辑  收藏  举报