grep命令的功能是在文件中搜索与字符串匹配的行并输出_技术成长日记-Vim实用技巧-4.8符号搜索...

1. ctags工具简介及使用

ctags工具根据源码文件生成一个tag文件,在tag文件中可以搜索函数、变量、类成员、宏等符号,文本编辑器或其他工具可以根据tag文件很容易且快速的定位符号定义位置。它支持C、C++、Java、Python等多达41种语言,是代码搜索利器。Ubuntu安装exuberant-ctags的命令:

sudo apt install exuberant-ctags

a. 生成符号文件

进入源码根目录,执行"ctags -R *"。

b. tag符号搜索

4c29f36d9dc14f5630de64c711d1f9e1.png

2. cscope插件介绍及使用

cscope是一个代码浏览工具。通过它生成的符号数据库,可以搜索符号的声明、定义、函数调用关系、文件、字符串等。它囊括了ctags的功能,要比ctags强大很多。Ubuntu下安装cscope的命令:

sudo apt-get install cscope

a. 生成符号文件

进入源码根目录,执行"cscope -bqR"

b. 符号搜索

c90837701e9b07a1aca8894f5925a3af.png

c. 在vimrc文件中配置cscope

if has(“cscope")
    "设置cscope二进制可执行文件的绝对路径
    set csprg=/usr/local/bin/cscope
    "优先搜索cscope的符号文件
    set csto=0
    "使用:cstag命令代替:tag/ctrl - ]/vim -t等命令,如果vim加载了cscope的数据库
    ":cstag命令实际执行的是”cs find g”
    set cst 
    "不打印cscope所产生的额外信息,也就是在加载cscope数据库时不打印冗余的log
    set nocsverb
    "加载当前路径的cscope数据库文件
    if filereadable("cscope.out")
        cs add cscope.out
    "如果cscope.out不存在于当前路径,加载环境变量CSCOPE_DB指定路径的cscope符号数
    "据库
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif
    "恢复csverb的初始值
    set csverb
endif

d. 用quickfix显示cscope的搜索结果

‘cscopequickfix’选项用于控制是否把cscope的输出结果显示在quickfix窗口。’cscopequickfix’包含多个控制子选项,它们是a,c,d,e,f,g,i,s,t,分别对应cscope find的a,c,d,e,f,g,i,s,t等选项。所以可以把下面命令添加到vimrc文件中:

:set cscopequickfix=s-,c-,d-,i-,t-,e-,a-

每个选项后的’-’表示字cscope有新的输出结果时清除旧的搜索结果。’+’表示新的搜索结果追加到已有的搜索结果后面。’0’表示该子功能不使用quickfix。

e. 给cscope命令定义快捷键

nmap <C->s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C->g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C->c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C->t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C->e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C->f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C->i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C->d :cs find d <C-R>=expand("<cword>")<CR><CR>
nmap <C->S :cs find t struct <C-R>=expand("<cword>")<CR> {<CR>

可以把这些映射放在vimrc文件。他们的用法是先将插入符移动到要查找的符号上,然后同时按住CTRL和键后松开,马上再按a,c,d,e,f,g,i,s,t序列中的一个字母实现相应的搜索功能。

3. Vim中的grep使用

Vim可以使用内部和外部的grep进行字符串搜索,内部为命令为:vimgrep,外部为:grep。在执行:vimgrep或:grep命令时,Vim会把查询结果默认输出到在quickfix窗口,可以很方便的浏览搜索结果。quickfix的用法请参考3.22节 quickfix。通过如下命令:grep实现对某个目录的递归搜索:

:grep[!] -r ‘pattern’ *

默认情况下,在grep执行完成后,Vim自动跳转到匹配的第一个条目,如果你不需要自动跳转,需要在grep后加一个’!’。

vimgrep的用法不同于:grep,格式如下:

:vimgrep /pattern/[g][j] **

所以vimgrep的样式放在两个斜杠之间,后面紧跟控制字符。’g’表示获取同一行的多个匹配字符串,否则只获取一个匹配。’j’表示默认不跳到第一个匹配的位置,否则自动跳转。两个**表示递归查找。

vimgrep和grep的区别主要在于,vimgrep在不同平台的兼容性更好,而外部grep在于速度上的优势,对两个命令的更详细的描述请查询:help grep。

经过实验,vimgrep速度太慢不建议使用。

4. taglist插件的使用

taglist插件是一款代码浏览插件,它主要的功能有:

  • 列出buffer中的变量、宏、函数、类等符号
  • 自动更新列表
  • 选择符号时自动定位到符号定义的位置
  • 支持当前符号高亮
  • 支持多种语言

还有其他一下有用的但不常用的功能,详细信息请参考taglist的帮助文档。

使用taglist需要注意一下几个方面:

  • 依赖于exuberant-ctags工具动态生成符号列表,GNU ctags不被支持。
  • 依赖于Vim的filtype检测功能,可以在vimrc文件中添加”filetype on”命令。
  • 如果Vim在初始化时使用-Z参数,则taglist不能工作。
  • taglist使用system()函数实现对exuberant-ctags的调用,所以需要系统对system()函数的支持,有些linux发行版出于安全原因禁用了system()函数导致对taglist的不兼容。

它提供很多全局变量可以很方便的进行定制,下面是我的vimrc中对taglist的配置:

let Tlist_Ctags_Cmd ='/usr/bin/ctags'
let Tlist_Exit_OnlyWindow = 1 
let Tlist_File_Fold_Auto_Close= 1
let Tlist_Inc_Winwidth = 0 

Tlist_Ctags_Cmd配置该插件所依赖的ctags程序的路径。

Tlist_Exit_OnlyWindow配置为1,如果taglist是唯一的窗口则退出Vim。

Tlist_File_Fold_Auto_Close配置为1,在切换buffer的时候折叠之前的符号列表。

Tlist_Inc_Winwidth设置为0表示不增加Taglist窗口的默认宽度。

:TlistToggle/:Tlist命令控制taglist窗口的打开和关闭。

Taglist插件的链接https://www.vim.org/scripts/script.php?script_id=273

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值