diff --git a/core/lib/defuns-evil.el b/core/lib/defuns-evil.el index d9c762fe6..4e6b71561 100644 --- a/core/lib/defuns-evil.el +++ b/core/lib/defuns-evil.el @@ -87,12 +87,64 @@ (call-interactively 'evil-window-split) (evil-window-down 1)) +;;;###autoload +(defun narf/undo-window-change () + (interactive) + (call-interactively (if (wg-current-workgroup t) 'wg-undo-wconfig-change 'winner-undo))) + +;;;###autoload +(defun narf/redo-window-change () + (interactive) + (call-interactively (if (wg-current-workgroup t) 'wg-redo-wconfig-change 'winner-redo))) + ;;;###autoload (defun narf/evil-window-vsplit () (interactive) (call-interactively 'evil-window-vsplit) (evil-window-right 1)) +(defun narf--evil-window-move (direction) + "Move current window to the next window in DIRECTION. If there is no window, +then make an empty split and switch their buffers." + (let* ((this-window (get-buffer-window)) + (this-buffer (current-buffer)) + (that-window (windmove-find-other-window direction nil this-window)) + (that-buffer (window-buffer that-window))) + (unless that-window + (setq that-window + (split-window this-window nil (cond ((eq direction 'up) 'above) + ((eq direction 'down) 'below) + (t direction)))) + (with-selected-window that-window + (switch-to-buffer "*scratch*")) + (setq that-buffer (window-buffer that-window))) + (with-selected-window this-window + (switch-to-buffer that-buffer)) + (with-selected-window that-window + (switch-to-buffer this-buffer)) + (select-window that-window))) + +;;;###autoload +(defun narf/evil-window-move-left () + "See `narf--evil-window-move'" + (interactive) + (narf--evil-window-move 'left)) +;;;###autoload +(defun narf/evil-window-move-down () + "See `narf--evil-window-move'" + (interactive) + (narf--evil-window-move 'down)) +;;;###autoload +(defun narf/evil-window-move-up () + "See `narf--evil-window-move'" + (interactive) + (narf--evil-window-move 'up)) +;;;###autoload +(defun narf/evil-window-move-right () + "See `narf--evil-window-move'" + (interactive) + (narf--evil-window-move 'right)) + ;;;###autoload (defmacro define-text-object! (key start-regex end-regex) (let ((inner-name (make-symbol "narf--inner-name")) diff --git a/private/my-bindings.el b/private/my-bindings.el index 888a0713a..e6c148a16 100644 --- a/private/my-bindings.el +++ b/private/my-bindings.el @@ -245,14 +245,20 @@ :e [escape] 'evil-normal-state (:map evil-window-map ; prefix "C-w" - "u" 'winner-undo + "u" 'narf/undo-window-change ;; Jump to new splits "s" 'narf/evil-window-split "v" 'narf/evil-window-vsplit - "C-u" 'winner-undo - "C-r" 'winner-redo + ;; Move window in one step + "H" 'narf/evil-window-move-left + "J" 'narf/evil-window-move-down + "K" 'narf/evil-window-move-up + "L" 'narf/evil-window-move-right + + "C-u" 'narf/undo-window-change + "C-r" 'narf/redo-window-change "C-h" 'evil-window-left ; don't accidentally invoke help "C-j" 'evil-window-down ; don't accidentally invoke help "C-k" 'evil-window-up ; don't accidentally invoke help