From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Chong Yidong Newsgroups: gmane.emacs.devel Subject: Re: shrink-window-if-larger-than-buffer in VC-diff Date: Wed, 18 Aug 2010 17:53:09 -0400 Message-ID: <87mxsjy4e2.fsf@stupidchicken.com> References: <87aaoo7pmj.fsf@stupidchicken.com> <87iq3bs168.fsf@stupidchicken.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Trace: dough.gmane.org 1282168419 3082 80.91.229.12 (18 Aug 2010 21:53:39 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Wed, 18 Aug 2010 21:53:39 +0000 (UTC) Cc: emacs-devel@gnu.org To: Juanma Barranquero Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Aug 18 23:53:38 2010 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1OlqZl-00080X-6m for ged-emacs-devel@m.gmane.org; Wed, 18 Aug 2010 23:53:37 +0200 Original-Received: from localhost ([127.0.0.1]:54968 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OlqZk-000160-GT for ged-emacs-devel@m.gmane.org; Wed, 18 Aug 2010 17:53:36 -0400 Original-Received: from [140.186.70.92] (port=55804 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OlqZU-000128-Ih for emacs-devel@gnu.org; Wed, 18 Aug 2010 17:53:25 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OlqZP-0001cS-2h for emacs-devel@gnu.org; Wed, 18 Aug 2010 17:53:20 -0400 Original-Received: from pantheon-po23.its.yale.edu ([130.132.50.117]:57076) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OlqZP-0001cJ-0j for emacs-devel@gnu.org; Wed, 18 Aug 2010 17:53:15 -0400 Original-Received: from furry ([64.134.241.179]) (authenticated bits=0) by pantheon-po23.its.yale.edu (8.12.11.20060308/8.12.11) with ESMTP id o7ILrAoB025253 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT); Wed, 18 Aug 2010 17:53:12 -0400 Original-Received: by furry (Postfix, from userid 1000) id 72BFCC013; Wed, 18 Aug 2010 17:53:09 -0400 (EDT) In-Reply-To: (Juanma Barranquero's message of "Tue, 17 Aug 2010 01:06:15 +0200") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) X-YaleITSMailFilter: Version 1.2c (attachment(s) not renamed) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4-2.6 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:128855 Archived-At: Juanma Barranquero writes: >> Maybe we should change `pop-to-buffer' so that it accepts >> an option to both shrink *and* grow windows. =C2=A0Then people who want = their >> windows to resize automagically can use this option, and have it work >> more reliably than it does now. =C2=A0(The default should be to avoid >> resizing at all.) > > I'm OK with that. Here's a possible implementation, which replaces even-window-heights with a new option `resize-windows-for-display'. The value `fit' says to resize the displayed/popped windows. What do you think? =3D=3D=3D modified file 'lisp/window.el' *** lisp/window.el 2010-06-07 18:28:02 +0000 --- lisp/window.el 2010-08-18 21:46:44 +0000 *************** *** 989,1025 **** )) frame)))) =20=20 ! (defcustom even-window-heights t ! "If non-nil `display-buffer' will try to even window heights. ! Otherwise `display-buffer' will leave the window configuration ! alone. Heights are evened only when `display-buffer' chooses a ! window that appears above or below the selected window." ! :type 'boolean ! :group 'windows) =20=20 ! (defun window--even-window-heights (window) ! "Even heights of WINDOW and selected window. ! Do this only if these windows are vertically adjacent to each ! other, `even-window-heights' is non-nil, and the selected window ! is higher than WINDOW." ! (when (and even-window-heights ! (not (eq window (selected-window))) ! ;; Don't resize minibuffer windows. ! (not (window-minibuffer-p (selected-window))) ! (> (window-height (selected-window)) (window-height window)) ! (eq (window-frame window) (window-frame (selected-window))) ! (let ((sel-edges (window-edges (selected-window))) ! (win-edges (window-edges window))) ! (and (=3D (nth 0 sel-edges) (nth 0 win-edges)) ! (=3D (nth 2 sel-edges) (nth 2 win-edges)) ! (or (=3D (nth 1 sel-edges) (nth 3 win-edges)) ! (=3D (nth 3 sel-edges) (nth 1 win-edges)))))) ! (let ((window-min-height 1)) ! ;; Don't throw an error if we can't even window heights for ! ;; whatever reason. ! (condition-case nil ! (enlarge-window (/ (- (window-height window) (window-height)) 2)) ! (error nil))))) =20=20 (defun window--display-buffer-1 (window) "Raise the frame containing WINDOW. --- 989,1030 ---- )) frame)))) =20=20 ! (defcustom resize-windows-for-display t ! "Whether `display-buffer' should resize windows. ! If nil, leave the window configuration alone. ! If `fit', try to shrink the chosen window if its buffer does not ! need so many lines; otherwise, try to even the window heights. ! For any other non-nil value, try to even the window heights if ! the chosen window appears above or below the selected window." ! :type '(choice (const :tag "Equalize window heights" t) ! (const :tag "Best fit" 'fit) ! (const :tag "No resize" nil)) ! :group 'windows ! :version "24.1") =20=20 ! (define-obsolete-variable-alias 'even-window-heights 'resize-windows-for-= display) !=20 ! (defun window--adjust-window-heights (window) ! "Adjust height of WINDOW according to `resize-windows-for-display'." ! ;; Try shrinking window if `resize-windows-for-display' is `fit'. ! (and resize-windows-for-display ! (not (and (eq resize-windows-for-display 'fit) ! (shrink-window-if-larger-than-buffer window))) ! (not (eq window (selected-window))) ! (not (window-minibuffer-p (selected-window))) ! (eq (window-frame window) (window-frame (selected-window))) ! (let ((sel-edges (window-edges (selected-window))) ! (win-edges (window-edges window))) ! (and (=3D (nth 0 sel-edges) (nth 0 win-edges)) ! (=3D (nth 2 sel-edges) (nth 2 win-edges)) ! (or (=3D (nth 1 sel-edges) (nth 3 win-edges)) ! (=3D (nth 3 sel-edges) (nth 1 win-edges))))) ! (let ((window-min-height 1)) ! ;; Don't throw an error if we can't even window heights for ! ;; whatever reason. ! (condition-case nil ! (enlarge-window (/ (- (window-height window) (window-height)) 2)) ! (error nil))))) =20=20 (defun window--display-buffer-1 (window) "Raise the frame containing WINDOW. *************** *** 1036,1047 **** (raise-frame frame)) window)) =20=20 ! (defun window--display-buffer-2 (buffer window &optional dedicated) "Display BUFFER in WINDOW and make its frame visible. ! Set `window-dedicated-p' to DEDICATED if non-nil. Return WINDOW." (when (and (buffer-live-p buffer) (window-live-p window)) (set-window-buffer window buffer) (when dedicated (set-window-dedicated-p window dedicated)) (window--display-buffer-1 window))) --- 1041,1056 ---- (raise-frame frame)) window)) =20=20 ! (defun window--display-buffer-2 (buffer window &optional dedicated adjust= -size) "Display BUFFER in WINDOW and make its frame visible. ! If DEDICATED is non-nil, set `window-dedicated-p'. ! If ADJUST-SIZE is non-nil, resize WINDOW according to ! `resize-windows-for-display'. Return WINDOW." (when (and (buffer-live-p buffer) (window-live-p window)) (set-window-buffer window buffer) + (when adjust-size + (window--adjust-window-heights window)) (when dedicated (set-window-dedicated-p window dedicated)) (window--display-buffer-1 window))) *************** *** 1160,1166 **** (window--try-to-split-window (get-lru-window frame-to-use t))))) (window--display-buffer-2 buffer window-to-use ! display-buffer-mark-dedicated)) ((let ((window-to-undedicate ;; When NOT-THIS-WINDOW is non-nil, temporarily dedicate ;; the selected window to its buffer, to avoid that some of --- 1169,1175 ---- (window--try-to-split-window (get-lru-window frame-to-use t))))) (window--display-buffer-2 buffer window-to-use ! display-buffer-mark-dedicated t)) ((let ((window-to-undedicate ;; When NOT-THIS-WINDOW is non-nil, temporarily dedicate ;; the selected window to its buffer, to avoid that some of *************** *** 1186,1193 **** (when (window-live-p window-to-undedicate) ;; Restore dedicated status of selected window. (set-window-dedicated-p window-to-undedicate nil)))) ! (window--even-window-heights window-to-use) ! (window--display-buffer-2 buffer window-to-use))))) =20=20 (defun pop-to-buffer (buffer-or-name &optional other-window norecord) "Select buffer BUFFER-OR-NAME in some window, preferably a different on= e. --- 1195,1201 ---- (when (window-live-p window-to-undedicate) ;; Restore dedicated status of selected window. (set-window-dedicated-p window-to-undedicate nil)))) ! (window--display-buffer-2 buffer window-to-use nil t))))) =20=20 (defun pop-to-buffer (buffer-or-name &optional other-window norecord) "Select buffer BUFFER-OR-NAME in some window, preferably a different on= e. *** lisp/vc/vc.el 2010-07-16 15:42:15 +0000 --- lisp/vc/vc.el 2010-08-18 21:50:15 +0000 *************** *** 1511,1517 **** (message "%s" (cdr messages)))) (goto-char (point-min)) (when window ! (shrink-window-if-larger-than-buffer window))) (when (and messages (not emptyp)) (message "%sdone" (car messages)))))) =20=20 --- 1511,1517 ---- (message "%s" (cdr messages)))) (goto-char (point-min)) (when window ! (window--adjust-window-heights window))) (when (and messages (not emptyp)) (message "%sdone" (car messages)))))) =20=20 *************** *** 1583,1589 **** (vc-exec-after `(vc-diff-finish ,(current-buffer) ',(when verbose messages))) ;; Display the buffer, but at the end because it can change point. ! (pop-to-buffer (current-buffer)) ;; In the async case, we return t even if there are no differences ;; because we don't know that yet. t))) --- 1583,1590 ---- (vc-exec-after `(vc-diff-finish ,(current-buffer) ',(when verbose messages))) ;; Display the buffer, but at the end because it can change point. ! (let ((resize-windows-for-display nil)) ! (pop-to-buffer (current-buffer))) ;; In the async case, we return t even if there are no differences ;; because we don't know that yet. t)))