From fa30322b230a7f5c56cb6044794882d1aadc736c Mon Sep 17 00:00:00 2001 From: Howard Abrams Date: Tue, 15 Nov 2022 11:08:27 -0800 Subject: [PATCH] Consistent window commands I like both my leader and ace-window for different reasons, and I need them to be consistent. Also, I want to split a window and immediately see a file or buffer. --- ha-config.org | 145 +++++++++++++++++++++++++++++++++++-------------- ha-display.org | 23 +++++--- 2 files changed, 118 insertions(+), 50 deletions(-) diff --git a/ha-config.org b/ha-config.org index e606d70..46c3d13 100644 --- a/ha-config.org +++ b/ha-config.org @@ -772,17 +772,30 @@ While it comes with Emacs, I use [[https://www.emacswiki.org/emacs/WinnerMode][w :config (winner-mode +1)) #+end_src + Use the [[https://github.com/abo-abo/ace-window][ace-window]] project to jump to any window you see: #+begin_src emacs-lisp (use-package ace-window + :init + ;; Since I use numbers for the window, I can make the + ;; commands more mnemonic: + (setq aw-dispatch-alist + '((?d aw-delete-window "Delete Window") + (?m aw-swap-window "Swap Windows") + (?M aw-move-window "Move Window") + (?c aw-copy-window "Copy Window") + (?j aw-switch-buffer-in-window "Select Buffer") + (?n aw-flip-window) + (?u aw-switch-buffer-other-window "Switch Buffer Other Window") + (?c aw-split-window-fair "Split Fair Window") + (?s aw-split-window-vert "Split Vert Window") + (?v aw-split-window-horz "Split Horz Window") + (?o delete-other-windows "Delete Other Windows") + (?? aw-show-dispatch-help))) + :bind ("s-w" . ace-window)) #+end_src -This package, bound to ~SPC w w~, also allows operations specified before choosing the window: -- ~x~ - delete window -- ~m~ - swap windows, which allows you to place the current buffer in any other window -- ~j~ - switch to a buffer in any other window -- ~?~ - show the rest of the command bindings -Keep in mind, these shortcuts work with more than two windows open. For instance, ~SPC w w x 3~ closes the "3" window. +Keep in mind, these shortcuts work with more than two windows open. For instance, ~SPC w w d 3~ closes the "3" window. To jump to a window even quicker, use the [[https://github.com/deb0ch/emacs-winum][winum package]]: #+begin_src emacs-lisp @@ -790,16 +803,7 @@ To jump to a window even quicker, use the [[https://github.com/deb0ch/emacs-winu :config (winum-mode +1)) #+end_src -And when creating new windows, why isn't the new window selected? -#+begin_src emacs-lisp - (defun jump-to-new-window (&rest _arg) - "Advice function to jump to newly spawned window." - (other-window 1)) - (dolist (command '(split-window-below split-window-right - evil-window-split evil-window-vsplit)) - (advice-add command :after #'jump-to-new-window)) -#+end_src This is nice since the window numbers are always present on a Doom modeline, but they order the window numbers /differently/ than =ace-window=. Let's see which I end up liking better. The ~0~ key/window should be always associated with a project-specific tree window: @@ -815,44 +819,49 @@ Let's try this out with a Hydra since some I can /repeat/ some commands (e.g. en :config (defhydra hydra-window-resize (:color blue :hint nil) " _w_: select _m_: move/swap _u_: undo _^_: taller (t) _+_: text larger - _j_: go up _x_: delete _U_: undo+ _V_: shorter (T) _-_: text smaller + _j_: go up _d_: delete _U_: undo+ _v_: shorter (T) _-_: text smaller _k_: down _e_: balance _r_: redo _>_: wider _F_: font larger - _h_: left _b_: h-split _R_: redo+ _<_: narrower _f_: font smaller - _l_: right _v_: v-split _o_: only this window _c_: choose (also 1-9) - " + _h_: left _w_: h-split _R_: redo+ _<_: narrower _f_: font smaller + _l_: right _s_: v-split _o_: only this window _c_: choose (also 1-9)" ("w" ace-window) - ("c" other-window :color pink) ; change window + ("c" other-window :color pink) ; change window ("o" delete-other-windows) ; Only this window - ("x" delete-window) + ("d" delete-window) ("x" delete-window) ("D" ace-delete-window) ("m" ace-swap-window) ("u" winner-undo) - ("U" winner-undo :color pink) + ("U" winner-undo :color pink) ("C-r" winner-redo) ("r" winner-redo) - ("R" winner-redo :color pink) + ("R" winner-redo :color pink) ("n" evil-window-new) - ("j" evil-window-up :color pink) - ("k" evil-window-down :color pink) - ("h" evil-window-left :color pink) - ("l" evil-window-right :color pink) + ("j" evil-window-down :color pink) + ("J" evil-window-down) + ("k" evil-window-up :color pink) + ("K" evil-window-up) + ("h" evil-window-left :color pink) + ("H" evil-window-left) + ("l" evil-window-right :color pink) + ("L" evil-window-right) - ("b" evil-window-split) ; For below - ("v" evil-window-vsplit) + ("w" hydra-window-split-h/body) ; Why `w', Why not? + ("s" hydra-window-split-v/body) - ("F" font-size-increase :color pink) - ("f" font-size-decrease :color pink) - ("+" text-scale-increase :color pink) - ("=" text-scale-increase :color pink) - ("-" text-scale-decrease :color pink) + ("F" font-size-increase :color pink) + ("f" font-size-decrease :color pink) + ("+" text-scale-increase :color pink) + ("=" text-scale-increase :color pink) + ("-" text-scale-decrease :color pink) ("^" evil-window-increase-height :color pink) - ("V" evil-window-decrease-height :color pink) + ("v" evil-window-decrease-height :color pink) ("t" evil-window-increase-height :color pink) ("T" evil-window-decrease-height :color pink) - (">" evil-window-increase-width :color pink) - ("<" evil-window-decrease-width :color pink) + (">" evil-window-increase-width :color pink) + ("<" evil-window-decrease-width :color pink) + ("." evil-window-increase-width :color pink) + ("," evil-window-decrease-width :color pink) ("e" balance-windows) ("1" winum-select-window-1) @@ -867,14 +876,68 @@ Let's try this out with a Hydra since some I can /repeat/ some commands (e.g. en ("0" neotree-toggle) ;; Extra bindings: - ("t" evil-window-increase-height :color pink) - ("T" evil-window-decrease-height :color pink) - ("." evil-window-increase-width :color pink) - ("," evil-window-decrease-width :color pink) ("q" nil :color blue))) (ha-leader "w" '("windows" . hydra-window-resize/body)) #+end_src +**** Window Splitting +When I split a window, I have a following intentions: + - Split and open a file from the prespective/project in the new window + - Split and change to a buffer from the prespective in the new window + - Split and move focus to the new window … you know, to await a new command + +And when creating new windows, why isn't the new window selected? Also, when I create a new window, I typically want a different buffer or file shown. +#+begin_src emacs-lisp + (defun ha-new-window (side file-or-buffer) + (pcase side + (:left (split-window-horizontally)) + (:right (split-window-horizontally) + (other-window 1)) + (:above (split-window-vertically)) + (:below (split-window-vertically) + (other-window 1))) + (pcase file-or-buffer + (:file (call-interactively 'consult-projectile-find-file)) + (:buffer (call-interactively 'consult-projectile-switch-to-buffer)))) +#+end_src + +Shame that hydra doesn’t have an /ignore-case/ feature. +#+begin_src emacs-lisp + (use-package hydra + :config + (defhydra hydra-window-split-above (:color blue :hint nil) + ("b" (lambda () (interactive) (ha-new-window :above :buffer)) "switch buffer") + ("B" (lambda () (interactive) (ha-new-window :above :buffer)) "switch buffer") + ("f" (lambda () (interactive) (ha-new-window :above :file)) "load file") + ("F" (lambda () (interactive) (ha-new-window :above :file)) "load file") + ("k" split-window-below "split window") + ("K" split-window-below "split window")) + + (defhydra hydra-window-split-below (:color blue :hint nil) + ("b" (lambda () (interactive) (ha-new-window :below :buffer)) "switch buffer") + ("B" (lambda () (interactive) (ha-new-window :below :buffer)) "switch buffer") + ("f" (lambda () (interactive) (ha-new-window :below :file)) "load file ") + ("F" (lambda () (interactive) (ha-new-window :below :file)) "load file ") + ("j" (lambda () (interactive) (split-window-below) (other-window 1)) "split window ") + ("J" (lambda () (interactive) (split-window-below) (other-window 1)) "split window ")) + + (defhydra hydra-window-split-right (:color blue :hint nil) + ("b" (lambda () (interactive) (ha-new-window :right :buffer)) "switch buffer") + ("B" (lambda () (interactive) (ha-new-window :right :buffer)) "switch buffer") + ("f" (lambda () (interactive) (ha-new-window :right :file)) "load file") + ("F" (lambda () (interactive) (ha-new-window :right :file)) "load file") + ("l" split-window-left "split window") + ("L" split-window-left "split window")) + + (defhydra hydra-window-split-left (:color blue :hint nil) + ("b" (lambda () (interactive) (ha-new-window :left :buffer)) "switch buffer") + ("B" (lambda () (interactive) (ha-new-window :left :buffer)) "switch buffer") + ("f" (lambda () (interactive) (ha-new-window :left :file)) "load file ") + ("F" (lambda () (interactive) (ha-new-window :left :file)) "load file ") + ("h" (lambda () (interactive) (split-window-left) (other-window 1)) "split window ") + ("H" (lambda () (interactive) (split-window-left) (other-window 1)) "split window "))) +#+end_src + *** Search Operations Ways to search for information goes under the ~s~ key. The venerable sage has always been =grep=, but we now have new-comers, like [[https://github.com/BurntSushi/ripgrep][ripgrep]], which are really fast. **** ripgrep diff --git a/ha-display.org b/ha-display.org index 2300cae..b1aee09 100644 --- a/ha-display.org +++ b/ha-display.org @@ -56,18 +56,22 @@ Large screen, lots of windows, so where is the cursor? While I used to use =hl-l other-window delete-window delete-other-windows + aw-delete-window forward-page backward-page scroll-up-command scroll-down-command - windmove-right - windmove-left - windmove-up - windmove-down - windmove-swap-states-right - windmove-swap-states-left - windmove-swap-states-up - windmove-swap-states-down + evil-window-right + evil-window-left + evil-window-up + evil-window-down + aw-move-window + aw-swap-window + aw-copy-window + aw-split-window-vert + aw-split-window-horz + aw-split-window-fair + ha-new-window winum-select-window-1 winum-select-window-2 winum-select-window-3 @@ -93,7 +97,8 @@ Large screen, lots of windows, so where is the cursor? While I used to use =hl-l outline-up-heading)) (pulsar-face 'pulsar-magenta) (pulsar-delay 0.055) - :bind ("" . pulsar-pulse-line)) + :bind ("" . pulsar-pulse-line) + :config (pulsar-global-mode)) #+end_src * Themes One does get used to a particular collection of colors. Mine is Tomorrow: