emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: hiding lines


From: Werner LEMBERG
Subject: Re: hiding lines
Date: Fri, 10 Apr 2009 21:54:24 +0200 (CEST)

> Consider this table:
> 
>   foo
>   bar
>   foo=bar
>   bar-foo
>   baz
>   baz=baz
>   baz-foo=baz
> 
> I would like to make all lines invisable *and* intangible which
> don't contain a `='.  Otherwise interactive search-and-replace would
> try to modify invisible text.  At least this is my conclusion of
> your explanations.

I've now come up with the code as shown in the attachment.  It works
fine, however, I would like to not have empty lines; in other words,
invisible text should not take any space in the buffer.  Does Emacs
supports such a `compressed invisibility'?  Otherwise it's getting
quite complicated, I fear...


    Werner

(defun make-lines-invisible (regexp &optional arg)
  "Make all lines matching a regexp invisible and intangible.
With a prefix arg, make it visible again.  It is not necessary
that REGEXP matches the whole line; if a hit is found, the
affected line gets automatically selected.

This command affects the whole buffer."
  (interactive "MRegexp: \nP")
  (let (ov
        ovs)
    (cond
     ((equal arg '(4))
      (setq ovs (overlays-in (point-min) (point-max)))
      (mapc (lambda (o)
              (if (overlay-get o 'make-lines-invisible)
                  (delete-overlay o)))
            ovs))
     (t
      (save-excursion
        (goto-char (point-min))
        (while (re-search-forward regexp nil t)
          (setq ov (make-overlay (line-beginning-position)
                                 (line-end-position)))
          (overlay-put ov 'make-lines-invisible t)
          (overlay-put ov 'invisible t)
          (overlay-put ov 'intangible t)))))))

(global-set-key "\C-cz" 'make-lines-invisible)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]