emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* temporary set source blocks major-mode-hook to nil locally to speed up Org Mode
@ 2018-10-14  7:48 stardiviner
  2018-10-15 20:58 ` Nicolas Goaziou
  0 siblings, 1 reply; 5+ messages in thread
From: stardiviner @ 2018-10-14  7:48 UTC (permalink / raw)
  To: org-mode

When I open a big Org file which contains many different languages source blocks. And when the Org file buffer is fontified when option `org-src-fontify-natively` is enabled. Org will try to load those major modes. Including major-mode-hook like "clojure-mode-hook", "emacs-lisp-mode-hook", "python-mode-hook" etc. But for fontify the source blocks, I don't think it is necessary to load those major-mode-hooks. Also they are slow. Like in my case, most of time is used for loading source blocks major-mode-hooks.

- clojure-mode-hook has CIDER etc
- python-mode-hook has elpy etc
- emacs-lisp-mode-hook has some utilities.

Temporary disable those major-mode-hooks by set-local them to nil is a good solution to speed-up Org.

WDYT? If I'm wrong, please give out some thought from you. Thanks.

-- 
[ stardiviner ] don't need to convince with trends.
       Blog: https://stardiviner.github.io/
       IRC(freenode): stardiviner
       GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
      

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: temporary set source blocks major-mode-hook to nil locally to speed up Org Mode
  2018-10-14  7:48 temporary set source blocks major-mode-hook to nil locally to speed up Org Mode stardiviner
@ 2018-10-15 20:58 ` Nicolas Goaziou
  2018-10-18  4:57   ` stardiviner
  0 siblings, 1 reply; 5+ messages in thread
From: Nicolas Goaziou @ 2018-10-15 20:58 UTC (permalink / raw)
  To: stardiviner; +Cc: org-mode

Hello,

stardiviner <numbchild@gmail.com> writes:

> When I open a big Org file which contains many different languages
> source blocks. And when the Org file buffer is fontified when option
> `org-src-fontify-natively` is enabled. Org will try to load those
> major modes. Including major-mode-hook like "clojure-mode-hook",
> "emacs-lisp-mode-hook", "python-mode-hook" etc. But for fontify the
> source blocks, I don't think it is necessary to load those
> major-mode-hooks. Also they are slow. Like in my case, most of time is
> used for loading source blocks major-mode-hooks.
>
> - clojure-mode-hook has CIDER etc
> - python-mode-hook has elpy etc
> - emacs-lisp-mode-hook has some utilities.
>
> Temporary disable those major-mode-hooks by set-local them to nil is a good solution to speed-up Org.
>
> WDYT? If I'm wrong, please give out some thought from you. Thanks.

Some major modes may use major mode hooks to finish setting up their
fontification process, who knows.

In any case, it could be worth trying it. Do you want to provide a patch
for that?

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: temporary set source blocks major-mode-hook to nil locally to speed up Org Mode
  2018-10-15 20:58 ` Nicolas Goaziou
@ 2018-10-18  4:57   ` stardiviner
  2018-10-18 22:17     ` Nicolas Goaziou
  0 siblings, 1 reply; 5+ messages in thread
From: stardiviner @ 2018-10-18  4:57 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: org-mode

[-- Attachment #1: Type: text/plain, Size: 1301 bytes --]


Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> Some major modes may use major mode hooks to finish setting up their
> fontification process, who knows.
>
> In any case, it could be worth trying it. Do you want to provide a patch
> for that?
>
> Regards,

I dived into the source code of two functions which are related to
defcustom variable ~org-src-fontify-natively~.

Here is my try:

#+begin_src diff
modified   lisp/org-src.el
@@ -585,7 +585,14 @@ as `org-src-fontify-natively' is non-nil."
 	    (erase-buffer)
 	    ;; Add string and a final space to ensure property change.
 	    (insert string " "))
-	  (unless (eq major-mode lang-mode) (funcall lang-mode))
+	  (unless (eq major-mode lang-mode)
+	    (message "%s enabled in source block" lang-mode)
+	    ;; (make-local-variable (intern (format "%s-hook" lang-mode)))
+	    ;; (set (intern (format "%s-hook" lang-mode)) nil)
+	    (message "%s is %s"
+		     (intern (format "%s-hook" lang-mode))
+		     (symbol-value (intern (format "%s-hook" lang-mode))))
+	    (funcall lang-mode))
 	  (org-font-lock-ensure)
 	  (let ((pos (point-min)) next)
 	    (while (setq next (next-property-change pos))
#+end_src

But it seems does not work as I expected.

Can't find out which real function is invoked when fontify every source blocks.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: a simple try --]
[-- Type: text/x-patch, Size: 1182 bytes --]

From cd43cd7c4c4e98d2b62af84a0729f82fb361c25f Mon Sep 17 00:00:00 2001
From: stardiviner <numbchild@gmail.com>
Date: Thu, 18 Oct 2018 12:55:30 +0800
Subject: [PATCH] Set all lang-mode-hook to nil to speedup source blocks
 fontify.

---
 lisp/org-src.el | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/lisp/org-src.el b/lisp/org-src.el
index 9c462b7e7..271ca82b9 100644
--- a/lisp/org-src.el
+++ b/lisp/org-src.el
@@ -585,7 +585,14 @@ as `org-src-fontify-natively' is non-nil."
 	    (erase-buffer)
 	    ;; Add string and a final space to ensure property change.
 	    (insert string " "))
