比grep更好用的代码搜索工具ack-grep

Posted by fishcried on June 3, 2015

grep非常常用,曾经特意的总结了一篇grep使用技巧,在CU上发布,后来放到了自己的博客grep使用技巧. 但grep使用起来击键确实多,自己定义了好几种alias,如: grep='grep --color=auto --exclude-dir={.bzr,.cvs,.git,.hg,.svn}' zsh内置的. chgrep=grep -nr --include "*.[ch]" pgrep=grep -nr --include "*.py" 后来发现了ack,这玩意确实很好用,在vim中使用就更赞了,此次特别总结下加深印象.

ACK是什么,为啥用?

ack官方的一句话就是“ack 2.14 is a tool like grep, optimized for programmers”.

那么都有哪些优化那,看下其特点,有些特性正是grep缺少的(这是我自己总结的):

  • 为代码搜索而定制 搜索时默认会忽略”.svn”,”.git”,”CVS”目录,备份文件,二进制文件,core文件等,真是为源码而生.如果觉得还不够,可以在配置文件中设置.
  • 默认为递归搜索 源码搜索一般确实都是递归的!
  • 可以指定搜索的源码类型 可以通过参数--xxx来指定源码类型,比如--python,--perl
  • 参数基本与grep一样 大部分参数与grep保持一致
  • 存在vim插件(ack.vim),可以方便的通过vim来调用
  • ack比grep少一个一个字符.而且排序上ack要比grep靠前多了.

总之,grep为了搜索而生,ack为搜索源码而生.

ack常用参数

  • -n, 显示行号
  • -l/L, 显示匹配/不匹配的文件名
  • -c, 统计次数
  • -v, invert match
  • -w, 词匹配
  • -i, 忽略大小写
  • -f, 只显示文件名,不进行搜索.

安装配置

安装

ubuntu:

apt-get install ack-grep -y

配置

ack可以通过.ackrc来进行定制.比如下面举例:

# 设置排序
--sort-files
#设置文件过滤
--python
--html
--js
--conf
# 设置显示
--noheading
# 定义新的文件类型
--type-set=conf=.conf
# 智能识别大小写
--smart-case
# 设置以less形式展示,设定less参数
--pager=less -R -M --shift 5 -i

Warn: 以上并不是一个推荐的配置,只是举例.个人基本没有进行特别定制

vim与ack结合

在vim中进行多文件查找可以使用自带的vimgrep命令,但是感觉有点别扭.可以集成ack到vim中,安装插件即可.

搜索ack.vim插件进行安装,并设置快捷键绑定.这里只是列出我的快捷键绑定.插件的具体安装请参照官方文档,推荐使用vundle来进行插件管理.

nmap <leader>ack :Ack
nmap <leader>ackw :call Search_Word()<cr>
function Search_Word()
    let w = expand("<cword>")
    execute "Ack " . w
endfunction

感慨

使用搜索工具有个矛盾点:

  • 使用者希望简洁 使用者不确定或者为了方便才进行搜索,渴望简洁.就像google桌面和360的桌面当想搜索的时候按两下ctrl就调用出输入口进行.
  • 程序希望提供精细化的条件指定 如果没有精细化的条件指定,电脑负担就加重了.最要命的是io负载,多人使用的服务器,如果有人随意使用find,grep的话很可能导致其他人卡顿.一旦提供精确一点的条件,命令行输入会非常麻烦.

例如在服务器上,我一般使用grep基本都会使用-F--include,这样效率会高,但是写起来麻烦.所以看到ack后会很高兴的去试用,并转换.

ack的设计目的上就明确了简化grep,为了更好的搜索代码.所以默认就会排除非代码目录文件.而且还提供了配置文件定制的方式.这很赞!

变更记录

Why Who When
创建文件,提醒日后完善内容 fishcired 2015-05-12
完善 fishcired 2015-06-02
继续完善 fishcired 2015-06-03