CSCOPE使用中问题小解

拥有了某种工具,往往不等于就能使用好这种工具。拥有工具简单,用好工具、发挥出最大作用则较难。CSCOPEVIM的使用者有了与SourceInsight"平起平坐“的机会,但是能否将CSCOPE的功能发挥出来还要看你是如何使用它了。

自从VIM”重装上阵“以后,我一直在使用CSCOPE。在使用过程中还是发现了一些”别扭“的事情。一般我会在一个大型Project的源代码的顶层目录使用CSCOPE -Rbq来生成cscope.out文件,如果你在cscope.out所在目录执行VIM的话,VIM会优先将cscope.out作为”符号交叉索引库“(与ctags相比),但是如果你在某个子目录下执行VIM进入编辑状态的话,因当前目录没有cscope.out,所以VIM无法加载cscope.out文件,也就无法在文件间跳转。而必要时你还需要手动执行命令行:cs add {TOP_LEVEL_PATH}/cscope.out才能连接到cscope,发挥其功用。

还有一种情况,如果你有两份基本相同的代码库,其中一份A建立了cscope.out文件(在A的顶层目录使用CSCOPE -Rbq),而另一份B没有建立,当使用B查看代码或编写代码时,手动add A库的cscope.out文件,然后打开B库子目录的一个文件,找到一个符号,用ctrl+]进行跳转,VIM会列出符号列表,当你选择一个时,VIM却提示你“E429: File xx/yy.h does not exist”,原因很简单,就是Cscope以相对路径存储了符号的位置,你从B库的工作目录下当然跳不过去了。

现在我们就要解决这两个问题,我们要做到:
1) 无论在任何目录下执行VIM,VIM都会自动加载当前阶段常用的cscope.out,而无需手动加载;
2) 让cscope.out内的符号以绝对路径的形式存储,这样无论在何处进入VIM,都能跳转到相应的符号定义的文件中;

其实解决上述两个问题的方法有多种,这里只是先说说我的一种方法,估摸着还不是最优的。在cscope官方有篇文章“Using Cscope on large projects”,里面关于cscope.out生成的方法可以解决第二个问题,即使用cscope.files来生成cscope.out。cscope.files中的内容很简单,就是文件列表,将你要进行扫描的所有文件的路径cscope.files中,然后执行cscope -bqk即可得到cscope.out。如果你要解决问题2,那你就将要进行扫描的文件的绝对路径名加入到csccope.files中。用find命令可以轻松帮你做到这一点。这里将这个工作放到了一个shell脚本中去完成了,脚本具有一定的通用性(我的脚本水平:菜鸟级^_^):
/* gen_cscope_files.sh */
#! /bin/bash

TARGET='/export/home1/username/cscope_db/cscope.files'
gen_cscope_files_usage() {
        echo "gen_cscope_files.sh 源码顶层目录(绝对路径) 待扫描子目录1 [待扫描子目录2] … [待扫描子目录N]"
}

if [ -z ${1} ]; then
        echo "请输入起始目录!"
        gen_cscope_files_usage
        exit 1
fi

if [ ${1:0:1} != '/' ]; then
        echo "请输入起始目录的绝对路径形式!"
        gen_cscope_files_usage
        exit 1
fi