-	  (unless (eq major-mode lang-mode) (funcall lang-mode))
+	  (unless (eq major-mode lang-mode)
+	    (message "%s enabled in source block" lang-mode)
+	    ;; (make-local-variable (intern (format "%s-hook" lang-mode)))
+	    ;; (set (intern (format "%s-hook" lang-mode)) nil)
+	    (message "%s is %s"
+		     (intern (format "%s-hook" lang-mode))
+		     (symbol-value (intern (format "%s-hook" lang-mode))))
+	    (funcall lang-mode))
 	  (org-font-lock-ensure)
 	  (let ((pos (point-min)) next)
 	    (while (setq next (next-property-change pos))
-- 
2.19.1


[-- Attachment #3: Type: text/plain, Size: 187 bytes --]


--
[ stardiviner ] don't need to convince with trends.
       Blog: https://stardiviner.github.io/
       IRC(freenode): stardiviner
       GPG: F09F650D7D674819892591401B5DF1C95AE89AC3

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: temporary set source blocks major-mode-hook to nil locally to speed up Org Mode
  2018-10-18  4:57   ` stardiviner
@ 2018-10-18 22:17     ` Nicolas Goaziou
  2018-10-19  0:14       ` stardiviner
  0 siblings, 1 reply; 5+ messages in thread
From: Nicolas Goaziou @ 2018-10-18 22:17 UTC (permalink / raw)
  To: stardiviner; +Cc: org-mode

Hello,

stardiviner <numbchild@gmail.com> writes:

> Here is my try:
>
> #+begin_src diff
> modified   lisp/org-src.el
> @@ -585,7 +585,14 @@ as `org-src-fontify-natively' is non-nil."
>  	    (erase-buffer)
>  	    ;; Add string and a final space to ensure property change.
>  	    (insert string " "))
> -	  (unless (eq major-mode lang-mode) (funcall lang-mode))
> +	  (unless (eq major-mode lang-mode)
> +	    (message "%s enabled in source block" lang-mode)
> +	    ;; (make-local-variable (intern (format "%s-hook" lang-mode)))
> +	    ;; (set (intern (format "%s-hook" lang-mode)) nil)
> +	    (message "%s is %s"
> +		     (intern (format "%s-hook" lang-mode))
> +		     (symbol-value (intern (format "%s-hook" lang-mode))))
> +	    (funcall lang-mode))
>  	  (org-font-lock-ensure)
>  	  (let ((pos (point-min)) next)
>  	    (while (setq next (next-property-change pos))
> #+end_src
>
> But it seems does not work as I expected.

Did you try to set the hook to a different value before (funcall lang-mode)?

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: temporary set source blocks major-mode-hook to nil locally to speed up Org Mode
  2018-10-18 22:17     ` Nicolas Goaziou
@ 2018-10-19  0:14       ` stardiviner
  0 siblings, 0 replies; 5+ messages in thread
From: stardiviner @ 2018-10-19  0:14 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: org-mode


Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

>
> Did you try to set the hook to a different value before (funcall lang-mode)?
>

Yes, like I said in previous messages, I want to make lang-mode-hook empty. It tested a few times, with restarting Emacs (loading a refresh Org Mode). It failed to fontify source blocks.

Reports error:

Failed to fontify source block.

I can see all source blocks are not fontified. Until I manually load the mode with [M-x load-library RET clojure-mode RET]. Then I reopen the Org file, the clojure source blocks are fontified.

Also I improved my code:

#+begin_src diff
modified   lisp/org-src.el
@@ -585,7 +585,14 @@ as `org-src-fontify-natively' is non-nil."
 	    (erase-buffer)
 	    ;; Add string and a final space to ensure property change.
 	    (insert string " "))
-	  (unless (eq major-mode lang-mode) (funcall lang-mode))
+	  (unless (eq major-mode lang-mode)
+	    ;; FIXME: Org mode fontification error in #<buffer Code.org> at 203
+	    ;; (let (hook (intern (format "%s-hook" lang-mode)))
+	    ;;   (message "%s enabled in source block" lang-mode)
+	    ;;   (make-local-variable hook)
+	    ;;   (set hook nil)
+	    ;;   (message "%s is %s" hook (symbol-value hook)))
+	    (funcall lang-mode))
 	  (org-font-lock-ensure)
 	  (let ((pos (point-min)) next)
 	    (while (setq next (next-property-change pos))
#+end_src

-- 
[ stardiviner ] don't need to convince with trends.
       Blog: https://stardiviner.github.io/
       IRC(freenode): stardiviner
       GPG: F09F650D7D674819892591401B5DF1C95AE89AC3
      

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-10-19  0:15 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-14  7:48 temporary set source blocks major-mode-hook to nil locally to speed up Org Mode stardiviner
2018-10-15 20:58 ` Nicolas Goaziou
2018-10-18  4:57   ` stardiviner
2018-10-18 22:17     ` Nicolas Goaziou
2018-10-19  0:14       ` stardiviner

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).