(or (and (consp arg) (= (car arg) 4) (= (car arg) 64))
(and (integerp arg) (not (zerop (logand arg 1))))))))
- (let ((current-windows (list (current-window-configuration)
+ (let ((previous mdw-current-window-configuration)
+ (current-windows (list (current-window-configuration)
(point-marker)))
(register-value (and register (get-register register))))
(when (and mdw-current-window-configuration (not no-save))
(set-register mdw-current-window-configuration current-windows))
(cond ((null register)
- (setq mdw-current-window-configuration nil))
+ (setq mdw-current-window-configuration nil)
+ (if previous
+ (message "Left window configuration `%c'." previous)
+ (message "Nothing to do!")))
((not (or (null register-value)
(and (consp register-value)
(window-configuration-p (car register-value))
(error "Register `%c' is not a window configuration" register))
(t
(cond ((null register-value)
- (set-register register current-windows))
+ (set-register register current-windows)
+ (message "Started new window configuration `%c'."
+ register))
(t
(set-window-configuration (car register-value))
- (goto-char (cadr register-value))))
+ (goto-char (cadr register-value))
+ (message "Switched to window configuration `%c'."
+ register)))
(setq mdw-current-window-configuration register)))))
;; Don't raise windows unless I say so.
;; Some hacks to do with window placement.
+(defvar mdw-designated-window nil
+ "The window chosen by `mdw-designate-window', or nil.")
+
+(defun mdw-designate-window (cancel)
+ "Use the selected window for the next pop-up buffer.
+With a prefix argument, clear the designated window."
+ (interactive "P")
+ (cond (cancel
+ (setq mdw-designated-window nil)
+ (message "Window designation cleared."))
+ (t
+ (setq mdw-designated-window (selected-window))
+ (message "Window designated."))))
+
+(defun mdw-display-buffer-in-designated-window (buffer alist)
+ "Display function to use the designated window."
+ (prog1 mdw-designated-window
+ (when mdw-designated-window
+ (select-window mdw-designated-window)
+ (switch-to-buffer buffer nil t))
+ (setq mdw-designated-window nil)))
+
+(setq display-buffer-base-action
+ (let* ((action display-buffer-base-action)
+ (funcs (car action))
+ (alist (cdr action)))
+ (cons (cons 'mdw-display-buffer-in-designated-window funcs) alist)))
+
(defun mdw-clobber-other-windows-showing-buffer (buffer-or-name)
"Arrange that no windows on other frames are showing BUFFER-OR-NAME."
(interactive "bBuffer: ")
(smerge-mode 1))))
(add-hook 'find-file-hook 'mdw-try-smerge t)
+(defcustom mdw-magit-new-window-modes
+ '(magit-diff-mode
+ magit-log-mode
+ magit-process-mode
+ magit-revision-mode
+ magit-stash-mode
+ magit-status-mode)
+ "Magit modes which should cause a new window to be used."
+ :type '(repeat symbol))
+
+(defun mdw-display-magit-buffer (buffer)
+ "Like `magit-display-buffer-traditional'.
+But uses `mdw-magit-new-window-modes' for its list of modes
+rather than baking the list into the function."
+ (display-buffer buffer
+ (if (and (not mdw-designated-window)
+ (derived-mode-p 'magit-mode)
+ (not (memq (with-current-buffer buffer major-mode)
+ mdw-magit-new-window-modes)))
+ '(display-buffer-same-window . nil)
+ nil)))
+(setq magit-display-buffer-function 'mdw-display-magit-buffer)
+
;;;--------------------------------------------------------------------------
;;; GUD, and especially GDB.