From: Kyle Meyer <kyle@kyleam.com>
To: Org-mode <emacs-orgmode@gnu.org>
Subject: Re: [PATCH] Patches for agenda exiting commands
Date: Sun, 04 Jan 2015 23:24:17 -0500 [thread overview]
Message-ID: <87tx05hn2m.fsf@kmlap.domain.org> (raw)
In-Reply-To: <87sifs6r7c.fsf@nicolasgoaziou.fr> (Nicolas Goaziou's message of "Sat, 03 Jan 2015 12:25:59 +0100")
[-- Attachment #1: Type: text/plain, Size: 415 bytes --]
Nicolas Goaziou <mail@nicolasgoaziou.fr> wrote:
[...]
> Nitpick: in commit messages, prefer the present tense.
I've reworded the commit message for the remaining patches.
>> +(defvar org-agenda-last-indirect-buffer nil)
>
> Please provide a docstring for this new variable.
[...]
> Also, the commit message lacks the creation of `org-agenda--quit'.
I've added both of these.
Thanks for your comments.
--
Kyle
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-org-agenda-Track-last-indirect-buffer.patch --]
[-- Type: text/x-diff, Size: 3665 bytes --]
From fc3a2b526a77e574c6b076d626cd35583ad5ecdf Mon Sep 17 00:00:00 2001
From: Kyle Meyer <kyle@kyleam.com>
Date: Sun, 4 Jan 2015 22:18:40 -0500
Subject: [PATCH 1/2] 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.
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). This prevents org-agenda-quit from deleting
a window if it is displaying a buffer that was created through a
org-tree-to-indirect-buffer call outside of
org-agenda-tree-to-indirect-buffer.
Make org-agenda-Quit check for indirect buffer windows, like
org-agenda-quit does.
---
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 2fbfacc..6e2e953 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -2078,6 +2078,8 @@ (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
+ "Last buffer loaded by `org-agenda-tree-to-indirect-buffer'.")
(defconst org-agenda-local-vars
'(org-agenda-this-buffer-name
@@ -2102,6 +2104,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 +7180,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 +7219,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 +8767,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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-org-agenda-Fix-issues-with-restoring-windows.patch --]
[-- Type: text/x-diff, Size: 5481 bytes --]
From f842617f9bacccdf2458a0c6b53f86814787cdc3 Mon Sep 17 00:00:00 2001
From: Kyle Meyer <kyle@kyleam.com>
Date: Sun, 4 Jan 2015 22:18:46 -0500
Subject: [PATCH 2/2] 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.
* lisp/org-agenda.el (org-agenda--quit): New function.
Update the pre-agenda window configuration on the next agenda call even
if org-agenda-pre-window-conf is non-nil (which occurs when the agenda
buffer is exited without q, Q, or X). This prevents restoring a window
configuration that is not the one prior to the most recent agenda call.
Make org-agenda-Quit (Q) restore the buffer-local, not the global, value
for org-agenda-pre-window-conf so that it works correctly with sticky
agenda buffers.
Along with these changes, merge the duplicated functionality of
org-agenda-quit and org-agenda-Quit into a new function,
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 6e2e953..8d5655f 100644
--- a/lisp/org-agenda.el
+++ b/lisp/org-agenda.el
@@ -3633,7 +3633,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
@@ -7180,32 +7180,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.
@@ -7219,31 +7194,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
next prev parent reply other threads:[~2015-01-05 4:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-02 23:04 [PATCH] Patches for agenda exiting commands Kyle Meyer
2015-01-03 11:25 ` Nicolas Goaziou
2015-01-05 4:24 ` Kyle Meyer [this message]
2015-01-05 11:50 ` Nicolas Goaziou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.orgmode.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87tx05hn2m.fsf@kmlap.domain.org \
--to=kyle@kyleam.com \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).