从vim更新cscope数据库

23

我在vim中使用cscope。当对多个文件进行大规模编辑时,cscope会报告已更改文件的旧行号。 如何在不丢失已打开标签/窗口和与cscope引擎的连接的情况下从vim重新构建cscope数据库?

  • 已在vim中打开的标签/窗口
  • 与cscope引擎的连接

谢谢。


1
请查看:http://vim.wikia.com/wiki/Automatically_create_and_update_cscope_database - Pierz
5个回答

33

首先,您需要更新cscope数据库。

:!cscope -Rbq

然后,从 vim 重新初始化数据库。

:cs reset

当已经存在一个到cscope数据库cscope.out的连接时,cscope会创建另一个ncscope.out。如何替换旧的数据库?我正在使用Windows cscope端口。 - Michal Čizmazia
错误:"cscope:命令行和旧符号数据库之间的-q选项不匹配" - ransh

9

在之前的答案基础上,将以下内容添加到您的 .vimrc 文件中:

map <F5> :!cscope -Rb<CR>:cs reset<CR><CR>                                      

然后在vim中使用F5进行刷新。

-b = 仅构建交叉引用。 -R = 在搜索源文件时递归子目录。


4

cscope_dynamic

cscope_dynamic可以满足您的所有需求,甚至更多:

  • 打开vim时自动加载数据库。
  • 如果存在本地cscope数据库,则加载该数据库,而不是全局数据库。
  • 处理连接错误。
  • 自动保存数据库更改。
  • 它非常快,特别是在处理大型源代码时。

为什么它更快?

它使用两个数据库:

  • 小数据库:经常更新,变化很小,因此速度非常快。
  • 大数据库:通过将小数据库合并到大数据库中来较少频繁更新。

编辑:Feb17: 删除旧答案,因为cscope_dynamic已全部包含。


2
我使用一个脚本,在后台不断地建立我的索引:
" We need to setup the function that reset cscope.
"You could define this in your vimrc instead.
vim --servername GVIM --remote-send ":function! ResetCscope()<CR>cscope reset<CR>endfunction<CR>"

while true ; do
    echo building...

    ctags -R
    cscope -Rbk
    vim --servername VIM --remote-expr "ResetCscope()"

    echo done. sleeping.
    sleep 1m
done

这段话的翻译如下:

(实际情况比那个复杂得多。)

如果你使用 vim --servername VIM 启动了 vim,那么 vim 调用应该会重新加载 cscope 数据库。(我使用 后台命令 运行 cscope 查询,所以对此不是很确定。该命令会独立地启动 cscope,而不使用 Vim 的连接。)


1
哎呀,我忘记了,由于我使用巨大的cscope数据库需要几秒钟才能搜索,所以我很少直接调用vim的cscope命令。我已经更新了答案以重置cscope连接。 - idbrii

2

最近在Windows上的gVim 8.0中尝试了这个功能,但即使进行了cs重置,vim仍然会锁定cscope.out,以至于cs无法在vim打开的情况下重新生成cscope.out。

在这种情况下,我添加了以下额外的映射(例如F12),它可以终止当前的cscope连接,以便使用F11重新生成cscope.out,而无需关闭vim。希望这能对某些人有所帮助。

map <F11> :!cscope -Rbq<CR><ESC>:cs add cscope.out<CR><CR> 
map <F12> :cs kill cscope.out<CR><CR>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接