emacs-devel
[Top][All Lists]
Advanced

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

Re: Potential bug in the logic of rmail-select-summary


From: Göktuğ Kayaalp
Subject: Re: Potential bug in the logic of rmail-select-summary
Date: Wed, 20 Jan 2021 17:09:44 +0300

On 2021-01-19 20:04 +01, martin rudalics <rudalics@gmx.at> wrote:
>  >> AFAIU rmail-pop-to-buffer could use some form of display-buffer-* to
>  >> avoid going through display-buffer-alist.
> An overriding action?  That's much too severe.
>  > Yes, but I'm  not sure we should prevent users from customizing the
>  > way Rmail buffers are displayed.
> Rmail is free to do what it wants in this regard.  But
>
> (".*" . (display-buffer-same-window))
>
> is a much too strong customization IMO.  It conflates 'pop-to-buffer'
> with its standard "pop to a window other than the selected one even if
> the buffer is already displayed in the selected window" behavior with
> 'switch-to-buffer'.  Don't do that - it may miss too many cases.

Martin and Eli, thanks for your help and sorry for this non-issue.  I
had this problem for more than a couple years now, and I was having some
problems with some Magit commands too, should’ve figured it out by now.

But also, it seems to me that how Rmail uses (rmail-)pop-to-buffer is
somewhat problematic regardless because Rmail uses it as part of its
logic sometimes and apparently that results in multiple calls to that
function per command.  I tested some configs and appended the results
below, tho I’m again not sure if it’s expected behaviour or some bug.


Best,

        -gk.



Appendix: Testing various configs with rmail-summary and display-buffer-alist.

This config in emacs -Q results in a vertical split, both windows
displaying the summary buffer, after hitting ‘h’ in an Rmail buffer:

(setq
 display-buffer-alist
 '(((lambda (b _) (eq (with-current-buffer b major-mode) 'rmail-summary-mode))
    .
    (display-buffer-below-selected))))

When I instead try this one:

(setq
 display-buffer-alist
 '(((lambda (b _) (eq (with-current-buffer b major-mode) 'rmail-summary-mode))
    .
    (display-buffer-at-bottom . ((inhibit-same-window . t))))))

(with or without the alist, summary buffer replaces the Rmail buffer.  A
more sophisticated config which is what I’d actually like to have
behaves a bit more weirdly:

(setq
 display-buffer-alist
 '(((lambda (b _) (eq (with-current-buffer b major-mode) 'rmail-summary-mode))
    .
    (gk-display-buffer-for-rmail))))

(defun gk-display-buffer-for-rmail (buffer _)
  (if (= (length (window-list)) 1)
      (display-buffer-in-direction buffer '((direction . left)))
    ;; If there are 1+ windows, use the top quarter of selected
    ;; window.
    (split-window-vertically (/ (window-height) 4))
    (switch-to-buffer buffer)))

if I have a vertical split, this happens:

[ some buffer ][ rmail ] ->  [ some buffer ][ rmail-summary ]
                                            [ rmail-summary ]
                                            [    rmail      ]

instead of expected

[ some buffer ][ rmail ] ->  [ some buffer ][ rmail-summary ]
                                            [    rmail      ]

and if rmail window was the only window, I get

[ rmail-summary ][ rmail-summary ]

This is apparently because rmail-summary (and rmail-quit, too) end up
calling rmail-pop-to-buffer multiple times, somehow.  I verified that
with calling toggle-debug-on-entry on the function: with rmail-summary I
need to hit ‘c’ in the debugger 4 times for the command to complete.

I tried the following more elaborate setup:

(require 'cl-lib)

(setq
 display-buffer-alist
 '(((lambda (b _) (eq (with-current-buffer b major-mode) 'rmail-summary-mode))
    .
    (gk-display-buffer-for-rmail))))

(defun gk-display-buffer-for-rmail (buffer _)
  ;; If the summary buffer is displayed, just go to it
  (if-let* ((sumw (car (cl-remove-if
                        #'null
                        (mapcar (lambda (w)
                                  (and (eq 'rmail-summary-mode
                                           (buffer-local-value 'major-mode 
(window-buffer w)))
                                       w))
                                (window-list))))))
      (select-window sumw)
    ;; Otherwise, if frame has only 1 window...
    (if (= (length (window-list)) 1)
        ;; (a) ...split it in two, otherwise...
        (split-window-horizontally (/ (window-width) 2))
      ;; (b) ...create a 1/4 split above the selected window, ...
      (split-window-vertically (/ (window-height) 4)))
    ;; ...eventually, display ‘buffer’.
    (switch-to-buffer buffer)))

This helps with the multiple summary windows problem, but while (b) case
works as expected, (a) results in a single window displaying the summary
buffer, which is weird.  I thought what rmail-pop-to-buffer does has
some effect here, but the following works fine:

(let (split-width-threshold)
   (split-window-horizontally (/ (window-width) 2)))



reply via email to

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