diff options
author | Carsten Dominik <carsten.dominik@gmail.com> | 2012-03-09 09:25:20 +0100 |
---|---|---|
committer | Carsten Dominik <carsten.dominik@gmail.com> | 2012-03-09 09:33:46 +0100 |
commit | 820a36f66cdf5db4a5a5567e89e89c11ca23d1af (patch) | |
tree | 9bbd0cf5284df0e7fc930598d1283777be10f8aa | |
parent | d4cd88bfe530378bc0ca407cab3be7b4a58ffeda (diff) | |
download | org-mode-820a36f66cdf5db4a5a5567e89e89c11ca23d1af.tar.gz |
Implement proper handling of agenda markers when using sticky agendas
* lisp/org-agenda.el (org-toggle-sticky-agenda): Kill all agenda buffers
when toggling sticky-agendas.
(org-agenda-get-restriction-and-command): Add `C-c a C-k' as a key to
explicitly kill all agenda buffers.
(org-agenda-run-series): Remove any old agenda markers in the buffer
that is going to take the new block agenda.
(org-prepare-agenda): Reset markers before erasing the buffer anc
running `org-agenda-mode', because after that hte local variable
`org-agenda-markers' will have gone away.
(org-agenda-Quit):
(org-finalize-agenda): Install the marker resetter into
the `kill-buffer-hook'.
(org-agenda-save-markers-for-cut-and-paste): Look for markers in all
agenda buffers.
(org-agenda-kill-all-agenda-buffers): New function.
-rw-r--r-- | lisp/org-agenda.el | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 8692cf2..09dc4f5 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -1829,6 +1829,7 @@ When nil, `q' will kill the single agenda buffer." "Toggle `org-agenda-sticky'." (interactive) (setq org-agenda-sticky (or arg (not org-agenda-sticky))) + (org-agenda-kill-all-agenda-buffers) (message "Sticky agenda was %s" (if org-agenda-sticky "enabled" "disabled"))) (defvar org-agenda-last-prefix-arg nil) @@ -2695,6 +2696,11 @@ s Search for keywords C Configure custom agenda commands nil (cons (substring (car x) 1) (cdr x)))) custom)))) + ((eq c ?\C-k) + (org-agenda-remove-restriction-lock 'noupdate) + (org-agenda-kill-all-agenda-buffers) + (message "All agenda buffers have been killed") + (ding) (sit-for 2)) ((and (not restrict-ok) (memq c '(?1 ?0 ?<))) (message "Restriction is only possible in Org-mode buffers") (ding) (sit-for 1)) @@ -2730,6 +2736,9 @@ s Search for keywords C Configure custom agenda commands "The arguments of the previous call to `org-agenda'.") (defun org-agenda-run-series (name series) (org-let (nth 1 series) '(org-prepare-agenda name)) + ;; We need to reset agenda markers heree, because when constructing a + ;; block agenda, the individual blocks do not do that. + (org-agenda-reset-markers) (let* ((org-agenda-multi t) (redo (list 'org-agenda-run-series name (list 'quote series))) (org-agenda-overriding-arguments @@ -3288,8 +3297,7 @@ generating a new one" (progn ;; Popup existing buffer (org-prepare-agenda-window (get-buffer org-agenda-buffer-name)) - (message - "Sticky Agenda buffer, use `r' to refresh") + (message "Sticky Agenda buffer, use `r' to refresh") (throw 'exit nil)) (setq org-todo-keywords-for-agenda nil) (setq org-done-keywords-for-agenda nil) @@ -3298,7 +3306,8 @@ generating a new one" (setq org-agenda-tag-filter nil org-agenda-category-filter nil)) (put 'org-agenda-tag-filter :preset-filter org-agenda-tag-filter-preset) - (put 'org-agenda-category-filter :preset-filter org-agenda-category-filter-preset) + (put 'org-agenda-category-filter :preset-filter + org-agenda-category-filter-preset) (if org-agenda-multi (progn (setq buffer-read-only nil) @@ -3316,10 +3325,10 @@ generating a new one" ;; since they are now buffer local (org-prepare-agenda-window (get-buffer-create org-agenda-buffer-name)) (setq buffer-read-only nil) + (org-agenda-reset-markers) (let ((inhibit-read-only t)) (erase-buffer)) (org-agenda-mode) (setq org-agenda-buffer (current-buffer)) - (org-agenda-reset-markers) (setq org-agenda-contributing-files nil) (setq org-agenda-columns-active nil) (org-prepare-agenda-buffers (org-agenda-files nil 'ifmode)) @@ -3369,6 +3378,7 @@ generating a new one" (org-agenda-filter-apply org-agenda-tag-filter 'tag)) (when (or org-agenda-category-filter (get 'org-agenda-category-filter :preset-filter)) (org-agenda-filter-apply org-agenda-category-filter 'category)) + (org-add-hook 'kill-buffer-hook 'org-agenda-reset-markers 'append 'local) ))) (defun org-agenda-mark-clocking-task () @@ -3524,9 +3534,13 @@ no longer in use." (move-marker (pop org-agenda-markers) nil))) (defun org-agenda-save-markers-for-cut-and-paste (beg end) - "Save relative positions of markers in region." - (mapc (lambda (m) (org-check-and-save-marker m beg end)) - org-agenda-markers)) + "Save relative positions of markers in region. +This check for agenda markers in all agenda buffers currently active." + (dolist (buf (buffer-list)) + (with-current-buffer buf + (when (eq major-mode 'org-agenda-mode) + (mapc (lambda (m) (org-check-and-save-marker m beg end)) + org-agenda-markers))))) ;;; Entry text mode @@ -4732,6 +4746,8 @@ function from a program - use `org-agenda-get-day-entries' instead." (when (> (- (org-float-time) org-agenda-last-marker-time) 5) + ;; I am not sure if this works with sticky agendas, because the marker + ;; list is then no longer a global variable. (org-agenda-reset-markers)) (org-compile-prefix-format 'agenda) (org-set-sorting-strategy 'agenda) @@ -6346,7 +6362,6 @@ If ERROR is non-nil, throw an error, otherwise just return nil." (error "Not allowed in %s-type agenda buffers" org-agenda-type) nil))) - (defun org-agenda-Quit (&optional arg) "Exit agenda by removing the window or the buffer" (interactive) @@ -6355,16 +6370,16 @@ If ERROR is non-nil, throw an error, otherwise just return nil." (let ((buf (current-buffer))) (if (eq org-agenda-window-setup 'other-frame) (progn - (kill-buffer buf) (org-agenda-reset-markers) + (kill-buffer buf) (org-columns-remove-overlays) (setq org-agenda-archives-mode nil) (delete-frame)) (and (not (eq org-agenda-window-setup 'current-window)) (not (one-window-p)) (delete-window)) - (kill-buffer buf) (org-agenda-reset-markers) + (kill-buffer buf) (org-columns-remove-overlays) (setq org-agenda-archives-mode nil))) ;; Maybe restore the pre-agenda window configuration. @@ -6400,6 +6415,17 @@ Org-mode buffers visited directly by the user will not be touched." (setq org-agenda-new-buffers nil) (org-agenda-Quit)) +(defun org-agenda-kill-all-agenda-buffers () + "Kill all buffers in `org-agena-mode'. +This is used when toggling sticky agendas. You can also explicitly invoke it +with `C-c a C-k'." + (interactive) + (let (blist) + (dolist (buf (buffer-list)) + (when (with-current-buffer buf (eq major-mode 'org-agenda-mode)) + (push buf blist))) + (mapc 'kill-buffer blist))) + (defun org-agenda-execute (arg) "Execute another agenda command, keeping same window. So this is just a shortcut for \\<global-map>`\\[org-agenda]', available |