使用cscope在VIM中浏览Python代码?

19

有人成功地在Python代码中使用cscope吗?我已经安装了VIM 7.2和最新版本的cscope,但它不能正确地检索我的代码标记(总是偏了几行)。我尝试了pycscope脚本,但它的输出不被现代版本的cscope支持。

有什么想法吗?或者用于浏览Python代码的VIM替代品?(我特别对cscope提供的除ctags简单标记外的额外功能感兴趣)


你有没有考虑简单地修复pycscope?我还没有看过需要做什么,但我想象它不会太困难。另外,你可能想要更新你的问题,提到像你的博客文章所说的那样,cscope被Python注释搞糊涂了。 - ssokolow
1
@ssokolow:修复pycscope的问题在于,cscope使用的“DB”格式没有文档记录,并且根据cscope的维护者所说,这是有意为之的。 - Eli Bendersky
啊。那将是不愉快的。我得考虑在那种情况下尝试什么解决方案。 - ssokolow
1
即使尝试修改cscope也是一场灾难。我可以找到用于识别注释的代码,但我认为在注释代码中包括#和"""会很混乱。也许最简单的方法是预处理源文件并剥离注释(用空行替换它们)。但是,这样做并不好玩,因为cscope无法使用标准输入。 - GWW
Doxygen原生仅支持C和Java,但通过PREFILTER选项,它可以处理任何编程语言文件。需要为该语言编写过滤应用程序。我还提交了(作为[补丁#3413344](https://sourceforge.net/tracker/?func=detail&aid=3413344&group_id=6556&atid=306556)),prefilter选项给ctags。也许在cscope中也有这个选项会很好。 - Jarekczek
6个回答

18

编辑:我将逐步介绍该过程:

准备资源:

exuberant ctags有一个选项:-x

   Alternatively,  ctags  can generate a cross reference file which lists,
   in human readable form, information about the  various  source  objects
   found in a set of language files.

这是解决问题的关键:

 ctags -x $(ls **/*.py);                  # replace with find if no zsh

这将为您提供已知格式的源对象数据库,其描述如下

 man ctags;                               # make sure you use exuberant ctags!

Gnu Global并不仅限于“开箱即用”的文件类型。任何常规文件格式都可以使用。

此外,您可以使用gtags-cscope(在手册的第3.7节中提到),作为使用gtags的可能快捷方式。您最终将获得一个ctags表格文件输入,Global/gtags可以解析以获取您的对象,或者您可以使用已知格式的ctags文件和pycscope源码一起来获得vim cscope命令的输入。

无论哪种方式,都很容易实现。

也许你更喜欢idutils?

这肯定是可能的,因为

pypi上的z3c.recipe.tags

同时使用ctags和idutils为buildout创建标签文件,这是我将很快调查的方法。

当然,您始终可以使用下面的greputils脚本,它支持idutils,我们知道idutils与python兼容,如果失败,则还有一种名为vimentry的东西使用python、idutils和vim。

参考链接(不完整列表):

希望这可以帮助您解决问题,它确实帮助了我。如果没有Gnu global,今晚我会非常失落。


GNU Global不支持Python,grep工具显然不是我要找的...你为什么要链接到pycscope的源代码? - Eli Bendersky
1
为什么要使用$(ls **/*.py)而不是单独使用**/*.py?据我所知,在zsh中它们是等效的,并且都会扩展到所有子目录中匹配文件的列表。 - Dave Kirby
1
我决定授予你赏金,因为你已经做了大量的研究,试图帮助我解决问题。在 Stack Overflow 上继续保持良好的工作。 - Eli Bendersky
“something called vimentry” - 这是指 exVim 吗,它有 your_project.vimentry 文件吗?这是我从谷歌搜索中找到的全部内容。 - Mu Mind

18

在我看来,这似乎起作用:

切换到您的 Python 代码的顶层目录。创建一个名为cscope.files的文件:

find . -name '*.py' > cscope.files

cscope -R
你可能需要先执行 cscope -b ,如果交叉引用未能被正确构建。

2
太棒了!这个技巧也适用于PHP,对我来说是这样的:(“在vim中使用PHP和cscope”): find . -name '*.php' > cscope.files && cscope -Rb -- -b 用于保存结果(在cscope.out中并在vim中使用)。 - tron5

12
  1. 根据与cscope维护者的通讯,该工具并不适用于Python,并且没有计划实现其兼容性。目前能够使用的部分是出于偶然,不能保证它会一直正常工作。
  2. 看起来我一直在使用一个过时的版本的pycscope。最新版本0.3已经支持cscope数据库。 pycscope的作者告诉我他通过阅读cscope的源代码找到了cscope数据库的输出格式,虽然这个格式没有被故意记录下来,但当前它仍然可以与pycsope 0.3一起使用,这是我将使用的解决方案。

“耸肩”你想要一个cscope的替代品,那就是idutils。它们执行类似的任务。 - chiggsy
据我所知,idutils更多地是用于取代“grep”,而不是用于替换“cscope”。 - Eli Bendersky

2
有一个很棒的Python-mode-klen插件。如果您已经安装了它和rope(Python重构库),那么转到特定术语的定义就像<C-c>g<C-c>rag一样简单(第一个是文件类型映射,第二个是全局映射)。还有更多有用的功能,对我来说有些是无用的。所有这些都可以禁用。在cscope-intro的问题列表中找到的功能:
这个符号在哪里使用? <C-c>f。虽然有点令人困惑,因为快速修复列表中的结果显示为-而不是实际行数(尽管它们指向正确的位置)。也许会被修复。
它定义在哪里?这个全局符号的定义是什么?这个函数在源文件中的位置在哪里?<C-c>g <...> 全局符号的定义是什么?<C-c>raj 不是很多,但我不是一个太有经验的ropevim用户。

我在他们的文档中找到了<C-c>g,但没有找到<C-c>f。您能否提供参考或按下<C-c>f时调用的实际命令? - Yoni Zohar
@YoniZohar https://github.com/klen/python-mode/blob/a92bfa476467822e5723edb689cb1e80c13da52d/plugin/pymode.vim#L221,然后查看https://github.com/klen/python-mode/blob/a92bfa476467822e5723edb689cb1e80c13da52d/ftplugin/python/pymode.vim#L139。我不记得最初是在哪里获得这个映射的,`git log --patch doc/pymode.txt`显示它从未出现在文档中。 - ZyX

0

0
我得到了和你一样的问题,经过在互联网上浏览后,我找到了解决方法:
创建一个Python脚本:cscope_scan.py
import os

codeRootDir = os.getcwd()

__revision__ = '0.1'
__author__ = 'lxd'

FILE_TYPE_LIST= ['py']

if __name__ == '__main__':
    import os
    f = open('cscope.files','w')
    for root,dirs,files in os.walk(codeRootDir):
        for file in files:
            for file_type in FILE_TYPE_LIST:
                if file.split('.')[-1] == file_type:
                    f.write('%s\n' %os.path.join(root,file))
    f.close()
    cmd = 'cscope -bk'
    os.system(cmd)

在您的代码根目录下执行此脚本,它将生成cscope.files文件,然后执行cscope -b命令。我不知道我的电脑出了什么问题,最后两行代码不能正常工作,但我认为手动输入cscope -bk是可以接受的:)


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