ack: the fast code search tool

September 08, 2009

One of the handiest tools in my programming toolkit is ack, a Perl script that is great for searching through code (or really any text files). I use it a lot while refactoring, for example when I want to rename a method every time it’s called in a project.

You can install ack with this command (from http://betterthangrep.com/):
$ curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 ~/bin/ack 

Assuming that ~/bin/ack is in your path searching code is as easy as this:

$ ack my_poorly_named_method

This spits out highlighted matches from every file in the present directory.

ack --help lists a lot of additional options to control how it matches, and what it outputs.

(My favorite is ack --thpppt)

$ ack --thpppt 
_   /|
\'o.O'
=(___)=
   U    Bill the Cat!

So back to how ack is useful when you want to do a find and replace on a lot of files.

First I’d do a quick search for the method I want to rename:
$ ack destroy_other
app/models/wd/core/proxy_to.rb
23:    def destroy_other!

script/pull_wds
58:      wd.destroy_other!

spec/models/wd/core/proxy_to_spec.rb
216:      @wd.destroy_other!

spec/script/pull_wds_spec.rb
26:    wd.should_receive :destroy_other!
36:    wd.should_not_receive :destroy_other!

This next command will open all the files in vi that matched in the previous command. (The !! is one of My Favorite Bash Substitution Tricks.)

$ vi `!! -l`

ack’s -l option causes it to output only the filenames containing the matches.