From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kyle Meyer Subject: [PATCH] Patches for agenda exiting commands Date: Fri, 02 Jan 2015 18:04:29 -0500 Message-ID: <87iogog4xu.fsf@kmlap.domain.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:56349) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y7BDc-0000YO-F9 for emacs-orgmode@gnu.org; Fri, 02 Jan 2015 18:01:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y7BDZ-0003vu-7p for emacs-orgmode@gnu.org; Fri, 02 Jan 2015 18:01:20 -0500 Received: from mail-oi0-f52.google.com ([209.85.218.52]:47944) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y7BDZ-0003vf-1N for emacs-orgmode@gnu.org; Fri, 02 Jan 2015 18:01:17 -0500 Received: by mail-oi0-f52.google.com with SMTP id a3so11113033oib.11 for ; Fri, 02 Jan 2015 15:01:15 -0800 (PST) Received: from localhost (FUSE-DEDICATED-66-117-226-50.fuse.net. [66.117.226.50]) by mx.google.com with ESMTPSA id e129sm24495271oih.28.2015.01.02.15.01.13 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 02 Jan 2015 15:01:14 -0800 (PST) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org-mode --=-=-= Content-Type: text/plain Hello, I've attached a few patches related to the agenda exiting commands. Please let me know any comments. -- Kyle --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0001-org-agenda-Fix-exiting-function-docstrings.patch >From eda6e1d681ba11d427fe37cfe8af966e82ebab2d Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Fri, 2 Jan 2015 17:38:19 -0500 Subject: [PATCH 1/5] org-agenda: Fix exiting function docstrings * lisp/org-agenda.el (org-agenda-Quit): * lisp/org-agenda.el (org-agenda-quit): * lisp/org-agenda.el (org-agenda-exit): Correct and expand docstrings. --- lisp/org-agenda.el | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 5990bbb..49eb07b 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -7173,8 +7173,9 @@ (defun org-agenda-check-type (error &rest types) nil)))) (defun org-agenda-Quit () - "Exit the agenda and kill buffers loaded by `org-agenda'. -Also restore the window configuration." + "Exit the agenda, killing the agenda buffer. +Like `org-agenda-quit', but kill the buffer even when +`org-agenda-sticky' is non-nil." (interactive) (if org-agenda-columns-active (org-columns-quit) @@ -7202,8 +7203,16 @@ (defun org-agenda-Quit () (setq org-agenda-pre-window-conf nil)))) (defun org-agenda-quit () - "Exit the agenda and restore the window configuration. -When `org-agenda-sticky' is non-nil, only bury the agenda." + "Exit the agenda. + +When `org-agenda-sticky' is non-nil, bury the agenda buffer +instead of killing it. + +When `org-agenda-restore-windows-after-quit' is non-nil, restore +the pre-agenda window configuration. + +When column view is active, exit column view instead of the +agenda." (interactive) (if (and (eq org-indirect-buffer-display 'other-window) org-last-indirect-buffer) @@ -7232,9 +7241,10 @@ (defun org-agenda-quit () (org-agenda-Quit)))) (defun org-agenda-exit () - "Exit the agenda and restore the window configuration. -Also kill Org-mode buffers loaded by `org-agenda'. Org-mode -buffers visited directly by the user will not be touched." + "Exit the agenda, killing Org buffers loaded by the agenda. +Like `org-agenda-Quit', but kill any buffers that were created by +the agenda. Org buffers visited directly by the user will not be +touched." (interactive) (org-release-buffers org-agenda-new-buffers) (setq org-agenda-new-buffers nil) -- 2.2.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0002-org-agenda-exit-Check-column-view.patch >From 44b71bf3a82ca16037252b13aee491e9807a7c4a Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Fri, 2 Jan 2015 17:38:24 -0500 Subject: [PATCH 2/5] org-agenda-exit: Check column view * lisp/org-agenda.el (org-agenda-exit): Exit column view before trying to exit agenda. Running org-agenda-exit in column view deleted all buffers loaded by the agenda, but it didn't actually exit the agenda because, if the agenda is in column view, org-agenda-Quit turns off column view instead of killing the agenda. So org-agenda-exit should either just quit column view if it is active (and not delete the loaded buffers or quit the agenda) or make sure that the agenda is not in column view before killing it. Since org-agenda-Quit and org-agenda-quit already do the former, make org-agenda-exit completely exit the agenda regardless of whether it is in column view. --- lisp/org-agenda.el | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 49eb07b..1446d21 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -7244,8 +7244,10 @@ (defun org-agenda-exit () "Exit the agenda, killing Org buffers loaded by the agenda. Like `org-agenda-Quit', but kill any buffers that were created by the agenda. Org buffers visited directly by the user will not be -touched." +touched. Also, exit the agenda even if it is in column view." (interactive) + (when org-agenda-columns-active + (org-columns-quit)) (org-release-buffers org-agenda-new-buffers) (setq org-agenda-new-buffers nil) (org-agenda-Quit)) -- 2.2.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0003-org-agenda-Quit-Remove-unnecessary-function-calls.patch >From 6af4d934882720e36228c4b7cc3013829e9bab0b Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Fri, 2 Jan 2015 17:38:30 -0500 Subject: [PATCH 3/5] org-agenda-Quit: Remove unnecessary function calls * lisp/org-agenda.el (org-agenda-Quit): Remove unnecessary function calls. - org-agenda-Quit turns off column view if it is active, instead of killing the agenda buffer, so there is no need to call org-columns-remove-overlays when killing the buffer. - org-agenda-reset-markers is already called when the kill-buffer-hook is run. --- lisp/org-agenda.el | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 1446d21..2fbfacc 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -7182,17 +7182,13 @@ (defun org-agenda-Quit () (let ((buf (current-buffer))) (if (eq org-agenda-window-setup 'other-frame) (progn - (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)) - (org-agenda-reset-markers) (kill-buffer buf) - (org-columns-remove-overlays) (setq org-agenda-archives-mode nil))) (setq org-agenda-buffer nil) ;; Maybe restore the pre-agenda window configuration. -- 2.2.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0004-org-agenda-Track-last-indirect-buffer.patch >From 25c6bb500ae0c3e583200bc7d8d67da86c4f1d10 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Fri, 2 Jan 2015 17:38:34 -0500 Subject: [PATCH 4/5] org-agenda: Track last indirect buffer * lisp/org-agenda.el (org-agenda-tree-to-indirect-buffer): Record last indirect buffer for agenda. * lisp/org-agenda.el (org-agenda-quit): Delete window for org-agenda-last-indirect-buffer, not org-last-indirect-buffer. If an indirect buffer for an Org subtree was present as a window, org-agenda-quit deleted this window regardless of whether it was created from the agenda. Introduce a new variable, org-agenda-last-indirect-buffer, that is specific for the agenda (and perhaps a particular agenda buffer, if org-agenda-sticky is set). org-agenda-quit checked for indirect buffers while org-agenda-Quit did not. There doesn't seem to be any reason for this difference in behavior, so make org-agenda-Quit treat windows for indirect buffers the same way as org-agenda-quit. --- lisp/org-agenda.el | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 2fbfacc..7ecea43 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -2078,6 +2078,7 @@ (defvar org-agenda-last-prefix-arg nil) (defvar org-agenda-this-buffer-name nil) (defvar org-agenda-doing-sticky-redo nil) (defvar org-agenda-this-buffer-is-sticky nil) +(defvar org-agenda-last-indirect-buffer nil) (defconst org-agenda-local-vars '(org-agenda-this-buffer-name @@ -2102,6 +2103,7 @@ (defconst org-agenda-local-vars org-agenda-effort-filter org-agenda-markers org-agenda-last-search-view-search-was-boolean + org-agenda-last-indirect-buffer org-agenda-filtered-by-category org-agenda-filter-form org-agenda-cycle-counter @@ -7177,6 +7179,12 @@ (defun org-agenda-Quit () Like `org-agenda-quit', but kill the buffer even when `org-agenda-sticky' is non-nil." (interactive) + (let ((org-agenda-last-indirect-window + (and (eq org-indirect-buffer-display 'other-window) + org-agenda-last-indirect-buffer + (get-buffer-window org-agenda-last-indirect-buffer)))) + (when org-agenda-last-indirect-window + (delete-window org-agenda-last-indirect-window))) (if org-agenda-columns-active (org-columns-quit) (let ((buf (current-buffer))) @@ -7210,12 +7218,12 @@ (defun org-agenda-quit () When column view is active, exit column view instead of the agenda." (interactive) - (if (and (eq org-indirect-buffer-display 'other-window) - org-last-indirect-buffer) - (let ((org-last-indirect-window - (get-buffer-window org-last-indirect-buffer))) - (if org-last-indirect-window - (delete-window org-last-indirect-window)))) + (let ((org-agenda-last-indirect-window + (and (eq org-indirect-buffer-display 'other-window) + org-agenda-last-indirect-buffer + (get-buffer-window org-agenda-last-indirect-buffer)))) + (when org-agenda-last-indirect-window + (delete-window org-agenda-last-indirect-window))) (if org-agenda-columns-active (org-columns-quit) (if org-agenda-sticky @@ -8758,7 +8766,8 @@ (defun org-agenda-tree-to-indirect-buffer (arg) (and indirect-window (select-window indirect-window)) (switch-to-buffer org-last-indirect-buffer :norecord) (fit-window-to-buffer indirect-window))) - (select-window (get-buffer-window agenda-buffer))))) + (select-window (get-buffer-window agenda-buffer)) + (setq org-agenda-last-indirect-buffer org-last-indirect-buffer)))) (defun org-agenda-do-tree-to-indirect-buffer (arg) "Same as `org-agenda-tree-to-indirect-buffer' without saving window." -- 2.2.1 --=-=-= Content-Type: text/x-diff Content-Disposition: attachment; filename=0005-org-agenda-Fix-issues-with-restoring-windows.patch >From 514ca4bf4c057cf781d85391c5ffd1530cdf2a05 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Fri, 2 Jan 2015 17:38:39 -0500 Subject: [PATCH 5/5] org-agenda: Fix issues with restoring windows * lisp/org-agenda.el (org-agenda-prepare-window): Update window configuration even when agenda buffer exists in background. * lisp/org-agenda.el (org-agenda-Quit): Use buffer value for org-agenda-pre-window-conf to allow for local values used with sticky agenda buffers. * lisp/org-agenda.el (org-agenda-quit): Reset local, not global, value for org-agenda-pre-window-conf. The pre-agenda window configuration was not being updated, resulting in a window configuration other than the one prior to the most recent agenda call being restored, in the following cases: - The user exited or buried the buffer without using q, Q, or x. - org-agenda-sticky was non-nil and the user buried the buffer with q. This was because the global, not buffer-local, value for org-agenda-pre-window-conf was not being reset. Also, when org-agenda-sticky was non-nil, pressing Q (org-agenda-Quit) restored the global, not the buffer-local, value for org-agenda-pre-window-conf. Along with these changes, merge the duplicated functionality in org-agenda-quit and org-agenda-Quit. --- lisp/org-agenda.el | 82 +++++++++++++++++++++--------------------------------- 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index 7ecea43..7bce68d 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -3632,7 +3632,7 @@ (defun org-agenda-prepare-window (abuf filter-alist) (unless (equal (current-buffer) abuf) (org-pop-to-buffer-same-window abuf)) (setq org-agenda-pre-window-conf - (or org-agenda-pre-window-conf wconf)))) + (or wconf org-agenda-pre-window-conf)))) (defun org-agenda-prepare (&optional name) (let ((filter-alist (if org-agenda-persistent-filter @@ -7179,32 +7179,7 @@ (defun org-agenda-Quit () Like `org-agenda-quit', but kill the buffer even when `org-agenda-sticky' is non-nil." (interactive) - (let ((org-agenda-last-indirect-window - (and (eq org-indirect-buffer-display 'other-window) - org-agenda-last-indirect-buffer - (get-buffer-window org-agenda-last-indirect-buffer)))) - (when org-agenda-last-indirect-window - (delete-window org-agenda-last-indirect-window))) - (if org-agenda-columns-active - (org-columns-quit) - (let ((buf (current-buffer))) - (if (eq org-agenda-window-setup 'other-frame) - (progn - (kill-buffer buf) - (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) - (setq org-agenda-archives-mode nil))) - (setq org-agenda-buffer nil) - ;; Maybe restore the pre-agenda window configuration. - (and org-agenda-restore-windows-after-quit - (not (eq org-agenda-window-setup 'other-frame)) - org-agenda-pre-window-conf - (set-window-configuration org-agenda-pre-window-conf) - (setq org-agenda-pre-window-conf nil)))) + (org-agenda--quit)) (defun org-agenda-quit () "Exit the agenda. @@ -7218,31 +7193,38 @@ (defun org-agenda-quit () When column view is active, exit column view instead of the agenda." (interactive) - (let ((org-agenda-last-indirect-window - (and (eq org-indirect-buffer-display 'other-window) - org-agenda-last-indirect-buffer - (get-buffer-window org-agenda-last-indirect-buffer)))) - (when org-agenda-last-indirect-window - (delete-window org-agenda-last-indirect-window))) + (org-agenda--quit org-agenda-sticky)) + +(defun org-agenda--quit (&optional bury) (if org-agenda-columns-active (org-columns-quit) - (if org-agenda-sticky - (let ((buf (current-buffer))) - (if (eq org-agenda-window-setup 'other-frame) - (progn - (delete-frame)) - (and (not (eq org-agenda-window-setup 'current-window)) - (not (one-window-p)) - (delete-window))) - (with-current-buffer buf - (bury-buffer) - ;; Maybe restore the pre-agenda window configuration. - (and org-agenda-restore-windows-after-quit - (not (eq org-agenda-window-setup 'other-frame)) - org-agenda-pre-window-conf - (set-window-configuration org-agenda-pre-window-conf) - (setq org-agenda-pre-window-conf nil)))) - (org-agenda-Quit)))) + (let ((buf (current-buffer)) + (wconf org-agenda-pre-window-conf) + (org-agenda-last-indirect-window + (and (eq org-indirect-buffer-display 'other-window) + org-agenda-last-indirect-buffer + (get-buffer-window org-agenda-last-indirect-buffer)))) + (cond + ((eq org-agenda-window-setup 'other-frame) + (delete-frame)) + ((and org-agenda-restore-windows-after-quit + wconf) + ;; Maybe restore the pre-agenda window configuration. Reset + ;; `org-agenda-pre-window-conf' before running + ;; `set-window-configuration', which loses the current buffer. + (setq org-agenda-pre-window-conf nil) + (set-window-configuration wconf)) + (t + (when org-agenda-last-indirect-window + (delete-window org-agenda-last-indirect-window)) + (and (not (eq org-agenda-window-setup 'current-window)) + (not (one-window-p)) + (delete-window)))) + (if bury + (bury-buffer buf) + (kill-buffer buf) + (setq org-agenda-archives-mode nil + org-agenda-buffer nil))))) (defun org-agenda-exit () "Exit the agenda, killing Org buffers loaded by the agenda. -- 2.2.1 --=-=-=--