mywin: use whitespace-line-column to calculate number of parallel windows
[emacs-init.git] / setup / mywin.el
index 63ab71d..7d961c1 100644 (file)
@@ -59,12 +59,21 @@ window smaller than MIN-HEIGHT lines."
 (defconst setup-my-windows-junk-buffers
   '("*scratch*" "*Messages*" "*Calculator" "*Calc Trail*" "*compilation*" "*fetchmail*"))
 
-(defun setup-my-windows ()
-  (interactive)
-  (let ((width 100) (min 100) (distribute t)
-        (currentbuffer (current-buffer))
-        (currentwindow (selected-window))
-        topwindows firstwindow newwindow newtopwindows)
+(defvar my-windows-count nil)
+
+(defun setup-my-windows (&optional n)
+  (interactive "P")
+  (if n
+      (if (integerp n)
+          (setq my-windows-count n)
+        (setq my-windows-count nil)))
+  (let* ((width (if my-windows-count
+                    (- (/ (frame-width) my-windows-count) 4)
+                  (or whitespace-line-column 100)))
+         (min width) (distribute t)
+         (currentbuffer (current-buffer))
+         (currentwindow (selected-window))
+         topwindows firstwindow newwindow newtopwindows)
     (walk-windows (function (lambda (w)
                               (let ((e (window-edges w)))
                                 (if (< (nth 1 e) window-min-height)
@@ -135,8 +144,9 @@ window smaller than MIN-HEIGHT lines."
                     if (and (= (aref name 0) ?*)
                             (not (member name setup-my-windows-precious-buffers))) return w)
               firstwindow))
-    (if (and distribute (> (length newtopwindows) 1))
-        (balance-windows firstwindow))
+    (when (and distribute (> (length newtopwindows) 1))
+      ;;(balance-windows)
+      )
     (select-window newwindow)
     (if (not (member (buffer-name currentbuffer) setup-my-windows-junk-buffers))
         (switch-to-buffer currentbuffer))))
@@ -151,28 +161,32 @@ window smaller than MIN-HEIGHT lines."
 (global-set-key "\C-x7" 'split-window-3-horizontally)
 (global-set-key "\C-x8" (lambda () (interactive) (split-window-n-horizontally 100 50)))
 (global-set-key "\C-x9" 'setup-my-windows)
-(global-set-key "\C-xp" 'other-window-reverse)
 (global-set-key "\C-\M-_" (lambda () (interactive) (safe-shrink-window 5)))
 
-(defun my-swap-window-to-right (&optional stay)
+(defun my-swap-window-to-right (&optional below)
+  "If swap buffer in this window with buffer on the right. If BELOW is set,
+instead move current buffer to right and replace it with the next buffer from
+the buffer stack in the current window."
   (interactive "P")
   (let ((cb (current-buffer))
         (cw (selected-window)))
+    (if below
+        (switch-to-buffer nil))
     (windmove-right)
-    (set-window-buffer cw (current-buffer))
-    (switch-to-buffer cb)
-    (if stay
-        (select-window cw))))
+    (if (not below)
+        (set-window-buffer cw (current-buffer)))
+    (switch-to-buffer cb)))
 
-(defun my-swap-window-to-left (&optional stay)
+(defun my-swap-window-to-left (&optional below)
   (interactive "P")
   (let ((cb (current-buffer))
         (cw (selected-window)))
+    (if below
+        (switch-to-buffer nil))
     (windmove-left)
-    (set-window-buffer cw (current-buffer))
-    (switch-to-buffer cb)
-    (if stay
-        (select-window cw))))
+    (if (not below)
+        (set-window-buffer cw (current-buffer)))
+    (switch-to-buffer cb)))
 
 (global-set-key "\C-x>" 'my-swap-window-to-right)
 (global-set-key "\C-x<" 'my-swap-window-to-left)
@@ -203,3 +217,4 @@ window smaller than MIN-HEIGHT lines."
     (shrink-window-horizontally (- (- width (window-width) (* window-min-width (1- count)))))))
 
 (global-set-key "\C-x=" 'safe-max-window-horizontally)
+(global-set-key "\C-x-" 'maximize-window-15)