diff options
author | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2017-08-31 23:14:04 +0200 |
---|---|---|
committer | Nicolas Goaziou <mail@nicolasgoaziou.fr> | 2017-08-31 23:14:04 +0200 |
commit | 1654a5a98ab28fea3b74536e423bfffddfd86531 (patch) | |
tree | 49e0f6b7aecbf26f37c7437b2e1064ac4e53a983 | |
parent | 18a48b5861a6d90e020d4d0b47cb15654e85d7a7 (diff) | |
download | org-mode-1654a5a98ab28fea3b74536e423bfffddfd86531.tar.gz |
Fix `:jump-to-captured' when refiling a capture target
* lisp/org-capture.el (org-capture-refile): Call
`org-capture-goto-last-stored' at the appropriate time.
* testing/lisp/test-org-capture.el (test-org-capture/refile): Add
test.
Reported-by: "Raymond Zeitler" <zeitra@yahoo.com>
<http://lists.gnu.org/archive/html/emacs-orgmode/2017-08/msg00704.html>
-rw-r--r-- | lisp/org-capture.el | 11 | ||||
-rw-r--r-- | testing/lisp/test-org-capture.el | 18 |
2 files changed, 25 insertions, 4 deletions
diff --git a/lisp/org-capture.el b/lisp/org-capture.el index 4320730..1da5c61 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -818,13 +818,17 @@ for `entry'-type templates")) (let* ((base (or (buffer-base-buffer) (current-buffer))) (pos (make-marker)) (org-capture-is-refiling t) - (kill-buffer (org-capture-get :kill-buffer 'local))) + (kill-buffer (org-capture-get :kill-buffer 'local)) + (jump-to-captured (org-capture-get :jump-to-captured 'local))) ;; Since `org-capture-finalize' may alter buffer contents (e.g., ;; empty lines) around entry, use a marker to refer to the ;; headline to be refiled. Place the marker in the base buffer, ;; as the current indirect one is going to be killed. (set-marker pos (save-excursion (org-back-to-heading t) (point)) base) - (org-capture-put :kill-buffer nil) + ;; `org-capture-finalize' calls `org-capture-goto-last-stored' too + ;; early. We want to wait for the refiling to be over, so we + ;; control when the latter function is called. + (org-capture-put :kill-buffer nil :jump-to-captured nil) (unwind-protect (progn (org-capture-finalize) @@ -833,7 +837,8 @@ for `entry'-type templates")) (org-with-wide-buffer (goto-char pos) (call-interactively 'org-refile)))) - (when kill-buffer (kill-buffer base))) + (when kill-buffer (kill-buffer base)) + (when jump-to-captured (org-capture-goto-last-stored))) (set-marker pos nil)))) (defun org-capture-kill () diff --git a/testing/lisp/test-org-capture.el b/testing/lisp/test-org-capture.el index 7b022b1..4d5dfb7 100644 --- a/testing/lisp/test-org-capture.el +++ b/testing/lisp/test-org-capture.el @@ -127,7 +127,23 @@ (buffer-substring-no-properties (line-beginning-position) (line-end-position)))))) - (catch :return (org-capture-refile)))))))) + (catch :return (org-capture-refile))))))) + ;; When the entry is refiled, `:jump-to-captured' moves point to the + ;; refile location, not the initial capture target. + (should + (org-test-with-temp-text-in-file "* Refile target" + (let ((file1 (buffer-file-name))) + (org-test-with-temp-text-in-file "* A" + (let* ((file2 (buffer-file-name)) + (org-capture-templates + `(("t" "Todo" entry (file+headline ,file2 "A") + "** H1 %?" :jump-to-captured t)))) + (org-capture nil "t") + (cl-letf (((symbol-function 'org-refile-get-location) + (lambda (&rest args) + (list (file-name-nondirectory file1) file1 nil nil)))) + (org-capture-refile) + (list file1 file2 (buffer-file-name))))))))) (provide 'test-org-capture) |