diff --git a/yafolding.el b/yafolding.el index a941f47..71bf333 100644 --- a/yafolding.el +++ b/yafolding.el @@ -122,21 +122,43 @@ If given, toggle all entries that start at INDENT-LEVEL." "Hide region between BEG and END." (when (> end beg) (yafolding-show-region beg end) - (let ((before-string - (concat - (and yafolding-show-fringe-marks - (propertize " " 'display '(left-fringe right-triangle))) - (yafolding-ellipsis))) - (new-overlay (make-overlay beg end))) + (let ((new-overlay (make-overlay beg end))) + (overlay-put new-overlay 'isearch-open-invisible #'yafolding--on-change) + (overlay-put new-overlay 'isearch-open-invisible-temporary #'yafolding--open-invisible-temporary) (overlay-put new-overlay 'invisible t) (overlay-put new-overlay 'intangible t) (overlay-put new-overlay 'evaporate t) (overlay-put new-overlay 'modification-hooks (list (lambda (overlay &rest _) (delete-overlay overlay)))) - (overlay-put new-overlay 'before-string before-string) + (overlay-put new-overlay 'before-string (yafolding--before-string)) (overlay-put new-overlay 'category 'yafolding)))) +(defun yafolding--open-invisible-temporary (ov hide-p) + "Temporary show/hide OV depends on HIDE-P flag." + (if hide-p (yafolding--hide-ov ov) + (yafolding--show-ov ov))) + +(defun yafolding--on-change (ov &rest _) + "Open overlay OV during content is changed." + (delete-overlay ov)) + +(defun yafolding--show-ov (ov &rest _) + "Show the OV." + (overlay-put ov 'invisible nil) + (overlay-put ov 'before-string nil)) + +(defun yafolding--hide-ov (ov &rest _) + "Hide the OV." + (overlay-put ov 'invisible t) + (overlay-put ov 'before-string (yafolding--before-string))) + +(defun yafolding--before-string () + (concat + (and yafolding-show-fringe-marks + (propertize " " 'display '(left-fringe right-triangle))) + (yafolding-ellipsis))) + (defun yafolding-debug () "Show yafolding information of the current position." (interactive) @@ -185,18 +207,6 @@ element-region: %d - %d, (L%d - L%d)" (yafolding-show-element) (yafolding-hide-element))) -(add-hook 'isearch-mode-hook - (lambda () - (mapcar (lambda (overlay) - (overlay-put overlay 'invisible nil)) - (yafolding-get-overlays (point-min) (point-max))))) - -(add-hook 'isearch-mode-end-hook - (lambda () - (mapcar (lambda (overlay) - (overlay-put overlay 'invisible t)) - (yafolding-get-overlays (point-min) (point-max))))) - (defun yafolding-go-parent-element () "Go back to parent element." (interactive)