From 3bc8c9647a55decc6c27cfdb8267de14d54d86d3 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Fri, 15 Feb 2013 16:00:16 +0100 Subject: [PATCH 1/3] org-element: Fix error and infloop in `org-element-at-point' * lisp/org-element.el (org-element-at-point): Return nil when in the first empty lines of the buffer. Return headline when in empty lines just after the headline. --- lisp/org-element.el | 48 +++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/lisp/org-element.el b/lisp/org-element.el index f4eb35d07..f17273ca8 100644 --- a/lisp/org-element.el +++ b/lisp/org-element.el @@ -4622,26 +4622,40 @@ first element of current section." (list (org-element-headline-parser (point-max) t)))) ;; Otherwise move at the beginning of the section containing ;; point. - (let ((origin (point)) - (end (save-excursion - (org-with-limited-levels (outline-next-heading)) (point))) - element type special-flag trail struct prevs parent) - (org-with-limited-levels - (if (org-before-first-heading-p) (goto-char (point-min)) - (org-back-to-heading) - (forward-line))) - (org-skip-whitespace) - (beginning-of-line) - ;; Parse successively each element, skipping those ending - ;; before original position. - (catch 'exit - (while t - (setq element + (catch 'exit + (let ((origin (point)) + (end (save-excursion + (org-with-limited-levels (outline-next-heading)) (point))) + element type special-flag trail struct prevs parent) + (org-with-limited-levels + (if (org-before-first-heading-p) + ;; In empty lines at buffer's beginning, return nil. + (progn (goto-char (point-min)) + (org-skip-whitespace) + (when (or (eobp) (> (line-beginning-position) origin)) + (throw 'exit nil))) + (org-back-to-heading) + (forward-line) + (org-skip-whitespace) + (when (> (line-beginning-position) origin) + ;; In blank lines just after the headline, point still + ;; belongs to the headline. + (throw 'exit + (progn (org-back-to-heading) + (if (not keep-trail) + (org-element-headline-parser (point-max) t) + (list (org-element-headline-parser + (point-max) t)))))))) + (beginning-of-line) + ;; Parse successively each element, skipping those ending + ;; before original position. + (while t + (setq element (org-element--current-element end 'element special-flag struct) - type (car element)) + type (car element)) (org-element-put-property element :parent parent) (when keep-trail (push element trail)) - (cond + (cond ;; 1. Skip any element ending before point. Also skip ;; element ending at point when we're sure that another ;; element has started. From dbadb2916b713853a79cc8b8aa8c65086d9fff7e Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Fri, 15 Feb 2013 16:03:23 +0100 Subject: [PATCH 2/3] Remove unnecessary `ignore-error' * lisp/org.el (org-end-of-line): Remove `ignore-error'. It is unnecessary since 3bc8c9647a55decc6c27cfdb8267de14d54d86d3. --- lisp/org.el | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 809cca904..81926f1a4 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -22240,10 +22240,8 @@ the cursor is already beyond the end of the headline." ((fboundp 'move-end-of-line) 'move-end-of-line) (t 'end-of-line)))) (if (or (not special) arg) (call-interactively move-fun) - (let* ((element (ignore-errors - ;; Don't throw an error outside elements - (save-excursion (beginning-of-line) - (org-element-at-point)))) + (let* ((element (save-excursion (beginning-of-line) + (org-element-at-point))) (type (org-element-type element))) (cond ((memq type '(headline inlinetask)) From 0b6a2e2416b0acc28469661d7013f92f82a34267 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Fri, 15 Feb 2013 16:08:09 +0100 Subject: [PATCH 3/3] C-c C-c does nothing when at a blank line * lisp/org.el (org-ctrl-c-ctrl-c): Do nothing when at a blank line, but still run `org-ctrl-c-ctrl-c-final-hook'. --- lisp/org.el | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lisp/org.el b/lisp/org.el index 81926f1a4..c37f507b7 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -19651,13 +19651,8 @@ This command does many different things, depending on context: ((run-hook-with-args-until-success 'org-ctrl-c-ctrl-c-hook)) (t (let* ((context (org-element-context)) (type (org-element-type context))) - ;; Test if point is within blanks at the end of an element. - (if (save-excursion - (or (not context) - (beginning-of-line) - (and (looking-at "[ \t]*$") - (skip-chars-forward " \r\t\n") - (>= (point) (org-element-property :end context))))) + ;; Test if point is within a blank line. + (if (save-excursion (beginning-of-line) (looking-at "[ \t]*$")) (or (run-hook-with-args-until-success 'org-ctrl-c-ctrl-c-final-hook) (user-error "C-c C-c can do nothing useful at this location")) ;; For convenience: at the first line of a paragraph on the