if [ ${#} -lt 2 ]; then
        echo "请输入你要扫描的子目录列表!"
        gen_cscope_files_usage
        exit 1
fi

if [ -s ${TARGET} ]; then
        cat /dev/null > ${TARGET}
fi

for dir in $@
do
        if [ ${dir} != ${1} ]; then
                find ${1}/${dir} \
                -name "*.[hc]" \
                -print >> ${TARGET}
        fi
done
这样你只要选择好你的cscope.files的存放位置(在上面的脚本中是写死的,当然你也可以修改脚本,通过命令行参数传入cscope.files的存放位置),给gen_cscope_files.sh一个源码的顶层目录(绝对路径),再给出你要扫描的子目录列表即可,比如:gen_cscope_files.sh /export/home/username/proj/foo  include src

以上解决了问题2,那问题1呢?我们在.vimrc中做文章。以下代码保证了每次vim被执行后都会将上面生成的cscope.out加载。
if has("cscope")
        if filereadable("/export/home1/username/cscope_db/cscope.out")
                cscope add  /export/home1/username/cscope_db/cscope.out
        endif
endif

到目前为止,你在B库中在任意目录下打开的文件都可以找到相应符号的位置。

梅西·国王低靡巴萨亦低靡

无轮2008-09赛季巴萨最终拿到零冠还是一冠,亦或两冠还是三冠,2009年二月份的下半月注定都是让巴萨众将士以及全世界的巴萨球迷们难以忘怀的日 子。两平一负,这样的战绩即使是在瓜迪奥拉执教巴萨的联赛初期都不曾有过,要知道巴萨在本赛季联赛前三轮的磨合期期间也是拿到了一胜、 一平、一负的。

2009年2月15日,洛佩拉球场险平贝蒂斯;
2009年2月22日,诺坎普主场26年来首负“副班长”西班牙人;
2009年2月25日,法国日尔兰球场逼平法甲王里昂。

要说与贝蒂斯一役, 巴萨受“FIFA病毒”影响较大还有情可原。场上的巴萨球员也的确尽显“疲态”。瓜帅安排梅西下半场出场也主要是为了摆出“震慑”的牌子,没有动真格的意 思,梅西亦心灵神会。出场不久就从右路转移到中路,扮演上了组织者的角色,显然这样的梅西在场上的威胁程度要笑了许多。但巴萨还是幸运,凭借埃托奥的发挥 勉强获得了一场平局。这一轮让皇马趁机追上2分;10分差距让球迷还继续保持乐观。

接下来巴萨众将士难得的整整修正了一周,梅西也得以充足了“电”。巴萨在诺坎普以几乎全部主力首发迎接“副班长”西班牙人的挑战。都说“德比”难打,这次 巴萨的经历再次印证了这一点。西班牙人正确的战术严重遏制了巴萨的中前场进攻,甚至可以说让巴萨的前后场出现脱节。前场不能给对手足够压力的情况下,巴萨 的后场防守也“乱”了起来。先是阿比达尔受伤下场,接下来就是凯塔红牌被罚下,最后“黄油手”巴尔德斯鬼使神差的为对手献上“大礼包”。本场“充满电”的 梅西没能如大家期望的那样有出色发挥,除了左路一脚任意球帮助图雷在混乱中打入一粒挽回颜面的进球外,梅西似乎失去了以往的灵性,突破减少,失误却相对增 多。在右路与阿尔维斯的配合也大不如以前默契和犀利了。右路突破受阻,梅西换位到左路和中路,由于队友同样低靡,所以梅西不能得到足够的支持。足球终究还 是11个人的运动,缺了队友的强力支持,即使是拥有球王般禀赋的梅西又能如何呢?1:2的比分保持到了终场,也许这场失利是大家赛前都没有预料到的,以前 那个场均>3个进球、已经许久没有尝过失败是什么滋味儿的热的发烫的巴萨居然在自己的主场,在家门口毫无脾气的彻彻底底的输给了对手,还损失了两元 大奖-阿比达尔和凯塔,也许大家心里面短时间还转不过这个劲儿来。皇马趁机将积分差距缩小为7分。巴萨的优势岌岌可危了。

img{512x368}
梅西,突破才你的利器

img{512x368}
让突破在犀利些吧

三天后,巴萨带着一平一负的郁闷战绩飞抵法国,迎战法甲王里昂。全世界的巴萨球迷都希望巴萨能在欧洲战场上出口恶气,冲冲霉运。特别是有梅西这个里昂“克 星”助力。但比赛过程再次与大家开了个玩笑,巴萨还是在先丢球后,惊险的由亨利扳平,客场也算是全身而退吧。被寄予厚望的梅西表现依旧低靡,在高大的意大 利伟大的左后卫格罗索的防守下,梅西毫无脾气,几次一对一的突破都让格罗索“合理”的断掉,裁判也毫不理会梅西的抗议。在右路受阻的梅西情绪上有所波动, 失误就更加“频频”了。上半场里昂几乎掐断了巴萨的前后场,巴萨无奈只能频频从后场直接发动进攻,而远离对方禁区的梅西、亨利和埃托奥组成的三叉戟在这样 的进攻模式下几乎处于停滞状态。巴萨从第40分钟开始恢复状态。下半场巴萨没有给里昂机会,梅西同样也没有得到进球的“好机会”。

img{512x368}
同一支巴萨,不同的状态

img{512x368}
哪里跌倒,就要在哪里爬起来

这三场比赛,瓜帅的调兵遣将和临场指挥也受到了质疑,但是对于年轻的瓜迪奥拉而言,失败往往让他能更多更快的认识到目前巴萨还不是最好的,还有很长的路要走,而他自己也能在“失败”中更快的成熟起来。

“不在沉默中爆发就在沉默中死亡”,明天凌晨巴萨客场调战马德里竞技,巴萨需要胜利来恢复自信心,梅西同样需要进球来证明自己是名副其实的巴萨国王。毕竟中国有句俗话:“再一再二不能再三再四”。

img{512x368}
我会回来的


微博:@tonybai_cn
微信公众号:iamtonybai
github.com: https://github.com/bigwhite

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats