diff options
| author | Tom Dalziel <tom_dl@hotmail.com> | 2024-05-22 22:46:36 +0200 |
|---|---|---|
| committer | Tom Dalziel <33435574+tomdl89@users.noreply.github.com> | 2024-05-26 17:24:32 +0200 |
| commit | 89efb079a1b31c1881adcc6b370b20ce85f2b5bc (patch) | |
| tree | 400599f150e4deb03e7145371ed390139b5e319d | |
| parent | e8c8e028261f9d57f8c570952043fcd165df41cb (diff) | |
Allow count after C-w for window commands
Fixes #1902
| -rw-r--r-- | evil-commands.el | 60 | ||||
| -rw-r--r-- | evil-maps.el | 10 | ||||
| -rw-r--r-- | evil-types.el | 15 |
3 files changed, 67 insertions, 18 deletions
diff --git a/evil-commands.el b/evil-commands.el index 21e3d3c..18e9f8c 100644 --- a/evil-commands.el +++ b/evil-commands.el @@ -4397,6 +4397,29 @@ The \"!\" argument means to sort in reverse order." ;;; Window navigation +(defvar evil--window-digit nil) + +(defun evil--window-keep-pred () + (eq 'evil-window-digit-argument this-command)) + +(defun evil--window-reset-digit () + (setq evil--window-digit nil) + (remove-hook 'post-command-hook #'evil--window-reset-digit)) + +(defun evil--window-on-exit () + (add-hook 'post-command-hook #'evil--window-reset-digit)) + +(defun evil-window-digit-argument () + "Like `digit-argument' but maintains the window map." + (interactive) + (unless (eq 'evil-window-digit-argument last-command) + (set-transient-map evil-window-map #'evil--window-keep-pred #'evil--window-on-exit)) + (let* ((char (if (integerp last-command-event) + last-command-event + (get last-command-event 'ascii-character))) + (digit (- (logand char ?\177) ?0))) + (setq evil--window-digit (+ (* 10 (or evil--window-digit 0)) digit)))) + (defmacro evil-save-side-windows (&rest body) "Toggle side windows, evaluate BODY, restore side windows." (declare (indent defun) (debug (&rest form))) @@ -4491,7 +4514,7 @@ when `evil-split-window-below' is non-nil. If COUNT and `evil-auto-balance-windows' are both non-nil then all children of the parent of the splitted window are rebalanced." :repeat nil - (interactive "P<f>") + (interactive "<wc><f>") (select-window (split-window (selected-window) (when count (- count)) (if evil-split-window-below 'below 'above))) @@ -4507,7 +4530,7 @@ right when `evil-vsplit-window-right' is non-nil. If COUNT and `evil-auto-balance-windows'are both non-nil then all children of the parent of the splitted window are rebalanced." :repeat nil - (interactive "P<f>") + (interactive "<wc><f>") (select-window (split-window (selected-window) (when count (- count)) (if evil-vsplit-window-right 'right 'left))) @@ -4540,28 +4563,28 @@ of the parent of the splitted window are rebalanced." (evil-define-command evil-window-left (count) "Move the cursor to new COUNT-th window left of the current one." :repeat nil - (interactive "p") + (interactive "<w>") (dotimes (_ count) (windmove-left))) (evil-define-command evil-window-right (count) "Move the cursor to new COUNT-th window right of the current one." :repeat nil - (interactive "p") + (interactive "<w>") (dotimes (_ count) (windmove-right))) (evil-define-command evil-window-up (count) "Move the cursor to new COUNT-th window above the current one." :repeat nil - (interactive "p") + (interactive "<w>") (dotimes (_ (or count 1)) (windmove-up))) (evil-define-command evil-window-down (count) "Move the cursor to new COUNT-th window below the current one." :repeat nil - (interactive "p") + (interactive "<w>") (dotimes (_ (or count 1)) (windmove-down))) @@ -4604,7 +4627,7 @@ is different from the current one." With COUNT go to the count-th window in the order starting from top-left." :repeat nil - (interactive "<c>") + (interactive "<wc>") (if (not count) (other-window +1) (evil-window-top-left) @@ -4615,7 +4638,7 @@ top-left." With COUNT go to the count-th window in the order starting from top-left." :repeat nil - (interactive "<c>") + (interactive "<wc>") (if (not count) (other-window -1) (evil-window-top-left) @@ -4625,7 +4648,7 @@ top-left." "Split the current window horizontally and open a new buffer or edit a certain FILE." :repeat nil - (interactive "P<f>") + (interactive "<wc><f>") (let ((new-window (split-window (selected-window) (when count (- count)) (if evil-split-window-below 'below 'above)))) (when (and (not count) evil-auto-balance-windows) @@ -4637,7 +4660,7 @@ and open a new buffer or edit a certain FILE." "Split the current window vertically and open a new buffer name or edit a certain FILE." :repeat nil - (interactive "P<f>") + (interactive "<wc><f>") (let ((new-window (split-window (selected-window) (when count (- count)) (if evil-vsplit-window-right 'right 'left)))) (when (and (not count) evil-auto-balance-windows) @@ -4658,37 +4681,37 @@ and open a new buffer name or edit a certain FILE." (evil-define-command evil-window-increase-height (count) "Increase current window height by COUNT." :repeat nil - (interactive "p") + (interactive "<w>") (enlarge-window count)) (evil-define-command evil-window-decrease-height (count) "Decrease current window height by COUNT." :repeat nil - (interactive "p") + (interactive "<w>") (enlarge-window (- count))) (evil-define-command evil-window-increase-width (count) "Increase current window width by COUNT." :repeat nil - (interactive "p") + (interactive "<w>") (enlarge-window count t)) (evil-define-command evil-window-decrease-width (count) "Decrease current window width by COUNT." :repeat nil - (interactive "p") + (interactive "<w>") (enlarge-window (- count) t)) (evil-define-command evil-window-set-height (count) "Set the height of the current window to COUNT." :repeat nil - (interactive "<c>") + (interactive "<wc>") (evil-resize-window (or count (frame-height)) nil)) (evil-define-command evil-window-set-width (count) "Set the width of the current window to COUNT." :repeat nil - (interactive "<c>") + (interactive "<wc>") (evil-resize-window (or count (frame-width)) t)) (evil-define-command evil-ex-resize (arg) @@ -4740,10 +4763,10 @@ If ARG is empty, maximize the current window height." slist (cdr slist))) (select-window (car (window-list)))))) -(evil-define-command evil-window-exchange (count) +(evil-define-command evil-window-exchange (&optional count) "Exchange the current window with the next, or the COUNT-th, one." :repeat nil - (interactive "<c>") + (interactive "<wc>") (let ((original-window (selected-window))) (evil-window-next count) (if (fboundp 'window-swap-states) @@ -5085,6 +5108,7 @@ Restore the disabled repeat hooks on insert-state exit." evil-execute-in-normal-state evil-replace-state evil-use-register + evil-window-digit-argument digit-argument negative-argument universal-argument diff --git a/evil-maps.el b/evil-maps.el index b0b2953..e94d78f 100644 --- a/evil-maps.el +++ b/evil-maps.el @@ -188,6 +188,16 @@ (define-key evil-window-map [C-up] 'evil-window-up) (define-key evil-window-map [C-left] 'evil-window-left) (define-key evil-window-map [C-right] 'evil-window-right) +(define-key evil-window-map "0" 'evil-window-digit-argument) +(define-key evil-window-map "1" 'evil-window-digit-argument) +(define-key evil-window-map "2" 'evil-window-digit-argument) +(define-key evil-window-map "3" 'evil-window-digit-argument) +(define-key evil-window-map "4" 'evil-window-digit-argument) +(define-key evil-window-map "5" 'evil-window-digit-argument) +(define-key evil-window-map "6" 'evil-window-digit-argument) +(define-key evil-window-map "7" 'evil-window-digit-argument) +(define-key evil-window-map "8" 'evil-window-digit-argument) +(define-key evil-window-map "9" 'evil-window-digit-argument) (when (featurep 'tab-bar) (define-key evil-motion-state-map "gt" 'evil-tab-next) diff --git a/evil-types.el b/evil-types.el index 67ea9ce..360316a 100644 --- a/evil-types.el +++ b/evil-types.el @@ -277,6 +277,13 @@ the last column is excluded." ;;; Custom interactive codes +(evil-define-interactive-code "<w>" + "Prefix argument converted to number, possibly multiplied by evil--window-digit." + (let ((prefix-num (prefix-numeric-value current-prefix-arg))) + (if evil--window-digit + (list (* evil--window-digit prefix-num)) + (list prefix-num)))) + (evil-define-interactive-code "<c>" "Count." (list (when current-prefix-arg @@ -294,6 +301,14 @@ directly." (prefix-numeric-value current-prefix-arg)))) +(evil-define-interactive-code "<wc>" + "Prefix argument converted to number, or nil possibly multiplied by +evil--window-digit." + (let ((prefix-num (prefix-numeric-value current-prefix-arg))) + (list + (cond (evil--window-digit (* evil--window-digit prefix-num)) + (current-prefix-arg prefix-num))))) + (evil-define-interactive-code "<C>" "Character read through `evil-read-key'." (list |
