chiark / gitweb /
el/dot-emacs.el: Open non-Magit buffers in new windows.
[profile] / el / dot-emacs.el
index c7849f32e41415df668d2714eb6c4bb8c7f019a0..12c3b21c7ab9cb27586e81fd1fb63a9aa7762d2f 100644 (file)
@@ -75,6 +75,13 @@ (defun mdw-emacs-version-p (major &optional minor)
       (and (= emacs-major-version major)
           (>= emacs-minor-version (or minor 0)))))
 
+(defun mdw-submode-p (mode parent)
+  "Return non-nil if MODE is indirectly derived from PARENT."
+  (let ((answer nil))
+    (while (cond ((eq mode parent) (setq answer t) nil)
+                (t (setq mode (get mode 'derived-mode-parent)))))
+    answer))
+
 ;; Some error trapping.
 ;;
 ;; If individual bits of this file go tits-up, we don't particularly want
@@ -319,13 +326,17 @@ (defun mdw-switch-window-configuration (register &optional no-save)
           (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))
@@ -334,10 +345,14 @@ (defun mdw-switch-window-configuration (register &optional no-save)
           (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.
@@ -5166,6 +5181,30 @@ (defun mdw-try-smerge ()
       (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
+                 (let ((mode (with-current-buffer buffer major-mode)))
+                   (if (and (not mdw-designated-window)
+                            (derived-mode-p 'magit-mode)
+                            (mdw-submode-p mode 'magit-mode)
+                            (not (memq 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.