unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: martin rudalics <rudalics@gmx.at>
To: Tassilo Horn <tsdh@gnu.org>
Cc: 20189@debbugs.gnu.org
Subject: bug#20189: 25.0.50; Feature request: Alternative split-window-sensibly functions
Date: Thu, 26 Mar 2015 11:58:17 +0100	[thread overview]
Message-ID: <5513E649.80004@gmx.at> (raw)
In-Reply-To: <87k2y51kjk.fsf@gnu.org>

 >> If you set `split-width-threshold' to zero and
 >> `split-height-threshold' to nil you should get the behavior you want.
 >
 > Wouldn't that mean that I get as many horizontal windows until they
 > become smaller than `window-min-width'?  I want them to alway be at
 > least 80 columns wide.

Then you have to set `split-width-threshold' to a larger value.

 >> You should be able to simplify your code by using idioms from the
 >> below.
 >>
 >> (defun th/split-window-sensibly (_window)
 >>    (let ((root (frame-root-window))
 >> 	(window-combination-resize 'resize))
 >>      (cond
 >>       ((>= (/ (window-total-width root) (window-combinations root t)) 80)
 >>        (split-window (window-last-child root) nil 'right))
 >>       ((>= (/ (window-total-height root) (window-combinations root)) 40)
 >>        (split-window (window-last-child root) nil 'below))
 >>       (t
 >>        (split-window-sensibly window)))))
 >
 > With that and repeated `display-buffer' calls for different buffers
 > starting with a single 269x82 window, I get 3 balanced side-by-side
 > windows first (good!), but the next d-b creates another horizontal
 > window.  Then I have 4 side-by-side balanced windows where each one is
 > less than 80 columns wide.  And yet another d-b splits the rightmost
 > window vertically although I don't want vertical splits at all if there
 > are already horizontal splits.

I only suggested to use the idioms of that form.  Instead of
`window-tree' or `balance-windows' as you did.

 > In that case, it should have reused some
 > existing window.

That's invalid with `split-window-preferred-function':

   This function is called with a window as single argument and is
   supposed to split that window and return the new window.  If the
   window can (or shall) not be split, it is supposed to return nil.

I think its doc-string is very clear about this.

 > That's ok for me although I think I'd like it better if it was this way:
 >
 >   +--------------------+--------------------+-----------------+
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |                 |
 >   |                    |                    |   (TWO)         |
 >   |                    |                    |   (THREE)       |
 >   |    *scratch*       |     ONE            |    FOUR         |
 >   +--------------------+--------------------+-----------------+


If you want to "reuse" a window you have to do it "elsewhere".  For
example thusly (largely untested, you also have to tweak hardcoded
values like 40 and 80):


(defun th/display-buffer (buffer alist)
   (or (display-buffer-reuse-window buffer alist)
       (let* ((root (frame-root-window))
	     (horizontal (window-combination-p root t))
	     (combs (window-combinations root horizontal)))
	(if (> combs 1)
	    (let* ((last (window-last-child root))
		   (window-combination-resize 'resize)
		   (window
		    (or (and horizontal
			     (>= (/ (window-total-width root) combs) 80)
			     (split-window last nil 'right))
			(and (not horizontal)
			     (>= (/ (window-total-height root) combs) 40)
			     (split-window last nil 'below)))))
	      (if (window-live-p window)
		  (window--display-buffer
		   buffer window 'window alist display-buffer-mark-dedicated)
		;; Reuse last.
		(window--display-buffer buffer last 'reuse alist)))
	  ;; Try to pop up a new window.
	  (display-buffer-pop-up-window buffer alist)))))

(customize-set-variable
  'display-buffer-base-action '(th/display-buffer . nil))


I hope you get the idea ;-)

martin





  reply	other threads:[~2015-03-26 10:58 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-24  9:18 bug#20189: 25.0.50; Feature request: Alternative split-window-sensibly functions Tassilo Horn
2015-03-24 10:51 ` martin rudalics
2015-03-24 11:39   ` Tassilo Horn
2015-03-24 13:30     ` martin rudalics
2015-03-24 14:59       ` Tassilo Horn
2015-03-25  8:23         ` martin rudalics
2015-03-25  9:41           ` Tassilo Horn
2015-03-26 10:58             ` martin rudalics [this message]
2015-03-26 11:01             ` Tassilo Horn
2015-03-26 13:47               ` martin rudalics
2015-03-26 14:18                 ` Stefan Monnier
2015-03-26 14:31                   ` martin rudalics
2015-03-27 18:26                     ` Stefan Monnier
2015-03-26 15:15                 ` Tassilo Horn
2015-03-26 16:04                   ` martin rudalics
2015-03-24 17:05 ` Eli Zaretskii
2015-03-25  7:00   ` Tassilo Horn
2015-03-25  8:24     ` martin rudalics
2015-03-25 17:25     ` Eli Zaretskii
2015-03-25 19:33       ` Tassilo Horn
2015-03-25 19:38         ` Eli Zaretskii
2015-03-26  4:27           ` Tassilo Horn
2015-03-26 10:58             ` martin rudalics
2015-03-26 16:29             ` Eli Zaretskii
2015-03-25  8:23   ` martin rudalics

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.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5513E649.80004@gmx.at \
    --to=rudalics@gmx.at \
    --cc=20189@debbugs.gnu.org \
    --cc=tsdh@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.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).