;; If individual bits of this file go tits-up, we don't particularly want
;; the whole lot to stop right there and then, because it's bloody annoying.
-(defmacro trap (&rest forms)
- "Execute FORMS without allowing errors to propagate outside."
- (declare (indent 0)
- (debug t))
- `(condition-case err
- ,(if (cdr forms) (cons 'progn forms) (car forms))
- (error (message "Error (trapped): %s in %s"
- (error-message-string err)
- ',forms))))
+(eval-and-compile
+ (defmacro trap (&rest forms)
+ "Execute FORMS without allowing errors to propagate outside."
+ (declare (indent 0)
+ (debug t))
+ `(condition-case err
+ ,(if (cdr forms) (cons 'progn forms) (car forms))
+ (error (message "Error (trapped): %s in %s"
+ (error-message-string err)
+ ',forms)))))
;; Configuration reading.
(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-designated-window-display-buffer-function (buffer not-this-window)
+ "Display buffer function to use the designated window."
+ (unless mdw-designated-window (error "No designated window!"))
+ (prog1 mdw-designated-window
+ (with-selected-window mdw-designated-window (switch-to-buffer buffer))
+ (setq mdw-designated-window nil
+ display-buffer-function nil)))
(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))
+ (with-selected-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-designate-window (cancel)
+ "Use the selected window for the next pop-up buffer.
+With a prefix argument, clear the designated window."
+ (interactive "P")
+ (let ((window (selected-window)))
+ (cond (cancel
+ (setq mdw-designated-window nil)
+ (unless (mdw-emacs-version-p 24)
+ (setq display-buffer-function nil))
+ (message "Window designation cleared."))
+ ((window-dedicated-p window)
+ (error "Window is dedicated to its buffer."))
+ (t
+ (setq mdw-designated-window window)
+ (unless (mdw-emacs-version-p 24)
+ (setq display-buffer-function
+ #'mdw-designated-window-display-buffer-function))
+ (message "Window designated.")))))
+
+(when (mdw-emacs-version-p 24)
+ (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."
nil))))
(setq magit-display-buffer-function 'mdw-display-magit-buffer)
+(defun mdw-display-magit-file-buffer (buffer)
+ "Show a file buffer from a diff."
+ (select-window (display-buffer buffer)))
+(setq magit-display-file-buffer-function 'mdw-display-magit-file-buffer)
+
;;;--------------------------------------------------------------------------
;;; GUD, and especially GDB.