From 8a6353b2c56526da1287e1ff18503230d0dbbc1a Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Fri, 30 May 2025 16:46:40 +0200 Subject: [PATCH] Move usability package configurations from configuration.org to init.el --- configuration.org | 514 ---------------------------------------------- init.el | 325 +++++++++++++++++++++++++++++ 2 files changed, 325 insertions(+), 514 deletions(-) diff --git a/configuration.org b/configuration.org index 4fae3a0..f58a2cc 100644 --- a/configuration.org +++ b/configuration.org @@ -37,520 +37,6 @@ (push (org-projectile-project-todo-entry) org-capture-templates)) #+end_src -* External packages to boost usability - -** ~gnu-elpa-keyring-update~, to make sure we always have the latest ELPA GPG keys - -#+begin_src emacs-lisp -(use-package gnu-elpa-keyring-update) -#+end_src - -** ~auto-package-update~, to automatically upgrade packages every week - -#+begin_src emacs-lisp -(use-package auto-package-update - :custom - (auto-package-update-interval 7) - (auto-package-update-delete-old-versions t) - ;; Let’s do this in after-init-hook, as use-package invocations may modify - ;; the list of installed packages - :hook - (after-init . auto-package-update-maybe)) -#+end_src - -** ~ace-window~, for better window navigation - -Besides its standard functionality i also add key bindings for burying or scrolling other windows. - -#+begin_src emacs-lisp -(use-package ace-window - :custom - (aw-background nil) - (aw-dispatch-always t) - :config - (add-to-list 'aw-dispatch-alist - '(?s gpolonkai/scroll-window-up " Scroll window up") - t) - (add-to-list 'aw-dispatch-alist - '(?S gpolonkai/scroll-window-down " Scroll window down") - t) - (add-to-list 'aw-dispatch-alist - '(?q gpolonkai/bury-window " Bury (quit) window") - t) - :bind - (:map ctl-x-map - ("o" . ace-window)) - :custom-face - (aw-leading-char-face ((t (:inherit ace-jump-face-foreground :height 2.0))))) -#+end_src - -** ~doom-themes~ - -#+begin_src emacs-lisp -(use-package doom-themes - :custom - (doom-themes-enable-bold t) - (doom-themes-enable-italic t) - :config - (load-theme 'doom-nord-aurora t) - (doom-themes-visual-bell-config) - (doom-themes-org-config)) -#+end_src - -** Nyanyanyanyanya - -*** ~nyan-mode~: Nyan-cat style position marker - -The package that [[https://gergely.polonkai.eu/blog/2014/9/17/nyanmacs.html][made me]] switch to Emacs. - -#+begin_src emacs-lisp -(use-package nyan-mode - :config - (nyan-mode t) - :custom - (nyan-bar-length 20) - (nyan-animate-nyancat t) - (nyan-wavy-trail t)) -#+end_src - -** ~delight~ to de-light some minor modes - -The list of active minor modes can easily fill my whole mode line (twice…). This is one of the things to protect me from that. - -#+begin_src emacs-lisp -(use-package delight) -#+end_src - -** ~minions~, to put all minor modes into a menu - -#+begin_src emacs-lisp -(use-package minions - :config - (minions-mode 1)) -#+end_src - -** ~doom-modeline~, because it’s much, much more beautiful than the vanilla one - -#+begin_src emacs-lisp -(use-package doom-modeline - :init - (doom-modeline-mode 1) - :custom - (doom-modeline-continuous-word-count-modes '(markdown-mode gfm-mode org-mode rst-mode)) - (doom-modeline-hud t) - (doom-modeline-minor-modes t)) -#+end_src - -** ~beacon~ to find the cursor - -Sometimes it disappears, or just too hard to see. - -#+begin_src emacs-lisp -(use-package beacon - :demand - :config - (beacon-mode 1) - :bind - (:map gpolonkai/pers-map - ("b" . beacon-blink))) -#+end_src - -** ~eshell~ extras - -*** Display the status of the last command in the fringe of EShell - -#+begin_src emacs-lisp -(use-package eshell-fringe-status - :hook - (eshell-mode . eshell-fringe-status-mode)) -#+end_src - -*** Extras for the EShell prompt - -#+begin_src emacs-lisp -(use-package eshell-prompt-extras - :config - (with-eval-after-load "esh-opt" - (autoload 'epe-theme-lambda "eshell-prompt-extras")) - :custom - (eshell-highlight-prompt nil) - (eshell-prompt-function 'epe-theme-lambda)) -#+end_src - -** ~form-feed~, to show form feed characters as a horizontal line - -Some (many? most?) Emacs packages use this to do some logical separation of the code. It is also used by some compilers, and Emacs’ help system. - -#+begin_src emacs-lisp -(use-package form-feed - :hook - (emacs-lisp-mode . form-feed-mode) - (compilation-mode . form-feed-mode) - (help-mode . form-feed-mode)) -#+end_src - -** ~hl-line~, to highlight the current line - -#+begin_src emacs-lisp -(use-package hl-line - :config - (when window-system - (global-hl-line-mode)) - :custom-face - (hl-line ((t (:inherit nil :background "gray25"))))) -#+end_src - -** ~ace-jump-mode~, to jump to a specific character - -#+begin_src emacs-lisp -(use-package ace-jump-mode - :bind - (:map gpolonkai/pers-map - ("SPC" . ace-jump-mode))) -#+end_src - -** Multiple cursors, because one is often not enough - -*** ~multiple-cursors~ - -#+begin_src emacs-lisp -(defun gpolonkai/no-blink-matching-paren () - (customize-set-variable 'blink-matching-paren nil)) - -(defun gpolonkai/blink-matching-paren () - (customize-set-variable 'blink-matching-paren t)) - -(use-package multiple-cursors - :init - (defvar gpolonkai/mc-prefix-map (make-sparse-keymap) - "Prefix keymap for multiple-cursors") - (define-prefix-command 'gpolonkai/mc-prefix-map) - (define-key global-map (kbd "C-c m") 'gpolonkai/mc-prefix-map) - :hook - (multiple-cursors-mode-enabled . gpolonkai/no-blink-matching-paren) - (multiple-cursors-mode-disabled . gpolonkai/blink-matching-paren) - :bind - (:map gpolonkai/mc-prefix-map - ("t" . mc/mark-all-like-this) - ("m" . mc/mark-all-like-this-dwim) - ("l" . mc/edit-lines) - ("e" . mc/edit-ends-of-lines) - ("a" . mc/edit-beginnings-of-lines) - ("n" . mc/mark-next-like-this) - ("p" . mc/mark-previous-like-this) - ("s" . mc/mark-sgml-tag-pair) - ("d" . mc/mark-all-like-this-in-defun) - ("M-" . mc/add-cursor-on-click))) -#+end_src - -*** ~phi-search~, incremental search compatible with ~multiple-cursors~ - -#+begin_src emacs-lisp -(use-package phi-search) - -(use-package phi-search-mc - :config - (phi-search-mc/setup-keys)) -#+end_src - -*** ~mc-extras~ - -#+begin_src emacs-lisp -(use-package mc-extras - :demand - :bind - (:map mc/keymap - ("=" . mc/compare-chars))) -#+end_src - -*** Add extra cursors with ~ace-jump~ - -#+begin_src emacs-lisp -(use-package ace-mc - :bind - (:map gpolonkai/mc-prefix-map - ("SPC" . ace-mc-add-multiple-cursors) - ("C-SPC" . ace-mc-add-single-cursor))) -#+end_src - -** ~smartparens~ for easier parentheses insertion - -#+begin_src emacs-lisp -(use-package smartparens - :demand - :config - (require 'smartparens-config) - (show-smartparens-global-mode t) - :hook - (prog-mode . turn-on-smartparens-strict-mode) - (markdown-mode . turn-on-smartparens-strict-mode) - :bind - (([f9] . smartparens-strict-mode) - ("C-c s u" . sp-unwrap-sexp) - ("C-c s k" . sp-kill-sexp) - ("C-c s r" . sp-rewrap-sexp))) -#+end_src - -** ~which-key~ to display available key bindings - -#+begin_src emacs-lisp -(use-package which-key - :config - (which-key-mode) - (which-key-setup-minibuffer) - :custom - (which-key-idle-delay 0.3)) -#+end_src - -** ~visual-fill-column~, width limited text view - -It’s much easier on the eye when writing text, not code. - -#+begin_src emacs-lisp -(use-package visual-fill-column - :custom - (visual-fill-column-center-text t) - (visual-fill-column-width 120) - :hook - (org-mode . visual-fill-column-mode)) -#+end_src - -** ~spinner~, to display a progress bar for e.g. background tasks - -#+begin_src emacs-lisp -(use-package spinner) -#+end_src - -** ~avy~ to jump to things - -#+begin_src emacs-lisp -(use-package avy - :demand - :config - (avy-setup-default) - :bind - (("M-g c" . avy-goto-char) - ("M-g C" . avy-goto-char-2) - ("M-g f" . avy-goto-line) - ("M-g w" . avy-goto-word-1) - ("M-g e" . avy-goto-word-0))) -#+end_src - -** ~goto-last-change~ - -#+begin_src emacs-lisp -(use-package goto-last-change - :bind - (("M-g /" . goto-last-change))) -#+end_src - -** ~rainbow-mode~ to highlight colours based on their name/hex code - -#+begin_src emacs-lisp -(use-package rainbow-mode - :hook - (css-mode . rainbow-mode) - (scss-mode . rainbow-mode) - (sass-mode . rainbow-mode)) -#+end_src - -** ~zygospore~ to toggle other windows for maximum focus - -When focus is no longer needed, they can be toggled back. - -#+begin_src emacs-lisp -(use-package zygospore - :bind - (:map ctl-x-map - ("1" . zygospore-toggle-delete-other-windows))) -#+end_src - -** ~dashboard~ - -#+begin_src emacs-lisp -(use-package dashboard - :after - projectile - :config - (add-to-list 'dashboard-items '(projects . 5) t) - (dashboard-setup-startup-hook) - :custom - (dashboard-set-heading-icons t) - (dashboard-set-file-icons t) - (dashboard-center-content t) - (dashboard-set-navigator t) - (dashboard-items '((agenda . 5) - (projects . 5) - (recents . 5) - (bookmarks . 5)))) -#+end_src - -** ~sr-speedbar~, speed bar in the same frame - -#+begin_src emacs-lisp -(use-package sr-speedbar - :after speedbar) -#+end_src - -** ~hungry-delete~ to delete all the whitespace - -#+begin_src emacs-lisp -(use-package hungry-delete - :config - (global-hungry-delete-mode)) -#+end_src - -** ~anzu~, to show number of matches while searching - -#+begin_src emacs-lisp -(use-package anzu - :delight - :config - (global-anzu-mode 1)) -#+end_src - -** ~all-the-icons~ - -Should the fonts be missing, run ~(all-the-icons-install-fonts)~. It’s not run -automatically, as it requires connecting to a website and download a pretty -large font file. - -#+begin_src emacs-lisp -(use-package all-the-icons) -#+end_src - -And apply it to dired, too. - -#+begin_src emacs-lisp -(use-package all-the-icons-dired - :hook - (dired-mode . all-the-icons-dired-mode)) -#+end_src - -** ~flyspell~ for all my spell-checking needs - -#+begin_src emacs-lisp -(use-package flyspell - :hook - (prog-mode . flyspell-prog-mode) - (text-mode . flyspell-mode)) -#+end_src - -** ~ace-flyspell~ - -#+begin_src emacs-lisp -(use-package ace-flyspell - :bind - (:map flyspell-mode-map - ("C-M-i" . ace-flyspell-correct-word))) -#+end_src - -** ~objed~, text object manipulation - -From the package description: - -#+begin_quote -Text objects are textual patterns like a line, a top level definition, a word, a sentence or any -other unit of text. When objed-mode is enabled, certain editing commands (configurable) will -activate objed and enable its modal editing features. -#+end_quote - -#+begin_src emacs-lisp -(use-package objed - :demand t - :bind - (:map global-map - ("M-SPC" . objed-activate))) -#+end_src - -** ~alert~ to send alerts to a notification system - -#+begin_src emacs-lisp -(use-package alert - :config - (setq alert-default-style 'libnotify)) -#+end_src - -Only send alerts from eshell when the buffer is not visible: - -#+begin_src emacs-lisp -(alert-add-rule - :status '(buried) - :mode 'eshell-mode - :style 'notifications) -#+end_src - -Send alerts to Termux if we are running there - -#+begin_src emacs-lisp -(when (gpolonkai/termux-p) - (use-package alert-termux - :after alert - :config - (setq alert-default-style 'termux))) -#+end_src - -** ~undo-tree~ - -#+begin_src emacs-lisp -(use-package undo-tree - :config - (global-undo-tree-mode) - :custom - (undo-tree-auto-save-history nil)) -#+end_src - -** ~ciel~ to mimic ViM’s ~ci~ functionality - -#+begin_src emacs-lisp -(use-package ciel - :bind - (:map global-map - ("C-c i" . ciel-ci) - ("C-c o" . ciel-co))) -#+end_src - -** ~hide-mode-line~ to hide the modeline occasionally - -#+begin_src emacs-lisp -(use-package hide-mode-line - :bind (:map gpolonkai/pers-map - ("h" . hide-mode-line-mode))) -#+end_src - -** ~string-inflection~ - -#+begin_src emacs-lisp -(use-package string-inflection - :bind (:map gpolonkai/pers-map - ("i" . string-inflection-all-cycle))) -#+end_src - -** ~spdx~ to insert SPDX compatible license text - -#+begin_src emacs-lisp -(use-package spdx - :bind (:map gpolonkai/pers-map - ("L" . spdx-insert-spdx-copyright)) - :custom - (spdx-copyright-holder 'user) - (spdx-copyright-sign 'unicode)) -#+end_src - -** ~ag~ to use the silver searcher - -#+begin_src emacs-lisp -(use-package ag - :commands (ag)) -#+end_src - -** ~rg~ to use ripgrep - -#+begin_src emacs-lisp -(use-package rg - :commands (rg)) -#+end_src - * Dired extras ** ~dired-collapse~, to collapse directories that contain a single file somewhere deep diff --git a/init.el b/init.el index 812b7aa..75fe0e7 100644 --- a/init.el +++ b/init.el @@ -530,6 +530,331 @@ order." :bind (("M-/" . dabbrev-completion) ("C-M-/" . dabbrev-expand))) +;; Make sure we always have the latest ELPA GPG keys +(use-package gnu-elpa-keyring-update) + +;; Keep packages up to date + +(use-package auto-package-update + :custom + (auto-package-update-interval 7) + (auto-package-update-delete-old-versions t) + ;; Even though this might require a restart when packages are updated, since + ;; `use-package' invocations update the list of installed packages, we have to + ;; do this in `after-init-hook'. + :hook + (after-init . auto-package-update-maybe)) + +;; TODO: This :config call might be omitted if i move it to +;; ace-window-display-mode-hook +(use-package ace-window + :custom + (aw-background nil) + (aw-dispatch-always t) + :config + (add-to-list 'aw-dispatch-alist + '(?s gpolonkai/scroll-window-up " Scroll window up") + t) + (add-to-list 'aw-dispatch-alist + '(?S gpolonkai/scroll-window-down " Scroll window down") + t) + (add-to-list 'aw-dispatch-alist + '(?q gpolonkai/bury-window " Bury (quit) window") + t) + :bind + (:map ctl-x-map + ("o" . ace-window)) + :custom-face + (aw-leading-char-face ((t (:inherit ace-jump-face-foreground :height 2.0))))) + +(use-package doom-themes + :custom + (doom-themes-enable-bold t) + (doom-themes-enable-italic t) + :config + (load-theme 'doom-nord-aurora t) + (doom-themes-visual-bell-config) + (doom-themes-org-config)) + +;; The package that converted me to Emacs: +;; https://gergely.polonkai.eu/blog/2014/9/17/nyanmacs.html +(use-package nyan-mode + :config + (nyan-mode t) + :custom + (nyan-bar-length 20) + (nyan-animate-nyancat t) + (nyan-wavy-trail t)) + +;; The list of active minor modes can easily fill my whole mode line (twice…). +;; This is one of the things to protect me from that. +(use-package delight) + +(use-package minions + :config + (minions-mode 1)) + +(use-package doom-modeline + :init + (doom-modeline-mode 1) + :custom + (doom-modeline-continuous-word-count-modes '(markdown-mode gfm-mode org-mode rst-mode)) + (doom-modeline-hud t) + (doom-modeline-minor-modes t)) + +(use-package beacon + :demand + :config + (beacon-mode 1) + :bind + (:map gpolonkai/pers-map + ("b" . beacon-blink))) + +(use-package eshell-fringe-status + :hook + (eshell-mode . eshell-fringe-status-mode)) + +(use-package eshell-prompt-extras + :config + (with-eval-after-load "esh-opt" + (autoload 'epe-theme-lambda "eshell-prompt-extras")) + :custom + (eshell-highlight-prompt nil) + (eshell-prompt-function 'epe-theme-lambda)) + +;; Some (many? most?) Emacs packages use this to do some logical separation of +;; the code. It is also used by some compilers, and Emacs’ help system. + +(use-package form-feed + :hook + (emacs-lisp-mode . form-feed-mode) + (compilation-mode . form-feed-mode) + (help-mode . form-feed-mode)) + +(use-package hl-line + :config + (when window-system + (global-hl-line-mode)) + :custom-face + (hl-line ((t (:inherit nil :background "gray25"))))) + +(use-package ace-jump-mode + :bind + (:map gpolonkai/pers-map + ("SPC" . ace-jump-mode))) + +(defun gpolonkai/no-blink-matching-paren () + "Disable blinking matching parens." + (customize-set-variable 'blink-matching-paren nil)) + +(defun gpolonkai/blink-matching-paren () + "Enable blinking matching parens." + (customize-set-variable 'blink-matching-paren t)) + +(use-package multiple-cursors + :init + (defvar gpolonkai/mc-prefix-map (make-sparse-keymap) + "Prefix keymap for multiple-cursors") + (define-prefix-command 'gpolonkai/mc-prefix-map) + (define-key global-map (kbd "C-c m") 'gpolonkai/mc-prefix-map) + :hook + (multiple-cursors-mode-enabled . gpolonkai/no-blink-matching-paren) + (multiple-cursors-mode-disabled . gpolonkai/blink-matching-paren) + :bind + (:map gpolonkai/mc-prefix-map + ("t" . mc/mark-all-like-this) + ("m" . mc/mark-all-like-this-dwim) + ("l" . mc/edit-lines) + ("e" . mc/edit-ends-of-lines) + ("a" . mc/edit-beginnings-of-lines) + ("n" . mc/mark-next-like-this) + ("p" . mc/mark-previous-like-this) + ("s" . mc/mark-sgml-tag-pair) + ("d" . mc/mark-all-like-this-in-defun) + ("M-" . mc/add-cursor-on-click))) + +;; phi-search is an incremental search compatible with multiple-cursors +(use-package phi-search) +(use-package phi-search-mc + :config + (phi-search-mc/setup-keys)) + +(use-package mc-extras + :demand + :bind + (:map mc/keymap + ("=" . mc/compare-chars))) + +(use-package ace-mc + :bind + (:map gpolonkai/mc-prefix-map + ("SPC" . ace-mc-add-multiple-cursors) + ("C-SPC" . ace-mc-add-single-cursor))) + +(use-package smartparens + :demand + :config + (require 'smartparens-config) + (show-smartparens-global-mode t) + :hook + (prog-mode . turn-on-smartparens-strict-mode) + (markdown-mode . turn-on-smartparens-strict-mode) + :bind + (([f9] . smartparens-strict-mode) + ("C-c s u" . sp-unwrap-sexp) + ("C-c s k" . sp-kill-sexp) + ("C-c s r" . sp-rewrap-sexp))) + +(use-package which-key + :config + (which-key-mode) + (which-key-setup-minibuffer) + :custom + (which-key-idle-delay 0.3)) + +(use-package visual-fill-column + :custom + (visual-fill-column-center-text t) + (visual-fill-column-width 120) + :hook + (org-mode . visual-fill-column-mode)) + +(use-package spinner) + +(use-package avy + :demand + :config + (avy-setup-default) + :bind + (("M-g c" . avy-goto-char) + ("M-g C" . avy-goto-char-2) + ("M-g f" . avy-goto-line) + ("M-g w" . avy-goto-word-1) + ("M-g e" . avy-goto-word-0))) + +(use-package goto-last-change + :bind + (("M-g /" . goto-last-change))) + +(use-package rainbow-mode + :hook + (css-mode . rainbow-mode) + (scss-mode . rainbow-mode) + (sass-mode . rainbow-mode)) + +(use-package zygospore + :bind + (:map ctl-x-map + ("1" . zygospore-toggle-delete-other-windows))) + +(use-package dashboard + :after + projectile + :config + (add-to-list 'dashboard-items '(projects . 5) t) + (dashboard-setup-startup-hook) + :custom + (dashboard-set-heading-icons t) + (dashboard-set-file-icons t) + (dashboard-center-content t) + (dashboard-set-navigator t) + (dashboard-items '((agenda . 5) + (projects . 5) + (recents . 5) + (bookmarks . 5)))) + +(use-package sr-speedbar + :after speedbar) + +(use-package hungry-delete + :config + (global-hungry-delete-mode)) + +(use-package anzu + :delight + :config + (global-anzu-mode 1)) + +;; Should the fonts be missing, run `all-the-icons-install-fonts'. It’s not run +;; automatically, as it requires connecting to a website and download a pretty +;; large font file. + +(use-package all-the-icons) + +(use-package all-the-icons-dired + :hook + (dired-mode . all-the-icons-dired-mode)) + +(use-package flyspell + :hook + (prog-mode . flyspell-prog-mode) + (text-mode . flyspell-mode)) + +(use-package ace-flyspell + :bind + (:map flyspell-mode-map + ("C-M-i" . ace-flyspell-correct-word))) + +;; Text objects are textual patterns like a line, a top level definition, a +;; word, a sentence or any other unit of text. When objed-mode is enabled, +;; certain editing commands (configurable) will activate objed and enable its +;; modal editing features. +;; +;; TODO: is :demand really needed here? +(use-package objed + :demand t + :bind + (:map global-map + ("M-SPC" . objed-activate))) + +(use-package alert + :config + (setq alert-default-style 'libnotify)) + +(alert-add-rule + :status '(buried) + :mode 'eshell-mode + :style 'notifications) + +(when (gpolonkai/termux-p) + (use-package alert-termux + :after alert + :config + (setq alert-default-style 'termux))) + +(use-package undo-tree + :config + (global-undo-tree-mode) + :custom + (undo-tree-auto-save-history nil)) + +(use-package ciel + :bind + (:map global-map + ("C-c i" . ciel-ci) + ("C-c o" . ciel-co))) + +(use-package hide-mode-line + :bind (:map gpolonkai/pers-map + ("h" . hide-mode-line-mode))) + +(use-package string-inflection + :bind (:map gpolonkai/pers-map + ("i" . string-inflection-all-cycle))) + +(use-package spdx + :bind (:map gpolonkai/pers-map + ("L" . spdx-insert-spdx-copyright)) + :custom + (spdx-copyright-holder 'user) + (spdx-copyright-sign 'unicode)) + +(use-package ag + :commands (ag)) + +(use-package rg + :commands (rg)) + ;; I started moving my configuration to this Org file. It’s easier to document this way. (org-babel-load-file (expand-file-name "configuration.org" user-emacs-directory))