---
title: 'Vim: Execute Commands On Global Matches And Their Surrounding Lines'
teaser:
tags: vim
author: Dan Croak
published_on: 2011-08-17
---

[Mike](http://thoughtbot.com/about/#mburns) just schooled us with some "vim by
example." His use case:

> I want to delete the line "Did not get valid lat and long", the line before
> it, and the line after it, everywhere in this text file, from within vim.

Here's how he did it:

    :g/Did not get valid lat and long/-,/Did not get valid lat and long/+ d

How's it work?

`:g` is [the global command](http://vim.wikia.com/wiki/Power_of_g):

    :[range]g/<pattern>/cmd

This executes a command on the specified range (defaults to whole file) for
each line matching the pattern. It also supports this format:

    :g/<pattern1>/,/<pattern2>/d

So, `:g/<p1>/,/<p2>/d` deletes inclusively from `/<p1>/` to `/<p2>/`.

Additionally, `/<p>/-` and `/<p>/+` mean "the line before and after the match".

Put it all together and "voilà." Thanks, Mike.
