emacs: convert all window/frame configurations to use-package

I am doing this for everything to align myself with the de facto
community standard.
This commit is contained in:
Protesilaos Stavrou 2024-04-19 10:23:12 +03:00
parent 1639756aba
commit 2c548aeb57
No known key found for this signature in database
GPG key ID: 99BD6459CD5CA3EA
3 changed files with 363 additions and 331 deletions

View file

@ -62,6 +62,7 @@
(use-package prot-common
:ensure nil
:functions (prot-common-truncate-lines-silently)
:hook ((fundamental-mode text-mode prog-mode) . prot-common-truncate-lines-silently)
:config
;; NEVER tell me which key can call a command that I specifically

View file

@ -1,19 +1,27 @@
;;; General window and buffer configurations
(prot-emacs-configure
(:delay 1)
(use-package uniquify
:ensure nil
:config
;;;; `uniquify' (unique names for buffers)
(setq uniquify-buffer-name-style 'forward)
(setq uniquify-strip-common-suffix t)
(setq uniquify-after-kill-buffer-p t)
(setq uniquify-after-kill-buffer-p t))
;;;; Line highlight
(require 'hl-line)
(use-package hl-line
:ensure nil
:commands (hl-line-mode)
:config
(setq hl-line-sticky-flag nil)
(setq hl-line-overlay-priority -50) ; emacs28
(setq hl-line-overlay-priority -50)) ; emacs28
;;;; Negative space highlight
(require 'whitespace)
(use-package whitespace
:ensure nil
:bind
(("<f6>" . whitespace-mode)
("C-c z" . delete-trailing-whitespace))
:config
;; NOTE 2023-08-14: This is experimental. I am not sure I like it.
(setq whitespace-style
'(face
@ -26,10 +34,14 @@
space-after-tab::tab
space-after-tab::space
space-before-tab::tab
space-before-tab::space))
space-before-tab::space)))
;;; Line numbers on the side of the window (prot-line-numbers.el)
(require 'display-line-numbers)
;;; Line numbers on the side of the window
(use-package display-line-numbers
:ensure nil
:bind
("<f7>" . display-line-numbers-mode)
:config
;; Set absolute line numbers, unless evil mode is loaded, in which
;; case we prefer relative numbers.
(setq-default display-line-numbers-type (if prot-emacs-load-evil 'relative t))
@ -37,94 +49,96 @@
(setq display-line-numbers-major-tick 0)
(setq display-line-numbers-minor-tick 0)
;; Use absolute numbers in narrowed buffers
(setq-default display-line-numbers-widen t)
(setq-default display-line-numbers-widen t))
(prot-emacs-keybind global-map
"<f6>" #'whitespace-mode
"<f7>" #'display-line-numbers-mode
"C-c z" #'delete-trailing-whitespace)
;;;; `window', `display-buffer-alist', and related
(use-package prot-window
:ensure nil
:demand t
:config
;; NOTE 2023-03-17: Remember that I am using development versions of
;; Emacs. Some of my `display-buffer-alist' contents are for Emacs
;; 29+.
(setq display-buffer-alist
`(;; no window
("\\`\\*Async Shell Command\\*\\'"
(display-buffer-no-window))
("\\`\\*\\(Warnings\\|Compile-Log\\|Org Links\\)\\*\\'"
(display-buffer-no-window)
(allow-no-window . t))
;; bottom side window
("\\*Org \\(Select\\|Note\\)\\*" ; the `org-capture' key selection and `org-add-log-note'
(display-buffer-in-side-window)
(dedicated . t)
(side . bottom)
(slot . 0)
(window-parameters . ((mode-line-format . none))))
;; bottom buffer (NOT side window)
((or . ((derived-mode . flymake-diagnostics-buffer-mode)
(derived-mode . flymake-project-diagnostics-mode)
(derived-mode . messages-buffer-mode)
(derived-mode . backtrace-mode)))
(display-buffer-reuse-mode-window display-buffer-at-bottom)
(window-height . 0.3)
(dedicated . t)
(preserve-size . (t . t)))
("\\*Embark Actions\\*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer)
(window-parameters . ((no-other-window . t)
(mode-line-format . none))))
("\\*\\(Output\\|Register Preview\\).*"
(display-buffer-reuse-mode-window display-buffer-at-bottom))
;; below current window
("\\(\\*Capture\\*\\|CAPTURE-.*\\)"
(display-buffer-reuse-mode-window display-buffer-below-selected))
("\\*\\vc-\\(incoming\\|outgoing\\|git : \\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 0.1)
(dedicated . t)
(preserve-size . (t . t)))
((derived-mode . reb-mode) ; M-x re-builder
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 4) ; note this is literal lines, not relative
(dedicated . t)
(preserve-size . (t . t)))
((or . ((derived-mode . occur-mode)
(derived-mode . grep-mode)
(derived-mode . Buffer-menu-mode)
(derived-mode . log-view-mode)
(derived-mode . help-mode) ; See the hooks for `visual-line-mode'
"\\*\\(|Buffer List\\|Occur\\|vc-change-log\\|eldoc.*\\).*"
prot-window-shell-or-term-p
;; ,world-clock-buffer-name
))
(prot-window-display-buffer-below-or-pop)
(body-function . prot-window-select-fit-size))
("\\*\\(Calendar\\|Bookmark Annotation\\|ert\\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(dedicated . t)
(window-height . fit-window-to-buffer))
;; NOTE 2022-09-10: The following is for `ispell-word', though
;; it only works because I override `ispell-display-buffer'
;; with `prot-spell-ispell-display-buffer' and change the
;; value of `ispell-choices-buffer'.
("\\*ispell-top-choices\\*.*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer))
;; same window
;;;; `window', `display-buffer-alist', and related
(require 'prot-window)
;; NOTE 2023-03-17: Remember that I am using development versions of
;; Emacs. Some of my `display-buffer-alist' contents are for Emacs
;; 29+.
(setq display-buffer-alist
`(;; no window
("\\`\\*Async Shell Command\\*\\'"
(display-buffer-no-window))
("\\`\\*\\(Warnings\\|Compile-Log\\|Org Links\\)\\*\\'"
(display-buffer-no-window)
(allow-no-window . t))
;; bottom side window
("\\*Org \\(Select\\|Note\\)\\*" ; the `org-capture' key selection and `org-add-log-note'
(display-buffer-in-side-window)
(dedicated . t)
(side . bottom)
(slot . 0)
(window-parameters . ((mode-line-format . none))))
;; bottom buffer (NOT side window)
((or . ((derived-mode . flymake-diagnostics-buffer-mode)
(derived-mode . flymake-project-diagnostics-mode)
(derived-mode . messages-buffer-mode)
(derived-mode . backtrace-mode)))
(display-buffer-reuse-mode-window display-buffer-at-bottom)
(window-height . 0.3)
(dedicated . t)
(preserve-size . (t . t)))
("\\*Embark Actions\\*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer)
(window-parameters . ((no-other-window . t)
(mode-line-format . none))))
("\\*\\(Output\\|Register Preview\\).*"
(display-buffer-reuse-mode-window display-buffer-at-bottom))
;; below current window
("\\(\\*Capture\\*\\|CAPTURE-.*\\)"
(display-buffer-reuse-mode-window display-buffer-below-selected))
("\\*\\vc-\\(incoming\\|outgoing\\|git : \\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 0.1)
(dedicated . t)
(preserve-size . (t . t)))
((derived-mode . reb-mode) ; M-x re-builder
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 4) ; note this is literal lines, not relative
(dedicated . t)
(preserve-size . (t . t)))
((or . ((derived-mode . occur-mode)
(derived-mode . grep-mode)
(derived-mode . Buffer-menu-mode)
(derived-mode . log-view-mode)
(derived-mode . help-mode) ; See the hooks for `visual-line-mode'
"\\*\\(|Buffer List\\|Occur\\|vc-change-log\\|eldoc.*\\).*"
prot-window-shell-or-term-p
,world-clock-buffer-name))
(prot-window-display-buffer-below-or-pop)
(body-function . prot-window-select-fit-size))
("\\*\\(Calendar\\|Bookmark Annotation\\|ert\\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(dedicated . t)
(window-height . fit-window-to-buffer))
;; NOTE 2022-09-10: The following is for `ispell-word', though
;; it only works because I override `ispell-display-buffer'
;; with `prot-spell-ispell-display-buffer' and change the
;; value of `ispell-choices-buffer'.
("\\*ispell-top-choices\\*.*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer))
;; same window
;; NOTE 2023-02-17: `man' does not fully obey the
;; `display-buffer-alist'. It works for new frames and for
;; `display-buffer-below-selected', but otherwise is
;; unpredictable. See `Man-notify-method'.
((or . ((derived-mode . Man-mode)
(derived-mode . woman-mode)
"\\*\\(Man\\|woman\\).*"))
(display-buffer-same-window))))
;; NOTE 2023-02-17: `man' does not fully obey the
;; `display-buffer-alist'. It works for new frames and for
;; `display-buffer-below-selected', but otherwise is
;; unpredictable. See `Man-notify-method'.
((or . ((derived-mode . Man-mode)
(derived-mode . woman-mode)
"\\*\\(Man\\|woman\\).*"))
(display-buffer-same-window)))))
(use-package prot-window
:ensure nil
:demand t
:config
(setq window-combination-resize t)
(setq even-window-sizes 'height-only)
(setq window-sides-vertical nil)
@ -132,50 +146,60 @@
(setq split-height-threshold 80)
(setq split-width-threshold 125)
(setq window-min-height 3)
(setq window-min-width 30)
(setq window-min-width 30))
(mapc
(lambda (hook)
(add-hook hook #'visual-line-mode))
'(epa-info-mode-hook help-mode-hook custom-mode-hook))
(use-package prot-window
:ensure nil
:demand t
:hook
((epa-info-mode help-mode custom-mode) . visual-line-mode))
(add-hook 'world-clock-mode-hook #'prot-common-truncate-lines-silently)
(add-hook 'calendar-mode-hook #'prot-common-truncate-lines-silently)
(use-package prot-window
:ensure nil
:demand t
:hook
((world-clock-mode calendar-mode) . prot-common-truncate-lines-silently))
;; NOTE 2022-09-17: Also see `prot-simple-swap-window-buffers'.
(prot-emacs-keybind global-map
"C-x <down>" #'next-buffer
"C-x <up>" #'previous-buffer
"C-x C-n" #'next-buffer ; override `set-goal-column'
"C-x C-p" #'previous-buffer ; override `mark-page'
"C-x !" #'delete-other-windows-vertically
"C-x _" #'balance-windows ; underscore
"C-x -" #'fit-window-to-buffer ; hyphen
"C-x +" #'balance-windows-area
"C-x }" #'enlarge-window
"C-x {" #'shrink-window
"C-x >" #'enlarge-window-horizontally ; override `scroll-right'
"C-x <" #'shrink-window-horizontally) ; override `scroll-left'
(prot-emacs-keybind resize-window-repeat-map
">" #'enlarge-window-horizontally
"<" #'shrink-window-horizontally))
(use-package prot-window
:ensure nil
:demand t
:bind
( :map global-map
;; NOTE 2022-09-17: Also see `prot-simple-swap-window-buffers'.
("C-x <down>" . next-buffer)
("C-x <up>" . previous-buffer)
("C-x C-n" . next-buffer) ; override `set-goal-column'
("C-x C-p" . previous-buffer) ; override `mark-page'
("C-x !" . delete-other-windows-vertically)
("C-x _" . balance-windows) ; underscore
("C-x -" . fit-window-to-buffer) ; hyphen
("C-x +" . balance-windows-area)
("C-x }" . enlarge-window)
("C-x {" . shrink-window)
("C-x >" . enlarge-window-horizontally) ; override `scroll-right'
("C-x <" . shrink-window-horizontally) ; override `scroll-left'
:map resize-window-repeat-map
(">" . enlarge-window-horizontally)
("<" . shrink-window-horizontally)))
;;; Frame-isolated buffers
;; Another package of mine. Read the manual:
;; <https://protesilaos.com/emacs/beframe>.
(prot-emacs-package beframe
(:install t)
(:delay 1)
(use-package beframe
:ensure t
:hook (after-init . beframe-mode)
:config
(setq beframe-functions-in-frames '(project-prompt-project-dir))
(beframe-mode 1)
;; I use this instead of :bind because I am binding a keymap and the
;; way `use-package' does it is by wrapping a lambda around it that
;; then breaks `describe-key' for those keys.
(prot-emacs-keybind global-map
;; Override the `set-fill-column' that I have no use for.
"C-x f" #'other-frame-prefix
;; Bind Beframe commands to a prefix key. Notice the -map as I am
;; binding keymap here, not a command.
"C-c b" beframe-prefix-map
"C-c b" #'beframe-prefix-map
;; Replace the generic `buffer-menu'. With a prefix argument, this
;; commands prompts for a frame. Call the `buffer-menu' via M-x if
;; you absolutely need the global list of buffers.
@ -185,46 +209,44 @@
"C-x B" #'select-frame-by-name))
;;; Frame history (undelete-frame-mode)
(prot-emacs-configure
(:delay 5)
(define-key global-map (kbd "C-x u") #'undelete-frame) ; I use only C-/ for `undo'
(undelete-frame-mode 1))
(use-package frame
:ensure nil
:bind ("C-x u" . undelete-frame) ; I use only C-/ for `undo'
:hook (after-init . undelete-frame-mode))
;;; Window history (winner-mode)
(prot-emacs-package winner
(:delay 5)
(winner-mode 1)
(prot-emacs-keybind global-map
"C-x <right>" #'winner-redo
"C-x <left>" #'winner-undo))
(use-package winner
:ensure nil
:hook (after-init . winner-mode)
:bind
(("C-x <right>" . winner-redo)
("C-x <left>" . winner-undo)))
;;; Directional window motions (windmove)
(prot-emacs-package windmove
(:delay 5)
(setq windmove-create-window nil) ; Emacs 27.1
(prot-emacs-keybind global-map
;; Those override some commands that are already available with
;; C-M-u, C-M-f, C-M-b.
"C-M-<up>" #'windmove-up
"C-M-<right>" #'windmove-right
"C-M-<down>" #'windmove-down
"C-M-<left>" #'windmove-left
"C-M-S-<up>" #'windmove-swap-states-up
"C-M-S-<right>" #'windmove-swap-states-right ; conflicts with `org-increase-number-at-point'
"C-M-S-<down>" #'windmove-swap-states-down
"C-M-S-<left>" #'windmove-swap-states-left))
(use-package windmove
:ensure nil
:bind
;; Those override some commands that are already available with
;; C-M-u, C-M-f, C-M-b.
(("C-M-<up>" . windmove-up)
("C-M-<right>" . windmove-right)
("C-M-<down>" . windmove-down)
("C-M-<left>" . windmove-left)
("C-M-S-<up>" . windmove-swap-states-up)
("C-M-S-<right>" . windmove-swap-states-right) ; conflicts with `org-increase-number-at-point'
("C-M-S-<down>" . windmove-swap-states-down)
("C-M-S-<left>" . windmove-swap-states-left))
:config
(setq windmove-create-window nil)) ; Emacs 27.1
;;; Header line context of symbol/heading (breadcrumb.el)
(prot-emacs-package breadcrumb
(:install t)
(:delay 2)
(use-package breadcrumb
:ensure t
:hook (after-init . breadcrumb-mode)
:config
(setq breadcrumb-project-max-length 0.5)
(setq breadcrumb-project-crumb-separator "/")
(setq breadcrumb-imenu-max-length 1.0)
(setq breadcrumb-imenu-crumb-separator " > ")
(breadcrumb-mode 1))
(setq breadcrumb-imenu-crumb-separator " > "))
(provide 'prot-emacs-window)

View file

@ -2611,6 +2611,7 @@ here:
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-essentials.el"
(use-package prot-common
:ensure nil
:functions (prot-common-truncate-lines-silently)
:hook ((fundamental-mode text-mode prog-mode) . prot-common-truncate-lines-silently)
:config
;; NEVER tell me which key can call a command that I specifically
@ -6038,16 +6039,7 @@ Finally, we ~provide~ the module. This is the mirror function of
:END:
This module is all about buffers and windows. How they are managed and
displayed. We start with the ~prot-emacs-configure~ macro to simply
group together lots of built-in functionality and give it a slight
deferred loading time to speed up startup
([[#h:54a4cb92-e7f8-4291-abe6-6e7dfdfd6200][The =init.el= macro to evaluate arbitrary Elisp (~prot-emacs-configure~)]]).
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el" :mkdirp yes
;;; General window and buffer configurations
(prot-emacs-configure
(:delay 1)
#+end_src
displayed.
*** The =prot-emacs-window.el= section about uniquifying buffer names
:PROPERTIES:
@ -6073,11 +6065,15 @@ would have the following buffer names in the various styles:
I use the =forward= style, which is the closest to the actual file
name.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el" :mkdirp yes
;;; General window and buffer configurations
(use-package uniquify
:ensure nil
:config
;;;; `uniquify' (unique names for buffers)
(setq uniquify-buffer-name-style 'forward)
(setq uniquify-strip-common-suffix t)
(setq uniquify-after-kill-buffer-p t)
(setq uniquify-after-kill-buffer-p t))
#+end_src
*** The =prot-emacs-window.el= section about line highlighting (~hl-line-mode~)
@ -6099,9 +6095,12 @@ do not matter.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;;; Line highlight
(require 'hl-line)
(use-package hl-line
:ensure nil
:commands (hl-line-mode)
:config
(setq hl-line-sticky-flag nil)
(setq hl-line-overlay-priority -50) ; emacs28
(setq hl-line-overlay-priority -50)) ; emacs28
#+end_src
*** The =prot-emacs-window.el= section about negative space highlighting (~whitespace-mode~)
@ -6122,7 +6121,12 @@ infer in most cases.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;;; Negative space highlight
(require 'whitespace)
(use-package whitespace
:ensure nil
:bind
(("<f6>" . whitespace-mode)
("C-c z" . delete-trailing-whitespace))
:config
;; NOTE 2023-08-14: This is experimental. I am not sure I like it.
(setq whitespace-style
'(face
@ -6135,7 +6139,7 @@ infer in most cases.
space-after-tab::tab
space-after-tab::space
space-before-tab::tab
space-before-tab::space))
space-before-tab::space)))
#+end_src
*** The =prot-emacs-window.el= section about line numbers (~display-line-numbers-mode~)
@ -6154,8 +6158,12 @@ while I set a relative count for contextual lines when ~prot-emacs-load-evil~
is true ([[#h:0d6763f3-56d6-44be-b10d-bfb8cc96b442][The =prot-emacs-evil.el= module]]).
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;; Line numbers on the side of the window (prot-line-numbers.el)
(require 'display-line-numbers)
;;; Line numbers on the side of the window
(use-package display-line-numbers
:ensure nil
:bind
("<f7>" . display-line-numbers-mode)
:config
;; Set absolute line numbers, unless evil mode is loaded, in which
;; case we prefer relative numbers.
(setq-default display-line-numbers-type (if prot-emacs-load-evil 'relative t))
@ -6163,21 +6171,7 @@ is true ([[#h:0d6763f3-56d6-44be-b10d-bfb8cc96b442][The =prot-emacs-evil.el= mod
(setq display-line-numbers-major-tick 0)
(setq display-line-numbers-minor-tick 0)
;; Use absolute numbers in narrowed buffers
(setq-default display-line-numbers-widen t)
#+end_src
*** The =prot-emacs-window.el= key bindings for built-in space and line number functionality
:PROPERTIES:
:CUSTOM_ID: h:6fa708d4-f1a8-41a2-ad29-dba9b1966b65
:END:
Here I simply bind some keys for the aforementioned.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
(prot-emacs-keybind global-map
"<f6>" #'whitespace-mode
"<f7>" #'display-line-numbers-mode
"C-c z" #'delete-trailing-whitespace)
(setq-default display-line-numbers-widen t))
#+end_src
*** The =prot-emacs-window.el= rules for displaying buffers (~display-buffer-alist~)
@ -6233,86 +6227,89 @@ perform the two-fold task of selecting a window and making it fit up
to a certain height.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;;; `window', `display-buffer-alist', and related
(require 'prot-window)
;;;; `window', `display-buffer-alist', and related
(use-package prot-window
:ensure nil
:demand t
:config
;; NOTE 2023-03-17: Remember that I am using development versions of
;; Emacs. Some of my `display-buffer-alist' contents are for Emacs
;; 29+.
(setq display-buffer-alist
`(;; no window
("\\`\\*Async Shell Command\\*\\'"
(display-buffer-no-window))
("\\`\\*\\(Warnings\\|Compile-Log\\|Org Links\\)\\*\\'"
(display-buffer-no-window)
(allow-no-window . t))
;; bottom side window
("\\*Org \\(Select\\|Note\\)\\*" ; the `org-capture' key selection and `org-add-log-note'
(display-buffer-in-side-window)
(dedicated . t)
(side . bottom)
(slot . 0)
(window-parameters . ((mode-line-format . none))))
;; bottom buffer (NOT side window)
((or . ((derived-mode . flymake-diagnostics-buffer-mode)
(derived-mode . flymake-project-diagnostics-mode)
(derived-mode . messages-buffer-mode)
(derived-mode . backtrace-mode)))
(display-buffer-reuse-mode-window display-buffer-at-bottom)
(window-height . 0.3)
(dedicated . t)
(preserve-size . (t . t)))
("\\*Embark Actions\\*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer)
(window-parameters . ((no-other-window . t)
(mode-line-format . none))))
("\\*\\(Output\\|Register Preview\\).*"
(display-buffer-reuse-mode-window display-buffer-at-bottom))
;; below current window
("\\(\\*Capture\\*\\|CAPTURE-.*\\)"
(display-buffer-reuse-mode-window display-buffer-below-selected))
("\\*\\vc-\\(incoming\\|outgoing\\|git : \\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 0.1)
(dedicated . t)
(preserve-size . (t . t)))
((derived-mode . reb-mode) ; M-x re-builder
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 4) ; note this is literal lines, not relative
(dedicated . t)
(preserve-size . (t . t)))
((or . ((derived-mode . occur-mode)
(derived-mode . grep-mode)
(derived-mode . Buffer-menu-mode)
(derived-mode . log-view-mode)
(derived-mode . help-mode) ; See the hooks for `visual-line-mode'
"\\*\\(|Buffer List\\|Occur\\|vc-change-log\\|eldoc.*\\).*"
prot-window-shell-or-term-p
;; ,world-clock-buffer-name
))
(prot-window-display-buffer-below-or-pop)
(body-function . prot-window-select-fit-size))
("\\*\\(Calendar\\|Bookmark Annotation\\|ert\\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(dedicated . t)
(window-height . fit-window-to-buffer))
;; NOTE 2022-09-10: The following is for `ispell-word', though
;; it only works because I override `ispell-display-buffer'
;; with `prot-spell-ispell-display-buffer' and change the
;; value of `ispell-choices-buffer'.
("\\*ispell-top-choices\\*.*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer))
;; same window
;; NOTE 2023-03-17: Remember that I am using development versions of
;; Emacs. Some of my `display-buffer-alist' contents are for Emacs
;; 29+.
(setq display-buffer-alist
`(;; no window
("\\`\\*Async Shell Command\\*\\'"
(display-buffer-no-window))
("\\`\\*\\(Warnings\\|Compile-Log\\|Org Links\\)\\*\\'"
(display-buffer-no-window)
(allow-no-window . t))
;; bottom side window
("\\*Org \\(Select\\|Note\\)\\*" ; the `org-capture' key selection and `org-add-log-note'
(display-buffer-in-side-window)
(dedicated . t)
(side . bottom)
(slot . 0)
(window-parameters . ((mode-line-format . none))))
;; bottom buffer (NOT side window)
((or . ((derived-mode . flymake-diagnostics-buffer-mode)
(derived-mode . flymake-project-diagnostics-mode)
(derived-mode . messages-buffer-mode)
(derived-mode . backtrace-mode)))
(display-buffer-reuse-mode-window display-buffer-at-bottom)
(window-height . 0.3)
(dedicated . t)
(preserve-size . (t . t)))
("\\*Embark Actions\\*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer)
(window-parameters . ((no-other-window . t)
(mode-line-format . none))))
("\\*\\(Output\\|Register Preview\\).*"
(display-buffer-reuse-mode-window display-buffer-at-bottom))
;; below current window
("\\(\\*Capture\\*\\|CAPTURE-.*\\)"
(display-buffer-reuse-mode-window display-buffer-below-selected))
("\\*\\vc-\\(incoming\\|outgoing\\|git : \\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 0.1)
(dedicated . t)
(preserve-size . (t . t)))
((derived-mode . reb-mode) ; M-x re-builder
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . 4) ; note this is literal lines, not relative
(dedicated . t)
(preserve-size . (t . t)))
((or . ((derived-mode . occur-mode)
(derived-mode . grep-mode)
(derived-mode . Buffer-menu-mode)
(derived-mode . log-view-mode)
(derived-mode . help-mode) ; See the hooks for `visual-line-mode'
"\\*\\(|Buffer List\\|Occur\\|vc-change-log\\|eldoc.*\\).*"
prot-window-shell-or-term-p
,world-clock-buffer-name))
(prot-window-display-buffer-below-or-pop)
(body-function . prot-window-select-fit-size))
("\\*\\(Calendar\\|Bookmark Annotation\\|ert\\).*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(dedicated . t)
(window-height . fit-window-to-buffer))
;; NOTE 2022-09-10: The following is for `ispell-word', though
;; it only works because I override `ispell-display-buffer'
;; with `prot-spell-ispell-display-buffer' and change the
;; value of `ispell-choices-buffer'.
("\\*ispell-top-choices\\*.*"
(display-buffer-reuse-mode-window display-buffer-below-selected)
(window-height . fit-window-to-buffer))
;; same window
;; NOTE 2023-02-17: `man' does not fully obey the
;; `display-buffer-alist'. It works for new frames and for
;; `display-buffer-below-selected', but otherwise is
;; unpredictable. See `Man-notify-method'.
((or . ((derived-mode . Man-mode)
(derived-mode . woman-mode)
"\\*\\(Man\\|woman\\).*"))
(display-buffer-same-window))))
;; NOTE 2023-02-17: `man' does not fully obey the
;; `display-buffer-alist'. It works for new frames and for
;; `display-buffer-below-selected', but otherwise is
;; unpredictable. See `Man-notify-method'.
((or . ((derived-mode . Man-mode)
(derived-mode . woman-mode)
"\\*\\(Man\\|woman\\).*"))
(display-buffer-same-window)))))
#+end_src
The following settings are relevant for the ~display-buffer-alist~ we
@ -6322,6 +6319,10 @@ height or width. These are relevant for ~prot-window-display-buffer-below-or-pop
and the other more basic functions I have defined for this purpose.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
(use-package prot-window
:ensure nil
:demand t
:config
(setq window-combination-resize t)
(setq even-window-sizes 'height-only)
(setq window-sides-vertical nil)
@ -6329,7 +6330,7 @@ and the other more basic functions I have defined for this purpose.
(setq split-height-threshold 80)
(setq split-width-threshold 125)
(setq window-min-height 3)
(setq window-min-width 30)
(setq window-min-width 30))
#+end_src
*** The =prot-emacs-window.el= setting to enable ~visual-line-mode~ in some contexts
@ -6346,10 +6347,11 @@ For the cases where I am fine with ~visual-line-mode~, I enable the
mode by adding it to these mode hooks.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
(mapc
(lambda (hook)
(add-hook hook #'visual-line-mode))
'(epa-info-mode-hook help-mode-hook custom-mode-hook))
(use-package prot-window
:ensure nil
:demand t
:hook
((epa-info-mode help-mode custom-mode) . visual-line-mode))
#+end_src
*** The =prot-emacs-window.el= settings to truncate some buffers silently
@ -6373,8 +6375,11 @@ The whole point of using hooks is to make these decisions on a
case-by-case basis.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
(add-hook 'world-clock-mode-hook #'prot-common-truncate-lines-silently)
(add-hook 'calendar-mode-hook #'prot-common-truncate-lines-silently)
(use-package prot-window
:ensure nil
:demand t
:hook
((world-clock-mode calendar-mode) . prot-common-truncate-lines-silently))
#+end_src
*** The =prot-emacs-window.el= section key bindings
@ -6388,23 +6393,27 @@ and ~next-buffer~. I rarely resize windows, though I am happy to use
the mouse for such a case.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;; NOTE 2022-09-17: Also see `prot-simple-swap-window-buffers'.
(prot-emacs-keybind global-map
"C-x <down>" #'next-buffer
"C-x <up>" #'previous-buffer
"C-x C-n" #'next-buffer ; override `set-goal-column'
"C-x C-p" #'previous-buffer ; override `mark-page'
"C-x !" #'delete-other-windows-vertically
"C-x _" #'balance-windows ; underscore
"C-x -" #'fit-window-to-buffer ; hyphen
"C-x +" #'balance-windows-area
"C-x }" #'enlarge-window
"C-x {" #'shrink-window
"C-x >" #'enlarge-window-horizontally ; override `scroll-right'
"C-x <" #'shrink-window-horizontally) ; override `scroll-left'
(prot-emacs-keybind resize-window-repeat-map
">" #'enlarge-window-horizontally
"<" #'shrink-window-horizontally))
(use-package prot-window
:ensure nil
:demand t
:bind
( :map global-map
;; NOTE 2022-09-17: Also see `prot-simple-swap-window-buffers'.
("C-x <down>" . next-buffer)
("C-x <up>" . previous-buffer)
("C-x C-n" . next-buffer) ; override `set-goal-column'
("C-x C-p" . previous-buffer) ; override `mark-page'
("C-x !" . delete-other-windows-vertically)
("C-x _" . balance-windows) ; underscore
("C-x -" . fit-window-to-buffer) ; hyphen
("C-x +" . balance-windows-area)
("C-x }" . enlarge-window)
("C-x {" . shrink-window)
("C-x >" . enlarge-window-horizontally) ; override `scroll-right'
("C-x <" . shrink-window-horizontally) ; override `scroll-left'
:map resize-window-repeat-map
(">" . enlarge-window-horizontally)
("<" . shrink-window-horizontally)))
#+end_src
*** The =prot-emacs-window.el= section about ~beframe~
@ -6434,19 +6443,21 @@ best changes I ever did to boost my productivity:
;;; Frame-isolated buffers
;; Another package of mine. Read the manual:
;; <https://protesilaos.com/emacs/beframe>.
(prot-emacs-package beframe
(:install t)
(:delay 1)
(use-package beframe
:ensure t
:hook (after-init . beframe-mode)
:config
(setq beframe-functions-in-frames '(project-prompt-project-dir))
(beframe-mode 1)
;; I use this instead of :bind because I am binding a keymap and the
;; way `use-package' does it is by wrapping a lambda around it that
;; then breaks `describe-key' for those keys.
(prot-emacs-keybind global-map
;; Override the `set-fill-column' that I have no use for.
"C-x f" #'other-frame-prefix
;; Bind Beframe commands to a prefix key. Notice the -map as I am
;; binding keymap here, not a command.
"C-c b" beframe-prefix-map
"C-c b" #'beframe-prefix-map
;; Replace the generic `buffer-menu'. With a prefix argument, this
;; commands prompts for a frame. Call the `buffer-menu' via M-x if
;; you absolutely need the global list of buffers.
@ -6470,10 +6481,10 @@ for the standard ~undo~ command, though I personally only ever use
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;; Frame history (undelete-frame-mode)
(prot-emacs-configure
(:delay 5)
(define-key global-map (kbd "C-x u") #'undelete-frame) ; I use only C-/ for `undo'
(undelete-frame-mode 1))
(use-package frame
:ensure nil
:bind ("C-x u" . undelete-frame) ; I use only C-/ for `undo'
:hook (after-init . undelete-frame-mode))
#+end_src
The ~winner-mode~ is basically the same idea as ~undelete-frame-mode~
@ -6484,13 +6495,12 @@ frame.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;; Window history (winner-mode)
(prot-emacs-package winner
(:delay 5)
(winner-mode 1)
(prot-emacs-keybind global-map
"C-x <right>" #'winner-redo
"C-x <left>" #'winner-undo))
(use-package winner
:ensure nil
:hook (after-init . winner-mode)
:bind
(("C-x <right>" . winner-redo)
("C-x <left>" . winner-undo)))
#+end_src
*** The =prot-emacs-window.el= keys for window motions (~windmove~)
@ -6508,21 +6518,21 @@ the placement of a window in the given direction.
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;; Directional window motions (windmove)
(prot-emacs-package windmove
(:delay 5)
(setq windmove-create-window nil) ; Emacs 27.1
(prot-emacs-keybind global-map
;; Those override some commands that are already available with
;; C-M-u, C-M-f, C-M-b.
"C-M-<up>" #'windmove-up
"C-M-<right>" #'windmove-right
"C-M-<down>" #'windmove-down
"C-M-<left>" #'windmove-left
"C-M-S-<up>" #'windmove-swap-states-up
"C-M-S-<right>" #'windmove-swap-states-right ; conflicts with `org-increase-number-at-point'
"C-M-S-<down>" #'windmove-swap-states-down
"C-M-S-<left>" #'windmove-swap-states-left))
(use-package windmove
:ensure nil
:bind
;; Those override some commands that are already available with
;; C-M-u, C-M-f, C-M-b.
(("C-M-<up>" . windmove-up)
("C-M-<right>" . windmove-right)
("C-M-<down>" . windmove-down)
("C-M-<left>" . windmove-left)
("C-M-S-<up>" . windmove-swap-states-up)
("C-M-S-<right>" . windmove-swap-states-right) ; conflicts with `org-increase-number-at-point'
("C-M-S-<down>" . windmove-swap-states-down)
("C-M-S-<left>" . windmove-swap-states-left))
:config
(setq windmove-create-window nil)) ; Emacs 27.1
#+end_src
*** The =prot-emacs-window.el= use of contextual header line (~breadcrumb~)
@ -6539,15 +6549,14 @@ leads to the current heading. Same idea for programming modes. Neat!
#+begin_src emacs-lisp :tangle "prot-emacs-modules/prot-emacs-window.el"
;;; Header line context of symbol/heading (breadcrumb.el)
(prot-emacs-package breadcrumb
(:install t)
(:delay 2)
(use-package breadcrumb
:ensure t
:hook (after-init . breadcrumb-mode)
:config
(setq breadcrumb-project-max-length 0.5)
(setq breadcrumb-project-crumb-separator "/")
(setq breadcrumb-imenu-max-length 1.0)
(setq breadcrumb-imenu-crumb-separator " > ")
(breadcrumb-mode 1))
(setq breadcrumb-imenu-crumb-separator " > "))
#+end_src
*** The =prot-emacs-window.el= ~provide~ form