diff options
author | Carsten Dominik <carsten.dominik@gmail.com> | 2010-06-29 09:14:21 +0200 |
---|---|---|
committer | Carsten Dominik <carsten.dominik@gmail.com> | 2010-06-29 09:16:04 +0200 |
commit | d537c10964e6e1b13911ead5128e1a0faef0d7a5 (patch) | |
tree | b18d207ee50ebfc3dea49ae1c8ee02aae7457db8 | |
parent | 2510d02be92c370ff193af29c89f60249de2aae6 (diff) | |
download | org-mode-d537c10964e6e1b13911ead5128e1a0faef0d7a5.tar.gz |
Capture: Better error handling and better return-to-last-stored
* lisp/org-capture.el (org-capture-position-for-last-stored):
org-capture-bookmark-last-stored-position): New functions.
(org-capture-place-table-line): Better error catching.
(org-capture-place-item):
(org-capture-place-entry):
(org-capture-place-plain-text): Call
`org-capture-position-for-last-stored'.
(org-capture-finalize): Just call
`org-capture-bookmark-last-stored-position'.
-rw-r--r-- | lisp/org-capture.el | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/lisp/org-capture.el b/lisp/org-capture.el index ea232cb..fb3c06a 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -386,7 +386,16 @@ bypassed." (if (equal goto 0) ;;insert at point (org-capture-insert-template-here) - (org-capture-place-template) + (condition-case error + (org-capture-place-template) + ((error quit) + (if (and (buffer-base-buffer (current-buffer)) + (string-match "\\`CAPTURE-" (buffer-name))) + (kill-buffer (current-buffer))) + (set-window-configuration (org-capture-get :return-to-wconf)) + (error "Capture template `%s': %s" + (org-capture-get :key) + (nth 1 error)))) (if (org-capture-get :immediate-finish) (org-capture-finalize) (if (and (org-mode-p) @@ -463,14 +472,8 @@ bypassed." ;; Store this place as the last one where we stored something ;; Do the marking in the base buffer, so that it makes sense after ;; the indirect buffer has been killed. - (let ((pos (point))) - (with-current-buffer (buffer-base-buffer (current-buffer)) - (save-excursion - (save-restriction - (widen) - (goto-char pos) - (bookmark-set "org-capture-last-stored") - (move-marker org-capture-last-stored-marker (point)))))) + (org-capture-bookmark-last-stored-position) + ;; Run the hook (run-hooks 'org-capture-before-finalize-hook) ) @@ -659,6 +662,7 @@ already gone." (setq beg (point)) (org-paste-subtree level txt 'for-yank) (org-capture-empty-lines-after 1) + (org-capture-position-for-last-stored beg) (outline-next-heading) (setq end (point)) (org-capture-mark-kill-region beg (1- end)) @@ -711,6 +715,7 @@ already gone." (insert txt) (or (bolp) (insert "\n")) (org-capture-empty-lines-after 1) + (org-capture-position-for-last-stored beg) (forward-char 1) (setq end (point)) (org-capture-mark-kill-region beg (1- end)) @@ -739,8 +744,8 @@ already gone." (forward-line 1)) (narrow-to-region b (point))) (goto-char end) - (insert "\n\n") - (narrow-to-region (1- (point)) (point))) + (insert "\n| |\n|----|\n| |\n") + (narrow-to-region (1+ end) (point))) ;; We are narrowed to the table, or to an empty line if there was no table ;; Check if the template is good @@ -756,7 +761,7 @@ already gone." ll) ;; The user wants a special position in the table (org-table-get-specials) - (setq ll (aref org-table-hlines nh)) + (setq ll (ignore-errors (aref org-table-hlines nh))) (unless ll (error "Invalid table line specification \"%s\"" table-line-pos)) (setq ll (+ ll delta (if (< delta 0) 0 -1))) @@ -790,6 +795,7 @@ already gone." (insert txt) (setq end (point)))) (goto-char beg) + (org-capture-position-for-last-stored 'table-line) (if (re-search-forward "%\\?" end t) (replace-match "")) (org-table-align))) @@ -803,6 +809,7 @@ already gone." (setq beg (point)) (insert txt) (org-capture-empty-lines-after 1) + (org-capture-position-for-last-stored beg) (setq end (point)) (org-capture-mark-kill-region beg (1- end)) (org-capture-narrow beg (1- end)) @@ -815,6 +822,41 @@ already gone." (org-capture-put :begin-marker m1) (org-capture-put :end-marker m2))) +(defun org-capture-position-for-last-stored (where) + "Memorize the position that should later become the position of last capture." + (cond + ((integerp where) + (org-capture-put :position-for-last-stored + (move-marker (make-marker) where + (or (buffer-base-buffer (current-buffer)) + (current-buffer))))) + ((eq where 'table-line) + (org-capture-put :position-for-last-stored + (list 'table-line + (org-table-current-dline)))) + (t (error "This should not happen")))) + +(defun org-capture-bookmark-last-stored-position () + "Bookmark the last-captured position." + (let* ((where (org-capture-get :position-for-last-stored 'local)) + (pos (cond + ((markerp where) + (prog1 (marker-position where) + (move-marker where nil))) + ((and (listp where) (eq (car where) 'table-line)) + (if (org-at-table-p) + (save-excursion + (org-table-goto-line (nth 1 where)) + (point-at-bol)) + (point)))))) + (with-current-buffer (buffer-base-buffer (current-buffer)) + (save-excursion + (save-restriction + (widen) + (goto-char pos) + (bookmark-set "org-capture-last-stored") + (move-marker org-capture-last-stored-marker (point))))))) + (defun org-capture-narrow (beg end) "Narrow, unless configuraion says not to narrow." (unless (org-capture-get :unnarrowed) |