Re: [O] Bug: [patch] also tangle headlines that begin with lower case string "comment" [8.2.5h (release_8.2.5h-680-g12df70 @ /home/youngfrog/sources/org-mode/lisp/)]
Nicolas Richard writes: > I don't know if speed is terribly important here, but since my suggested > approach uses a loop instead of recursion, it ends up being faster for > nested headlines (more than 5 levels). This obviously could be fixed in > the initial approach too. > > Since we know where point is, we could also use > (org-element-headline-parser nil t) instead of (org-element-at-point). > That's a tiny bit faster. `org-element-headline-parser' is a bit low-level. Also, it will still retrieve all entry properties, which explains why regexps are faster. Anyway, it doesn't matter much if speed is not an issue. Regards, -- Nicolas Goaziou
Re: [O] Bug: [patch] also tangle headlines that begin with lower case string "comment" [8.2.5h (release_8.2.5h-680-g12df70 @ /home/youngfrog/sources/org-mode/lisp/)]
Hi Nicolas, Nicolas Goaziou writes: > Of course, `org-element-at-point' can parse headlines, but if speed is > a factor, since headline syntax is not context-dependent, it is often > worth considering using regexps. I don't know if speed is terribly important here, but since my suggested approach uses a loop instead of recursion, it ends up being faster for nested headlines (more than 5 levels). This obviously could be fixed in the initial approach too. Since we know where point is, we could also use (org-element-headline-parser nil t) instead of (org-element-at-point). That's a tiny bit faster. For those interested, here's timing info: (progn (defun yf/org-babel-under-commented-heading-p () "Return t if currently under a commented heading." (unless (org-before-first-heading-p) (save-excursion (org-back-to-heading t) (let ((elt (org-element-headline-parser nil t))) (while (and elt (not (org-element-property :commentedp elt))) (setq elt (and (org-up-heading-safe) (org-element-headline-parser nil t elt (elp-instrument-list '(org-babel-under-commented-heading-p yf/org-babel-under-commented-heading-p)) (let ((org-element-use-cache t)) (with-temp-buffer (insert "* foo bar ** bal *** bal bal * bal ** bal *** bal bal * bal ** bal *** bal bal * bal ** bal") (org-mode) (goto-char (point-min)) (forward-line 4) ;; <- 0 for top level, etc. ;; (profiler-reset) (let ((n 100)) (garbage-collect) (dotimes (_ n) (org-babel-under-commented-heading-p)) (dotimes (_ n) (yf/org-babel-under-commented-heading-p)) (elp-results) ) ;; (profiler-report) ))) > Also, don't forget `org-with-limited-levels' when you need to tell > a headline from an inlinetask. I have absolutely no idea if this is important here. -- Nicolas.
Re: [O] Bug: [patch] also tangle headlines that begin with lower case string "comment" [8.2.5h (release_8.2.5h-680-g12df70 @ /home/youngfrog/sources/org-mode/lisp/)]
Hi Nicolas, Nicolas Goaziou writes: > Of course, `org-element-at-point' can parse headlines, but if speed is > a factor, since headline syntax is not context-dependent, it is often > worth considering using regexps. I don't know if speed is terribly important here, but since my suggested approach uses a loop instead of recursion, it ends up being faster for nested headlines (more than 5 levels). This obviously could be fixed in the initial approach too. Since we know where point is, we could also use (org-element-headline-parser nil t) instead of (org-element-at-point). That's a tiny bit faster. For those interested, here's timing info: (progn (defun yf/org-babel-under-commented-heading-p () "Return t if currently under a commented heading." (unless (org-before-first-heading-p) (save-excursion (org-back-to-heading t) (let ((elt (org-element-headline-parser nil t))) (while (and elt (not (org-element-property :commentedp elt))) (setq elt (and (org-up-heading-safe) (org-element-headline-parser nil t elt (elp-instrument-list '(org-babel-under-commented-heading-p yf/org-babel-under-commented-heading-p)) (let ((org-element-use-cache t)) (with-temp-buffer (insert "* foo bar ** bal *** bal bal * bal ** bal *** bal bal * bal ** bal *** bal bal * bal ** bal") (org-mode) (goto-char (point-min)) (forward-line 4) ;; <- 0 for top level, etc. ;; (profiler-reset) (let ((n 100)) (garbage-collect) (dotimes (_ n) (org-babel-under-commented-heading-p)) (dotimes (_ n) (yf/org-babel-under-commented-heading-p)) (elp-results) ) ;; (profiler-report) ))) But as I said, I don't think speed matters much for this specific function. > Also, don't forget `org-with-limited-levels' when you need to tell > a headline from an inlinetask. I have absolutely no idea if this is important here. -- Nicolas.
Re: [O] Bug: [patch] also tangle headlines that begin with lower case string "comment" [8.2.5h (release_8.2.5h-680-g12df70 @ /home/youngfrog/sources/org-mode/lisp/)]
Hello, Nicolas Richard writes: > I take the opportuinty to ask if we should try and make this function > use org-element instead. > > My naïve approach doesn't work: > > #+begin_src emacs-lisp > (save-excursion > (org-back-to-heading t) > (let ((elt (org-element-at-point))) > (while (and elt > (not > (org-element-property :commentedp elt))) > (setq elt > (org-element-property :parent elt))) > elt)) > #+end_src > > because an heading doesn't know what its parent heading is (the property > is nil). This can be fixed by doing: > > #+begin_src emacs-lisp > (defun org-babel-under-commented-heading-p () > "Return t if currently under a commented heading." > (unless (org-before-first-heading-p) > (save-excursion > (org-back-to-heading t) > (let ((elt (org-element-at-point))) > (while (and elt > (not >(org-element-property :commentedp elt))) > (setq elt > (and (org-up-heading-safe) >(org-element-at-point > elt > #+end_src > > > byt I'm not sure it is very pretty. Opinions ? Of course, `org-element-at-point' can parse headlines, but if speed is a factor, since headline syntax is not context-dependent, it is often worth considering using regexps. Also, don't forget `org-with-limited-levels' when you need to tell a headline from an inlinetask. Regards, -- Nicolas Goaziou
[O] Bug: [patch] also tangle headlines that begin with lower case string "comment" [8.2.5h (release_8.2.5h-680-g12df70 @ /home/youngfrog/sources/org-mode/lisp/)]
Hi, Trying to tangle code blocks in a headline line like: #+begin_src org ,* Comment retrouver #+end_src I struggled to understand what I was doing wrong because it didn't tangle anything. In fact, the french word "Comment" was mistakenly parsed as the org-comment-string, and so the headline was skipped. Let's avoid that (see patch below). I take the opportuinty to ask if we should try and make this function use org-element instead. My naïve approach doesn't work: #+begin_src emacs-lisp (save-excursion (org-back-to-heading t) (let ((elt (org-element-at-point))) (while (and elt (not (org-element-property :commentedp elt))) (setq elt (org-element-property :parent elt))) elt)) #+end_src because an heading doesn't know what its parent heading is (the property is nil). This can be fixed by doing: #+begin_src emacs-lisp (defun org-babel-under-commented-heading-p () "Return t if currently under a commented heading." (unless (org-before-first-heading-p) (save-excursion (org-back-to-heading t) (let ((elt (org-element-at-point))) (while (and elt (not (org-element-property :commentedp elt))) (setq elt (and (org-up-heading-safe) (org-element-at-point elt #+end_src byt I'm not sure it is very pretty. Opinions ? Anyway, here's the quicker fix : From: Nicolas Richard Date: Wed, 5 Mar 2014 14:54:49 +0100 Subject: [PATCH] * ob-tangle.el (org-babel-under-commented-heading-p): Disable case folding to avoid matching "Comment" at beg of headline. --- lisp/ob-tangle.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lisp/ob-tangle.el b/lisp/ob-tangle.el index 0096ac9..9f0ea0d 100644 --- a/lisp/ob-tangle.el +++ b/lisp/ob-tangle.el @@ -361,7 +361,8 @@ that the appropriate major-mode is set. SPEC has the form: "Return t if currently under a commented heading." (unless (org-before-first-heading-p) (if (let ((hd (nth 4 (org-heading-components - (and hd (string-match (concat "^" org-comment-string) hd))) + (and hd (let (case-fold-search) + (string-match (concat "^" org-comment-string) hd t (save-excursion (and (org-up-heading-safe) -- Nico.