summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Guerry <bzg@altern.org>2011-03-06 14:10:28 +0100
committerBastien Guerry <bzg@altern.org>2011-03-06 14:10:28 +0100
commit35effd6b6d3e0ac9d311a4f1a9b545683c174aff (patch)
treeed99dc4e0deacf533497e096f681a746e2c2bd8c
parente4899b1742464d28e3a21e83179717f7dd0a1c31 (diff)
downloadorg-mode-35effd6b6d3e0ac9d311a4f1a9b545683c174aff.tar.gz
org-capture.el: Fix bug about capturing to narrowed buffers.
* org-capture.el (org-capture-put-target-region-and-position): New function to store information about the target buffer. (org-capture-set-target-location): Use it. (org-capture-finalize): restore the target buffer in its possibly narrowed state. Also restore the cursor position.
-rw-r--r--lisp/org-capture.el55
1 files changed, 54 insertions, 1 deletions
diff --git a/lisp/org-capture.el b/lisp/org-capture.el
index f112663..ae38cab 100644
--- a/lisp/org-capture.el
+++ b/lisp/org-capture.el
@@ -517,7 +517,11 @@ process should clock-out the captured entry."
(let ((beg (point-min))
(end (point-max))
(abort-note nil))
+ ;; Store the size of the capture buffer
+ (org-capture-put :captured-entry-size (- (point-max) (point-min)))
(widen)
+ ;; Store the insertion point in the target buffer
+ (org-capture-put :insertion-point (point))
(if org-note-abort
(let ((m1 (org-capture-get :begin-marker 'local))
@@ -567,9 +571,30 @@ process should clock-out the captured entry."
(kill-buffer (org-capture-get :kill-buffer 'local))
(base-buffer (buffer-base-buffer (current-buffer))))
- ;; Kill the indiret buffer
+ ;; Kill the indirect buffer
(kill-buffer (current-buffer))
+ ;; Narrow back the target buffer to its previous state
+ (with-current-buffer (org-capture-get :buffer)
+ (let ((reg (org-capture-get :initial-target-region))
+ (pos (org-capture-get :initial-target-position))
+ (ipt (org-capture-get :insertion-point))
+ (size (org-capture-get :captured-entry-size)))
+ (when reg
+ (cond ((< ipt (car reg))
+ ;; insertion point is before the narrowed region
+ (narrow-to-region (+ size (car reg)) (+ size (cdr reg))))
+ ((> ipt (cdr reg))
+ ;; insertion point is after the narrowed region
+ (narrow-to-region (car reg) (cdr reg)))
+ (t
+ ;; insertion point is within the narrowed region
+ (narrow-to-region (car reg) (+ size (cdr reg)))))
+ ;; now place back the point at its original position
+ (if (< ipt (car reg))
+ (goto-char (+ size pos))
+ (goto-char (if (< ipt pos) (+ size pos) pos))))))
+
;; Kill the target buffer if that is desired
(when (and base-buffer new-buffer kill-buffer)
(with-current-buffer base-buffer (save-buffer))
@@ -629,6 +654,16 @@ already gone. Any prefix argument will be passed to the refile command."
;;; Supporting functions for handling the process
+(defun org-capture-put-target-region-and-position ()
+ "Store the initial region with `org-capture-put'."
+ (org-capture-put
+ :initial-target-region
+ ;; Check if the buffer is currently narrowed
+ (when (/= (buffer-size) (- (point-max) (point-min)))
+ (cons (point-min) (point-max))))
+ ;; store the current point
+ (org-capture-put :initial-target-position (point)))
+
(defun org-capture-set-target-location (&optional target)
"Find target buffer and position and store then in the property list."
(let ((target-entry-p t))
@@ -637,12 +672,16 @@ already gone. Any prefix argument will be passed to the refile command."
(cond
((eq (car target) 'file)
(set-buffer (org-capture-target-buffer (nth 1 target)))
+ (org-capture-put-target-region-and-position)
+ (widen)
(setq target-entry-p nil))
((eq (car target) 'currentfile)
(if (not (and (buffer-file-name) (org-mode-p)))
(error "Cannot call this capture template outside of an Org buffer")
(set-buffer (org-capture-target-buffer (buffer-file-name)))
+ (org-capture-put-target-region-and-position)
+ (widen)
(setq target-entry-p nil)))
((eq (car target) 'id)
@@ -650,10 +689,14 @@ already gone. Any prefix argument will be passed to the refile command."
(if (not loc)
(error "Cannot find target ID \"%s\"" (nth 1 target))
(set-buffer (org-capture-target-buffer (car loc)))
+ (widen)
+ (org-capture-put-target-region-and-position)
(goto-char (cdr loc)))))
((eq (car target) 'file+headline)
(set-buffer (org-capture-target-buffer (nth 1 target)))
+ (org-capture-put-target-region-and-position)
+ (widen)
(let ((hd (nth 2 target)))
(goto-char (point-min))
(unless (org-mode-p)
@@ -674,10 +717,14 @@ already gone. Any prefix argument will be passed to the refile command."
(cons (org-capture-expand-file (nth 1 target))
(cddr target)))))
(set-buffer (marker-buffer m))
+ (org-capture-put-target-region-and-position)
+ (widen)
(goto-char m)))
((eq (car target) 'file+regexp)
(set-buffer (org-capture-target-buffer (nth 1 target)))
+ (org-capture-put-target-region-and-position)
+ (widen)
(goto-char (point-min))
(if (re-search-forward (nth 2 target) nil t)
(progn
@@ -690,6 +737,8 @@ already gone. Any prefix argument will be passed to the refile command."
((memq (car target) '(file+datetree file+datetree+prompt))
(require 'org-datetree)
(set-buffer (org-capture-target-buffer (nth 1 target)))
+ (org-capture-put-target-region-and-position)
+ (widen)
;; Make a date tree entry, with the current date (or yesterday,
;; if we are extending dates for a couple of hours)
(org-datetree-find-date-create
@@ -711,6 +760,8 @@ already gone. Any prefix argument will be passed to the refile command."
((eq (car target) 'file+function)
(set-buffer (org-capture-target-buffer (nth 1 target)))
+ (org-capture-put-target-region-and-position)
+ (widen)
(funcall (nth 2 target))
(org-capture-put :exact-position (point))
(setq target-entry-p (and (org-mode-p) (org-at-heading-p))))
@@ -724,6 +775,8 @@ already gone. Any prefix argument will be passed to the refile command."
(if (and (markerp org-clock-hd-marker)
(marker-buffer org-clock-hd-marker))
(progn (set-buffer (marker-buffer org-clock-hd-marker))
+ (org-capture-put-target-region-and-position)
+ (widen)
(goto-char org-clock-hd-marker))
(error "No running clock that could be used as capture target")))