emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [patch suggestion] Mitigating the poor Emacs performance on huge org


From: Nicolas Goaziou
Subject: Re: [patch suggestion] Mitigating the poor Emacs performance on huge org files: Do not use overlays for PROPERTY and LOGBOOK drawers
Date: Fri, 08 May 2020 18:38:19 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux)

Hello,

Ihor Radchenko <address@hidden> writes:

> ;; Unfortunately isearch, sets inhibit-point-motion-hooks and we
> ;; cannot even use cursor-sensor-functions as a workaround
> ;; I used a less ideas approach with advice to isearch-search-string as
> ;; a workaround 

OK.

> (defun org-find-text-property-region (pos prop)
>   "Find a region containing PROP text property around point POS."
>   (require 'org-macs) ;; org-with-point-at
>   (org-with-point-at pos

Do we really need that since every function has a POS argument anyway?
Is it for the `widen' part?

>     (let* ((beg (and (get-text-property pos prop) pos))
>          (end beg))
>       (when beg
>       (setq beg (or (previous-single-property-change pos prop)
>                     beg))

Shouldn't fall-back be (point-min)?

>       (setq end (or (next-single-property-change pos prop)
>                     end))

And (point-max) here?

>         (unless (equal beg end)

Nitpick: `equal' -> =

>           (cons beg end))))))

> ;; :FIXME: re-hide properties when point moves away
> (define-advice isearch-search-string (:after (&rest _) put-overlay)
>   "Reveal hidden text at point."
>   (when-let ((region (org-find-text-property-region (point) 'invisible)))
>     (with-silent-modifications
>       (put-text-property (car region) (cdr region) 'org-invisible 
> (get-text-property (point) 'invisible)))
>       (remove-text-properties (car region) (cdr region) '(invisible nil))))

Could we use `isearch-update-post-hook' here?

Or, it seems nicer to `add-function' around `isearch-filter-predicate'
and extend isearch-filter-visible to support (i.e., stop at, and
display) invisible text through text properties.

> ;; this seems to be unstable, but I cannot figure out why
> (defun org-restore-invisibility-specs (&rest _)
>   ""
>    (let ((pos (point-min)))
>      (while (< (setq pos (next-single-property-change pos 'org-invisible nil 
> (point-max))) (point-max))
>        (when-let ((region (org-find-text-property-region pos 'org-invisible)))
>          (with-silent-modifications
>            (put-text-property (car region) (cdr region) 'invisible 
> (get-text-property pos 'org-invisible))
>            (remove-text-properties (car region) (cdr region) '(org-invisible 
> nil)))))))

Could you use the hook above to store all visited invisible texts, and
re-hide them at the end of the search, e.g., using
`isearch-mode-end-hook'?

> (add-hook 'post-command-hook #'org-restore-invisibility-specs)

Ouch. I hope we can avoid that.

I wonder how it compares to drawers using the same invisible spec as
headlines, as it was the case before. Could you give it a try? 

I think hiding all property drawers right after opening a subtree is
fast enough.

Another option, as I already suggested, would be to use text-properties
on property drawers only. Ignoring isearch inside those sounds
tolerable, at least.

Regards,

-- 
Nicolas Goaziou



reply via email to

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