+(defun mdw-last-window-in-frame-p (window)
+ "Return whether WINDOW is the last in its frame."
+ (catch 'done
+ (while window
+ (let ((next (window-next-sibling window)))
+ (while (and next (window-minibuffer-p next))
+ (setq next (window-next-sibling next)))
+ (if next (throw 'done nil)))
+ (setq window (window-parent window)))
+ t))
+
+(defun mdw-display-buffer-in-tolerable-window (buffer alist)
+ "Try finding a tolerable window in which to display BUFFER.
+Begone, foul DWIMmerlaik!
+
+This is all totally subject to arbitrary change in the future, but the
+emphasis is on predictability rather than crazy DWIMmery."
+ (let* ((selected (selected-window)) chosen
+ (full-height-p (window-full-height-p selected))
+ (full-width-p (window-full-width-p selected)))
+ (cond
+
+ ((and full-height-p full-width-p)
+ ;; We're basically the only window in the frame. If we want to get
+ ;; anywhere, we'll have to split the window.
+
+ (let ((width (window-width selected))
+ (preferred-width (mdw-preferred-column-width)))
+ (if (and (>= width (mdw-frame-width-for-columns 2 preferred-width))
+ (mdw-frame-width-quantized-p width preferred-width))
+ (setq chosen (split-window-right preferred-width))
+ (setq chosen (split-window-below)))
+ (display-buffer-record-window 'window chosen buffer)))
+
+ ((mdw-last-window-in-frame-p selected)
+ ;; This is the last window in the frame. I don't think I want to
+ ;; clobber the first window, so rebound and clobber the previous one
+ ;; instead. (This obviously has the same effect if there are only two
+ ;; windows, but seems more useful if there are three.)
+
+ (setq chosen (previous-window selected 'never nil))
+ (display-buffer-record-window 'reuse chosen buffer))
+
+ (t
+ ;; There's another window in front of us. Let's use that one.
+ (setq chosen (next-window selected 'never nil)))
+ (display-buffer-record-window 'reuse chosen buffer))
+
+ (if (eq chosen selected)
+ (error "Failed to select a different window!"))
+
+ (when chosen
+ (with-selected-window chosen (switch-to-buffer buffer)))
+ chosen))
+
+;; Hack the display actions so that they do something sensible.
+(setq display-buffer-fallback-action
+ '((display-buffer--maybe-same-window
+ display-buffer-reuse-window
+ display-buffer-pop-up-window
+ mdw-display-buffer-in-tolerable-window)))
+