emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/ebdb 60f7c04 2/2: Rework Gnus/Message window configurat


From: Eric Abrahamsen
Subject: [elpa] externals/ebdb 60f7c04 2/2: Rework Gnus/Message window configuration customization, bump version
Date: Wed, 2 Jun 2021 13:57:26 -0400 (EDT)

branch: externals/ebdb
commit 60f7c0410164fa01d9298ec937d87602f8a615dd
Author: Eric Abrahamsen <eric@ericabrahamsen.net>
Commit: Eric Abrahamsen <eric@ericabrahamsen.net>

    Rework Gnus/Message window configuration customization, bump version
    
    The fundamental problem was that EBDB shouldn't have been taking over
    window configuration for Gnus and message-mode.  The current
    implementation provides sane defaults with no config, plus the option
    to better integrate with Gnus' own window configuration system.
    
    * ebdb-gnus.el (ebdb-gnus-window-configuration): Change behavior of
    option.
    (ebdb-insinuate-gnus): Only add the option value to
    ebdb-window-to-buffer if it's a symbol.
    * ebdb-message.el (ebdb-message-window-configuration,
    ebdb-insinuate-mail): Do the same for message.
    (ebdb-message-reply-yank-window-config): Obsolete.
    * ebdb.info: Document.
    * ebdb.el: Bump version to 0.6.23.
    * ebdb-com.el (ebdb-pop-up-window): Refactor to more completely
    short-circuit if the buffer is already displayed. Gnus will have
    already popped up the window by now, so do a minimum of work.
---
 ebdb-com.el     |  89 +++++++++++++++++++++++-----------------------
 ebdb-gnus.el    |  50 ++++++++++++--------------
 ebdb-message.el |  65 +++++++++++++---------------------
 ebdb.el         |   2 +-
 ebdb.info       | 107 +++++++++++++++++++++++++++++++++-----------------------
 ebdb.org        |  30 ++++++++++++++--
 ebdb.texi       |  30 ++++++++++++++--
 7 files changed, 209 insertions(+), 164 deletions(-)

