Emacs fun: toggle-narrow

TorgoX on 2006-02-07T10:27:45

Dear Log,

I've always wanted narrowing in emacs to be something I could just toggle, but there seemed no particularly easy would I could implement that. But the other day I finally sat down and banged this out:

  
(global-set-key "\M-n" 'toggle-narrow)

(defun toggle-narrow (beg end)
  "If narrow, widen; if not narrowed, narrow!"
  (interactive "r") ; "r" for region
  (if (narrow-p)
    (progn (widen)
      (message "Un-narrowing."))
    (progn (narrow-to-region beg end)
       (message "Narrowing to c%s - c%s." beg end))))

(defun narrow-p ()
  "Whether narrow is in effect for the current buffer"  
  
  (let (real-point-min real-point-max)
    (save-excursion (save-restriction
	(widen)
	(setq real-point-min (point-min)
            real-point-max (point-max))))
    (or
     (/= real-point-min (point-min))
     (/= real-point-max (point-max)))))


What's it for?

jplindstrom on 2006-02-07T11:52:52

I've seen the command in the manual but have never really used it. It sounds clever, but it's not something I ever felt I whish I could use.

Can you give a few real-life (as in "actual") scenarios when it's useful to use narrow?

/J

Re:What's it for?

TorgoX on 2006-02-07T13:47:37

I think I typically use narrow for restricting the range of a search-and-replace.

Example: I'm working on an HTML document and I want to paste in some Perl code or something. I type <pre>, paste the code, and </pre>, and then I realize I need to turn the &'s in the Perl code into &amp;'s. So I select the Perl code that I just pasted in, hit Narrow, use replace-string to change &'s to &amp;, and then hit Widen.

Re:What's it for?

Fletch on 2006-02-07T16:56:55

Yup, that's the most common use I have for it as well. In fact if you're feeling really inspired a replace-regexp-narrowed (or maybe replace-regexp-region) that did just that (narrowed, replace-regexp, widened) could be useful.

Re:What's it for?

vjo on 2006-02-09T16:15:42

Can't you use C-x n n and C-x n w for this?

Re:What's it for?

TorgoX on 2006-02-09T23:27:34

Yes.