branch: elpa/helm
commit 014b41fb8add23c5308f908e9e015f71d276c238
Author: Thierry Volpiatto <thie...@posteo.net>
Commit: Thierry Volpiatto <thie...@posteo.net>

    Add new commands to resplit window in both directions
---
 helm-core.el | 48 +++++++++++++++++++++++++++++++++---------------
 1 file changed, 33 insertions(+), 15 deletions(-)

diff --git a/helm-core.el b/helm-core.el
index c95a6c2c1e7..f6bb1d9f96d 100644
--- a/helm-core.el
+++ b/helm-core.el
@@ -469,8 +469,8 @@ i.e. the loop is not entered after running COMMAND."
     (helm-define-key-with-subkeys map (kbd "C-c n") ?n #'helm-run-cycle-resume)
     ;; Disable `file-cache-minibuffer-complete'.
     (define-key map (kbd "<C-tab>")    #'undefined)
-    ;; Multi keys
-    (define-key map (kbd "C-t")        #'helm-toggle-resplit-window)
+    (define-key map (kbd "C-t")        #'helm-toggle-resplit-window-forward)
+    (define-key map (kbd "C-r")        #'helm-toggle-resplit-window-backward)
     ;; Debugging command
     (define-key map (kbd "C-h C-d")    #'helm-enable-or-switch-to-debug)
     (define-key map (kbd "C-h c")      #'helm-customize-group)
@@ -7307,11 +7307,22 @@ unless FORCE-LONGEST is non nil."
 ;;
 ;;
 (defvar helm--toggle-resplit-window-iterator nil)
-(defun helm-toggle-resplit-window ()
+(defvar helm--toggle-resplit-window-last-command nil)
+(defun helm-toggle-resplit-window-forward ()
+  "Toggle resplit helm window clockwise."
+  (interactive)
+  (helm-toggle-resplit-window-1 1))
+
+(defun helm-toggle-resplit-window-backward ()
+  "Toggle resplit helm window counterclockwise."
+  (interactive)
+  (helm-toggle-resplit-window-1 -1))
+
+(defun helm-toggle-resplit-window-1 (arg)
   "Toggle resplit helm window, vertically or horizontally.
 When more than two windows `helm-swap-windows' is used which display
-`helm-buffer' in each different windows, otherwise split windows clockwise."
-  (interactive)
+`helm-buffer' in each different windows, otherwise split windows clockwise if
+ARG is positive otherwise counterclockwise if negative."
   (with-helm-alive-p
     (cond ((> (length (window-list nil 1)) 2)
            (helm-swap-windows))
@@ -7329,24 +7340,21 @@ When more than two windows `helm-swap-windows' is used 
which display
                         ((window-parameter
                           (get-buffer-window helm-current-buffer) 'window-slot)
                          (user-error "Can't resplit a side window"))
-                        (t (helm--toggle-resplit-window)))
-                  (setq helm--window-side-state (helm--get-window-side-state)))
+                        (t (helm--toggle-resplit-window arg))))
              (when helm-prevent-escaping-from-minibuffer
                (helm-prevent-switching-other-window :enabled t))))
           (t (error "current window configuration not suitable for 
splitting")))))
 (put 'helm-toggle-resplit-window 'helm-only t)
 
-(defun helm--toggle-resplit-window ()
+(defun helm--toggle-resplit-window (arg)
   (let ((current-state (helm--get-window-side-state))
         new-state)
-    (unless (and helm--toggle-resplit-window-iterator
+    (unless (and (eq helm--toggle-resplit-window-last-command this-command)
                  (eq current-state helm--window-side-state))
       (setq helm--toggle-resplit-window-iterator
-            (helm-iter-circular (helm-acase current-state
-                                  (right '(below left above right))
-                                  (left  '(above right below left))
-                                  (below '(left above right below))
-                                  (above '(right below left above))))))
+            (helm-iter-circular (helm--resplit-window-direction
+                                 current-state arg)))
+      (setq helm--toggle-resplit-window-last-command this-command))
     (setq new-state (helm-iter-next helm--toggle-resplit-window-iterator)
           helm-split-window-state (helm-acase new-state
                                     ((right left)  'horizontal)
@@ -7355,7 +7363,17 @@ When more than two windows `helm-swap-windows' is used 
which display
     (set-window-buffer
      (select-window
       (split-window (selected-window) nil new-state))
-     helm-buffer)))
+     helm-buffer)
+    (setq helm--window-side-state (helm--get-window-side-state))))
+
+(defun helm--resplit-window-direction (state arg)
+  (let ((clockwise (helm-acase state
+                     (right '(below left above))
+                     (left  '(above right below))
+                     (below '(left above right))
+                     (above '(right below left)))))
+    (append (if (< arg 0) (reverse clockwise) clockwise)
+            (list state))))
 
 ;; Utility: Resize helm window.
 (defun helm-enlarge-window-1 (n)

Reply via email to