diff --git a/ebdb-com.el b/ebdb-com.el
index 636cb5f..8a9a38b 100644
--- a/ebdb-com.el
+++ b/ebdb-com.el
@@ -1200,52 +1200,49 @@ popped up from."
   (let* ((buf (get-buffer buf))
         (split-window (car-safe pop))
         (buffer-window (get-buffer-window buf t))
-        (direction (or (nth 2 pop)
-                       (if (> (window-total-width split-window)
-                              (window-total-height split-window))
-                           'right
-                         'below)))
-        (size (cond ((null pop)
-                     nil)
-                    ((integerp (cadr pop))
-                     (cadr pop))
-                    ((or (floatp (cadr pop)) (floatp ebdb-default-window-size))
-                     (let ((flt (or (cadr pop) ebdb-default-window-size)))
-                       (round (* (if (memq direction '(left right))
-                                     (window-total-width split-window)
-                                   (window-total-height split-window))
-                                 (- 1 flt)))))
-                    ((integerp ebdb-default-window-size)
-                     ebdb-default-window-size))))
-
-    (cond (buffer-window
-          ;; It's already visible, re-use it.
-          (when select
-            (select-window buffer-window)))
-         ((not (or split-window size))
-          ;; Not splitting, but buffer isn't visible, just take up
-          ;; the whole window.
-           (pop-to-buffer-same-window buf)
-          (setq buffer-window (get-buffer-window buf t)))
-         (t
-          ;; Otherwise split.
-          (setq
-           buffer-window
-           ;;   If the window we're splitting is an atomic window,
-           ;; maybe make our buffer part of the atom.
-           (if (and ebdb-join-atomic-windows
-                    (window-atom-root split-window))
-               (display-buffer-in-atom-window
-                buf `((window . ,split-window)
-                      (side . ,direction)
-                      ,(if (eq direction 'below)
-                           `(window-height . ,size)
-                         `(window-width . ,size))))
-             (split-window
-              split-window size direction)))
-          (set-window-buffer buffer-window buf)))
-    (display-buffer-record-window 'window buffer-window buf)
-    (set-window-prev-buffers buffer-window nil)
+        direction size)
+    ;; It's already visible, re-use it and we're done.
+    (unless buffer-window
+      (setq direction (or (nth 2 pop)
+                         (if (> (window-total-width split-window)
+                                (window-total-height split-window))
+                             'right
+                           'below))
+           size (cond ((null pop)
+                       nil)
+                      ((integerp (cadr pop))
+                       (cadr pop))
+                      ((or (floatp (cadr pop)) (floatp 
ebdb-default-window-size))
+                       (let ((flt (or (cadr pop) ebdb-default-window-size)))
+                         (round (* (if (memq direction '(left right))
+                                       (window-total-width split-window)
+                                     (window-total-height split-window))
+                                   (- 1 flt)))))
+                      ((integerp ebdb-default-window-size)
+                       ebdb-default-window-size)))
+      (if (not (or split-window size))
+         ;; Not splitting, but buffer isn't visible, just take up
+         ;; the whole window.
+         (pop-to-buffer-same-window buf)
+       (setq buffer-window (get-buffer-window buf t))
+       ;; Otherwise split.
+       (setq
+        buffer-window
+        ;; If the window we're splitting is an atomic window,
+        ;; maybe make our buffer part of the atom.
+        (if (and ebdb-join-atomic-windows
+                 (window-atom-root split-window))
+            (display-buffer-in-atom-window
+             buf `((window . ,split-window)
+                   (side . ,direction)
+                   ,(if (eq direction 'below)
+                        `(window-height . ,size)
+                      `(window-width . ,size))))
+          (split-window
+           split-window size direction))))
+      (set-window-buffer buffer-window buf)
+      (display-buffer-record-window 'window buffer-window buf)
+      (set-window-prev-buffers buffer-window nil))
     (when select
       (select-window buffer-window))))
 
diff --git a/ebdb-gnus.el b/ebdb-gnus.el
index 8daa768..6e61bc0 100644
--- a/ebdb-gnus.el
+++ b/ebdb-gnus.el
@@ -50,26 +50,21 @@ Size should be specified as a float between 0 and 1.  
Defaults to
 the value of `ebdb-default-window-size'."
   :type 'float)
 
-(defcustom ebdb-gnus-window-configuration
-  `(article
-    ,(cond
-      (gnus-use-trees
-       `(vertical 1.0
-                 (summary 0.25 point)
-                 (tree 0.25)
-                 (horizontal 1.0
-                             (article 1.0)
-                             (ebdb-gnus ,ebdb-gnus-window-size))))
-      (t
-       `(vertical 1.0
-                 (summary 0.25 point)
-                 (horizontal 1.0
-                             (article 1.0)
-                             (ebdb-gnus ,ebdb-gnus-window-size))))))
-  "Gnus window configuration to include EBDB.
-By default, this adds the *EBDB-Gnus* window to the right of the
-article buffer, taking up 40% of the horizontal space."
-  :type 'list)
+(defcustom ebdb-gnus-window-configuration nil
+  "Symbol that names EBDB's Gnus window config.
+This option is nil by default, meaning Gnus will pop up the
+*EBDB-Gnus* window next to the *Article* buffer, with a
+width/height of `ebdb-gnus-window-size'.
+
+If more control is required, set this to a symbol name.  This
+symbol will be entered into the `gnus-window-to-buffer' alist,
+and can be used as an entry in more complex Gnus buffer/window
+configurations.
+
+Note that this should be a different symbol from that used in
+Message-mode article composition window config."
+  :type '(choice (const :tag nil)
+                (symbol :tag "Window config name")))
 
 (defcustom ebdb-gnus-post-style-function
   (lambda (_rec _mail) nil)
@@ -248,14 +243,6 @@ Note that `( is the backquote, NOT the quote '(."
 (defsubst ebdb-gnus-buffer-name ()
   (format "*%s-Gnus*" ebdb-buffer-name))
 
-;; Tell Gnus how to display the *EBDB-Gnus* buffer.
-(add-hook 'ebdb-after-load-hook
-         (lambda ()
-          (with-eval-after-load "gnus-win"
-            (when ebdb-mua-pop-up
-              (add-to-list 'gnus-window-to-buffer
-                           `(ebdb-gnus . ,(ebdb-gnus-buffer-name)))
-              (gnus-add-configuration ebdb-gnus-window-configuration)))))
 
 (cl-defmethod ebdb-make-buffer-name (&context (major-mode gnus-summary-mode))
   "Produce a EBDB buffer name associated with Gnus."
@@ -357,6 +344,13 @@ composed to a certain record."
   (define-key gnus-summary-mode-map ";" ebdb-mua-keymap)
   (define-key gnus-article-mode-map ";" ebdb-mua-keymap)
 
+  ;; If the user has set this to a symbol, it needs to be added to
+  ;; Gnus' `gnus-window-to-buffer' list.
+  (when ebdb-gnus-window-configuration
+    (add-to-list 'gnus-window-to-buffer
+                (cons ebdb-gnus-window-configuration
+                      (ebdb-gnus-buffer-name))))
+
   ;; Versions of Gnus with the gnus-search.el library allow us to
   ;; perform contact auto-completion within search queries.
   (when (boundp 'gnus-search-contact-tables)
diff --git a/ebdb-message.el b/ebdb-message.el
index 77c6466..f230864 100644
--- a/ebdb-message.el
+++ b/ebdb-message.el
@@ -51,25 +51,26 @@ Size should be specified as a float between 0 and 1.  
Defaults to
 the value of `ebdb-default-window-size'."
   :type 'float)
 
-(defcustom ebdb-message-reply-window-config
-  `(reply
-    (horizontal 1.0
-               (message 1.0 point)
-               (ebdb-message ,ebdb-message-window-size)))
-  "Message reply window configuration to show EBDB.
-See Gnus' manual for details."
+(defcustom ebdb-message-window-configuration nil
+  "Symbol that names EBDB's Message reply window config.
+This option is nil by default, meaning Gnus will pop up the
+*EBDB-Message* buffer next to the message composition buffer,
+with width/height of `ebdb-message-window-size'.
+
+If more control is required, set this to a symbol name.  This
+symbol will be entered into the `gnus-window-to-buffer' alist,
+and can be used as an entry in more complex Gnus buffer/window
+configurations.
+
+Note that this should be a different symbol from that used in
+Gnus's article-reading config."
   :group 'ebdb-mua-message
-  :type 'list)
-
-(defcustom ebdb-message-reply-yank-window-config
-  `(reply-yank
-     (horizontal 1.0
-                (message 1.0 point)
-                (ebdb-message ,ebdb-message-window-size)))
-  "Message reply-yank window configuration to show EBDB.
-See Gnus' manual for details."
-  :group 'ebdb-mua-message
-  :type 'list)
+  :type '(choice (const nil)
+                (symbol :tag "Window config name")))
+
+(make-obsolete-variable 'ebdb-message-reply-yank-window-config
+                       'ebdb-message-window-configuration
+                       "0.6.23")
 
 ;; Suggestions welcome: What are good keybindings for the following
 ;; commands that do not collide with existing bindings?
@@ -157,6 +158,12 @@ Also fires when postponing a draft."
                   nil t)))
     ('nil nil)
     (_ (define-key mail-mode-map "\M-\t" 'ebdb-complete-mail)))
+
+  (when ebdb-message-window-configuration
+    (add-to-list 'gnus-window-to-buffer
+                (cons ebdb-message-window-configuration
+                      (ebdb-message-buffer-name))))
+
   (ebdb-undisplay-records))
 
 (defun ebdb-message-auto-update ()
@@ -170,27 +177,5 @@ Also fires when postponing a draft."
 (add-hook 'message-send-hook 'ebdb-message-auto-update)
 (add-hook 'mail-send-hook 'ebdb-message-auto-update)
 
-;; Slightly convoluted, but does it the "right way".  The
-;; `message-header-setup-hook' creates and populates the
-;; *EBDB-Message* buffer after the message-mode buffer is created.
-;; The gnus window configuration stanza makes sure it's displayed
-;; after the message buffer is set up.
-(add-hook 'ebdb-after-load-hook
-         (lambda ()
-           (with-eval-after-load "gnus-win"
-             ;; Display only because we're going to be (possibly)
-             ;; prompted for creation again when the message is sent.
-             (add-hook 'message-header-setup-hook #'ebdb-message-display-only)
-
-             (when ebdb-mua-pop-up
-               (add-to-list 'gnus-window-to-buffer
-                            `(ebdb-message . ,(ebdb-message-buffer-name)))
-
-               (gnus-add-configuration
-                ebdb-message-reply-window-config)
-
-               (gnus-add-configuration
-                ebdb-message-reply-yank-window-config)))))
-
 (provide 'ebdb-message)
 ;;; ebdb-message.el ends here
diff --git a/ebdb.el b/ebdb.el
index 4fe87fb..22a76fa 100644
--- a/ebdb.el
+++ b/ebdb.el
@@ -2,7 +2,7 @@
 
 ;; Copyright (C) 2016-2020  Free Software Foundation, Inc.
 
-;; Version: 0.6.22
+;; Version: 0.6.23
 ;; Package-Requires: ((emacs "25.1") (cl-lib "0.5") (seq "2.15"))
 
 ;; Maintainer: Eric Abrahamsen <eric@ericabrahamsen.net>
diff --git a/ebdb.info b/ebdb.info
index 79eca58..b727b36 100644
--- a/ebdb.info
+++ b/ebdb.info
@@ -698,9 +698,28 @@ controlling the window size of pop-up buffers.  Each 
option is named as
 ‘ebdb-<MUA>-window-size’, and each defaults to
 ‘ebdb-default-window-size’.
 
-   Beyond this, there are no other user customization options
-controlling the layout of MUA pop-up buffers.  Further customization
-will likely be added in the future: please complain to the author.
+   The Gnus and Message MUAs have their own special window configuration
+system (*Note (Gnus)Window Layout::).  If you’re not making special use
+of that system, EBDB will default to taking up a percentage of the
+article and message composition windows.  If you are using that system
+for more control, you use the ‘ebdb-gnus-window-configuration’ and
+‘ebdb-message-window-configuration’ options to do so.  They should be
+set to two arbitrary (but distinct) symbols, which will be added to the
+‘gnus-window-to-buffer’ alist, and can be used in
+‘gnus-add-configuration’ calls, for example:
+
+     (gnus-add-configuration
+      '(article
+        (vertical 1.0
+                  (summary 0.25 point)
+                  (horizontal 1.0
+                              (article 1.0)
+                              (ebdb-gnus 0.4)))))
+
+   Because Gnus and Message use separate EBDB buffers for record update
+and display, the two options must be separate, and used in the
+appropriate article-display vs message-composition window
+configurations.
 
 
 File: ebdb.info,  Node: Auto-Updating Records,  Next: Noticing and Automatic 
Rules,  Prev: Pop-up Buffers,  Up: Display and Updating
@@ -2485,6 +2504,7 @@ File: ebdb.info,  Node: Index,  Prev: Hacking EBDB,  Up: 
Top
 * ebdb-gnus-auto-update-p:               Auto-Updating Records.
                                                               (line  48)
 * ebdb-gnus-post-style-function:         Posting Styles.      (line  13)
+* ebdb-gnus-window-configuration:        Pop-up Buffers.      (line  42)
 * ebdb-hash-extra-predicates:            Fast Lookups.        (line  30)
 * ebdb-hashtable:                        Fast Lookups.        (line  10)
 * ebdb-help:                             The Basics of ebdb-mode.
@@ -2520,6 +2540,7 @@ File: ebdb.info,  Node: Index,  Prev: Hacking EBDB,  Up: 
Top
                                                               (line  48)
 * ebdb-message-clean-name-function:      Sender name display. (line  14)
 * ebdb-message-mail-as-name:             Sender name display. (line  18)
+* ebdb-message-window-configuration:     Pop-up Buffers.      (line  42)
 * ebdb-mhe-auto-update-p:                Auto-Updating Records.
                                                               (line  48)
 * ebdb-migrate-from-bbdb:                Record Migration.    (line   6)
@@ -2748,46 +2769,46 @@ Node: MUA Interaction21076
 Node: Loading MUA Code21629
 Node: Display and Updating22342
 Node: Pop-up Buffers23108
-Node: Auto-Updating Records25106
-Node: Noticing and Automatic Rules29900
-Node: Interactive Commands31722
-Node: EBDB and MUA summary buffers34196
-Node: Sender name display34714
-Node: Summary buffer marks35941
-Node: Mail Address Completion37120
-Node: A Note on Completion39629
-Node: Specific MUAs40252
-Node: Gnus40400
-Node: Posting Styles40622
-Node: EBDB Buffers42178
-Node: Searching43389
-Node: Changing Search Behavior45103
-Node: The Basics of ebdb-mode46350
-Node: Customizing Record Display50698
-Node: Marking55018
-Node: Exporting/Formatting55445
-Node: Completion56380
-Node: Snarfing57176
-Node: Internationalization59193
-Node: Diary Integration61894
-Node: Mail Aliases62759
-Node: vCard Support63473
-Node: Org Integration63972
-Node: Citing Records65870
-Node: Hacking EBDB66628
-Node: Field Classes69221
-Node: Init and Delete Methods72402
-Node: Manipulating Field Data Programmatically73926
-Node: The Labeled Field Class75638
-Node: The Singleton Field Class76509
-Node: Actions76947
-Node: Custom Field Searching77619
-Node: Fast Lookups80486
-Node: Formatting in the EBDB Buffer82296
-Node: Writing Internationalization Libraries84372
-Node: Writing Integration For New MUAs88788
-Node: Article snarfing92236
-Node: Index92954
+Node: Auto-Updating Records25958
+Node: Noticing and Automatic Rules30752
+Node: Interactive Commands32574
+Node: EBDB and MUA summary buffers35048
+Node: Sender name display35566
+Node: Summary buffer marks36793
+Node: Mail Address Completion37972
+Node: A Note on Completion40481
+Node: Specific MUAs41104
+Node: Gnus41252
+Node: Posting Styles41474
+Node: EBDB Buffers43030
+Node: Searching44241
+Node: Changing Search Behavior45955
+Node: The Basics of ebdb-mode47202
+Node: Customizing Record Display51550
+Node: Marking55870
+Node: Exporting/Formatting56297
+Node: Completion57232
+Node: Snarfing58028
+Node: Internationalization60045
+Node: Diary Integration62746
+Node: Mail Aliases63611
+Node: vCard Support64325
+Node: Org Integration64824
+Node: Citing Records66722
+Node: Hacking EBDB67480
+Node: Field Classes70073
+Node: Init and Delete Methods73254
+Node: Manipulating Field Data Programmatically74778
+Node: The Labeled Field Class76490
+Node: The Singleton Field Class77361
+Node: Actions77799
+Node: Custom Field Searching78471
+Node: Fast Lookups81338
+Node: Formatting in the EBDB Buffer83148
+Node: Writing Internationalization Libraries85224
+Node: Writing Integration For New MUAs89640
+Node: Article snarfing93088
+Node: Index93806
 
 End Tag Table
 
diff --git a/ebdb.org b/ebdb.org
index c096f07..6db0225 100644
--- a/ebdb.org
+++ b/ebdb.org
@@ -513,9 +513,33 @@ the window size of pop-up buffers.  Each option is named as
 ~ebdb-<MUA>-window-size~, and each defaults to
 ~ebdb-default-window-size~.
 
-Beyond this, there are no other user customization options controlling
-the layout of MUA pop-up buffers.  Further customization will likely
-be added in the future: please complain to the author.
+#+VINDEX: ebdb-gnus-window-configuration
+#+VINDEX: ebdb-message-window-configuration
+The Gnus and Message MUAs have their own special window
+configuration system (@@texinfo:@xref{Window Layout,,,Gnus}@@).  If
+you're not making special use of that system, EBDB will default to
+taking up a percentage of the article and message composition
+windows.  If you are using that system for more control, you use the
+~ebdb-gnus-window-configuration~ and
+~ebdb-message-window-configuration~ options to do so.  They should be
+set to two arbitrary (but distinct) symbols, which will be added to
+the ~gnus-window-to-buffer~ alist, and can be used in
+~gnus-add-configuration~ calls, for example:
+
+#+begin_src elisp
+  (gnus-add-configuration
+   '(article
+     (vertical 1.0
+               (summary 0.25 point)
+               (horizontal 1.0
+                           (article 1.0)
+                           (ebdb-gnus 0.4)))))
+#+end_src
+
+Because Gnus and Message use separate EBDB buffers for record update
+and display, the two options must be separate, and used in the
+appropriate article-display vs message-composition window
+configurations.
 *** Auto-Updating Records
 EBDB can automatically update the name and mail addresses of records
 based on information in an MUA message. The first and most important
diff --git a/ebdb.texi b/ebdb.texi
index c563f56..fa44a31 100644
--- a/ebdb.texi
+++ b/ebdb.texi
@@ -733,9 +733,33 @@ the window size of pop-up buffers.  Each option is named as
 @code{ebdb-<MUA>-window-size}, and each defaults to
 @code{ebdb-default-window-size}.
 
-Beyond this, there are no other user customization options controlling
-the layout of MUA pop-up buffers.  Further customization will likely
-be added in the future: please complain to the author.
+@vindex ebdb-gnus-window-configuration
+@vindex ebdb-message-window-configuration
+The Gnus and Message MUAs have their own special window
+configuration system (@xref{Window Layout,,,Gnus}).  If
+you're not making special use of that system, EBDB will default to
+taking up a percentage of the article and message composition
+windows.  If you are using that system for more control, you use the
+@code{ebdb-gnus-window-configuration} and
+@code{ebdb-message-window-configuration} options to do so.  They should be
+set to two arbitrary (but distinct) symbols, which will be added to
+the @code{gnus-window-to-buffer} alist, and can be used in
+@code{gnus-add-configuration} calls, for example:
+
+@lisp
+(gnus-add-configuration
+ '(article
+   (vertical 1.0
+             (summary 0.25 point)
+             (horizontal 1.0
+                         (article 1.0)
+                         (ebdb-gnus 0.4)))))
+@end lisp
+
+Because Gnus and Message use separate EBDB buffers for record update
+and display, the two options must be separate, and used in the
+appropriate article-display vs message-composition window
+configurations.
 
 @node Auto-Updating Records
 @subsection Auto-Updating Records



reply via email to

[Prev in Thread] Current Thread [Next in Thread]