From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stephen Leake Newsgroups: gmane.emacs.devel Subject: managing windows in two frames Date: Tue, 03 Sep 2013 04:11:44 -0500 Message-ID: <8561uiclrj.fsf@stephe-leake.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1378199528 20957 80.91.229.3 (3 Sep 2013 09:12:08 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 3 Sep 2013 09:12:08 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Sep 03 11:12:11 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1VGmee-0000ln-0d for ged-emacs-devel@m.gmane.org; Tue, 03 Sep 2013 11:12:08 +0200 Original-Received: from localhost ([::1]:44251 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGmed-00029g-HE for ged-emacs-devel@m.gmane.org; Tue, 03 Sep 2013 05:12:07 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:33846) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGmeS-0001zD-N7 for emacs-devel@gnu.org; Tue, 03 Sep 2013 05:12:04 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VGmeI-0004nb-Gs for emacs-devel@gnu.org; Tue, 03 Sep 2013 05:11:56 -0400 Original-Received: from hrndva-omtalb.mail.rr.com ([71.74.56.122]:3837) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VGmeI-0004nN-DE for emacs-devel@gnu.org; Tue, 03 Sep 2013 05:11:46 -0400 X-Authority-Analysis: v=2.0 cv=ddwCLAre c=1 sm=0 a=90MK7lSzN9hCuM5ahEFLfw==:17 a=M2z5juievrMA:10 a=yJoioP6_5VwA:10 a=o_R75loqY_IA:10 a=9i_RQKNPAAAA:8 a=KGjhK52YXX0A:10 a=DvP-K6i241AA:10 a=HWvygF778HlD8AXtQdUA:9 a=90MK7lSzN9hCuM5ahEFLfw==:117 X-Cloudmark-Score: 0 X-Authenticated-User: X-Originating-IP: 75.87.84.149 Original-Received: from [75.87.84.149] ([75.87.84.149:55927] helo=TAKVER) by hrndva-oedge01.mail.rr.com (envelope-from ) (ecelerity 2.2.3.46 r()) with ESMTP id 1F/D1-28548-1D7A5225; Tue, 03 Sep 2013 09:11:45 +0000 User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (windows-nt) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 71.74.56.122 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:163157 Archived-At: I'd like to add the following functions to Emacs: (defun display-buffer-reuse-frame (buffer alist) "Display BUFFER in an existing frame other than the current frame. If successful, return the window used; otherwise return nil. If ALIST has a non-nil `inhibit-switch-frame' entry, avoid raising the frame. If ALIST has a non-nil `pop-up-frame-parameters' entry, the corresponding value is an alist of frame parameters to give the new frame." (let* ((frame (car (filtered-frame-list (lambda (frame) (and (not (eq frame (selected-frame))) (not (window-dedicated-p (or (get-lru-window frame) (frame-first-window frame))))))))) (window (and frame (or (get-lru-window frame) ;; lru-window can be nil if window was deleted, by ediff for example (frame-first-window frame-2)))) ) (when window (prog1 (window--display-buffer buffer window 'frame alist display-buffer-mark-dedicated) (unless (cdr (assq 'inhibit-switch-frame alist)) (window--maybe-raise-frame frame)))) )) (defun display-buffer-other-window-or-frame (buffer alist) "Depending on `current-prefix-arg', show BUFFER in another window or frame. If current-prefix-arg is: '(4) - from C-u; show buffer in another window in current frame, creating new if needed. '(16) - from C-u C-u; show buffer in another frame, creating new if needed. other - return nil." (or (cond ((equal current-prefix-arg '(4)) ;; other window (or (display-buffer-use-some-window buffer '((inhibit-same-window . t))) (display-buffer-pop-up-window buffer nil))) ((equal current-prefix-arg '(16)) ;; other frame (or (display-buffer-reuse-frame buffer '((reusable-frames . visible))) ;; reuse a window in other frame (display-buffer-pop-up-frame buffer nil))) (t nil) ))) (defun sal-move-to-other-frame () "Move current buffer to a window in another frame." (interactive) (let ((buffer (current-buffer))) (switch-to-prev-buffer nil 'bury) (let ((display-buffer-overriding-action '((display-buffer-reuse-frame buffer display-buffer-pop-up-frame) . '((reusable-frames . visible))))) ;; reuse a window in other frame (display-buffer buffer)))) The use case for these: I use two Emacs frames, side by side, filling the screen. This allows two things: 1) opening other applications next to an Emacs frame 2) navigating between frames for horizontal movement (using window manager keys), and between windows for vertical movement (using Emacs keys). With one Emacs frame, split both horizontally and vertically, I find it difficult to navigate among the windows. `display-buffer-reuse-frame' allows displaying a buffer in the other frame, without always creating a new frame. `display-buffer-other-window-or-frame' gives the user flexible control of all buffer display functions, via the prefix arg. `sal-move-to-other-frame' is convenient for rearranging the buffers in the display. (needs another name for inclusion in Emacs). In my ~/.emacs, I set: (setq display-buffer-base-action '((display-buffer-reuse-window display-buffer-other-window-or-frame) . ((reusable-frames . visible)))) Thoughts? -- -- Stephe