2025-12-22 10:51:46 +11:00
|
|
|
;; -*- lexical-binding: t; -*-
|
|
|
|
|
;; Restore old window configurations
|
|
|
|
|
|
|
|
|
|
(use-package winner
|
|
|
|
|
:ensure nil
|
|
|
|
|
:commands (winner-undo winner-redo)
|
|
|
|
|
:hook elpaca-after-init
|
|
|
|
|
:init (setq winner-boring-buffers '("*Completions*"
|
|
|
|
|
"*Compile-Log*"
|
|
|
|
|
"*inferior-lisp*"
|
|
|
|
|
"*Fuzzy Completions*"
|
|
|
|
|
"*Apropos*"
|
|
|
|
|
"*Help*"
|
|
|
|
|
"*cvs*"
|
|
|
|
|
"*Buffer List*"
|
|
|
|
|
"*Ibuffer*"
|
|
|
|
|
"*esh command on file*")))
|
|
|
|
|
|
2026-02-15 00:34:42 +11:00
|
|
|
(defun split-window-horizontally-instead ()
|
|
|
|
|
"Kill other windows and split the current window is on the top half of the frame."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let* ((next-window (next-window))
|
|
|
|
|
(other-buffer (and next-window (window-buffer next-window))))
|
|
|
|
|
(delete-other-windows)
|
|
|
|
|
(split-window-horizontally)
|
|
|
|
|
(when other-buffer
|
|
|
|
|
(set-window-buffer next-window other-buffer))))
|
|
|
|
|
|
|
|
|
|
(defun split-window-vertically-instead ()
|
|
|
|
|
"Kill other windows and split the current window is on left half of the frame."
|
|
|
|
|
(interactive)
|
|
|
|
|
(let* ((next-window (next-window))
|
|
|
|
|
(other-buffer (and next-window (window-buffer next-window))))
|
|
|
|
|
(delete-other-windows)
|
|
|
|
|
(split-window-vertically)
|
|
|
|
|
(when other-buffer
|
|
|
|
|
(set-window-buffer next-window other-buffer))))
|
|
|
|
|
|
2025-12-22 10:51:46 +11:00
|
|
|
(use-package ace-window
|
|
|
|
|
:hook (emacs-startup . ace-window-display-mode)
|
|
|
|
|
:bind (([remap other-window] . ace-window)
|
2025-12-22 15:57:17 +11:00
|
|
|
("C-c w" . ace-window-hydra/body))
|
2025-12-22 10:51:46 +11:00
|
|
|
:pretty-hydra
|
2025-12-22 12:49:49 +11:00
|
|
|
(("Actions"
|
2025-12-22 10:51:46 +11:00
|
|
|
(("TAB" other-window "switch")
|
|
|
|
|
("x" ace-delete-window "delete")
|
|
|
|
|
("X" ace-delete-other-windows "delete other" :exit t)
|
|
|
|
|
("s" ace-swap-window "swap")
|
|
|
|
|
("a" ace-select-window "select" :exit t)
|
|
|
|
|
("m" toggle-frame-maximized "maximize" :exit t)
|
|
|
|
|
("u" toggle-frame-fullscreen "fullscreen" :exit t))
|
|
|
|
|
"Resize"
|
|
|
|
|
(("h" shrink-window-horizontally "←")
|
|
|
|
|
("j" enlarge-window "↓")
|
|
|
|
|
("k" shrink-window "↑")
|
|
|
|
|
("l" enlarge-window-horizontally "→")
|
|
|
|
|
("n" balance-windows "balance"))
|
|
|
|
|
"Split"
|
|
|
|
|
(("r" split-window-right "horizontally")
|
2026-02-21 02:32:56 +11:00
|
|
|
("R" split-window-horizontally-instead "split-window-horizontally-instead")
|
2025-12-22 10:51:46 +11:00
|
|
|
("v" split-window-below "vertically")
|
2026-02-21 02:32:56 +11:00
|
|
|
("V" split-window-vertically-instead "split-window-vertically-instead"))
|
2025-12-22 10:51:46 +11:00
|
|
|
"Zoom"
|
|
|
|
|
(("+" text-scale-increase "in")
|
|
|
|
|
("=" text-scale-increase "in")
|
|
|
|
|
("-" text-scale-decrease "out")
|
|
|
|
|
("0" (text-scale-increase 0) "reset"))
|
|
|
|
|
"Misc"
|
|
|
|
|
(("o" set-frame-font "frame font")
|
|
|
|
|
("f" make-frame-command "new frame")
|
|
|
|
|
("d" delete-frame "delete frame")
|
|
|
|
|
("<left>" winner-undo "winner undo")
|
|
|
|
|
("<right>" winner-redo "winner redo")))))
|
|
|
|
|
|
2025-12-22 12:38:36 +11:00
|
|
|
(use-package popper
|
|
|
|
|
:custom
|
|
|
|
|
(popper-group-function #'popper-group-by-directory)
|
|
|
|
|
(popper-echo-dispatch-actions t)
|
2025-12-22 12:46:12 +11:00
|
|
|
:bind (:map popper-mode-map
|
2025-12-22 12:38:36 +11:00
|
|
|
("C-h z" . popper-toggle)
|
|
|
|
|
("C-<tab>" . popper-cycle)
|
|
|
|
|
("C-M-<tab>" . popper-toggle-type))
|
|
|
|
|
:hook (emacs-startup . popper-echo-mode)
|
|
|
|
|
:init
|
|
|
|
|
(setq popper-mode-line ""
|
|
|
|
|
popper-reference-buffers
|
|
|
|
|
'("\\*Messages\\*$"
|
|
|
|
|
"Output\\*$" "\\*Pp Eval Output\\*$"
|
|
|
|
|
"^\\*eldoc.*\\*$"
|
|
|
|
|
"\\*Compile-Log\\*$"
|
|
|
|
|
"\\*Completions\\*$"
|
|
|
|
|
"\\*Warnings\\*$"
|
|
|
|
|
"\\*Async Shell Command\\*$"
|
|
|
|
|
"\\*Apropos\\*$"
|
|
|
|
|
"\\*Backtrace\\*$"
|
|
|
|
|
"\\*Calendar\\*$"
|
|
|
|
|
"\\*Fd\\*$" "\\*Find\\*$" "\\*Finder\\*$"
|
|
|
|
|
"\\*Kill Ring\\*$"
|
|
|
|
|
"\\*Embark \\(Collect\\|Live\\):.*\\*$"
|
|
|
|
|
|
|
|
|
|
bookmark-bmenu-mode
|
|
|
|
|
comint-mode
|
|
|
|
|
compilation-mode
|
|
|
|
|
help-mode helpful-mode
|
|
|
|
|
tabulated-list-mode
|
|
|
|
|
Buffer-menu-mode
|
|
|
|
|
|
|
|
|
|
flymake-diagnostics-buffer-mode
|
|
|
|
|
|
|
|
|
|
gnus-article-mode devdocs-mode
|
|
|
|
|
grep-mode occur-mode rg-mode
|
|
|
|
|
osx-dictionary-mode fanyi-mode
|
|
|
|
|
"^\\*gt-result\\*$" "^\\*gt-log\\*$"
|
|
|
|
|
|
|
|
|
|
"^\\*Process List\\*$" process-menu-mode
|
|
|
|
|
list-environment-mode cargo-process-mode
|
|
|
|
|
|
|
|
|
|
"^\\*.*eat.*\\*.*$"
|
|
|
|
|
"^\\*.*eshell.*\\*.*$"
|
|
|
|
|
"^\\*.*shell.*\\*.*$"
|
|
|
|
|
"^\\*.*terminal.*\\*.*$"
|
|
|
|
|
"^\\*.*vterm[inal]*.*\\*.*$"
|
|
|
|
|
|
|
|
|
|
"\\*DAP Templates\\*$" dap-server-log-mode
|
|
|
|
|
"\\*ELP Profiling Restuls\\*" profiler-report-mode
|
|
|
|
|
"\\*package update results\\*$" "\\*Package-Lint\\*$"
|
|
|
|
|
"\\*[Wo]*Man.*\\*$"
|
|
|
|
|
"\\*ert\\*$" overseer-buffer-mode
|
|
|
|
|
"\\*gud-debug\\*$"
|
|
|
|
|
"\\*lsp-help\\*$" "\\*lsp session\\*$"
|
|
|
|
|
"\\*quickrun\\*$"
|
|
|
|
|
"\\*tldr\\*$"
|
|
|
|
|
"\\*vc-.*\\**"
|
|
|
|
|
"\\*diff-hl\\**"
|
|
|
|
|
"^\\*macro expansion\\**"
|
2025-12-27 16:41:42 +08:00
|
|
|
|
2025-12-22 12:38:36 +11:00
|
|
|
"\\*Agenda Commands\\*" "\\*Org Select\\*" "\\*Capture\\*" "^CAPTURE-.*\\.org*"
|
|
|
|
|
"\\*Gofmt Errors\\*$" "\\*Go Test\\*$" godoc-mode
|
|
|
|
|
"\\*docker-.+\\*"
|
|
|
|
|
"\\*prolog\\*" inferior-python-mode inf-ruby-mode swift-repl-mode
|
|
|
|
|
"\\*rustfmt\\*$" rustic-compilation-mode rustic-cargo-clippy-mode
|
2025-12-27 16:41:42 +08:00
|
|
|
rustic-cargo-outdated-mode rustic-cargo-run-mode rustic-cargo-test-mode
|
|
|
|
|
"\\*haskell\\*"))
|
2026-02-08 20:12:13 +11:00
|
|
|
(add-to-list 'display-buffer-alist
|
|
|
|
|
'("\\.pdf\\'"
|
|
|
|
|
(display-buffer-reuse-window display-buffer-in-direction)
|
|
|
|
|
(direction . right)
|
|
|
|
|
(window-width . 0.5)))
|
|
|
|
|
(add-to-list 'display-buffer-alist
|
|
|
|
|
'("\\*OCaml\\*"
|
|
|
|
|
(display-buffer-reuse-window display-buffer-in-direction)
|
|
|
|
|
(direction . right)
|
|
|
|
|
(window-width . 0.5)))
|
2025-12-27 16:41:42 +08:00
|
|
|
|
2025-12-22 12:38:36 +11:00
|
|
|
:config
|
|
|
|
|
(with-no-warnings
|
|
|
|
|
(defun my-popper-fit-window-height (win)
|
|
|
|
|
"Adjust the height of popup window WIN to fit the buffer's content."
|
|
|
|
|
(let ((desired-height (floor (/ (frame-height) 3))))
|
|
|
|
|
(fit-window-to-buffer win desired-height desired-height)))
|
|
|
|
|
(setq popper-window-height #'my-popper-fit-window-height)
|
|
|
|
|
|
|
|
|
|
(defun popper-close-window-hack (&rest _args)
|
|
|
|
|
"Close popper window via `C-g'."
|
|
|
|
|
(when (and ; (called-interactively-p 'interactive)
|
|
|
|
|
(not (region-active-p))
|
|
|
|
|
popper-open-popup-alist)
|
|
|
|
|
(let ((window (caar popper-open-popup-alist))
|
|
|
|
|
(buffer (cdar popper-open-popup-alist)))
|
|
|
|
|
(when (and (window-live-p window)
|
|
|
|
|
(buffer-live-p buffer)
|
|
|
|
|
(not (with-current-buffer buffer
|
|
|
|
|
(derived-mode-p 'eshell-mode
|
|
|
|
|
'shell-mode
|
|
|
|
|
'term-mode
|
|
|
|
|
'vterm-mode))))
|
|
|
|
|
(delete-window window)))))
|
|
|
|
|
(advice-add #'keyboard-quit :before #'popper-close-window-hack)))
|
|
|
|
|
|
2025-12-22 10:51:46 +11:00
|
|
|
(provide 'init-window)
|
2025-12-22 12:38:36 +11:00
|
|
|
;;; init-window.el ends here
|