Download
(defgroup hide-region nil
"Functions to hide region using an overlay with the invisible
property. The text is not affected."
:prefix "hide-region-"
:group 'convenience)
(defcustom hide-region-before-string "@["
"String to mark the beginning of an invisible region. This string is
not really placed in the text, it is just shown in the overlay"
:type '(string)
:group 'hide-region)
(defcustom hide-region-after-string "]@"
"String to mark the beginning of an invisible region. This string is
not really placed in the text, it is just shown in the overlay"
:type '(string)
:group 'hide-region)
(defcustom hide-region-propertize-markers t
"If non-nil, add text properties to the region markers."
:type 'boolean
:group 'hide-region)
(defvar hide-region-overlays nil
"Variable to store the regions we put an overlay on.")
(defun hide-region-hide ()
"Hides a region by making an invisible overlay over it and save the
overlay on the hide-region-overlays \"ring\""
(interactive)
(make-variable-buffer-local 'hide-region-overlays)
(let ((new-overlay (make-overlay (mark) (point))))
(setq hide-region-overlays
(append
(list new-overlay) hide-region-overlays))
(overlay-put new-overlay 'invisible t)
(overlay-put new-overlay 'intangible t)
(overlay-put new-overlay 'before-string
(if hide-region-propertize-markers
(propertize hide-region-before-string
'font-lock-face 'region)
hide-region-before-string))
(overlay-put new-overlay 'after-string
(if hide-region-propertize-markers
(propertize hide-region-after-string
'font-lock-face 'region)
hide-region-after-string))))
(defun hide-region-unhide ()
"Unhide a region at a time, starting with the last one hidden and
deleting the overlay from the hide-region-overlays \"ring\"."
(interactive)
(make-variable-buffer-local 'hide-region-overlays)
(if (car hide-region-overlays)
(progn
(delete-overlay (car hide-region-overlays))
(setq hide-region-overlays (cdr hide-region-overlays)))))
(defun hide-region-unhide-below (point)
"unhide a region just below the point"
(interactive "d")
(make-variable-buffer-local 'hide-region-overlays)
(let ((number (length hide-region-overlays))
(tmp-overlay nil)
(tmp-start nil)
(tmp-len nil)
(tmp-number nil))
(setq number (- number 1))
(while (>= number 0)
(setq tmp-start (overlay-start (nth number hide-region-overlays)))
(if (and (> tmp-start point) (or (eq tmp-len nil) (< tmp-start tmp-len)))
(progn
(setq tmp-len tmp-start)
(setq tmp-number number)))
(setq number (- number 1)))
(if tmp-number
(progn
(setq tmp-overlay (nth tmp-number hide-region-overlays))
(delete-overlay tmp-overlay)
(if (equal tmp-number 0)
(setq hide-region-overlays (cdr hide-region-overlays))
(delq tmp-overlay hide-region-overlays)))
(if (car hide-region-overlays)
(progn
(delete-overlay (car hide-region-overlays))
(setq hide-region-overlays (cdr hide-region-overlays)))))
))
(defun hide-region-unhide-all ()
(interactive)
"unhide all the region in the current buffer"
(make-variable-buffer-local 'hide-region-overlays)
(while hide-region-overlays
(if (car hide-region-overlays)
(progn
(delete-overlay (car hide-region-overlays))
(setq hide-region-overlays (cdr hide-region-overlays))))))
(defvar hide-region-show-flag nil
"flag used to indicate whether the region is shown when toggle")
(defun hide-region-toggle ()
"toggle all the hide region in the current buffer"
(interactive)
(make-variable-buffer-local 'hide-region-overlays)
(make-variable-buffer-local 'hide-region-show-flag)
(let ((number (length hide-region-overlays)))
(setq number (- number 1))
(while (>= number 0)
(overlay-put (nth number hide-region-overlays) 'invisible hide-region-show-flag)
(setq number (- number 1)))
(if hide-region-show-flag
(setq hide-region-show-flag nil)
(setq hide-region-show-flag t))))
(provide 'hide-region)