vim+cscope时自动更新cscope的数据库文件

在linux环境下vim和emacs是当仁不让的主流编辑器。现在记录一下本人使用vim时遇到的一个问题(如题),和解决方法。

        vim只是一个编辑器,如工程中的符号跳转、符号搜索等功能它并不具备。那么在阅读kernel等大型工程的时候单纯用vim是不方便的。那么就需要借助 cscope进行上述功能的补充。如果只是代码阅读,则一次生成数据库就可以了,但是如果是在正常的开发过程中,需要经常对文件进行修改就会发现有一个麻 烦。

        那就是cscope并不会自动更新它的数据库,如我们新增或者删除某个函数后并不会体现到当前连接到vim中的这个数据库里。此时将出现跳转失败等问题。

        而source insight等工具是能够自动更新其数据库的,我们的修改可以实时被其看到而不出现跳转失败等问题。那么能否让系统也自动更新cscope的数据库呢?当然可以,当然了,cscope是不能自动更新的,那么就需要依赖于操作系统了,下面将从windows和linux两方面说一下本人自动更新的实现。

        一、windows:stackoverflow 中了解到,GVIM有一个server/remote工作模式。即在gvim外部向vim发指令让其做某些事情。我们知道,windows下某个文件被打 开后是不能再对它进行操作的。数据库文件cscope.out一但被连接到vim那么就不能再对该文件进行操作了。那怎么办呢,此时就需要用到上面说的方 法了。需要让vim知道我们将要更新数据库了,需要它先断开连接,更新完成后再重新连接,这样就完成了一次完整的更新了。在windows中当然是使 用.bat文件做这样事情了,我实现上述功能的代码如下:

首先需要实现vim需要干事的函数(在_vimrc文件中添加下面两个函数):

1:断开scope数据库连接

function! disable_cscope()
cs kill -1
endfunction

2:重新连接scope数据库(我的数据库在E:\Linux_kernel\linux-2.6.11.1\目录中)

function! connect_cscope()
cs add E:\Linux_kernel\linux-2.6.11.1\cscope_bak.out
endfunction

3:后台更新数据库的bat文件

@echo off
%2      //进入运行文件时传入的第二个参数指示的盘
cd %1    //进入第一个参数指定的具体目录
:loop
del cscope.out cscope.files    //删除老的数据库文件
echo "cscope db create"
dir /s /b *.c *.h > cscope.files    //生成文件列表
cscope -Rbqk    //生成数据库文件
cmd /c vim --servername gvim --remote-expr "disable_cscope()"    //发指令让vim断开cscope连接
copy %1\cscope.out %1\cscope_bak.out    //拷贝cscope.out为cscope_bak.out
cmd /c vim --servername gvim --remote-expr "connect_cscope()"    //发指令让vim重新连接数据库
echo sleep 180s
ping -n 180 localhost >nul    //通过ping本机实现延时,时间自定
goto loop
@echo on

代码解释:

1、 其中一个值得解释的地方是重新连接的是cscope.out的副本,而不是原件,这样做的目的在于,不让vim断开连接太久。首先我们是删除了数据库文件 才开始再生成的,如果连接的是原件,则在删除之前就需要断开连接,且生成文件列表和数据库上非常耗时的,这样就会导致vim中长时间没有cscope的数 据库连接而让人忍受不了。使用了副本就只需要等到数据库生成后,断开连接,进行一次拷贝,再重新连接一次副本。这个断开的时间非常短,人是感觉不到的。

2、另一个值得解释的地方在于运行文件的时候需要传入参数,如:我的bat文件名叫auto_load_cscope.bat,而我的工程目录在E:\Linux_kernel\linux-2.6.11.1\中,我运行文件的方法是在cmd中进入auto_load_cscope.bat所在的目录后输入auto_load_cscope.bat E:\Linux_kernel\linux-2.6.11.1 E:即可更新E:\Linux_kernel\linux-2.6.11.1中的工程。通过参数运行文件的好处在于非常的灵活,通过参数可以做非常多的事,比如同时打开多工程都是可以实现的。

二、接下来就到linux了,在linux中会简单得多,因为它可以操作打开的文件,它可以不需要断开连接就能复制数据库文件。

        在linux中我们使用.sh文件进行后台运行,代码如下:

#!/bin/bash
cd $1
while :; do
rm -f cscope.out
cscope -Rbqk
cp cscope.out cscope_bak.out
sleep 180s
done

解释:

1、在linux中打开vim后需要手动连接数据库的副本,以后就高枕无忧了。

2、同样使用参数运行.sh文件:进入.sh文件的目录后输入命令./auto_load_cscope.sh /home/jiang/work/Linux_kernel/linux-2.6.11.1/ &即可。

3、在linux中没有打开的文件不能操作的限制后,进行多工程编辑将比windows下容易得多,直接用不同的参数运行多次.sh文件,并打开不同的工程即可。

到此,我的实现就完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值