From: Chong Yidong Date: Thu, 1 Sep 2011 17:04:30 +0000 (-0400) Subject: Fix display-buffer interactive spec, and fixes for pop-to-buffer*. X-Git-Tag: emacs-pretest-24.0.90~104^2~152^2~12 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=437014c8adcd604bdec350015d89eab1d7c12ec2;p=emacs.git Fix display-buffer interactive spec, and fixes for pop-to-buffer*. * lisp/window.el (display-buffer): Restore interactive spec. (display-buffer-same-window, display-buffer-other-window): New functions. (pop-to-buffer-1): New function. Use the above. (pop-to-buffer, pop-to-buffer-same-window): Use it. (pop-to-buffer-other-window, pop-to-buffer-other-frame): Deleted. * lisp/view.el (view-buffer-other-window, view-buffer-other-frame): Just use pop-to-buffer. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b4b95fb4074..e51cdb9137a 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,15 @@ +2011-09-01 Chong Yidong + + * window.el (display-buffer): Restore interactive spec. + (display-buffer-same-window, display-buffer-other-window): New + functions. + (pop-to-buffer-1): New function. Use the above. + (pop-to-buffer, pop-to-buffer-same-window): Use it. + (pop-to-buffer-other-window, pop-to-buffer-other-frame): Deleted. + + * view.el (view-buffer-other-window, view-buffer-other-frame): + Just use pop-to-buffer. + 2011-09-01 Thierry Volpiatto * vc/vc-rcs.el (vc-rcs-responsible-p): Handle directories. (Bug#9391) diff --git a/lisp/view.el b/lisp/view.el index be011d217fc..96fecd9df1c 100644 --- a/lisp/view.el +++ b/lisp/view.el @@ -338,7 +338,8 @@ Optional argument EXIT-ACTION is either nil or a function with buffer as argument. This function is called when finished viewing buffer. Use this argument instead of explicitly setting `view-exit-action'." (interactive "bIn other window view buffer:\nP") - (pop-to-buffer-other-window buffer) + (let ((pop-up-windows t)) + (pop-to-buffer buffer t)) (view-mode-enter nil exit-action)) ;;;###autoload @@ -358,7 +359,8 @@ Optional argument EXIT-ACTION is either nil or a function with buffer as argument. This function is called when finished viewing buffer. Use this argument instead of explicitly setting `view-exit-action'." (interactive "bView buffer in other frame: \nP") - (pop-to-buffer-other-frame buffer) + (let ((pop-up-frames t)) + (pop-to-buffer buffer t)) (view-mode-enter nil exit-action)) ;;;###autoload diff --git a/lisp/window.el b/lisp/window.el index 50deb035420..11f4920c24f 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -4674,6 +4674,7 @@ This is an ACTION just like in `display-buffer-alist'.") (defun display-buffer (&optional buffer-or-name action frame) "Display BUFFER in some window." + (interactive "BDisplay buffer:\nP") (let* ((buffer (window-normalize-buffer-to-display buffer-or-name)) (buffer-name (buffer-name buffer)) (user-action @@ -4736,6 +4737,27 @@ its documentation for additional customization information." ;;(make-frame-visible (window-frame old-window)) )) +;;; Functions for use via `display-buffer-alist'. + +(defun display-buffer-same-window (buffer alist) + "Display BUFFER in the selected window, and return the window. +If BUFFER cannot be displayed in the selected window (usually +because it is dedicated to another buffer), return nil." + (let ((norecord (cadr (assq 'norecord alist)))) + (cond + ((eq buffer (window-buffer)) + (selected-window)) + ((not (or (window-minibuffer-p) (window-dedicated-p))) + (set-window-buffer nil buffer) + (selected-window))))) + +(defun display-buffer-other-window (buffer alist) + "Display BUFFER in another window, and return BUFFER. +If BUFFER cannot be displayed in another window, just return nil." + (display-buffer-default buffer t)) + +;;; Display + selection commands: + (defun pop-to-buffer (buffer-or-name &optional other-window norecord) "Select buffer BUFFER-OR-NAME in some window, preferably a different one. BUFFER-OR-NAME may be a buffer, a string \(a buffer name), or @@ -4759,20 +4781,7 @@ of `display-buffer' for additional customization information. Optional third arg NORECORD non-nil means do not put this buffer at the front of the list of recently selected ones." (interactive "BPop to buffer:\nP") - (let ((buffer (window-normalize-buffer-to-display buffer-or-name)) - (old-window (selected-window)) - (old-frame (selected-frame)) - new-window new-frame) - (set-buffer buffer) - (setq new-window (display-buffer buffer other-window)) - (setq new-frame (window-frame new-window)) - (if (eq old-frame new-frame) - ;; Make sure new-window gets selected (Bug#8615), (Bug#6954). - (select-window new-window norecord) - ;; `display-buffer' has chosen another frame, make sure it gets - ;; input focus and is risen. - (select-frame-set-input-focus new-frame norecord)) - buffer)) + (pop-to-buffer-1 buffer-or-name (if other-window t nil) norecord)) (defun pop-to-buffer-same-window (&optional buffer-or-name norecord) "Pop to buffer specified by BUFFER-OR-NAME in the selected window. @@ -4781,40 +4790,39 @@ the selected window, usually because it is dedicated to another buffer. Optional arguments BUFFER-OR-NAME and NORECORD are as for `pop-to-buffer'." (interactive "BPop to buffer in selected window:\nP") - (let ((buffer (window-normalize-buffer-to-display buffer-or-name))) - (cond - ((eq buffer (window-buffer)) - (unless norecord - (select-window (selected-window))) - (set-buffer buffer)) - ((or (window-minibuffer-p) (window-dedicated-p)) - (pop-to-buffer buffer norecord)) - (t - (set-window-buffer nil buffer) - (unless norecord - (select-window (selected-window))) - (set-buffer buffer))))) - -(defun pop-to-buffer-other-window (&optional buffer-or-name norecord) - "Pop to buffer specified by BUFFER-OR-NAME in another window. -The selected window will be used only if there is no other -choice. Windows on the selected frame are preferred to windows -on other frames. Optional arguments BUFFER-OR-NAME and NORECORD -are as for `pop-to-buffer'." - (interactive "BPop to buffer in another window:\nP") - (let ((pop-up-windows t) - same-window-buffer-names same-window-regexps) - (pop-to-buffer buffer-or-name t norecord))) - -(defun pop-to-buffer-other-frame (&optional buffer-or-name norecord) - "Pop to buffer specified by BUFFER-OR-NAME on another frame. -The selected frame will be used only if there's no other choice. -Optional arguments BUFFER-OR-NAME and NORECORD are as for -`pop-to-buffer'." - (interactive "BPop to buffer on another frame:\nP") - (let ((pop-up-frames t) - same-window-buffer-names same-window-regexps) - (pop-to-buffer buffer-or-name t norecord))) + (pop-to-buffer-1 buffer-or-name 'same-window norecord)) + +(defun pop-to-buffer-1 (buffer-or-name window-choice norecord) + (set-buffer (window-normalize-buffer-to-display + ;; BUFFER-OR-NAME nil means another buffer. + (or buffer-or-name + (other-buffer (current-buffer))))) + (let ((old-window (selected-window)) + (old-frame (selected-frame)) + (same-window-buffer-names same-window-buffer-names) + (same-window-regexps same-window-regexps)) + (if (eq window-choice t) + (setq same-window-buffer-names nil + same-window-regexps nil)) + (let* ((action + ;; Based on the WINDOW-CHOICE argument, choose an action + ;; argument to pass to `display-buffer'. + (cond + ((null window-choice) + '((display-buffer-other-window display-buffer-same-window))) + ((eq window-choice 'same-window) + '((display-buffer-same-window display-buffer-other-window))) + (t + '((display-buffer-other-window))))) + (window (display-buffer (current-buffer) action)) + (frame (window-frame window))) + (if (eq frame old-frame) + ;; Make sure new window gets selected (Bug#8615), (Bug#6954). + (select-window window norecord) + ;; If `display-buffer' has chosen another frame, make sure it + ;; gets input focus. + (select-frame-set-input-focus frame norecord)) + (current-buffer)))) (defun read-buffer-to-switch (prompt) "Read the name of a buffer to switch to, prompting with PROMPT.