Thursday, July 21, 2011

A Visual Guide to Narrowing in Emacs

 Every once in a while, you'd hear someone talk about narrowing in Emacs and you'd wonder what they're talking about.  The idea behind narrowing is that, you might be interested in only a certain portion of the file/buffer you're working on and you'd like to work on that portion alone and nothing else.  Narrowing allows you to do that by simply eliminates from your viewing, any other extraneous lines other than the highlighted ones.  Here's an example


In the screenshot above, let's say I want to work on the rows only upto to 10-Jan-2006 in a file containing 1000s of rows.  Mark the region and hit C-x n n.

 The rest of the lines are gone and only the marked region is left.  Now, you can work on the narrowed region as usual; the normal editing editing commands apply. Once you've completed the changes, you can get your complete buffer back by using C-x n w which widens the buffer or cancels narrowing.  For example, I've changed ABB to XXX in the narrowed region and reverted to the normal buffer by C-x n w.

 That's it. A couple of points are in order. It is disabled by default, so you'd want to enable it by adding the following to your .emacs
;;;enable narrowing
(put 'narrow-to-region 'disabled nil)
If you're confused whether narrowing is in effect or not, the modeline should have the word Narrow in it as a visual indication.  Lastly, the hidden text and lines are not gone even if you save with narrowing in effect, so you really don't need to panic that you've accidently overwritten the entire file or any other pant turding fear!

2 comments:

Scott Turner said...

The example in this article is exactly the use case for the only times I use narrowing: to easily perform a replace on a region. Then I realized that replace-string only works in the marked region. Are there other good uses for narrowing?

sivaram said...

Well, I've used it while doing code review of badly written shell scripts and places where I was better off doing a manual replace of key text. Combine this with rectangle commands, you can fairly be certain of making exactly the changes you want in the only place you wanted.