What We Do





Free Consultation


(920) 309 - 5605

2 min
Searching for Silver Bullets

Searching for Silver Bullets

Jon Kinney
Partner & CTO

Asking Better Questions About Your Product

Download our free guide to begin implementing feedback loops in your organization.

By filling out this form, you agree to receive marketing emails from Headway.

You don’t need developers to launch your startup

In this free video series, learn proven tactics that will impact real business growth.

By filling out this form, you agree to receive marketing emails from Headway.

Make better decisions for your product

Dive deeper into the MoSCoW process to be more effective with your team.

By filling out this form, you agree to receive marketing emails from Headway.

A mindset for startup growth

In this free video series, learn the common mistakes we see and give yourself a greater chance for success.

By filling out this form, you agree to receive marketing emails from Headway.

Searching across a project's codebase for keywords is a pretty standard
requirement when starting something new. Recently I inherited a very large
Rails app with 238 models and 348 controllers. That is to say nothing of
the number of view and JavaScript files as well as service objects, presenters,
etc. It was pretty clear that I was going to have to find a way to explore
certain parts of the code by looking for what I was working on that day in

Lots of editors have this capability built in including: RubyMine, Sublime
Text, Atom, and Textmate, but at Headway we use console Vim inside of Tmux for
the majority of our development, and project-wide search isn't provided out of
the box. This led me to try several different "grep like" tools over the years,
including just plain [grep](https://en.wikipedia.org/wiki/Grep). However, with
thousands of files to search through, I needed speed. For many years I was
happily served by a tool called [Ack](http://beyondgrep.com/documentation/),
which bills itself as a much faster grep replacement. But even with all the
improvements over vanilla grep that Ack made, it was still too slow for my
needs. Enter [The Silver
Searcher](https://github.com/ggreer/the_silver_searcher), or "Ag" as it's

Ag starts out claiming that "it is an order of magnitude faster than ack".
A bold statement to be sure, but I can say with certainty that it is
indeed worth the upgrade.

## Installing Ag

To install Ag, use [homebrew](http://brew.sh/): `brew install
the_silver_searcher`. For other platforms, see the

## Configuring Ag To Ignore Directories

Without any configuration, Ag will search through all the files in
a directory except for those matched by ignore patterns specified in
the project's `.gitignore` or `.hgignore` or `.agignore` files. You can
also create a `~/.agignore` file at the root of your home directory for
global use.

Ignoring some directories in a Rails app like `/public/system` and
`/coverage` that aren't typically found in the `.gitignore`, can have
a dramatic impact on the speed at which results are returned from Ag.
Without a tuned `.agignore`, in the project I mentioned earlier, Ag would
take 15 seconds to return results. With a tuned `.agignore` file though,
I was able to get results back in under a second! Ack or grep were
unusable and just locked up my machine.

The `.agignore` pattern is really straightforward. You simply list the
folders or files you want to ignore by name like so:

   -- CODE line-numbers language-lang --

## Performing Advanced Searches

One of the tasks that I needed to perform involved deleting a whole workflow
from the app. This meant that while I wanted to delete code that included text
like "news" I didn't want to include text like "newsignword". In order to find
only items that stopped after the four characters "news" I needed to use
a negative lookahead regex.

Ag uses Perl-Compatible Regular Expression (PCRE) syntax, which I wasn't
overly familiar with, so here are a few sites that I used to help test my

 * [https://regex101.com](https://regex101.com)
 * [https://www.debuggex.com/cheatsheet/regex/pcre](https://www.debuggex.com/cheatsheet/regex/pcre)

I ended up with this:

   -- CODE line-numbers language-lang --

This would search for the string "news" but omit results that would
include "ignword" or "tyle" immediately following "news". So while all the
"news" hits showed up, I was able to filter out tens of hits for
"newsignword" and "newStyle".

## Wrap up

Next time you need to get up to speed quickly on a new codebase, give Ag
a shot! Coupled with other tools like [ctags](http://ctags.sourceforge.net/),
and [rails.vim](https://github.com/tpope/vim-rails), [Vim](http://www.vim.org/)
is a great IDE for Ruby on Rails development! Also, check out the cool things
happening in the [neovim](https://neovim.io/) space!

Enjoyed this post?

Other related posts

See all the ways we can help you grow through design, development, marketing, and more.

View All

Listen and learn from anywhere

Listen and learn from anywhere

Listen and learn from anywhere

The Manifest

Level up your skills and develop a startup mindset.
Stay up to date with the latest content from the Headway team.