mirror of
https://github.com/protesilaos/dotfiles.git
synced 2026-09-10 07:16:20 -04:00
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:
parent
1639756aba
commit
2c548aeb57
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue