summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2014-09-14 00:04:20 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2014-10-28 14:23:51 +0100
commit57d8b68d9594d4e23d5f4960073a1cac78bc72e3 (patch)
tree15e14bd1bb9bf4b312de4a2e90e417dbeef244c9
parentae35b8c4ad03bc858c0c64f043c4da7b493c0568 (diff)
downloadorg-mode-57d8b68d9594d4e23d5f4960073a1cac78bc72e3.tar.gz
Update `org-get-property-block'
* lisp/org.el (org-at-property-p): Rewrite. Don't use `org-element-at-point'. It is faster to retrieve the property drawer location instead. (org-get-property-block): Update function and docstring. Change signature. (org-entry-properties, org-entry-put, org-buffer-property-keys): Apply signature change.
-rwxr-xr-xlisp/org.el73
1 files changed, 34 insertions, 39 deletions
diff --git a/lisp/org.el b/lisp/org.el
index 4ee14b0..4d2ec9b 100755
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -15426,45 +15426,40 @@ When INCREMENT is non-nil, set the property to the next allowed value."
(org-clock-update-mode-line))
(message "%s is now %s" prop val)))
+(defun org-get-property-block (&optional beg force)
+ "Return the (beg . end) range of the body of the property drawer.
+BEG is the beginning and end of the current subtree, or of the
+part before the first headline. If it is not given, it will be
+found. If the drawer does not exist, create it if FORCE is
+non-nil, or return nil."
+ (org-with-wide-buffer
+ (when beg (goto-char beg))
+ (unless (org-before-first-heading-p)
+ (let ((beg (cond (beg)
+ ((or (not (featurep 'org-inlinetask))
+ (org-inlinetask-in-task-p))
+ (org-back-to-heading t))
+ (t (org-with-limited-levels (org-back-to-heading t))))))
+ (forward-line)
+ (when (org-looking-at-p org-planning-line-re) (forward-line))
+ (cond ((looking-at org-property-drawer-re)
+ (forward-line)
+ (cons (point) (progn (goto-char (match-end 0))
+ (line-beginning-position))))
+ (force
+ (org-insert-property-drawer)
+ (let ((pos (save-excursion (search-forward ":END:")
+ (line-beginning-position))))
+ (cons pos pos))))))))
+
(defun org-at-property-p ()
"Non-nil when point is inside a property drawer.
See `org-property-re' for match data, if applicable."
- (when (eq (org-element-type (org-element-at-point)) 'node-property)
- (save-excursion
- (beginning-of-line)
- (looking-at org-property-re))))
-
-(defun org-get-property-block (&optional beg end force)
- "Return the (beg . end) range of the body of the property drawer.
-BEG and END are the beginning and end of the current subtree, or of
-the part before the first headline. If they are not given, they will
-be found. If the drawer does not exist and FORCE is non-nil, create
-the drawer."
- (catch 'exit
- (save-excursion
- (let* ((beg (or beg (and (org-before-first-heading-p) (point-min))
- (progn (org-back-to-heading t) (point))))
- (end (or end (and (not (outline-next-heading)) (point-max))
- (point))))
- (goto-char beg)
- (if (re-search-forward org-property-start-re end t)
- (setq beg (1+ (match-end 0)))
- (if force
- (save-excursion
- (org-insert-property-drawer)
- (setq end (progn (outline-next-heading) (point))))
- (throw 'exit nil))
- (goto-char beg)
- (if (re-search-forward org-property-start-re end t)
- (setq beg (1+ (match-end 0)))))
- (if (re-search-forward org-property-end-re end t)
- (setq end (match-beginning 0))
- (or force (throw 'exit nil))
- (goto-char beg)
- (setq end beg)
- (org-indent-line)
- (insert ":END:\n"))
- (cons beg end)))))
+ (save-excursion
+ (beginning-of-line)
+ (and (looking-at org-property-re)
+ (let ((property-drawer (save-match-data (org-get-property-block))))
+ (and property-drawer (< (point) (cdr property-drawer)))))))
(defun org-entry-properties (&optional pom which specific)
"Get all properties of the entry at point-or-marker POM.
@@ -15556,7 +15551,7 @@ things up because then unnecessary parsing is avoided."
(when (memq which '(all standard))
;; Get the standard properties, like :PROP: ...
- (setq range (org-get-property-block beg end))
+ (setq range (org-get-property-block beg))
(when range
(goto-char (car range))
(while (re-search-forward org-property-re
@@ -15808,7 +15803,7 @@ If it is not a string, an error is raised."
property))
(t ; a non-special property
(let ((buffer-invisibility-spec (org-inhibit-invisibility))) ; Emacs 21
- (setq range (org-get-property-block beg end 'force))
+ (setq range (org-get-property-block beg 'force))
(goto-char (car range))
(if (re-search-forward
(org-re-property property nil t) (cdr range) t)
@@ -15843,7 +15838,7 @@ formats in the current buffer."
(setq range (or (org-get-property-block)
(if (y-or-n-p
(format "Malformed drawer at %d, repair?" (point)))
- (org-get-property-block nil nil t)
+ (org-get-property-block nil t)
(throw 'cont nil))))
(goto-char (car range))
(while (re-search-forward org-property-re