如何在Vim中查找变量的所有出现?

14

在vim中,如何查找特定目录下所有文件中变量的所有出现次数?

我知道vimgrep有时可以工作,但它只查找文本,如果其他类具有相同名称的变量并且我只想要特定类别下的变量,则无法使用。

我该怎么做?还是应该使用IDE代替?


1
使用集成开发环境(IDE)。Vim仅使用基本机制,如正则表达式或二进制搜索:它无法像IDE一样理解您的代码。 - romainl
你使用哪些编程语言?cscope 的建议对于类 C 语言很好,但对其他语言来说可能不太适用。 - David Pope
2个回答

18

当你已经有一个编辑器的时候,为什么还要使用另一个IDE呢?Vim是一个可配置的IDE,适用于不同的语言。

你可以使用cscope建立代码数据库。这个数据库

  • 允许搜索代码中:
    • 所有符号的引用
    • 全局定义
    • 被函数调用的函数
    • 调用函数的函数
    • 文本字符串
    • 正则表达式模式
    • 一个文件
    • 包含一个文件的文件

Cscope的其他特点:

以下是翻译:
  • 基于Curses的(文本屏幕)
  • 生成信息数据库,以便更快地搜索和日后参考
  • 模糊解析器支持C语言,但足够灵活,可以用于C ++和Java,并用作广义的“grep数据库”(使用它浏览大型文本文档!)
  • 具有命令行模式,可用于脚本中或作为GUI /前端的后端
  • 可在所有Unix版本上运行,以及大多数垄断控制的操作系统。

一旦创建了您的数据库,您就可以浏览变量、函数等的用法。


编辑(略有偏题):
在编程时,与Vim一起使用的另一个很酷的东西是 Ctags 使用的 taglist 插件:
“标签列表”插件是Vim源代码浏览器插件,提供了源代码文件结构概述,并允许您高效地浏览不同编程语言的源代码文件。

+1 给 cscope,它真的很棒。我通常都会一直打开一个终端标签来使用 cscope。 - alesplin
1
尽管vim可以被视为集成开发环境(IDE),但是将其设置为像IDE一样的行为需要非常陡峭的学习曲线。实际上,一个人需要理解vimscript和.vim文件夹以及它们如何同时使用。 - puk
如果您使用vim的内部:make命令,如果有警告或错误,您可以使用:cnext跳转到该警告/错误。它会显示问题所在,并且甚至会将您带到该行的正确位置。当然,您需要构建一个Makefile,但这并不难制作,尽管可能需要学习。但即使如此,一旦您掌握了,就会很容易。 - Pryftan
谢谢,受益匪浅。 - linjiejun
vim 项目浏览插件包括cscope、taglist和ctags。 - linjiejun
显示剩余4条评论

10

cscope逐步示例

进入您的项目基本目录,然后运行:

cscope -Rb

这将生成一个cscope.out文件,其中包含解析信息。即使对于像Linux内核这样的大型项目,生成速度也相当快。

请注意,cscope不是为除C语言之外的其他语言设计的。有时它可以用于其他类似C语法的语言,如Python,并且您可以通过一些技巧(例如cscope -Rb -s *和其他一些在Using cscope to browse Python code with VIM?中提到的方法)强制其识别这些文件,但是它不能像处理C语言那样有效地工作。

打开vim并运行:

:cs add cscope.out
:cs find s my_func

s 是符号的助记符。其他提供的 cscope 查询也是可能的。

在 Vim 之外,cscope 接口还具有变量赋值查询(符号出现的子集),而 Vim 似乎没有提供此功能 (?)

这将向快速修复列表添加调用者列表,您可以使用以下命令打开:

:copen

跳转至您感兴趣的行并按回车键。

另请参阅:


cscope -Rb does not work, you should use cscope -Rb -s * - minerals
@minerals,你能否给出一个最小的项目示例,其中不使用“-s”无法工作?我不确定该选项的含义。 - Ciro Santilli OurBigBook.com
在任何基于Python的项目目录中,进入该目录并运行cscope -Rb命令,您应该会看到“cscope:未找到源文件”的消息,cscope.out文件也不会被创建。相反,请运行cscope -Rb -s *命令,这样就会创建cscope.out文件。 - minerals
1
@minerals 这篇文章说cscope并不适用于Python:https://dev59.com/questions/LnA65IYBdhLWcg3wogEb#3779871 我已经添加了澄清。 - Ciro Santilli OurBigBook.com
语言服务器在开箱即用时提供了更好的支持,因此本帖中的答案大多已经过时。 - Waqar

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