From 0f9db243ad9f851bdf39f80ca684d0274988c174 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 26 Aug 2024 16:02:44 +0200 Subject: [PATCH 001/143] 'Fresh' start - Use config_new.org as main config file Trimmed down version of old config. Insipred by 'mastering emacs' book to use more the built-in functionality of emacs. I found that It's more than good enough for my usecases. - adapt early-init for quicker startup Stolen from doom emacs - Don't use/load project.org Use .dir-locals.el you peasant --- config.org | 118 +++++++++---------- config_new.org | 299 +++++++++++++++++++++++++++++++++++++++++++++++++ early-init.el | 8 ++ init.el | 21 +++- 4 files changed, 385 insertions(+), 61 deletions(-) create mode 100644 config_new.org diff --git a/config.org b/config.org index bb73156..ff3b9cb 100644 --- a/config.org +++ b/config.org @@ -117,11 +117,13 @@ This configuration requires the installation of : ** Garbage collection -Increase GC threshold to minimize time wasting: +Increase GC threshold to minimize time wasting on modern machines: #+BEGIN_SRC emacs-lisp (setq gc-cons-threshold 20000000) ;; 20 MB #+END_SRC +Recommendation stolen from https://github.com/lewang/flx?tab=readme-ov-file#gc-optimization . + * Base packages to install first ** Elpaca @@ -130,76 +132,43 @@ Replacement for built-in package manager package.el : https://github.com/progfolio/elpaca #+BEGIN_SRC emacs-lisp - (defvar elpaca-installer-version 0.4) - + (defvar elpaca-installer-version 0.7) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) - (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) - (defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) - (defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" - - :ref nil - - :files (:defaults (:exclude "extensions")) - - :build (:not elpaca--activate-package))) - + :ref nil :depth 1 + :files (:defaults "elpaca-test.el" (:exclude "extensions")) + :build (:not elpaca--activate-package))) (let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) - - (build (expand-file-name "elpaca/" elpaca-builds-directory)) - - (order (cdr elpaca-order)) - - (default-directory repo)) - + (build (expand-file-name "elpaca/" elpaca-builds-directory)) + (order (cdr elpaca-order)) + (default-directory repo)) (add-to-list 'load-path (if (file-exists-p build) build repo)) - (unless (file-exists-p repo) - (make-directory repo t) - (when (< emacs-major-version 28) (require 'subr-x)) - (condition-case-unless-debug err - - (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) - - ((zerop (call-process "git" nil buffer t "clone" - - (plist-get order :repo) repo))) - - ((zerop (call-process "git" nil buffer t "checkout" - - (or (plist-get order :ref) "--")))) - - (emacs (concat invocation-directory invocation-name)) - - ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" - - "--eval" "(byte-recompile-directory \".\" 0 'force)"))) - - ((require 'elpaca)) - - ((elpaca-generate-autoloads "elpaca" repo))) - - (kill-buffer buffer) - - (error "%s" (with-current-buffer buffer (buffer-string)))) - - ((error) (warn "%s" err) (delete-directory repo 'recursive)))) - + (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(plist-get order :repo) ,repo)))) + ((zerop (call-process "git" nil buffer t "checkout" + (or (plist-get order :ref) "--")))) + (emacs (concat invocation-directory invocation-name)) + ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" + "--eval" "(byte-recompile-directory \".\" 0 'force)"))) + ((require 'elpaca)) + ((elpaca-generate-autoloads "elpaca" repo))) + (progn (message "%s" (buffer-string)) (kill-buffer buffer)) + (error "%s" (with-current-buffer buffer (buffer-string)))) + ((error) (warn "%s" err) (delete-directory repo 'recursive)))) (unless (require 'elpaca-autoloads nil t) - (require 'elpaca) - (elpaca-generate-autoloads "elpaca" repo) - (load "./elpaca-autoloads"))) - (add-hook 'after-init-hook #'elpaca-process-queues) - (elpaca `(,@elpaca-order)) #+END_SRC @@ -453,6 +422,14 @@ We could use an alias (alias sudo eshell/sudo $*), but to keep things inside thi (setq password-cache-expiry 3600) ; for one hour (time in secs) #+END_SRC +** Vterm + +#+BEGIN_SRC emacs-lisp +(use-package vterm + :ensure t + ) +#+END_SRC + * Dired @@ -754,7 +731,7 @@ will the entire line including the following newline will be deleted. #+BEGIN_SRC emacs-lisp (setq kill-ring-max 5000) ; increase kill-ring capacity -(setq kill-whole-line t) +;; (setq kill-whole-line t) #+END_SRC ** Newline at end-of-file @@ -1115,6 +1092,13 @@ TODO: need to document this * Magit + +#+BEGIN_SRC emacs-lisp +(use-package transient + :ensure t + ) +#+END_SRC + #+BEGIN_SRC emacs-lisp (use-package magit :ensure t @@ -1171,6 +1155,26 @@ https://github.com/joaotavora/yasnippet *** Eglot +Eldoc complaints: + +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :preface + (unload-feature 'eldoc t) + (setq custom-delayed-init-variables '()) + (defvar global-eldoc-mode nil) + :config + (global-eldoc-mode)) + + +(use-package jsonrpc + :preface + (unload-feature 'jsonrpc t) + ) + +#+END_SRC + + #+BEGIN_SRC emacs-lisp (use-package eglot :hook (prog-mode . eglot-ensure) diff --git a/config_new.org b/config_new.org new file mode 100644 index 0000000..c5dd757 --- /dev/null +++ b/config_new.org @@ -0,0 +1,299 @@ +#+STARTUP: overview +#+TITLE: My Emacs +#+CREATOR: Laurens Miers +#+LANGUAGE: en +[[./img/dash_logo.png]] + +* Elpaca + +#+begin_src emacs-lisp +(defvar elpaca-installer-version 0.7) +(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) +(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) +(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) +(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" + :ref nil :depth 1 + :files (:defaults "elpaca-test.el" (:exclude "extensions")) + :build (:not elpaca--activate-package))) +(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) + (build (expand-file-name "elpaca/" elpaca-builds-directory)) + (order (cdr elpaca-order)) + (default-directory repo)) + (add-to-list 'load-path (if (file-exists-p build) build repo)) + (unless (file-exists-p repo) + (make-directory repo t) + (when (< emacs-major-version 28) (require 'subr-x)) + (condition-case-unless-debug err + (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(plist-get order :repo) ,repo)))) + ((zerop (call-process "git" nil buffer t "checkout" + (or (plist-get order :ref) "--")))) + (emacs (concat invocation-directory invocation-name)) + ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" + "--eval" "(byte-recompile-directory \".\" 0 'force)"))) + ((require 'elpaca)) + ((elpaca-generate-autoloads "elpaca" repo))) + (progn (message "%s" (buffer-string)) (kill-buffer buffer)) + (error "%s" (with-current-buffer buffer (buffer-string)))) + ((error) (warn "%s" err) (delete-directory repo 'recursive)))) + (unless (require 'elpaca-autoloads nil t) + (require 'elpaca) + (elpaca-generate-autoloads "elpaca" repo) + (load "./elpaca-autoloads"))) +(add-hook 'after-init-hook #'elpaca-process-queues) +(elpaca `(,@elpaca-order)) +#+end_src + +#+begin_src emacs-lisp + ;; Install use-package support + (elpaca elpaca-use-package + ;; Enable use-package :ensure support for Elpaca. + (elpaca-use-package-mode) + ) +#+end_src + +* General config + +** Yes-or-no + +Because I'm lazy, important yes-or-no questions can be answered with y-or-n: +#+begin_src emacs-lisp +(defalias 'yes-or-no-p 'y-or-n-p) +#+end_src + +** FIDO + +Use Fake-ido as minibuffer completion system, more info here: +https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html + +#+begin_src emacs-lisp +(fido-vertical-mode 1) +#+end_src + +** Switch windows + +#+begin_src emacs-lisp +(global-set-key (kbd "M-o") 'other-window) +#+end_src + +** Maximize at startup + +More info : https://www.emacswiki.org/emacs/FullScreen + +#+begin_src emacs-lisp +(push '(fullscreen . maximized) default-frame-alist) +#+end_src + +** ibuffer + +Use list-buffers bigger brother. +#+begin_src emacs-lisp +(global-set-key [remap list-buffers] 'ibuffer) +#+end_src + +** Mark + +#+begin_src emacs-lisp +(global-set-key (kbd "M-SPC") 'mark-word) +#+end_src + +** Isearch + +Display number of matches: +#+begin_src emacs-lisp +(setq-default isearch-lazy-count t) +#+end_src + +Reference that might be interesting for later: +https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html + +** Sudo file + +#+begin_src emacs-lisp +(defun sudo () + "Use TRAMP to `sudo' the current buffer." + (interactive) + (when buffer-file-name + (find-alternate-file + (concat "/sudo:root@localhost:" + buffer-file-name) + ) + ) +) +#+end_src + +* Whole-line-or-region + +Source: +https://github.com/purcell/whole-line-or-region + +Operate on the current line if no region is active. + +#+begin_src emacs-lisp +(use-package whole-line-or-region + :ensure t + :config + (whole-line-or-region-global-mode 1) +) +#+end_src + +* imenu + +** Flatten + +#+begin_src emacs-lisp +(use-package flimenu + :ensure t + :config + (flimenu-global-mode 1) +) + +(global-set-key (kbd "M-i") 'imenu) +#+end_src + +* Terminal + +** Toggle between char- and line-mode + +Courtesy goes to https://joelmccracken.github.io/entries/switching-between-term-mode-and-line-mode-in-emacs-term/ + +#+BEGIN_SRC emacs-lisp +(require 'term) + +(defun jnm/term-toggle-mode () + "Toggles term between line mode and char mode" + (interactive) + (if (term-in-line-mode) + (term-char-mode) + (term-line-mode))) + +(define-key term-mode-map (kbd "C-c C-j") 'jnm/term-toggle-mode) +(define-key term-mode-map (kbd "C-c C-k") 'jnm/term-toggle-mode) + +(define-key term-raw-map (kbd "C-c C-j") 'jnm/term-toggle-mode) +(define-key term-raw-map (kbd "C-c C-k") 'jnm/term-toggle-mode) +#+END_SRC + +For the keybindings, we have to defien them in both raw and line mode. From the help page of term mode: + If you define custom keybindings, make sure to assign them to the + correct keymap (or to both): use ‘term-raw-map’ in raw mode and + ‘term-mode-map’ in line mode. + +* Theme + +#+BEGIN_SRC emacs-lisp +(use-package monokai-theme + :ensure t + :init + (load-theme 'monokai t) +) +#+END_SRC + +* Dashboard + +#+begin_src emacs-lisp +(use-package dashboard + :ensure t + :config + (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) + (add-hook 'elpaca-after-init-hook #'dashboard-initialize) + (dashboard-setup-startup-hook)) +#+end_src + +* Hydra + +Install and wait for hydra to be available since we are using it in this init.el : +#+begin_src emacs-lisp +(use-package hydra + :ensure (:wait t) + ) +#+end_src + +** Text zoom + +#+begin_src emacs-lisp +(defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out") +) +#+end_src + +* Programming + +** Eglot + +#+BEGIN_SRC emacs-lisp +(use-package eglot + :ensure t + :defer t + ;; This doesn't work for some reason, workaround below + ;;:hook (prog-mode . eglot-ensure) + ;; :config + ;; (add-hook 'prog-mode-hook 'eglot-ensure) +) +#+END_SRC + +Workaround to enable eglot in all programming modes: +#+BEGIN_SRC emacs-lisp +(add-hook 'prog-mode-hook 'eglot-ensure) +#+END_SRC + +** Yasnippet + +#+BEGIN_SRC emacs-lisp +(use-package yasnippet + :ensure t + :config + (yas-reload-all) + (add-hook 'prog-mode-hook 'yas-minor-mode) +) +#+END_SRC + +** Magit + +#+BEGIN_SRC emacs-lisp +(use-package magit + :ensure t +) +#+END_SRC + +* Multiple cursors + +#+BEGIN_SRC emacs-lisp +(use-package multiple-cursors + :ensure t +) +#+END_SRC + +* Comment-dwim-2 + +Replacement for built-in =comment-dwim=, more comment features. + +https://github.com/remyferre/comment-dwim-2 + +#+BEGIN_SRC emacs-lisp +(use-package comment-dwim-2 + :ensure t + :config + (global-set-key (kbd "M-;") 'comment-dwim-2) +) +#+END_SRC + +* Projectile + +#+BEGIN_SRC emacs-lisp +(use-package projectile + :ensure t + :hook (prog-mode . projectile-mode) +;; :config +;; (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) +;; (setq projectile-indexing-method 'alien) +;; (setq projectile-enable-caching t) +;; (projectile-mode) +) + +#+END_SRC diff --git a/early-init.el b/early-init.el index 512068a..0fe1b95 100644 --- a/early-init.el +++ b/early-init.el @@ -1 +1,9 @@ (setq package-enable-at-startup nil) + + +;; Local Variables: +;; no-byte-compile: t +;; no-native-compile: t +;; no-update-autoloads: t +;; End: + diff --git a/init.el b/init.el index 444b5ab..b25e39d 100644 --- a/init.el +++ b/init.el @@ -5,13 +5,26 @@ ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (defvar config-file (expand-file-name "config.org" user-emacs-directory)) - (defvar project-file (expand-file-name "project.org" user-emacs-directory)) + (defvar config-file (expand-file-name "config_new.org" user-emacs-directory)) + ;;(defvar project-file (expand-file-name "project.org" user-emacs-directory)) (when (file-readable-p config-file) (org-babel-load-file (expand-file-name config-file))) ;; If it exists, load some project-specific configurations. - (when (file-readable-p project-file) - (org-babel-load-file (expand-file-name project-file))) + ;;(when (file-readable-p project-file) + ;; (org-babel-load-file (expand-file-name project-file))) ) +(custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(package-selected-packages + '(flycheck-clang-tidy org-tree-slide ox-reveal writeroom-mode visual-fill-column org-present clang-format+ dash))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) From 0db6d1753e8fc43e2b3b7c7c49f328a733f4f539 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 11:58:49 +0200 Subject: [PATCH 002/143] ADD multipe-cursor keybindings --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index c5dd757..d073aef 100644 --- a/config_new.org +++ b/config_new.org @@ -266,6 +266,12 @@ Workaround to enable eglot in all programming modes: #+BEGIN_SRC emacs-lisp (use-package multiple-cursors :ensure t + :bind + ("C-x r a" . mc/edit-beginnings-of-lines) + ("C-x r e" . mc/edit-ends-of-lines) + ("C->" . mc/mark-next-like-this) + ("C-<" . mc/mark-previous-like-this) + ("C-c C->" . mc/mark-all-like-this) ) #+END_SRC From ef04adcfd92e173ec3a28cbe5bb441312dfbea94 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:02:47 +0200 Subject: [PATCH 003/143] ADD hippie-expand Remap dabbrev to hippie-expand --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index d073aef..04a3253 100644 --- a/config_new.org +++ b/config_new.org @@ -125,6 +125,12 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. ) #+end_src +** Abbrev + +#+begin_src emacs-lisp +(global-set-key [remap dabbrev-expand] 'hippie-expand) +#+end_src + * Whole-line-or-region Source: From 3bf48f5927c3d64d7f3c340461f8bf3b006b972a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:03:02 +0200 Subject: [PATCH 004/143] ADD zap-up-to-char keybinding --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index 04a3253..2ef4bb6 100644 --- a/config_new.org +++ b/config_new.org @@ -131,6 +131,12 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. (global-set-key [remap dabbrev-expand] 'hippie-expand) #+end_src +** Zap + +#+begin_src emacs-lisp +(global-set-key (kbd "M-S-z") 'zap-up-to-char) +#+end_src + * Whole-line-or-region Source: From d184007b9b3c9b2f8c44f21622022f9c86370b4e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:03:19 +0200 Subject: [PATCH 005/143] ADD spell checking in prog-mode --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index 2ef4bb6..ff8ee7a 100644 --- a/config_new.org +++ b/config_new.org @@ -137,6 +137,14 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. (global-set-key (kbd "M-S-z") 'zap-up-to-char) #+end_src +** Spell checking + +Look into customizing the 'ispell' group. + +#+begin_src emacs-lisp +(add-hook 'prog-mode-hook 'flyspell-prog-mode) +#+end_src + * Whole-line-or-region Source: From db266f3ecec8b746c3decd4319b13b732f35dd19 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:03:32 +0200 Subject: [PATCH 006/143] ADD 'transient' dependant package for magit --- config_new.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config_new.org b/config_new.org index ff8ee7a..d567839 100644 --- a/config_new.org +++ b/config_new.org @@ -275,6 +275,18 @@ Workaround to enable eglot in all programming modes: ** Magit +*** Transient + +Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. + +#+BEGIN_SRC emacs-lisp +(use-package transient + :ensure t + ) +#+END_SRC + +*** Core + #+BEGIN_SRC emacs-lisp (use-package magit :ensure t From bd3f73747779c16d9efa643f47113ca3e675340d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:19:53 +0200 Subject: [PATCH 007/143] ADD enhanced dired --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index d567839..2876e5c 100644 --- a/config_new.org +++ b/config_new.org @@ -145,6 +145,12 @@ Look into customizing the 'ispell' group. (add-hook 'prog-mode-hook 'flyspell-prog-mode) #+end_src +* Dired + +#+begin_src emacs-lisp +(require 'dired-x) +#+end_src + * Whole-line-or-region Source: From 00d40a2d5ac4f40adcf904b5903263e8dc7f9900 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:22:53 +0200 Subject: [PATCH 008/143] PROJECTILE: Initial configuration Not sure yet about this but working for now. Override default project keymap --- config_new.org | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/config_new.org b/config_new.org index 2876e5c..6d4403d 100644 --- a/config_new.org +++ b/config_new.org @@ -332,12 +332,11 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package projectile :ensure t - :hook (prog-mode . projectile-mode) -;; :config -;; (setq projectile-globally-ignored-directories (cons ".ccls-cache" projectile-globally-ignored-directories)) -;; (setq projectile-indexing-method 'alien) -;; (setq projectile-enable-caching t) -;; (projectile-mode) + :config + (setq projectile-indexing-method 'alien) + (setq projectile-enable-caching t) + (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) + (projectile-mode +1) ) #+END_SRC From a6c81d05bac145c6fa8b8efabf9d03f93c32890d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 8 Sep 2024 18:45:34 +0200 Subject: [PATCH 009/143] ADD smartparens --- config_new.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config_new.org b/config_new.org index 6d4403d..1bfa1c6 100644 --- a/config_new.org +++ b/config_new.org @@ -299,6 +299,22 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC +** Smartparens +Smart minor-mode to deal with pairs. + +https://github.com/Fuco1/smartparens + +#+BEGIN_SRC emacs-lisp +(use-package smartparens + :ensure t + :bind + ("C-M-w" . sp-copy-sexp) + :hook (prog-mode text-mode markdown-mode) + :config + (require 'smartparens-config) +) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From b8ef2937f35169ad15be4a1f9090759ff6c5a8b4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:34:16 +0200 Subject: [PATCH 010/143] ADD save history and recentf --- config_new.org | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config_new.org b/config_new.org index 1bfa1c6..6a890d2 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,25 @@ * General config +** Save history and recent files + +#+begin_src emacs-lisp +;; The built-in `savehist-mode' saves minibuffer histories. Vertico +;; can then use that information to put recently selected options at +;; the top. +;; +;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a +(savehist-mode 1) + +;; The built-in `recentf-mode' keeps track of recently visited files. +;; You can then access those through the `consult-buffer' interface or +;; with `recentf-open'/`recentf-open-files'. +;; +;; I do not use this facility, because the files I care about are +;; either in projects or are bookmarked. +(recentf-mode 1) +#+end_src + ** Yes-or-no Because I'm lazy, important yes-or-no questions can be answered with y-or-n: From 9541cfbf440ecd26561adb6161e730170788b8fe Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:34:31 +0200 Subject: [PATCH 011/143] Delete trailing whitespaces before-saving Enable globally because I don't know of a scenario where we would ever want this. --- config_new.org | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/config_new.org b/config_new.org index 6a890d2..4866110 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,12 @@ * General config +** Delete trailing whitespaces + +#+BEGIN_SRC emacs-lisp +(add-hook 'before-save-hook 'delete-trailing-whitespace) +#+END_SRC + ** Save history and recent files #+begin_src emacs-lisp @@ -103,7 +109,7 @@ https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html More info : https://www.emacswiki.org/emacs/FullScreen #+begin_src emacs-lisp -(push '(fullscreen . maximized) default-frame-alist) +(push '(fullscreen . maximized) default-frame-alist) #+end_src ** ibuffer @@ -284,7 +290,7 @@ Install and wait for hydra to be available since we are using it in this init.el Workaround to enable eglot in all programming modes: #+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'eglot-ensure) +(add-hook 'prog-mode-hook 'eglot-ensure) #+END_SRC ** Yasnippet @@ -373,5 +379,3 @@ https://github.com/remyferre/comment-dwim-2 (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) ) - -#+END_SRC From 7329b044f3861f515bdaa2399c9253658dc859d9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:35:11 +0200 Subject: [PATCH 012/143] ADD save-symbol-at-point function This was originally supplied by smartparens but I don't need the whole package for this function. Other functionality which I used from smartparens is available with electric-pair-mode . --- config_new.org | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config_new.org b/config_new.org index 4866110..688035d 100644 --- a/config_new.org +++ b/config_new.org @@ -379,3 +379,17 @@ https://github.com/remyferre/comment-dwim-2 (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) ) + +* Custom + +** Save symbol at point + +#+BEGIN_SRC emacs-lisp +(defun myrmi/save-symbol-at-point () + "Make symbol at point the latest kill in the kill ring." + (interactive) + (let ((symbol (thing-at-point 'symbol))) + (when symbol (kill-new symbol)))) + +(global-set-key (kbd "C-M-w") 'myrmi/save-symbol-at-point) +#+END_SRC From 801188ed90116da9c696fdaf81e26cd137437be1 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:36:50 +0200 Subject: [PATCH 013/143] ADD electric-pair mode in prog-mode This was originally supplied by smartparens but I'm only using a subset of this package. The main functionality which I used from smartparens is available with electric-pair-mode . --- config_new.org | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config_new.org b/config_new.org index 688035d..de2f4e0 100644 --- a/config_new.org +++ b/config_new.org @@ -275,6 +275,11 @@ Install and wait for hydra to be available since we are using it in this init.el * Programming +** Electric pair +#+BEGIN_SRC emacs-lisp +(add-hook 'prog-mode-hook 'electric-pair-mode) +#+END_SRC + ** Eglot #+BEGIN_SRC emacs-lisp From 22a827592d6cb8eda46f7972be1541d9f657cf6c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:38:09 +0200 Subject: [PATCH 014/143] REMOVE imenu use consult-imenu in future --- config_new.org | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/config_new.org b/config_new.org index de2f4e0..4e3591d 100644 --- a/config_new.org +++ b/config_new.org @@ -191,20 +191,6 @@ Operate on the current line if no region is active. ) #+end_src -* imenu - -** Flatten - -#+begin_src emacs-lisp -(use-package flimenu - :ensure t - :config - (flimenu-global-mode 1) -) - -(global-set-key (kbd "M-i") 'imenu) -#+end_src - * Terminal ** Toggle between char- and line-mode From df5d0349070cfebfc3f151f8112cd875e5c3ce97 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:38:50 +0200 Subject: [PATCH 015/143] PROJECTILE: install project.el hooks Some packages use the project.el functions/bindings (like consult, ...) for their functionality. Install the projectile bindings so that they start using the projectile framework. --- config_new.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config_new.org b/config_new.org index 4e3591d..f53f9a0 100644 --- a/config_new.org +++ b/config_new.org @@ -369,7 +369,10 @@ https://github.com/remyferre/comment-dwim-2 (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) + (require 'project) + (add-hook 'project-find-functions #'project-projectile) ) +#+END_SRC * Custom From 35102de7f578cca937af0afeb8342a149bcd2d48 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:00 +0200 Subject: [PATCH 016/143] REMOVE fido, ADD Vertico Switch from fido to vertico --- config_new.org | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/config_new.org b/config_new.org index f53f9a0..893ccfd 100644 --- a/config_new.org +++ b/config_new.org @@ -55,6 +55,23 @@ ) #+end_src +* Vertico-stack + +** Vertico + +#+BEGIN_SRC emacs-lisp +;; Enable vertico +(use-package vertico + :ensure t + ;; :custom + ;; (vertico-scroll-margin 0) ;; Different scroll margin + ;; (vertico-count 20) ;; Show more candidates + ;; (vertico-resize t) ;; Grow and shrink the Vertico minibuffer + ;; (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' + :init + (vertico-mode)) +#+END_SRC + * General config ** Delete trailing whitespaces @@ -89,15 +106,6 @@ Because I'm lazy, important yes-or-no questions can be answered with y-or-n: (defalias 'yes-or-no-p 'y-or-n-p) #+end_src -** FIDO - -Use Fake-ido as minibuffer completion system, more info here: -https://www.gnu.org/software/emacs/manual/html_node/emacs/Icomplete.html - -#+begin_src emacs-lisp -(fido-vertical-mode 1) -#+end_src - ** Switch windows #+begin_src emacs-lisp From 393bace7cff1e1b535dc0ab35fccc4883cc6fa53 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:25 +0200 Subject: [PATCH 017/143] ADD consult example config --- config_new.org | 111 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/config_new.org b/config_new.org index 893ccfd..bb451bd 100644 --- a/config_new.org +++ b/config_new.org @@ -72,6 +72,117 @@ (vertico-mode)) #+END_SRC +** Consult + +#+BEGIN_SRC emacs-lisp +(use-package consult + :ensure t + ;; Replace bindings. Lazily loaded by `use-package'. + :bind (;; C-c bindings in `mode-specific-map' + ;; ("C-c M-x" . consult-mode-command) + ;; ("C-c h" . consult-history) + ;; ("C-c k" . consult-kmacro) + ;; ("C-c m" . consult-man) + ;; ("C-c i" . consult-info) + ([remap Info-search] . consult-info) + ;; C-x bindings in `ctl-x-map' + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ;; ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ;; ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings in `goto-map' + ;; ("M-g e" . consult-compile-error) + ;; ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ;; ("M-g m" . consult-mark) + ;; ("M-g k" . consult-global-mark) + ("M-i" . consult-imenu) + ("M-I" . consult-imenu-multi) + ;; M-s bindings in `search-map' + ;; ("M-s d" . consult-find) ;; Alternative: consult-fd + ;; ("M-s c" . consult-locate) + ;; ("M-s g" . consult-grep) + ;; ("M-s G" . consult-git-grep) + ;; ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ;; ("M-s L" . consult-line-multi) + ;; ("M-s k" . consult-keep-lines) + ;; ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history) ;; orig. previous-matching-history-element + ) + + ;; Enable automatic preview at point in the *Completions* buffer. This is + ;; relevant when you use the default completion UI. + :hook (completion-list-mode . consult-preview-at-point-mode) + + ;; The :init configuration is always executed (Not lazy) + :init + + ;; Optionally configure the register formatting. This improves the register + ;; preview for `consult-register', `consult-register-load', + ;; `consult-register-store' and the Emacs built-ins. + ;; (setq register-preview-delay 0.5 + ;; register-preview-function #'consult-register-format) + + ;; Optionally tweak the register preview window. + ;; This adds thin lines, sorting and hides the mode line of the window. + ;; (advice-add #'register-preview :override #'consult-register-window) + + ;; Use Consult to select xref locations with preview + (setq xref-show-xrefs-function #'consult-xref + xref-show-definitions-function #'consult-xref) + + ;; Configure other variables and modes in the :config section, + ;; after lazily loading the package. + ;; :config + + ;; Optionally configure preview. The default value + ;; is 'any, such that any key triggers the preview. + ;; (setq consult-preview-key 'any) + ;; (setq consult-preview-key "M-.") + ;; (setq consult-preview-key '("S-" "S-")) + ;; For some commands and buffer sources it is useful to configure the + ;; :preview-key on a per-command basis using the `consult-customize' macro. + ;; (consult-customize + ;; consult-theme :preview-key '(:debounce 0.2 any) + ;; consult-ripgrep consult-git-grep consult-grep + ;; consult-bookmark consult-recent-file consult-xref + ;; consult--source-bookmark consult--source-file-register + ;; consult--source-recent-file consult--source-project-recent-file + ;; :preview-key "M-." + ;; :preview-key '(:debounce 0.4 any)) + + ;; Optionally configure the narrowing key. + ;; Both < and C-+ work reasonably well. + ;; (setq consult-narrow-key "<") ;; "C-+" + + ;; Optionally make narrowing help available in the minibuffer. + ;; You may want to use `embark-prefix-help-command' or which-key instead. + ;; (keymap-set consult-narrow-map (concat consult-narrow-key " ?") #'consult-narrow-help) +) +#+END_SRC + * General config ** Delete trailing whitespaces From 17515a83778ba08e25ca158ad5753f4be29698e7 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:39 +0200 Subject: [PATCH 018/143] ADD Corfu For nice popup in eglot. --- config_new.org | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/config_new.org b/config_new.org index bb451bd..9d3ade8 100644 --- a/config_new.org +++ b/config_new.org @@ -183,6 +183,35 @@ ) #+END_SRC +** Corfu + +#+BEGIN_SRC emacs-lisp + (use-package corfu + :ensure t + ;; Optional customizations + ;; :custom + ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + ;; (corfu-auto t) ;; Enable auto completion + ;; (corfu-separator ?\s) ;; Orderless field separator + ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary + ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match + ;; (corfu-preview-current nil) ;; Disable current candidate preview + ;; (corfu-preselect 'prompt) ;; Preselect the prompt + ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches + ;; (corfu-scroll-margin 5) ;; Use scroll margin + + ;; Enable Corfu only for certain modes. See also `global-corfu-modes'. + ;; :hook ((prog-mode . corfu-mode) + ;; (shell-mode . corfu-mode) + ;; (eshell-mode . corfu-mode)) + + ;; Recommended: Enable Corfu globally. This is recommended since Dabbrev can + ;; be used globally (M-/). See also the customization variable + ;; `global-corfu-modes' to exclude certain modes. + :init + (global-corfu-mode)) +#+end_src + * General config ** Delete trailing whitespaces From 6e1ed0ebb6af66e0553d2f43f8567a6a713ad36c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:45:57 +0200 Subject: [PATCH 019/143] ADD Orderless --- config_new.org | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/config_new.org b/config_new.org index 9d3ade8..51e576b 100644 --- a/config_new.org +++ b/config_new.org @@ -212,6 +212,31 @@ (global-corfu-mode)) #+end_src +** Orderless + +#+begin_src emacs-lisp + (use-package orderless + :ensure t + :demand t + :custom + (completion-styles '(orderless basic)) + ;; (gnus-completion-styles '(orderless substring basic)) + ;; (completion-category-overrides '((file (styles basic partial-completion)))) + + ;; Below not necessary if using vertico + ;; (completion-category-overrides '( + ;; (command (styles orderless basic partial-completion)) + ;; (file (styles orderless basic partial-completion)) + ;;;; (buffer (styles orderless basic)) + ;; (variable (styles orderless basic)) + ;; (symbol (styles orderless basic)) + ;; (consult-location (styles orderless)) + ;; (consult-multi (styles orderless)) + ;; ) + ;; ) + ) +#+end_src + * General config ** Delete trailing whitespaces From 49e26e5568c3b88fdbd73250acfc5271064b2dfb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:46:07 +0200 Subject: [PATCH 020/143] ADD Marginalia Some eye candy in the minibuffer --- config_new.org | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/config_new.org b/config_new.org index 51e576b..e4e294b 100644 --- a/config_new.org +++ b/config_new.org @@ -237,6 +237,27 @@ ) #+end_src +** Marginalia + +#+begin_src emacs-lisp +;; Enable rich annotations using the Marginalia package +(use-package marginalia + :ensure t + ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding + ;; available in the *Completions* buffer, add it to the + ;; `completion-list-mode-map'. + :bind (:map minibuffer-local-map + ("M-A" . marginalia-cycle)) + + ;; The :init section is always executed. + :init + + ;; Marginalia must be activated in the :init section of use-package such that + ;; the mode gets enabled right away. Note that this forces loading the + ;; package. + (marginalia-mode)) +#+end_src + * General config ** Delete trailing whitespaces From 1549038f73f74b2c4c756a89a76b6742364c193f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 12:58:13 +0200 Subject: [PATCH 021/143] ADD backup configuration Store backups in /backups --- config_new.org | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/config_new.org b/config_new.org index e4e294b..43ae68b 100644 --- a/config_new.org +++ b/config_new.org @@ -285,6 +285,27 @@ (recentf-mode 1) #+end_src +** Backups + +#+BEGIN_SRC emacs-lisp +(defvar myrmi-backup-directory (concat user-emacs-directory "backups")) +(if (not (file-exists-p myrmi-backup-directory)) + (make-directory myrmi-backup-directory t) + ) +(setq backup-directory-alist `(("." . ,myrmi-backup-directory))) +(setq make-backup-files t + backup-by-copying t + version-control t + delete-old-versions t + delete-by-moving-to-trash t + kept-old-versions 6 + kept-new-versions 9 + auto-save-default t + auto-save-timeout 20 + auto-save-interval 200 + ) +#+END_SRC + ** Yes-or-no Because I'm lazy, important yes-or-no questions can be answered with y-or-n: From 43c75a29e21c33f6d73a14375025c43368682297 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 13:03:17 +0200 Subject: [PATCH 022/143] REMOVE custom-set-variables Find a way to move this elegantly to a file which can be ignored by git --- init.el | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/init.el b/init.el index b25e39d..4a3164f 100644 --- a/init.el +++ b/init.el @@ -15,16 +15,3 @@ ;;(when (file-readable-p project-file) ;; (org-babel-load-file (expand-file-name project-file))) ) -(custom-set-variables - ;; custom-set-variables was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - '(package-selected-packages - '(flycheck-clang-tidy org-tree-slide ox-reveal writeroom-mode visual-fill-column org-present clang-format+ dash))) -(custom-set-faces - ;; custom-set-faces was added by Custom. - ;; If you edit it by hand, you could mess it up, so be careful. - ;; Your init file should contain only one such instance. - ;; If there is more than one, they won't work right. - ) From 53dd2a90840d4a723280f9ee460cb59a31a39f7d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 21:37:06 +0200 Subject: [PATCH 023/143] ADD custom ceedling commands Convience function to run the ceedling command --- config_new.org | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/config_new.org b/config_new.org index 43ae68b..8b6a9d7 100644 --- a/config_new.org +++ b/config_new.org @@ -602,3 +602,23 @@ https://github.com/remyferre/comment-dwim-2 (global-set-key (kbd "C-M-w") 'myrmi/save-symbol-at-point) #+END_SRC + +** Ceedling + +#+BEGIN_SRC emacs-lisp +(defvar ceedling-project-file-name "project.yml") +(defvar ceedling-cmd "ceedling") +(defvar ceedling-project-root ".") + +(defun myrmi/run-ceedling-tests (&optional file-name) + (interactive) + (let* ( + (file-path (or file-name buffer-file-name)) + (root-path (or (locate-dominating-file file-path ceedling-project-file-name) ceedling-project-root)) + ) + (compile + (concat "cd " root-path " && " ceedling-cmd) + ) + ) + ) +#+END_SRC From 12b33b1f498bcea3e1edcad76e5bde84ed90ca00 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 12 Sep 2024 21:37:32 +0200 Subject: [PATCH 024/143] PROJECTILE: use hybrid method Gives more flexibility with .projectile file IMO to add/remove folders from projectile-find-file . --- config_new.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 8b6a9d7..07ef738 100644 --- a/config_new.org +++ b/config_new.org @@ -580,7 +580,7 @@ https://github.com/remyferre/comment-dwim-2 (use-package projectile :ensure t :config - (setq projectile-indexing-method 'alien) + (setq projectile-indexing-method 'hybrid) (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) From 832bc40d8141f23bc8d0a607795690d2410f5377 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sat, 14 Sep 2024 08:37:47 +0200 Subject: [PATCH 025/143] Set path/exec-path to shell path For .dir-locals.el to find the custom programs --- config_new.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config_new.org b/config_new.org index 07ef738..e0d116c 100644 --- a/config_new.org +++ b/config_new.org @@ -622,3 +622,16 @@ https://github.com/remyferre/comment-dwim-2 ) ) #+END_SRC + +** Set path to shell path + +#+BEGIN_SRC emacs-lisp +(defun set-exec-path-from-shell-PATH () + (let ((path-from-shell + (replace-regexp-in-string "[[:space:]\n]*$" "" + (shell-command-to-string "$SHELL -l -c 'echo $PATH'")))) + (setenv "PATH" path-from-shell) + (setq exec-path (split-string path-from-shell path-separator)))) + +(set-exec-path-from-shell-PATH) +#+END_SRC From 1475b4acb8e0e163a2edee2d4b1f6dc256fe41a4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 15 Sep 2024 17:46:29 +0200 Subject: [PATCH 026/143] CUSTOM: Add functions to reload .dir-locals.el --- config_new.org | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/config_new.org b/config_new.org index e0d116c..f6f9247 100644 --- a/config_new.org +++ b/config_new.org @@ -635,3 +635,23 @@ https://github.com/remyferre/comment-dwim-2 (set-exec-path-from-shell-PATH) #+END_SRC + +** Reload dir-locals.el + +#+BEGIN_SRC emacs-lisp +(defun myrmi/reload-dir-locals-for-current-buffer () + "Reload dir locals for the current buffer" + (interactive) + (let ((enable-local-variables :all)) + (hack-dir-local-variables-non-file-buffer))) + +(defun myrmi/reload-dir-locals-for-all-buffers-in-this-directory () + "For every buffer with the same `default-directory` as the + current buffer, reload dir-locals." + (interactive) + (let ((dir default-directory)) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (when (equal default-directory dir) + (myrmi/reload-dir-locals-for-current-buffer)))))) +#+END_SRC From f44190a45d0ca5a25241182a0fe670efda7424fa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 15 Sep 2024 17:47:30 +0200 Subject: [PATCH 027/143] ELISP: add demos to describe-function It saves me some extra googling. --- config_new.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config_new.org b/config_new.org index f6f9247..4747938 100644 --- a/config_new.org +++ b/config_new.org @@ -589,6 +589,18 @@ https://github.com/remyferre/comment-dwim-2 ) #+END_SRC +* Elisp + +** Add demos to describe-function + +#+BEGIN_SRC emacs-lisp +(use-package elisp-demos + :ensure t + :config + (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) + ) +#+END_SRC + * Custom ** Save symbol at point From 9d84faf97a55f81ca4f58d6cb2c40f9f07d9aff4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 15 Sep 2024 19:40:21 +0200 Subject: [PATCH 028/143] ADD custom visit/reload config functions --- config_new.org | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/config_new.org b/config_new.org index 4747938..b5d6d45 100644 --- a/config_new.org +++ b/config_new.org @@ -667,3 +667,20 @@ https://github.com/remyferre/comment-dwim-2 (when (equal default-directory dir) (myrmi/reload-dir-locals-for-current-buffer)))))) #+END_SRC + +** Visit/reload config + +These snippets assume my-config-file variable is set outside this configuration. +This should normally be done by the init.el to load this configuration. + +#+BEGIN_SRC emacs-lisp +(defun myrmi/visit-config () + "Reloads ~/.emacs.d/config.org at runtime" + (interactive) + (find-file my-config-file)) + +(defun myrmi/reload-config () + "Reloads ~/.emacs.d/config.org at runtime" + (interactive) + (org-babel-load-file my-config-file)) +#+END_SRC From f121ec0330da1929c07ccea7939309ba013a624b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 17 Sep 2024 20:55:04 +0200 Subject: [PATCH 029/143] REMOVE smartparens Replaced with electric-pair mode, good enough for my usecase. Don't need all the fancy stuff smartparens provides --- config_new.org | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/config_new.org b/config_new.org index b5d6d45..4196378 100644 --- a/config_new.org +++ b/config_new.org @@ -530,22 +530,6 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC -** Smartparens -Smart minor-mode to deal with pairs. - -https://github.com/Fuco1/smartparens - -#+BEGIN_SRC emacs-lisp -(use-package smartparens - :ensure t - :bind - ("C-M-w" . sp-copy-sexp) - :hook (prog-mode text-mode markdown-mode) - :config - (require 'smartparens-config) -) -#+END_SRC - * Multiple cursors #+BEGIN_SRC emacs-lisp From 2c29e771325c2c89730d1f717ab92092325d7451 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:44:13 +0200 Subject: [PATCH 030/143] ADD dumb-jump mode Add it immediatelly to the list of xref backends. --- config_new.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config_new.org b/config_new.org index 4196378..a6901a2 100644 --- a/config_new.org +++ b/config_new.org @@ -530,6 +530,16 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC +** Dumb-jump + +#+BEGIN_SRC emacs-lisp + (use-package dumb-jump + :ensure t + :init + (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) + ) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From 0482e48c7fec99cc0793915ecdf38679fa543731 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:44:41 +0200 Subject: [PATCH 031/143] Ensure eglot does not take full control of Xref Eglot by default will take full control of xref and make the xref-backend-functions (eglot-xref-backend t) . To have dumb-jump as backup if eglot would fail, instruct eglot to stay out of Xref and add/remove eglot xref backend manually. --- config_new.org | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/config_new.org b/config_new.org index a6901a2..91dda14 100644 --- a/config_new.org +++ b/config_new.org @@ -484,19 +484,17 @@ Install and wait for hydra to be available since we are using it in this init.el ** Eglot #+BEGIN_SRC emacs-lisp -(use-package eglot - :ensure t - :defer t - ;; This doesn't work for some reason, workaround below - ;;:hook (prog-mode . eglot-ensure) - ;; :config - ;; (add-hook 'prog-mode-hook 'eglot-ensure) -) -#+END_SRC + (use-package eglot + :ensure t + ) -Workaround to enable eglot in all programming modes: -#+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'eglot-ensure) + (setq eglot-stay-out-of '(xref)) + (add-hook 'prog-mode-hook 'eglot-ensure) + (add-hook 'eglot-managed-mode-hook (lambda () + (if (eglot-managed-p) + (add-hook 'xref-backend-functions 'eglot-xref-backend) + (remove-hook 'xref-backend-functions 'eglot-xref-backend) + ))) #+END_SRC ** Yasnippet From ee7073ea67b013019c785cdc8a57a04166003360 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:46:14 +0200 Subject: [PATCH 032/143] ADD Yasnippet hook to prog- and org-mode --- config_new.org | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 91dda14..4c0966d 100644 --- a/config_new.org +++ b/config_new.org @@ -497,14 +497,17 @@ Install and wait for hydra to be available since we are using it in this init.el ))) #+END_SRC + ** Yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet :ensure t + :hook + (prog-mode . yas-minor-mode) + (org-mode . yas-minor-mode) :config (yas-reload-all) - (add-hook 'prog-mode-hook 'yas-minor-mode) ) #+END_SRC From 8732e361600e8ff50d7000511a98d1c9940999d8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 19 Sep 2024 22:47:48 +0200 Subject: [PATCH 033/143] PROJECTILE: Don't set indexing method This can be forced through .dir.locals.el if necessary. Leave it at default value (alien). --- config_new.org | 1 - 1 file changed, 1 deletion(-) diff --git a/config_new.org b/config_new.org index 4c0966d..52951b8 100644 --- a/config_new.org +++ b/config_new.org @@ -575,7 +575,6 @@ https://github.com/remyferre/comment-dwim-2 (use-package projectile :ensure t :config - (setq projectile-indexing-method 'hybrid) (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) (projectile-mode +1) From 8b3f426ae147d7b10f29485c8a9e1db9833cc354 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 10:08:45 +0200 Subject: [PATCH 034/143] ADD markdown-mode --- config_new.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config_new.org b/config_new.org index 52951b8..a105850 100644 --- a/config_new.org +++ b/config_new.org @@ -497,6 +497,13 @@ Install and wait for hydra to be available since we are using it in this init.el ))) #+END_SRC +** Markdown-mode + +#+BEGIN_SRC emacs-lisp +(use-package markdown-mode + :ensure t +) +#+END_SRC ** Yasnippet From c748fb94c4122ce5ddec48e395e8dcf5d0c24de9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 10:09:13 +0200 Subject: [PATCH 035/143] ADD treesitter-mode for C --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index a105850..a68be07 100644 --- a/config_new.org +++ b/config_new.org @@ -548,6 +548,14 @@ Magit depends on this and it seems it's not installed as a dependency, so instal ) #+END_SRC +** C-programming + +*** Tree-sitter + +#+BEGIN_SRC emacs-lisp +(add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode)) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From 69010af86e84d20710cea13e5b70365248c19314 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:35:15 +0200 Subject: [PATCH 036/143] INIT: Fix config file name for myrmi/{visit,reload}-config --- init.el | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/init.el b/init.el index 4a3164f..bd22fe2 100644 --- a/init.el +++ b/init.el @@ -5,11 +5,10 @@ ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (defvar config-file (expand-file-name "config_new.org" user-emacs-directory)) - ;;(defvar project-file (expand-file-name "project.org" user-emacs-directory)) + (defvar my-config-file (expand-file-name "config_new.org" user-emacs-directory)) - (when (file-readable-p config-file) - (org-babel-load-file (expand-file-name config-file))) + (when (file-readable-p my-config-file) + (org-babel-load-file (expand-file-name my-config-file))) ;; If it exists, load some project-specific configurations. ;;(when (file-readable-p project-file) From cdcd5779395fd75e7f5158ce73715767567b75c0 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:35:37 +0200 Subject: [PATCH 037/143] INIT: Move customization to its own file that we can ignore --- .gitignore | 1 + init.el | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7ea8f90 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +custom.el diff --git a/init.el b/init.el index bd22fe2..2676b28 100644 --- a/init.el +++ b/init.el @@ -4,13 +4,12 @@ ;;; https://jonnay.github.io/emagicians-starter-kit/Emagician-Base.html ;;; ... (let ((gc-cons-threshold most-positive-fixnum)) + (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (defvar my-config-file (expand-file-name "config_new.org" user-emacs-directory)) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - ;; If it exists, load some project-specific configurations. - ;;(when (file-readable-p project-file) - ;; (org-babel-load-file (expand-file-name project-file))) + (load custom-file) ) From f1eed76f1ba039cd7128f3376f59de4ee5806972 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:36:22 +0200 Subject: [PATCH 038/143] SNIPPET: Add c-define snippet --- snippets/c-mode/define | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 snippets/c-mode/define diff --git a/snippets/c-mode/define b/snippets/c-mode/define new file mode 100644 index 0000000..eb89c4a --- /dev/null +++ b/snippets/c-mode/define @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: Make a define +# key: def +# -- + +#define ${1:mydefine$(upcase yas-text)} $2 From 1449ae0e5f1fc955babea40850f9ac67ecb30686 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:37:12 +0200 Subject: [PATCH 039/143] SNIPPET: Add org source-code-block snippet --- snippets/org-mode/emacs-lisp-source-block | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 snippets/org-mode/emacs-lisp-source-block diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block new file mode 100644 index 0000000..c0d946b --- /dev/null +++ b/snippets/org-mode/emacs-lisp-source-block @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: Lisp source code block +# key: se> +# -- + +#+BEGIN_SRC emacs-lisp +#+END_SRC From 752734c381e7fbf0a7d4a0f1a549e6ce994b6d2f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 20 Sep 2024 18:37:22 +0200 Subject: [PATCH 040/143] SNIPPET: Add git-commit message template --- snippets/text-mode/git-commit-message-before-after | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 snippets/text-mode/git-commit-message-before-after diff --git a/snippets/text-mode/git-commit-message-before-after b/snippets/text-mode/git-commit-message-before-after new file mode 100644 index 0000000..983e180 --- /dev/null +++ b/snippets/text-mode/git-commit-message-before-after @@ -0,0 +1,10 @@ +# -*- mode: snippet -*- +# name: Git commit message template +# key: bac +# -- + +Before this commit, +${1} + +After this commit, +${2} From 31da5498b610e723a71900b38ef829bd2c91211d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:16:05 +0200 Subject: [PATCH 041/143] SNIPPETS: Fix org mode lisp source block snippet + add general source block --- snippets/org-mode/emacs-lisp-source-block | 2 +- snippets/org-mode/source_block_emacs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 snippets/org-mode/source_block_emacs diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index c0d946b..5909c42 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -1,6 +1,6 @@ # -*- mode: snippet -*- # name: Lisp source code block -# key: se> +# key: s> # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs new file mode 100644 index 0000000..98bfd6f --- /dev/null +++ b/snippets/org-mode/source_block_emacs @@ -0,0 +1,7 @@ +# -*- mode: snippet -*- +# name: Start emacs source block +# key: se> +# -- + +#+BEGIN_SRC emacs-lisp +#+END_SRC From 091b5fbda2a9953e69b4153229eceffc68056c22 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:17:30 +0200 Subject: [PATCH 042/143] GENERAL: Enable delete-selection-mode --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index a68be07..b48f483 100644 --- a/config_new.org +++ b/config_new.org @@ -385,6 +385,12 @@ Look into customizing the 'ispell' group. (add-hook 'prog-mode-hook 'flyspell-prog-mode) #+end_src +** Delete selection mode + +#+BEGIN_SRC emacs-lisp +(delete-selection-mode t) +#+END_SRC + * Dired #+begin_src emacs-lisp From 6f306b4ea51ad6c701a2696f9c0e1e3c03cb7ee8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:26:12 +0200 Subject: [PATCH 043/143] Add "Enable disabled commands" section Enable narrow functions cause they're really handy. --- config_new.org | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config_new.org b/config_new.org index b48f483..b329034 100644 --- a/config_new.org +++ b/config_new.org @@ -391,6 +391,16 @@ Look into customizing the 'ispell' group. (delete-selection-mode t) #+END_SRC +** Enable disabled commands + +Some commands are disabled to protect the user. +Narrow-region/page is a really handy feature, enable it: + +#+BEGIN_SRC emacs-lisp +(put 'narrow-to-page 'disabled nil) +(put 'narrow-to-region 'disabled nil) +#+END_SRC + * Dired #+begin_src emacs-lisp From 012e96051096f337035ff8cdbd194ac6b81c968f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:44:09 +0200 Subject: [PATCH 044/143] COMPILATION: goto end of buffer on completion --- config_new.org | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config_new.org b/config_new.org index b329034..2f066d7 100644 --- a/config_new.org +++ b/config_new.org @@ -572,6 +572,21 @@ Magit depends on this and it seems it's not installed as a dependency, so instal (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode)) #+END_SRC +** Compilation + +*** Goto end of buffer on completion + +Compilation output is almost always bigger than a normal buffer. +Move to the end if the compilation finishes. + +#+BEGIN_SRC emacs-lisp +(defun goto-end-compilation-buffer (comp-buffer msg) + (goto-char (point-max)) + ) + +(add-hook 'compilation-finish-functions #'goto-end-compilation-buffer) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From 6e52096e2d7cb214dec17b32a23b656b1f9bb57b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 11:48:43 +0200 Subject: [PATCH 045/143] Only load custom file if it exists --- init.el | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/init.el b/init.el index 2676b28..2ee5b47 100644 --- a/init.el +++ b/init.el @@ -11,5 +11,6 @@ (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (load custom-file) + (when (file-readable-p custom-file) + (load custom-file)) ) From 1b6619a978d0e6034cfea5ad2ba5e87472c82f28 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:18:32 +0200 Subject: [PATCH 046/143] USE_PACKAGE: always set ':ensure t' by default --- config_new.org | 123 +++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 66 deletions(-) diff --git a/config_new.org b/config_new.org index 2f066d7..5245488 100644 --- a/config_new.org +++ b/config_new.org @@ -62,7 +62,6 @@ #+BEGIN_SRC emacs-lisp ;; Enable vertico (use-package vertico - :ensure t ;; :custom ;; (vertico-scroll-margin 0) ;; Different scroll margin ;; (vertico-count 20) ;; Show more candidates @@ -76,7 +75,6 @@ #+BEGIN_SRC emacs-lisp (use-package consult - :ensure t ;; Replace bindings. Lazily loaded by `use-package'. :bind (;; C-c bindings in `mode-specific-map' ;; ("C-c M-x" . consult-mode-command) @@ -186,55 +184,53 @@ ** Corfu #+BEGIN_SRC emacs-lisp - (use-package corfu - :ensure t - ;; Optional customizations - ;; :custom - ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' - ;; (corfu-auto t) ;; Enable auto completion - ;; (corfu-separator ?\s) ;; Orderless field separator - ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary - ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match - ;; (corfu-preview-current nil) ;; Disable current candidate preview - ;; (corfu-preselect 'prompt) ;; Preselect the prompt - ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches - ;; (corfu-scroll-margin 5) ;; Use scroll margin +(use-package corfu + ;; Optional customizations + ;; :custom + ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + ;; (corfu-auto t) ;; Enable auto completion + ;; (corfu-separator ?\s) ;; Orderless field separator + ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary + ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match + ;; (corfu-preview-current nil) ;; Disable current candidate preview + ;; (corfu-preselect 'prompt) ;; Preselect the prompt + ;; (corfu-on-exact-match nil) ;; Configure handling of exact matches + ;; (corfu-scroll-margin 5) ;; Use scroll margin - ;; Enable Corfu only for certain modes. See also `global-corfu-modes'. - ;; :hook ((prog-mode . corfu-mode) - ;; (shell-mode . corfu-mode) - ;; (eshell-mode . corfu-mode)) + ;; Enable Corfu only for certain modes. See also `global-corfu-modes'. + ;; :hook ((prog-mode . corfu-mode) + ;; (shell-mode . corfu-mode) + ;; (eshell-mode . corfu-mode)) - ;; Recommended: Enable Corfu globally. This is recommended since Dabbrev can - ;; be used globally (M-/). See also the customization variable - ;; `global-corfu-modes' to exclude certain modes. - :init - (global-corfu-mode)) + ;; Recommended: Enable Corfu globally. This is recommended since Dabbrev can + ;; be used globally (M-/). See also the customization variable + ;; `global-corfu-modes' to exclude certain modes. + :init + (global-corfu-mode)) #+end_src ** Orderless #+begin_src emacs-lisp - (use-package orderless - :ensure t - :demand t - :custom - (completion-styles '(orderless basic)) - ;; (gnus-completion-styles '(orderless substring basic)) - ;; (completion-category-overrides '((file (styles basic partial-completion)))) +(use-package orderless + :demand t + :custom + (completion-styles '(orderless basic)) + ;; (gnus-completion-styles '(orderless substring basic)) + ;; (completion-category-overrides '((file (styles basic partial-completion)))) - ;; Below not necessary if using vertico - ;; (completion-category-overrides '( - ;; (command (styles orderless basic partial-completion)) - ;; (file (styles orderless basic partial-completion)) - ;;;; (buffer (styles orderless basic)) - ;; (variable (styles orderless basic)) - ;; (symbol (styles orderless basic)) - ;; (consult-location (styles orderless)) - ;; (consult-multi (styles orderless)) - ;; ) - ;; ) - ) +;; Below not necessary if using vertico +;; (completion-category-overrides '( +;; (command (styles orderless basic partial-completion)) +;; (file (styles orderless basic partial-completion)) +;;;; (buffer (styles orderless basic)) +;; (variable (styles orderless basic)) +;; (symbol (styles orderless basic)) +;; (consult-location (styles orderless)) +;; (consult-multi (styles orderless)) +;; ) +;; ) +) #+end_src ** Marginalia @@ -242,7 +238,6 @@ #+begin_src emacs-lisp ;; Enable rich annotations using the Marginalia package (use-package marginalia - :ensure t ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding ;; available in the *Completions* buffer, add it to the ;; `completion-list-mode-map'. @@ -251,7 +246,6 @@ ;; The :init section is always executed. :init - ;; Marginalia must be activated in the :init section of use-package such that ;; the mode gets enabled right away. Note that this forces loading the ;; package. @@ -401,6 +395,15 @@ Narrow-region/page is a really handy feature, enable it: (put 'narrow-to-region 'disabled nil) #+END_SRC +** Use-package + +*** Always ensure + +#+BEGIN_SRC emacs-lisp +(require 'use-package-ensure) +(setq use-package-always-ensure t) +#+END_SRC + * Dired #+begin_src emacs-lisp @@ -416,7 +419,7 @@ Operate on the current line if no region is active. #+begin_src emacs-lisp (use-package whole-line-or-region - :ensure t + :config (whole-line-or-region-global-mode 1) ) @@ -454,7 +457,7 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+BEGIN_SRC emacs-lisp (use-package monokai-theme - :ensure t + :init (load-theme 'monokai t) ) @@ -464,7 +467,6 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+begin_src emacs-lisp (use-package dashboard - :ensure t :config (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) (add-hook 'elpaca-after-init-hook #'dashboard-initialize) @@ -500,9 +502,7 @@ Install and wait for hydra to be available since we are using it in this init.el ** Eglot #+BEGIN_SRC emacs-lisp - (use-package eglot - :ensure t - ) + (use-package eglot) (setq eglot-stay-out-of '(xref)) (add-hook 'prog-mode-hook 'eglot-ensure) @@ -516,16 +516,14 @@ Install and wait for hydra to be available since we are using it in this init.el ** Markdown-mode #+BEGIN_SRC emacs-lisp -(use-package markdown-mode - :ensure t -) +(use-package markdown-mode) + #+END_SRC ** Yasnippet #+BEGIN_SRC emacs-lisp (use-package yasnippet - :ensure t :hook (prog-mode . yas-minor-mode) (org-mode . yas-minor-mode) @@ -541,24 +539,20 @@ Install and wait for hydra to be available since we are using it in this init.el Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. #+BEGIN_SRC emacs-lisp -(use-package transient - :ensure t - ) +(use-package transient) #+END_SRC *** Core #+BEGIN_SRC emacs-lisp -(use-package magit - :ensure t -) +(use-package magit) + #+END_SRC ** Dumb-jump #+BEGIN_SRC emacs-lisp (use-package dumb-jump - :ensure t :init (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) ) @@ -591,7 +585,6 @@ Move to the end if the compilation finishes. #+BEGIN_SRC emacs-lisp (use-package multiple-cursors - :ensure t :bind ("C-x r a" . mc/edit-beginnings-of-lines) ("C-x r e" . mc/edit-ends-of-lines) @@ -609,7 +602,6 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package comment-dwim-2 - :ensure t :config (global-set-key (kbd "M-;") 'comment-dwim-2) ) @@ -619,7 +611,6 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package projectile - :ensure t :config (setq projectile-enable-caching t) (define-key projectile-mode-map (kbd "C-x p") 'projectile-command-map) @@ -635,7 +626,7 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package elisp-demos - :ensure t + :config (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) ) From 074c5fe0b1696680e28b5d6ea41236324b1889bd Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:19:06 +0200 Subject: [PATCH 047/143] ADD Org mode settings from old config - Enable Super/sub-scripts - Preserve indentation - Org bullets --- config_new.org | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 5245488..0774e54 100644 --- a/config_new.org +++ b/config_new.org @@ -620,13 +620,41 @@ https://github.com/remyferre/comment-dwim-2 ) #+END_SRC +* Org + +** General config +*** Super/Sub-scripts + +Use ={}= for subscripting: + +https://orgmode.org/manual/Subscripts-and-superscripts.html + +#+BEGIN_SRC emacs-lisp +(setq org-use-sub-superscripts '{}) +#+END_SRC + +*** Indentation + +Preserve indentation in SRC blocks + +#+BEGIN_SRC emacs-lisp +(setq org-src-preserve-indentation t) +#+END_SRC + +** Org bullets + +#+BEGIN_SRC emacs-lisp +(use-package org-bullets + :config + (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) +#+END_SRC + * Elisp ** Add demos to describe-function #+BEGIN_SRC emacs-lisp (use-package elisp-demos - :config (advice-add 'describe-function-1 :after #'elisp-demos-advice-describe-function-1) ) From e02a1990aac09ddfd67e184a961fbf2e8fb1d373 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:19:24 +0200 Subject: [PATCH 048/143] ADD Zygospore from old config It's too usefull not to have --- config_new.org | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/config_new.org b/config_new.org index 0774e54..5b85570 100644 --- a/config_new.org +++ b/config_new.org @@ -492,6 +492,20 @@ Install and wait for hydra to be available since we are using it in this init.el ) #+end_src +* Zygospore + +Revert =C-x 1= by pressing =C-x 1= again: +[[https://github.com/louiskottmann/zygospore.el]] + +FYI: At one point, used this together with sr-speedbar. They did not play well together... + +#+BEGIN_SRC emacs-lisp +(use-package zygospore + :config + (global-set-key (kbd "C-x 1") 'zygospore-toggle-delete-other-windows) +) +#+END_SRC + * Programming ** Electric pair From 122f1f51865675ef3d200af377258298a5a147b9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:19:48 +0200 Subject: [PATCH 049/143] ADD Iedit from old config It's too usefull not to have --- config_new.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config_new.org b/config_new.org index 5b85570..78c1d6b 100644 --- a/config_new.org +++ b/config_new.org @@ -506,6 +506,17 @@ FYI: At one point, used this together with sr-speedbar. They did not play well t ) #+END_SRC +* Iedit + +Highlight occurences of symbol and replace them simultanously. +Shortkey: =C-;= + +https://github.com/victorhge/iedit + +#+BEGIN_SRC emacs-lisp +(use-package iedit) +#+END_SRC + * Programming ** Electric pair From d757ce44a819506691a9f97d08fe28f963dd4e9c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:51:57 +0200 Subject: [PATCH 050/143] GENERAL: Move general config first before vertico stack This fixes the init error on vertico stack symbols not being known due to ':ensure' being removed since it should be enabled by default but this was only done later in the 'general config' section. --- config_new.org | 305 +++++++++++++++++++++++++------------------------ 1 file changed, 153 insertions(+), 152 deletions(-) diff --git a/config_new.org b/config_new.org index 78c1d6b..e4d24d6 100644 --- a/config_new.org +++ b/config_new.org @@ -55,6 +55,159 @@ ) #+end_src +* General config + +** Delete trailing whitespaces + +#+BEGIN_SRC emacs-lisp +(add-hook 'before-save-hook 'delete-trailing-whitespace) +#+END_SRC + +** Save history and recent files + +#+begin_src emacs-lisp +;; The built-in `savehist-mode' saves minibuffer histories. Vertico +;; can then use that information to put recently selected options at +;; the top. +;; +;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a +(savehist-mode 1) + +;; The built-in `recentf-mode' keeps track of recently visited files. +;; You can then access those through the `consult-buffer' interface or +;; with `recentf-open'/`recentf-open-files'. +;; +;; I do not use this facility, because the files I care about are +;; either in projects or are bookmarked. +(recentf-mode 1) +#+end_src + +** Backups + +#+BEGIN_SRC emacs-lisp +(defvar myrmi-backup-directory (concat user-emacs-directory "backups")) +(if (not (file-exists-p myrmi-backup-directory)) + (make-directory myrmi-backup-directory t) + ) +(setq backup-directory-alist `(("." . ,myrmi-backup-directory))) +(setq make-backup-files t + backup-by-copying t + version-control t + delete-old-versions t + delete-by-moving-to-trash t + kept-old-versions 6 + kept-new-versions 9 + auto-save-default t + auto-save-timeout 20 + auto-save-interval 200 + ) +#+END_SRC + +** Yes-or-no + +Because I'm lazy, important yes-or-no questions can be answered with y-or-n: +#+begin_src emacs-lisp +(defalias 'yes-or-no-p 'y-or-n-p) +#+end_src + +** Switch windows + +#+begin_src emacs-lisp +(global-set-key (kbd "M-o") 'other-window) +#+end_src + +** Maximize at startup + +More info : https://www.emacswiki.org/emacs/FullScreen + +#+begin_src emacs-lisp +(push '(fullscreen . maximized) default-frame-alist) +#+end_src + +** ibuffer + +Use list-buffers bigger brother. +#+begin_src emacs-lisp +(global-set-key [remap list-buffers] 'ibuffer) +#+end_src + +** Mark + +#+begin_src emacs-lisp +(global-set-key (kbd "M-SPC") 'mark-word) +#+end_src + +** Isearch + +Display number of matches: +#+begin_src emacs-lisp +(setq-default isearch-lazy-count t) +#+end_src + +Reference that might be interesting for later: +https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html + +** Sudo file + +#+begin_src emacs-lisp +(defun sudo () + "Use TRAMP to `sudo' the current buffer." + (interactive) + (when buffer-file-name + (find-alternate-file + (concat "/sudo:root@localhost:" + buffer-file-name) + ) + ) +) +#+end_src + +** Abbrev + +#+begin_src emacs-lisp +(global-set-key [remap dabbrev-expand] 'hippie-expand) +#+end_src + +** Zap + +#+begin_src emacs-lisp +(global-set-key (kbd "M-S-z") 'zap-up-to-char) +#+end_src + +** Spell checking + +Look into customizing the 'ispell' group. + +#+begin_src emacs-lisp +(add-hook 'prog-mode-hook 'flyspell-prog-mode) +#+end_src + +** Delete selection mode + +#+BEGIN_SRC emacs-lisp +(delete-selection-mode t) +#+END_SRC + +** Enable disabled commands + +Some commands are disabled to protect the user. +Narrow-region/page is a really handy feature, enable it: + +#+BEGIN_SRC emacs-lisp +(put 'narrow-to-page 'disabled nil) +(put 'narrow-to-region 'disabled nil) +#+END_SRC + +** Use-package + +*** Always ensure + +#+BEGIN_SRC emacs-lisp +(require 'use-package-ensure) +(setq use-package-always-ensure t) +#+END_SRC + +** Adaptive cursor width * Vertico-stack ** Vertico @@ -252,158 +405,6 @@ (marginalia-mode)) #+end_src -* General config - -** Delete trailing whitespaces - -#+BEGIN_SRC emacs-lisp -(add-hook 'before-save-hook 'delete-trailing-whitespace) -#+END_SRC - -** Save history and recent files - -#+begin_src emacs-lisp -;; The built-in `savehist-mode' saves minibuffer histories. Vertico -;; can then use that information to put recently selected options at -;; the top. -;; -;; Further reading: https://protesilaos.com/emacs/dotemacs#h:25765797-27a5-431e-8aa4-cc890a6a913a -(savehist-mode 1) - -;; The built-in `recentf-mode' keeps track of recently visited files. -;; You can then access those through the `consult-buffer' interface or -;; with `recentf-open'/`recentf-open-files'. -;; -;; I do not use this facility, because the files I care about are -;; either in projects or are bookmarked. -(recentf-mode 1) -#+end_src - -** Backups - -#+BEGIN_SRC emacs-lisp -(defvar myrmi-backup-directory (concat user-emacs-directory "backups")) -(if (not (file-exists-p myrmi-backup-directory)) - (make-directory myrmi-backup-directory t) - ) -(setq backup-directory-alist `(("." . ,myrmi-backup-directory))) -(setq make-backup-files t - backup-by-copying t - version-control t - delete-old-versions t - delete-by-moving-to-trash t - kept-old-versions 6 - kept-new-versions 9 - auto-save-default t - auto-save-timeout 20 - auto-save-interval 200 - ) -#+END_SRC - -** Yes-or-no - -Because I'm lazy, important yes-or-no questions can be answered with y-or-n: -#+begin_src emacs-lisp -(defalias 'yes-or-no-p 'y-or-n-p) -#+end_src - -** Switch windows - -#+begin_src emacs-lisp -(global-set-key (kbd "M-o") 'other-window) -#+end_src - -** Maximize at startup - -More info : https://www.emacswiki.org/emacs/FullScreen - -#+begin_src emacs-lisp -(push '(fullscreen . maximized) default-frame-alist) -#+end_src - -** ibuffer - -Use list-buffers bigger brother. -#+begin_src emacs-lisp -(global-set-key [remap list-buffers] 'ibuffer) -#+end_src - -** Mark - -#+begin_src emacs-lisp -(global-set-key (kbd "M-SPC") 'mark-word) -#+end_src - -** Isearch - -Display number of matches: -#+begin_src emacs-lisp -(setq-default isearch-lazy-count t) -#+end_src - -Reference that might be interesting for later: -https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html - -** Sudo file - -#+begin_src emacs-lisp -(defun sudo () - "Use TRAMP to `sudo' the current buffer." - (interactive) - (when buffer-file-name - (find-alternate-file - (concat "/sudo:root@localhost:" - buffer-file-name) - ) - ) -) -#+end_src - -** Abbrev - -#+begin_src emacs-lisp -(global-set-key [remap dabbrev-expand] 'hippie-expand) -#+end_src - -** Zap - -#+begin_src emacs-lisp -(global-set-key (kbd "M-S-z") 'zap-up-to-char) -#+end_src - -** Spell checking - -Look into customizing the 'ispell' group. - -#+begin_src emacs-lisp -(add-hook 'prog-mode-hook 'flyspell-prog-mode) -#+end_src - -** Delete selection mode - -#+BEGIN_SRC emacs-lisp -(delete-selection-mode t) -#+END_SRC - -** Enable disabled commands - -Some commands are disabled to protect the user. -Narrow-region/page is a really handy feature, enable it: - -#+BEGIN_SRC emacs-lisp -(put 'narrow-to-page 'disabled nil) -(put 'narrow-to-region 'disabled nil) -#+END_SRC - -** Use-package - -*** Always ensure - -#+BEGIN_SRC emacs-lisp -(require 'use-package-ensure) -(setq use-package-always-ensure t) -#+END_SRC - * Dired #+begin_src emacs-lisp From f6c14e7caaf7e111c19a662ba0772f910994e28a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 22 Sep 2024 17:52:43 +0200 Subject: [PATCH 051/143] GENERAL: Add adaptive cursor width --- config_new.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config_new.org b/config_new.org index e4d24d6..a070af1 100644 --- a/config_new.org +++ b/config_new.org @@ -208,6 +208,13 @@ Narrow-region/page is a really handy feature, enable it: #+END_SRC ** Adaptive cursor width + +Make cursor the width of the character it is under f.e. full width of a tab. + +#+BEGIN_SRC emacs-lisp +(setq x-stretch-cursor t) +#+END_SRC + * Vertico-stack ** Vertico From 2be3a79aed9d452c3ceaa877b7a5e702fa42ebdb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:22:11 +0200 Subject: [PATCH 052/143] CORFU: Enable automatic completion in buffer Also cycle if we reach begin/end of list of candidates. --- config_new.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config_new.org b/config_new.org index a070af1..3b57a67 100644 --- a/config_new.org +++ b/config_new.org @@ -346,9 +346,9 @@ Make cursor the width of the character it is under f.e. full width of a tab. #+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations - ;; :custom - ;; (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' - ;; (corfu-auto t) ;; Enable auto completion + :custom + (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' + (corfu-auto t) ;; Enable auto completion ;; (corfu-separator ?\s) ;; Orderless field separator ;; (corfu-quit-at-boundary nil) ;; Never quit at completion boundary ;; (corfu-quit-no-match nil) ;; Never quit, even if there is no match From 539570657720a3115efe678023572723cb54c733 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:26:43 +0200 Subject: [PATCH 053/143] ORG_MODE: Fix snippets to place cursor inside source block --- snippets/org-mode/emacs-lisp-source-block | 1 + snippets/org-mode/source_block_emacs | 1 + 2 files changed, 2 insertions(+) diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 5909c42..2f90c13 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -4,4 +4,5 @@ # -- #+BEGIN_SRC emacs-lisp +${1} #+END_SRC diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index 98bfd6f..73ed1eb 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -4,4 +4,5 @@ # -- #+BEGIN_SRC emacs-lisp +${1} #+END_SRC From 584a0b1b7cb31ef105320224dd223fddf2bffa81 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:27:02 +0200 Subject: [PATCH 054/143] MAGIT: Add example command to update submodules --- config_new.org | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/config_new.org b/config_new.org index 3b57a67..e40e8b3 100644 --- a/config_new.org +++ b/config_new.org @@ -572,16 +572,36 @@ https://github.com/victorhge/iedit Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. #+BEGIN_SRC emacs-lisp -(use-package transient) +(use-package transient + :ensure (:wait t) +) #+END_SRC *** Core #+BEGIN_SRC emacs-lisp -(use-package magit) +(use-package magit +:ensure (:wait t) +) #+END_SRC +**** Extra commands + +***** Update all submodules + +#+BEGIN_SRC emacs-lisp +(transient-define-suffix magit-submodule-update-all () + "Update all submodules" + :description "Update All git submodule update --init --recursive" + (interactive) + (magit-with-toplevel + (magit-run-git-async "submodule" "update" "--force"))) + +(transient-append-suffix 'magit-submodule "f" + '("U" magit-submodule-update-all)) +#+END_SRC + ** Dumb-jump #+BEGIN_SRC emacs-lisp From 5ef08b39b658e61cc8bf3ec63190beb9af6aeeec Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:31:10 +0200 Subject: [PATCH 055/143] ADD volatile highlights --- config_new.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config_new.org b/config_new.org index e40e8b3..74af99d 100644 --- a/config_new.org +++ b/config_new.org @@ -647,6 +647,19 @@ Move to the end if the compilation finishes. ) #+END_SRC +* Volatile highlights + +Show/highlight changes when doing undo/yanks/kills/... + +https://github.com/k-talo/volatile-highlights.el + +#+BEGIN_SRC emacs-lisp +(use-package volatile-highlights + :config + (volatile-highlights-mode t) +) +#+END_SRC + * Comment-dwim-2 Replacement for built-in =comment-dwim=, more comment features. From 78afc078ff26793a208fd2221226a5586cda6937 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 23 Sep 2024 16:35:04 +0200 Subject: [PATCH 056/143] GENERAL: Enable column numbers --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index 74af99d..4f8f1e8 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,12 @@ * General config +** Enable column numbers + +#+BEGIN_SRC emacs-lisp +(setq column-number-mode 1) +#+END_SRC + ** Delete trailing whitespaces #+BEGIN_SRC emacs-lisp From d5f79bf639b40b574eba68ef8a3182e7d13da9b6 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:08 +0200 Subject: [PATCH 057/143] ADD angry faces face to major prog modes --- config_new.org | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/config_new.org b/config_new.org index 4f8f1e8..debb4fc 100644 --- a/config_new.org +++ b/config_new.org @@ -533,6 +533,28 @@ https://github.com/victorhge/iedit * Programming +** Angry faces + +#+BEGIN_SRC emacs-lisp +(defface highlight-angry-faces + '( + (default :background "Yellow" :foreground "Red") + ) + "Angry faces highlighting." + :group 'basic-faces +) + +(mapc (lambda (mode) + (font-lock-add-keywords + mode + '( + ("\\<\\(FIXME\\)" 1 'highlight-angry-faces t) + ("\\<\\(TODO\\)" 1 'highlight-angry-faces t) + ))) + '(text-mode emacs-lisp-mode rust-mode zig-mode c-ts-mode c-mode prog-mode) +) +#+END_SRC + ** Electric pair #+BEGIN_SRC emacs-lisp (add-hook 'prog-mode-hook 'electric-pair-mode) From 954196d061579ea8f3f1bcb47c502fa2a7cb8987 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:25 +0200 Subject: [PATCH 058/143] ADD rust-mode --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index debb4fc..bbc9811 100644 --- a/config_new.org +++ b/config_new.org @@ -662,6 +662,14 @@ Move to the end if the compilation finishes. (add-hook 'compilation-finish-functions #'goto-end-compilation-buffer) #+END_SRC +** Rust + +#+BEGIN_SRC emacs-lisp +(use-package rust-mode + :init + (setq rust-mode-treesitter-derive t)) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From f2cfe8035ca1accfd5af44edcfd6ee4f320817d5 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:32 +0200 Subject: [PATCH 059/143] ADD zig mode --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index bbc9811..9ff9041 100644 --- a/config_new.org +++ b/config_new.org @@ -670,6 +670,12 @@ Move to the end if the compilation finishes. (setq rust-mode-treesitter-derive t)) #+END_SRC +** Zig + +#+BEGIN_SRC emacs-lisp +(use-package zig-mode) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From edee35724e51d847cda9e9c92a7033701517851d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:31:37 +0200 Subject: [PATCH 060/143] ADD python mode --- config_new.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config_new.org b/config_new.org index 9ff9041..330635d 100644 --- a/config_new.org +++ b/config_new.org @@ -676,6 +676,12 @@ Move to the end if the compilation finishes. (use-package zig-mode) #+END_SRC +** Python + +#+BEGIN_SRC emacs-lisp +(use-package python-mode) +#+END_SRC + * Multiple cursors #+BEGIN_SRC emacs-lisp From c31bd5ab5b097ca77e18e7c0a94fe87f23fe7238 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:32:27 +0200 Subject: [PATCH 061/143] ADD visible bell --- config_new.org | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/config_new.org b/config_new.org index 330635d..c7ee028 100644 --- a/config_new.org +++ b/config_new.org @@ -57,6 +57,14 @@ * General config +** Bell + +The audible bell is annoying AF. + +#+BEGIN_SRC emacs-lisp +(setq visible-bell 1) +#+END_SRC + ** Enable column numbers #+BEGIN_SRC emacs-lisp From d3f6a04e9bee99bdb1428dd2dc13ee5184e2856b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 11:37:07 +0200 Subject: [PATCH 062/143] ADD resize-mode --- config_new.org | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/config_new.org b/config_new.org index c7ee028..5633e96 100644 --- a/config_new.org +++ b/config_new.org @@ -229,6 +229,62 @@ Make cursor the width of the character it is under f.e. full width of a tab. (setq x-stretch-cursor t) #+END_SRC +* Resize-mode + +Minor-mode to easily resize frames (works with EXWM (firefox, ...)). +Courtesy goes to kuanyui (https://gist.github.com/kuanyui/65a408d393871048771c): + +#+BEGIN_SRC emacs-lisp +;;; resize-frame.el --- A minor mode to resize frames easily. -*- lexical-binding: t; -*- + +;; Copyright (C) 2014 kuanyui + +;; Author: kuanyui +;; Keywords: frames, tools, convenience +;; License: WTFPL 1.0 + +;;; Commentary: + +;; Press "ESC `" and use arrow-keys or i/j/k/l to adjust frames. press any key to done. + +;;; Code: + +(defvar resize-frame-map + (let ((map (make-keymap))) + (define-key map (kbd "") 'enlarge-window) + (define-key map (kbd "") 'shrink-window) + (define-key map (kbd "") 'enlarge-window-horizontally) + (define-key map (kbd "") 'shrink-window-horizontally) + (set-char-table-range (nth 1 map) t 'resize-frame-done) + (define-key map (kbd "C-p") 'enlarge-window) + (define-key map (kbd "C-n") 'shrink-window) + (define-key map (kbd "C-f") 'enlarge-window-horizontally) + (define-key map (kbd "C-b") 'shrink-window-horizontally) + map)) + +(define-minor-mode resize-frame + "A simple minor mode to resize-frame. +C-c C-c to apply." + ;; The initial value. + :init-value nil + ;; The indicator for the mode line. + :lighter " ResizeFrame" + ;; The minor mode bindings. + :keymap resize-frame-map + :global t + (if (<= (length (window-list)) 1) + (progn (setq resize-frame nil) + (message "Only root frame exists, abort.")) + (message "Use arrow-keys or i/j/k/l to adjust frames."))) + +(defun resize-frame-done () + (interactive) + (setq resize-frame nil) + (message "Done.")) + +(global-set-key (kbd "C-x C-r") 'resize-frame) +#+END_SRC + * Vertico-stack ** Vertico From 55e765911ef76e71cc69b9ec34496d74305da70b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:24:29 +0200 Subject: [PATCH 063/143] Rename Vertico-stack to Completion section --- config_new.org | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/config_new.org b/config_new.org index 5633e96..59c02ef 100644 --- a/config_new.org +++ b/config_new.org @@ -285,9 +285,8 @@ C-c C-c to apply." (global-set-key (kbd "C-x C-r") 'resize-frame) #+END_SRC -* Vertico-stack - -** Vertico +* Completion +** Minibuffer #+BEGIN_SRC emacs-lisp ;; Enable vertico From 4233409d50e835860e3741fbc0ecd452d3e27423 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:27:16 +0200 Subject: [PATCH 064/143] Enable dired-x whenever dired mode is invoked --- config_new.org | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/config_new.org b/config_new.org index 59c02ef..83529a9 100644 --- a/config_new.org +++ b/config_new.org @@ -483,8 +483,20 @@ C-c C-c to apply." * Dired +** Dired-x + #+begin_src emacs-lisp -(require 'dired-x) +(with-eval-after-load 'dired + (require 'dired-x) + ;; Set dired-x global variables here. For example: + ;; (setq dired-x-hands-off-my-keys nil) + )) + +(add-hook 'dired-mode-hook + (lambda () + ;; Set dired-x buffer-local variables here. For example: + ;; (dired-omit-mode 1) + )) #+end_src * Whole-line-or-region From caf08093ddffa08e6c5885e4b2bd378443298cc4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:44:32 +0200 Subject: [PATCH 065/143] ADD eshell plan9/smart-mode settings --- config_new.org | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/config_new.org b/config_new.org index 83529a9..90bcdd7 100644 --- a/config_new.org +++ b/config_new.org @@ -515,6 +515,21 @@ Operate on the current line if no region is active. #+end_src * Terminal +** Eshell +*** Smart mode + +Plan 9 smart terminal features, for more info: +https://www.masteringemacs.org/article/complete-guide-mastering-eshell + +#+BEGIN_SRC emacs-lisp +(require 'eshell) +(require 'em-smart) +(setq eshell-where-to-jump 'begin) +(setq eshell-review-quick-commands nil) +(setq eshell-smart-space-goes-to-end t) + +(add-hook 'eshell-mode-hook 'eshell-smart-initialize) +#+END_SRC ** Toggle between char- and line-mode From cb018ca96b1dea4d2f300521084d14359e404e20 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:47:22 +0200 Subject: [PATCH 066/143] Move config.org to config_old.org This to keep the old settings, you never know. Yeah, I know, it's in git and I can always go back, but it's easier to compare if the file is still in the repo... --- config.org => config_old.org | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename config.org => config_old.org (100%) diff --git a/config.org b/config_old.org similarity index 100% rename from config.org rename to config_old.org From ddc622f270b05a3e6fde0419e162c142d3fa68b5 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:49:14 +0200 Subject: [PATCH 067/143] Move config_new.org to config.org Use it as the main config now. --- config_new.org => config.org | 0 init.el | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename config_new.org => config.org (100%) diff --git a/config_new.org b/config.org similarity index 100% rename from config_new.org rename to config.org diff --git a/init.el b/init.el index 2ee5b47..e442e9c 100644 --- a/init.el +++ b/init.el @@ -6,7 +6,7 @@ (let ((gc-cons-threshold most-positive-fixnum)) (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. - (defvar my-config-file (expand-file-name "config_new.org" user-emacs-directory)) + (defvar my-config-file (expand-file-name "config.org" user-emacs-directory)) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) From 29f8a2b08bb56c8030e0b521d6faf4631396a173 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 20:52:36 +0200 Subject: [PATCH 068/143] Update gitignore --- .gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.gitignore b/.gitignore index 7ea8f90..ea48958 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,21 @@ custom.el +backups +eshell +elpaca + +# projectile +projectile* + +# savehist file +history + +# recentf file +recentf + +session* + +# .org converted files +config*.el + +# Tramp connection file +tramp From 7c39432564d45137eae605851285ae2823807fb3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 21:00:23 +0200 Subject: [PATCH 069/143] Move sudo to myrmi/sudo-current-buffer It's a new function, use the custom prefix to make that clear. --- config.org | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/config.org b/config.org index 90bcdd7..d2fe38c 100644 --- a/config.org +++ b/config.org @@ -161,21 +161,6 @@ Display number of matches: Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html -** Sudo file - -#+begin_src emacs-lisp -(defun sudo () - "Use TRAMP to `sudo' the current buffer." - (interactive) - (when buffer-file-name - (find-alternate-file - (concat "/sudo:root@localhost:" - buffer-file-name) - ) - ) -) -#+end_src - ** Abbrev #+begin_src emacs-lisp @@ -866,6 +851,22 @@ Preserve indentation in SRC blocks * Custom +** Sudo current buffer + +#+BEGIN_SRC emacs-lisp +(defun myrmi/sudo-current-buffer () + "Use TRAMP to `sudo' the current buffer." + (interactive) + (when buffer-file-name + (find-alternate-file + (concat "/sudo:root@localhost:" + buffer-file-name) + ) + ) +) +#+END_SRC + + ** Save symbol at point #+BEGIN_SRC emacs-lisp From 3c24cac0c12080fa4534a93f439f282d248e1fac Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 22:06:42 +0200 Subject: [PATCH 070/143] DELETE sunrise-commander Not using it, maybe somewhere in the future, I'll re-enable/add it. --- .gitmodules | 3 --- extra/sunrise-commander | 1 - 2 files changed, 4 deletions(-) delete mode 100644 .gitmodules delete mode 160000 extra/sunrise-commander diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f8db735..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "extra/sunrise-commander"] - path = extra/sunrise-commander - url = https://github.com/escherdragon/sunrise-commander diff --git a/extra/sunrise-commander b/extra/sunrise-commander deleted file mode 160000 index cf8305a..0000000 --- a/extra/sunrise-commander +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cf8305a149a321d028858057e7a7c92f0038a06a From 5ca1559c206aa1087d5d6d10d4256d6d341106a2 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 22:18:01 +0200 Subject: [PATCH 071/143] Move cheat-sheet to inside config.org --- cheat-sheet.txt | 8 -------- config.org | 13 ++++++++++++- 2 files changed, 12 insertions(+), 9 deletions(-) delete mode 100644 cheat-sheet.txt diff --git a/cheat-sheet.txt b/cheat-sheet.txt deleted file mode 100644 index ddd8cdd..0000000 --- a/cheat-sheet.txt +++ /dev/null @@ -1,8 +0,0 @@ -C-M-Space : smartparens wrapping -C-c C-c : calculator (see init.el) -C-h k : lookup key sequence -C-x 0 : close current window -C-q : insert a -M-x (un)tabify : (replace) tabs -M-x describe-bindings : list of all mapped keys/commands -M-p : fill-paragraph, works for doxygen as well diff --git a/config.org b/config.org index aced26d..5d3a693 100644 --- a/config.org +++ b/config.org @@ -866,7 +866,6 @@ Preserve indentation in SRC blocks ) #+END_SRC - ** Save symbol at point #+BEGIN_SRC emacs-lisp @@ -948,3 +947,15 @@ This should normally be done by the init.el to load this configuration. (interactive) (org-babel-load-file my-config-file)) #+END_SRC + +** Tips and Tricks + +*** Cheat-sheet + +| Key | Explanation | +|-----------------------+-----------------------------------------------------------| +| C-h k | Lookup key sequencesmartparens wrapping | +| C-q | Insert quoted/explicitly. F.e. to insert a tab, ... | +| M-x untabify/tabify | Convert to spaces/tabs | +| M-x describe-bindings | List all mapped keys/commands | +| M-q | Fill paragraph | From c5cebd2147edabe9310fea7275c4331f2877746e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 24 Sep 2024 22:22:47 +0200 Subject: [PATCH 072/143] REMOVE logo Img is bloat --- config.org | 1 - img/dash_logo.png | Bin 65349 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 img/dash_logo.png diff --git a/config.org b/config.org index 5d3a693..1025829 100644 --- a/config.org +++ b/config.org @@ -2,7 +2,6 @@ #+TITLE: My Emacs #+CREATOR: Laurens Miers #+LANGUAGE: en -[[./img/dash_logo.png]] * Elpaca diff --git a/img/dash_logo.png b/img/dash_logo.png deleted file mode 100644 index bd8c88bef43e593c46d6a03337f85a3275c88d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65349 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 Cam7mj From 8a5527c2d4347e76c5664602225b976eb9cbb380 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 25 Sep 2024 23:02:26 +0200 Subject: [PATCH 073/143] ADD org-roam + org-roam-ui --- config.org | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/config.org b/config.org index 1025829..9ddf340 100644 --- a/config.org +++ b/config.org @@ -837,6 +837,39 @@ Preserve indentation in SRC blocks (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC +** Org Roam + +#+BEGIN_SRC emacs-lisp +(use-package org-roam + :custom + (org-roam-directory "~/projects/notes") + :config + (org-roam-setup) +) + +#+END_SRC + +*** UI + +#+BEGIN_SRC emacs-lisp +(use-package org-roam-ui + :ensure + (:host github :repo "org-roam/org-roam-ui" :branch "main" :files ("*.el" "out")) + :after org-roam +;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have +;; a hookable mode anymore, you're advised to pick something yourself +;; if you don't care about startup time, use +;; :hook (after-init . org-roam-ui-mode) + :config + (setq org-roam-ui-sync-theme t + org-roam-ui-follow t + org-roam-ui-update-on-save t + org-roam-ui-open-on-start t) + ;; Start UI + ;; (org-roam-ui-mode) + ) +#+END_SRC + * Elisp ** Add demos to describe-function From 61273748883b504f4ed9ffd47aff30079a0f6a85 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:18:04 +0200 Subject: [PATCH 074/143] ORG_ROAM: Add completion everywhere That way, when we type a part of the note name, we get an automatic link/insert of the node. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 9ddf340..441286c 100644 --- a/config.org +++ b/config.org @@ -843,10 +843,10 @@ Preserve indentation in SRC blocks (use-package org-roam :custom (org-roam-directory "~/projects/notes") + (org-roam-completion-everywhere t) :config (org-roam-setup) ) - #+END_SRC *** UI From bbffcd8d2bcfbbe1b4a42b7fe04f8f0fe3fb5f46 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:21:11 +0200 Subject: [PATCH 075/143] DIRED: Add guessing of target directory --- config.org | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config.org b/config.org index 441286c..40aefce 100644 --- a/config.org +++ b/config.org @@ -483,6 +483,15 @@ C-c C-c to apply." )) #+end_src +** Guess target directory + +I currently prefer to have two dired windows open in the same frame. +Instruct dired to 'Prefer next windows on the same frame' when renaming/copying files. + +#+BEGIN_SRC emacs-lisp +(setq dired-dwim-target 'dired-dwim-target-next) +#+END_SRC + * Whole-line-or-region Source: From 32ddb062c02f82a4439e09d1b1fc0ee6f61c4633 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:21:26 +0200 Subject: [PATCH 076/143] ORG_ROAM: Add consult integration --- config.org | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/config.org b/config.org index 40aefce..11c2b17 100644 --- a/config.org +++ b/config.org @@ -879,6 +879,40 @@ Preserve indentation in SRC blocks ) #+END_SRC +*** Consult + +#+BEGIN_SRC emacs-lisp +(use-package consult-org-roam + :ensure t + :after org-roam + :init + (require 'consult-org-roam) + ;; Activate the minor mode + (consult-org-roam-mode 1) + ;; :custom + ;; Use `ripgrep' for searching with `consult-org-roam-search' + ;; (consult-org-roam-grep-func #'consult-ripgrep) + + ;; Configure a custom narrow key for `consult-buffer', default is 'n', this sets it to 'r' + ;; (consult-org-roam-buffer-narrow-key ?r) + + ;; Display org-roam buffers right after non-org-roam buffers + ;; in consult-buffer (and not down at the bottom) + ;; (consult-org-roam-buffer-after-buffers t) + :config + ;; Eventually suppress previewing for certain functions + (consult-customize + consult-org-roam-forward-links + :preview-key "M-.") + :bind + ;; Define some convenient keybindings as an addition + ("C-c n f" . consult-org-roam-file-find) + ("C-c n b" . consult-org-roam-backlinks) + ("C-c n B" . consult-org-roam-backlinks-recursive) + ("C-c n l" . consult-org-roam-forward-links) + ("C-c n s" . consult-org-roam-search)) +#+END_SRC + * Elisp ** Add demos to describe-function From 1022956e464b86917d0988569ad7f548f24ad4b8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:30:48 +0200 Subject: [PATCH 077/143] ENABLE consult-grep --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 11c2b17..e59f51c 100644 --- a/config.org +++ b/config.org @@ -323,7 +323,7 @@ C-c C-c to apply." ;; M-s bindings in `search-map' ;; ("M-s d" . consult-find) ;; Alternative: consult-fd ;; ("M-s c" . consult-locate) - ;; ("M-s g" . consult-grep) + ("M-s g" . consult-grep) ;; ("M-s G" . consult-git-grep) ;; ("M-s r" . consult-ripgrep) ("M-s l" . consult-line) From 83dc7650868b9f98bf2d1330d936d557fe75c222 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:46:53 +0200 Subject: [PATCH 078/143] ENABLE consult-compile-error --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index e59f51c..744fbc7 100644 --- a/config.org +++ b/config.org @@ -311,7 +311,7 @@ C-c C-c to apply." ;; Other custom bindings ("M-y" . consult-yank-pop) ;; orig. yank-pop ;; M-g bindings in `goto-map' - ;; ("M-g e" . consult-compile-error) + ("M-g e" . consult-compile-error) ;; ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck ("M-g g" . consult-goto-line) ;; orig. goto-line ("M-g M-g" . consult-goto-line) ;; orig. goto-line From f82e59591e2d06d8b3f9ac7a1d6000563a8453bb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:47:05 +0200 Subject: [PATCH 079/143] ENABLE consult-flymake --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 744fbc7..7111358 100644 --- a/config.org +++ b/config.org @@ -312,7 +312,7 @@ C-c C-c to apply." ("M-y" . consult-yank-pop) ;; orig. yank-pop ;; M-g bindings in `goto-map' ("M-g e" . consult-compile-error) - ;; ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck ("M-g g" . consult-goto-line) ;; orig. goto-line ("M-g M-g" . consult-goto-line) ;; orig. goto-line ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading From e837ce7551da3ad61f91acf49a0d5c0b2ad9720e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 26 Sep 2024 22:48:20 +0200 Subject: [PATCH 080/143] ENABLE consult-find --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 7111358..27cc543 100644 --- a/config.org +++ b/config.org @@ -321,7 +321,7 @@ C-c C-c to apply." ("M-i" . consult-imenu) ("M-I" . consult-imenu-multi) ;; M-s bindings in `search-map' - ;; ("M-s d" . consult-find) ;; Alternative: consult-fd + ("M-s d" . consult-find) ;; Alternative: consult-fd ;; ("M-s c" . consult-locate) ("M-s g" . consult-grep) ;; ("M-s G" . consult-git-grep) From 8b1d672215d9229d3e01d8f3a2c62216c47cb00b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 10:07:52 +0200 Subject: [PATCH 081/143] FIX org-mode source block snippets --- snippets/org-mode/emacs-lisp-source-block | 4 ++-- snippets/org-mode/source_block_emacs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 2f90c13..73ed1eb 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -1,6 +1,6 @@ # -*- mode: snippet -*- -# name: Lisp source code block -# key: s> +# name: Start emacs source block +# key: se> # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index 73ed1eb..bcda23d 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -1,8 +1,8 @@ # -*- mode: snippet -*- -# name: Start emacs source block -# key: se> +# name: Org source code block +# key: s> # -- -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC ${1} #+END_SRC From 62148f96ca7adff1e7ffcad9d1c81578e47faf83 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 10:08:33 +0200 Subject: [PATCH 082/143] Simplify keys for org-mode source block snippets --- snippets/org-mode/emacs-lisp-source-block | 2 +- snippets/org-mode/source_block_emacs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 73ed1eb..25f00aa 100644 --- a/snippets/org-mode/emacs-lisp-source-block +++ b/snippets/org-mode/emacs-lisp-source-block @@ -1,6 +1,6 @@ # -*- mode: snippet -*- # name: Start emacs source block -# key: se> +# key: se # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index bcda23d..215d78e 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -1,6 +1,6 @@ # -*- mode: snippet -*- # name: Org source code block -# key: s> +# key: s # -- #+BEGIN_SRC From ce1c827f4c4c3bfcdf0dfc83ee6b1e2465b875e0 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:49:26 +0200 Subject: [PATCH 083/143] ELPACA: Add sub-titles --- config.org | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.org b/config.org index 27cc543..7002ee2 100644 --- a/config.org +++ b/config.org @@ -5,6 +5,8 @@ * Elpaca +** Core + #+begin_src emacs-lisp (defvar elpaca-installer-version 0.7) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) @@ -46,6 +48,8 @@ (elpaca `(,@elpaca-order)) #+end_src +** Use-package integration + #+begin_src emacs-lisp ;; Install use-package support (elpaca elpaca-use-package From 1a99cb8ccb94a9797611c0cc3c1fa3445b07b674 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:50:10 +0200 Subject: [PATCH 084/143] ELPACA: Wait until use-package integration fully loaded Stolen from github: https://github.com/progfolio/elpaca/issues/236 If the maintainer does it, it probably is needed. --- config.org | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index 7002ee2..68b8f96 100644 --- a/config.org +++ b/config.org @@ -51,11 +51,14 @@ ** Use-package integration #+begin_src emacs-lisp - ;; Install use-package support - (elpaca elpaca-use-package - ;; Enable use-package :ensure support for Elpaca. - (elpaca-use-package-mode) - ) +;; Install use-package support +(elpaca elpaca-use-package + ;; Enable use-package :ensure support for Elpaca. + (elpaca-use-package-mode) + ) + +;; wait to get elpaca use-package integration +(elpaca-wait) #+end_src * General config From 21fbc47a8f650ecbd8ef20a773a7d539e9e19aef Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:57:14 +0200 Subject: [PATCH 085/143] ADD eldoc section This is a built-in package which we are updating for eglot. This requires some emacs-fu which I found on the elpaca github. --- config.org | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/config.org b/config.org index 68b8f96..99d95d8 100644 --- a/config.org +++ b/config.org @@ -61,6 +61,43 @@ (elpaca-wait) #+end_src +* Built-in packages +** Eldoc + +I got the following error message when loading eglot: +#+BEGIN_SRC +eglot failed eldoc installed version (1 13 0) lower than min required 1.14.0 00.239351 +#+END_SRC + +So install the eldoc package to be sure we have the latest version. +But after installing it, we get a new warning: + +#+BEGIN_SRC +⛔ Warning (emacs): eldoc loaded before Elpaca activation +#+END_SRC + +This seemed tricker than expected, but found a solution in the github issues of elpaca: +https://github.com/progfolio/elpaca/issues/236 + +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :preface + ;; avoid loading of built-in eldoc, see https://github.com/progfolio/elpaca/issues/236#issuecomment-1879838229 + (unload-feature 'eldoc t) + (setq custom-delayed-init-variables '()) + (defvar global-eldoc-mode nil) + :demand t + :config + (global-eldoc-mode)) + +#+END_SRC +** Wait for loading updated packages + +Wait until updated built-in packages are fully loaded: +#+BEGIN_SRC emacs-lisp +(elpaca-wait) +#+END_SRC + * General config ** Bell From 1521fcb13ee8f72d3aa35f3fef7c4c7f1264e2df Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Fri, 27 Sep 2024 15:58:24 +0200 Subject: [PATCH 086/143] ADD jsonrpc section This is a built-in package which we are updating for eglot. --- config.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config.org b/config.org index 99d95d8..b7dbd21 100644 --- a/config.org +++ b/config.org @@ -91,6 +91,18 @@ https://github.com/progfolio/elpaca/issues/236 (global-eldoc-mode)) #+END_SRC + +** Jsonrpc +After eldoc was taken care of, a new error was reported: +#+BEGIN_SRC +eglot failed jsonrpc installed version (1 0 16) lower than min required 1.0.24 00.280828 +#+END_SRC + +So let's install the latest one: +#+BEGIN_SRC emacs-lisp +(use-package jsonrpc) +#+END_SRC + ** Wait for loading updated packages Wait until updated built-in packages are fully loaded: From 934c375c34cb8ac084134ef7c461e120566fbabb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 15:13:45 +0200 Subject: [PATCH 087/143] ADD org-roam-dailies-goto-today keybinding --- config.org | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index b7dbd21..69ce512 100644 --- a/config.org +++ b/config.org @@ -966,7 +966,9 @@ Preserve indentation in SRC blocks ("C-c n b" . consult-org-roam-backlinks) ("C-c n B" . consult-org-roam-backlinks-recursive) ("C-c n l" . consult-org-roam-forward-links) - ("C-c n s" . consult-org-roam-search)) + ("C-c n s" . consult-org-roam-search) + ("C-c n d" . org-roam-dailies-goto-today) + ) #+END_SRC * Elisp From 6aaae92c535a10659d546b2c7f86fce975b7eb5f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 21:50:21 +0200 Subject: [PATCH 088/143] ADD filetags snippet --- snippets/org-mode/filetags | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 snippets/org-mode/filetags diff --git a/snippets/org-mode/filetags b/snippets/org-mode/filetags new file mode 100644 index 0000000..b3f283d --- /dev/null +++ b/snippets/org-mode/filetags @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: Filetags +# key: ft +# -- + +#+FILETAGS: :$1: From 3ad176fbf96fd8f7c910150a5e8ee2f7513b2511 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 21:04:37 +0200 Subject: [PATCH 089/143] ORG-TODO: Mark parent task done if child tasks are done --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index 69ce512..db8d82f 100644 --- a/config.org +++ b/config.org @@ -894,6 +894,19 @@ Preserve indentation in SRC blocks (setq org-src-preserve-indentation t) #+END_SRC +** Org-todo + +*** Mark parent entry as DONE when children are DONE + +#+BEGIN_SRC emacs-lisp +(defun org-summary-todo (n-done n-not-done) + "Switch entry to DONE when all subentries are done, to TODO otherwise." + (let (org-log-done org-todo-log-states) ; turn off logging + (org-todo (if (= n-not-done 0) "DONE" "TODO")))) + +(add-hook 'org-after-todo-statistics-hook #'org-summary-todo) +#+END_SRC + ** Org bullets #+BEGIN_SRC emacs-lisp From d0657174dcc24b3cec48846baf834b76d0a655c4 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 29 Sep 2024 22:58:41 +0200 Subject: [PATCH 090/143] Update org-agenda-files with todo.org inside org-roam-directory --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index db8d82f..c4f81da 100644 --- a/config.org +++ b/config.org @@ -924,6 +924,8 @@ Preserve indentation in SRC blocks (org-roam-completion-everywhere t) :config (org-roam-setup) + ;; Add todo lists to org-agenda + (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) ) #+END_SRC From 40d9146a45c4bc00733294f14b2a5c4fddc8bf98 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:58:34 +0200 Subject: [PATCH 091/143] In-buffer-completion: Add separate section --- config.org | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index c4f81da..bdc3ea9 100644 --- a/config.org +++ b/config.org @@ -450,7 +450,9 @@ C-c C-c to apply." ) #+END_SRC -** Corfu +** In-buffer completion + +*** Corfu #+BEGIN_SRC emacs-lisp (use-package corfu From a5efd66ec77a10603ff1390b101b1a7140df3a1d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:58:59 +0200 Subject: [PATCH 092/143] In-buffer-completion: Add consult completion method --- config.org | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.org b/config.org index bdc3ea9..11e7279 100644 --- a/config.org +++ b/config.org @@ -452,6 +452,17 @@ C-c C-c to apply." ** In-buffer completion +*** Consult + +#+BEGIN_SRC +(setq completion-in-region-function + (lambda (&rest args) + (apply (if vertico-mode + #'consult-completion-in-region + #'completion--in-region) + args))) +#+END_SRC + *** Corfu #+BEGIN_SRC emacs-lisp From a68f566cd955505cbb519216ca7307981308347a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:59:09 +0200 Subject: [PATCH 093/143] In-buffer-completion: Disable corfu Getting crashes with emacs 29.4, seems to be a known issue. Until emacs 30, find another in-buffer-completion solution. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 11e7279..91591be 100644 --- a/config.org +++ b/config.org @@ -465,7 +465,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC (use-package corfu ;; Optional customizations :custom From 75bda91171d9432e6c36c62204504f93706363d3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 17 Oct 2024 21:59:48 +0200 Subject: [PATCH 094/143] In-buffer-completion: Add company-mode --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index 91591be..84fc64c 100644 --- a/config.org +++ b/config.org @@ -491,6 +491,19 @@ C-c C-c to apply." (global-corfu-mode)) #+end_src +*** Company-mode + +#+BEGIN_SRC emacs-lisp +(use-package company + :config + (define-key prog-mode-map + (kbd "TAB") + #'company-indent-or-complete-common) + :init + (global-company-mode) + ) +#+END_SRC + ** Orderless #+begin_src emacs-lisp From ad0adbc7266af6f64eb6f883bcd566182f135935 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 4 Nov 2024 09:43:21 +0100 Subject: [PATCH 095/143] feat: Enable global auto-revert mode --- config.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.org b/config.org index 84fc64c..c990b2b 100644 --- a/config.org +++ b/config.org @@ -269,6 +269,12 @@ Make cursor the width of the character it is under f.e. full width of a tab. (setq x-stretch-cursor t) #+END_SRC +** Enable auto-revert + +#+BEGIN_SRC emacs-lisp +(setq global-auto-revert-mode 1) +#+END_SRC + * Resize-mode Minor-mode to easily resize frames (works with EXWM (firefox, ...)). From 7285b8750ed850a9305611bc88d4095abdee0737 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 17 Nov 2024 19:27:26 +0100 Subject: [PATCH 096/143] feat: load init.el from (org-)notes repo if it exists --- init.el | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/init.el b/init.el index e442e9c..fa74166 100644 --- a/init.el +++ b/init.el @@ -7,10 +7,14 @@ (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (defvar my-config-file (expand-file-name "config.org" user-emacs-directory)) + (defvar notes-config-file (expand-file-name "init.el" "~/projects/notes/")) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) (when (file-readable-p custom-file) (load custom-file)) + + (when (file-readable-p notes-config-file) + (load notes-config-file)) ) From 2023ec08b34b6824b19391f7855b59325c487898 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sat, 21 Dec 2024 19:54:33 +0100 Subject: [PATCH 097/143] add(snippets): Add kaboom snippet for c-mode --- snippets/c-mode/kaboom | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 snippets/c-mode/kaboom diff --git a/snippets/c-mode/kaboom b/snippets/c-mode/kaboom new file mode 100644 index 0000000..d4220a2 --- /dev/null +++ b/snippets/c-mode/kaboom @@ -0,0 +1,6 @@ +# -*- mode: snippet -*- +# name: kaboom +# key: kb +# -- + +char (*__kaboom)[sizeof($1)] = 1; From 34e4462f1bef1da0642a9eccb7ad15ebacf981c3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 21:47:39 +0100 Subject: [PATCH 098/143] add(yas): enable also in text-mode --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index c990b2b..8b4bfc0 100644 --- a/config.org +++ b/config.org @@ -759,6 +759,7 @@ https://github.com/victorhge/iedit :hook (prog-mode . yas-minor-mode) (org-mode . yas-minor-mode) + (text-mode . yas-minor-mode) :config (yas-reload-all) ) From 0e722c06b590e941875af29fe2af838a92a5b441 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 21:47:58 +0100 Subject: [PATCH 099/143] add(org-roam): show tags in org-roam-node-find This allows us to search for them as well --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index 8b4bfc0..fbc73df 100644 --- a/config.org +++ b/config.org @@ -957,6 +957,7 @@ Preserve indentation in SRC blocks (org-roam-completion-everywhere t) :config (org-roam-setup) + (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) ) From cea6f3f2c0dd6ac9616b9d3d5403f7bca311e2fa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 21:48:45 +0100 Subject: [PATCH 100/143] add(org-roam): enable db autosync mode --- config.org | 1 + 1 file changed, 1 insertion(+) diff --git a/config.org b/config.org index fbc73df..7600947 100644 --- a/config.org +++ b/config.org @@ -958,6 +958,7 @@ Preserve indentation in SRC blocks :config (org-roam-setup) (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) + (org-roam-db-autosync-mode) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) ) From 28dae3bfeb6a7d6ba751adc31a6fb540935cb072 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 22:05:29 +0100 Subject: [PATCH 101/143] add(org-roam): don't limit tags to 10 chars --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 7600947..fd17ab9 100644 --- a/config.org +++ b/config.org @@ -957,7 +957,7 @@ Preserve indentation in SRC blocks (org-roam-completion-everywhere t) :config (org-roam-setup) - (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag))) + (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags}" 'face 'org-tag))) (org-roam-db-autosync-mode) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) From e692a9de93f5a6afd8e97cc674b1cd8339d9b581 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 7 Jan 2025 22:05:46 +0100 Subject: [PATCH 102/143] add(org-roam): custom command to filter on a tag --- config.org | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config.org b/config.org index fd17ab9..4b14626 100644 --- a/config.org +++ b/config.org @@ -1034,6 +1034,22 @@ Preserve indentation in SRC blocks * Custom +** Org-roam + +Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#filter-by-a-tag . + +#+BEGIN_SRC emacs-lisp +(defun myrmi/org-roam-node-find-tag-filter () + "Select a single tag from list and filter `org-roam-node' by it." + (interactive) + (let ((tag (car (completing-read-multiple "Tag: " + (org-roam-tag-completions))))) + (org-roam-node-find nil nil + (lambda (node) + (member tag + (org-roam-node-tags node)))))) +#+END_SRC + ** Sudo current buffer #+BEGIN_SRC emacs-lisp From 275d07b9614c718470ee566680b734446883379e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:48:29 +0100 Subject: [PATCH 103/143] feat(buffer-completion): replace company-mode with corfu --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 4b14626..ed797e3 100644 --- a/config.org +++ b/config.org @@ -471,7 +471,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations :custom @@ -499,7 +499,7 @@ C-c C-c to apply." *** Company-mode -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC (use-package company :config (define-key prog-mode-map From 7252361ab14013391b75be10861a0bee5e95efb3 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:48:34 +0100 Subject: [PATCH 104/143] feat(consult): enable --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index ed797e3..96cec6c 100644 --- a/config.org +++ b/config.org @@ -460,7 +460,7 @@ C-c C-c to apply." *** Consult -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (setq completion-in-region-function (lambda (&rest args) (apply (if vertico-mode From c8fa26b07b7d9d0f0a659556fd829d35e50cdc5e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:48:49 +0100 Subject: [PATCH 105/143] feat(corfu): make execute complete --- config.org | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.org b/config.org index 96cec6c..fa61c57 100644 --- a/config.org +++ b/config.org @@ -474,6 +474,9 @@ C-c C-c to apply." #+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations + :bind (:map corfu-map ("" . corfu-complete)) + :config + (setq tab-always-indent 'complete) :custom (corfu-cycle t) ;; Enable cycling for `corfu-next/previous' (corfu-auto t) ;; Enable auto completion From 3853d9d247239f4b47c9eecf7e851f1067dace0a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 8 Jan 2025 21:49:21 +0100 Subject: [PATCH 106/143] fix: close minibuffer if open when pressing C-g --- config.org | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/config.org b/config.org index fa61c57..4e8e23a 100644 --- a/config.org +++ b/config.org @@ -1161,3 +1161,37 @@ This should normally be done by the init.el to load this configuration. | M-x untabify/tabify | Convert to spaces/tabs | | M-x describe-bindings | List all mapped keys/commands | | M-q | Fill paragraph | + +** Minibuffer + +*** Close minibuffer when pressing C-g + +'Inspired' by https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/#h:1e4fde73-a2a2-4dc5-82ad-02cf3884ece6 . +#+BEGIN_SRC emacs-lisp +(defun myrmi/keyboard-quit-dwim () + "Do-What-I-Mean behaviour for a general `keyboard-quit'. + +The generic `keyboard-quit' does not do the expected thing when +the minibuffer is open. Whereas we want it to close the +minibuffer, even without explicitly focusing it. + +The DWIM behaviour of this command is as follows: + +- When the region is active, disable it. +- When a minibuffer is open, but not focused, close the minibuffer. +- When the Completions buffer is selected, close it. +- In every other case use the regular `keyboard-quit'." + (interactive) + (cond + ((region-active-p) + (keyboard-quit)) + ((derived-mode-p 'completion-list-mode) + (delete-completion-window)) + ((> (minibuffer-depth) 0) + (abort-recursive-edit)) + (t + (keyboard-quit)))) + +(define-key global-map (kbd "C-g") #'myrmi/keyboard-quit-dwim) + +#+END_SRC From ede533e7927a4933659c427e536692d74cb2224a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 9 Jan 2025 20:53:30 +0100 Subject: [PATCH 107/143] Use load-file option for custom file and notes iso manual check --- init.el | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/init.el b/init.el index fa74166..3d52422 100644 --- a/init.el +++ b/init.el @@ -12,9 +12,6 @@ (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (when (file-readable-p custom-file) - (load custom-file)) - - (when (file-readable-p notes-config-file) - (load notes-config-file)) + (load notes-config-file :no-error-if-file-is-missing) + (load custom-file :no-error-if-file-is-missing) ) From 17e062e07f32968ec5463d3ad635d31c923ed9c8 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 9 Jan 2025 20:54:38 +0100 Subject: [PATCH 108/143] Add font and icon/nerd-font section --- config.org | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/config.org b/config.org index 4e8e23a..09e47b6 100644 --- a/config.org +++ b/config.org @@ -1053,6 +1053,45 @@ Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#fi (org-roam-node-tags node)))))) #+END_SRC +** Font + +'Inspired' by https://protesilaos.com/codelog/2024-11-28-basic-emacs-configuration/#h:1e4fde73-a2a2-4dc5-82ad-02cf3884ece6 . +#+BEGIN_SRC emacs-lisp +(let ((mono-spaced-font "Monospace") + (proportionately-spaced-font "Sans")) + (set-face-attribute 'default nil :family mono-spaced-font :height 100) + (set-face-attribute 'fixed-pitch nil :family mono-spaced-font :height 1.0) + (set-face-attribute 'variable-pitch nil :family proportionately-spaced-font :height 1.0)) +#+END_SRC + +*** Icon fonts + +To make this setup work, the user must type M-x and then call the +command 'nerd-icons-install-fonts'. This will store the icon font files +in a local directory (on Linux this is ~/.local/share/fonts). + +#+BEGIN_SRC emacs-lisp +(use-package nerd-icons + :ensure t) + +(use-package nerd-icons-completion + :ensure t + :after marginalia + :config + (add-hook 'marginalia-mode-hook #'nerd-icons-completion-marginalia-setup)) + +(use-package nerd-icons-corfu + :ensure t + :after corfu + :config + (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)) + +(use-package nerd-icons-dired + :ensure t + :hook + (dired-mode . nerd-icons-dired-mode)) +#+END_SRC + ** Sudo current buffer #+BEGIN_SRC emacs-lisp From c47c5a5185ee55d1192f73ff68b70b056bf77331 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 9 Jan 2025 21:11:48 +0100 Subject: [PATCH 109/143] fix: revert-mode setting --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index 09e47b6..72bc534 100644 --- a/config.org +++ b/config.org @@ -272,7 +272,7 @@ Make cursor the width of the character it is under f.e. full width of a tab. ** Enable auto-revert #+BEGIN_SRC emacs-lisp -(setq global-auto-revert-mode 1) +(global-auto-revert-mode t) #+END_SRC * Resize-mode From 0b57fa79b5b4e35642ad5f3183e74585f3be56a2 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:36:55 +0200 Subject: [PATCH 110/143] feat: Update elpaca This avoids the warning at startup about not being able to determine elpaca core date. --- config.org | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/config.org b/config.org index 72bc534..24b9c10 100644 --- a/config.org +++ b/config.org @@ -7,13 +7,13 @@ ** Core -#+begin_src emacs-lisp -(defvar elpaca-installer-version 0.7) +#+BEGIN_SRC emacs-lisp +(defvar elpaca-installer-version 0.11) (defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) (defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) (defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) (defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" - :ref nil :depth 1 + :ref nil :depth 1 :inherit ignore :files (:defaults "elpaca-test.el" (:exclude "extensions")) :build (:not elpaca--activate-package))) (let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) @@ -23,30 +23,30 @@ (add-to-list 'load-path (if (file-exists-p build) build repo)) (unless (file-exists-p repo) (make-directory repo t) - (when (< emacs-major-version 28) (require 'subr-x)) + (when (<= emacs-major-version 28) (require 'subr-x)) (condition-case-unless-debug err - (if-let ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) - ((zerop (apply #'call-process `("git" nil ,buffer t "clone" - ,@(when-let ((depth (plist-get order :depth))) - (list (format "--depth=%d" depth) "--no-single-branch")) - ,(plist-get order :repo) ,repo)))) - ((zerop (call-process "git" nil buffer t "checkout" - (or (plist-get order :ref) "--")))) - (emacs (concat invocation-directory invocation-name)) - ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" - "--eval" "(byte-recompile-directory \".\" 0 'force)"))) - ((require 'elpaca)) - ((elpaca-generate-autoloads "elpaca" repo))) + (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) + ((zerop (apply #'call-process `("git" nil ,buffer t "clone" + ,@(when-let* ((depth (plist-get order :depth))) + (list (format "--depth=%d" depth) "--no-single-branch")) + ,(plist-get order :repo) ,repo)))) + ((zerop (call-process "git" nil buffer t "checkout" + (or (plist-get order :ref) "--")))) + (emacs (concat invocation-directory invocation-name)) + ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" + "--eval" "(byte-recompile-directory \".\" 0 'force)"))) + ((require 'elpaca)) + ((elpaca-generate-autoloads "elpaca" repo))) (progn (message "%s" (buffer-string)) (kill-buffer buffer)) (error "%s" (with-current-buffer buffer (buffer-string)))) ((error) (warn "%s" err) (delete-directory repo 'recursive)))) (unless (require 'elpaca-autoloads nil t) (require 'elpaca) (elpaca-generate-autoloads "elpaca" repo) - (load "./elpaca-autoloads"))) + (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) (add-hook 'after-init-hook #'elpaca-process-queues) (elpaca `(,@elpaca-order)) -#+end_src +#+END_SRC ** Use-package integration From f5ef8d68c597b2c6c0423dc169395b2aab29f738 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:37:32 +0200 Subject: [PATCH 111/143] fix: Update visit/reload-config docs --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 24b9c10..1eb50cd 100644 --- a/config.org +++ b/config.org @@ -1179,12 +1179,12 @@ This should normally be done by the init.el to load this configuration. #+BEGIN_SRC emacs-lisp (defun myrmi/visit-config () - "Reloads ~/.emacs.d/config.org at runtime" + "Visit emacs config" (interactive) (find-file my-config-file)) (defun myrmi/reload-config () - "Reloads ~/.emacs.d/config.org at runtime" + "Reload emacs config at runtime" (interactive) (org-babel-load-file my-config-file)) #+END_SRC From d3dc9465dd19f2d6139e06b07bf56eba9d2d6e61 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:38:32 +0200 Subject: [PATCH 112/143] fix: load init.el of notes repo when org-roam is properly loaded This avoids all kinds of issues about variables not being declared, etc. in the project-notes init.el --- config.org | 1 + init.el | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index 1eb50cd..404cccb 100644 --- a/config.org +++ b/config.org @@ -964,6 +964,7 @@ Preserve indentation in SRC blocks (org-roam-db-autosync-mode) ;; Add todo lists to org-agenda (custom-set-variables '(org-agenda-files (directory-files-recursively org-roam-directory "todo\\.org$"))) + (load (expand-file-name "init.el" org-roam-directory) :no-error-if-file-is-missing) ) #+END_SRC diff --git a/init.el b/init.el index 3d52422..5b96eb9 100644 --- a/init.el +++ b/init.el @@ -7,11 +7,9 @@ (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; This is the actual config file. It is omitted if it doesn't exist so emacs won't refuse to launch. (defvar my-config-file (expand-file-name "config.org" user-emacs-directory)) - (defvar notes-config-file (expand-file-name "init.el" "~/projects/notes/")) (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (load notes-config-file :no-error-if-file-is-missing) (load custom-file :no-error-if-file-is-missing) ) From 1a21781fba70826d4c71aed51004059833b85313 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:39:47 +0200 Subject: [PATCH 113/143] fix: switch back to company from corfu to avoid random crash It seems like a known issue (don't have the link anymore..) but company is doing fine for now so just switch back to it. --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 404cccb..af422e5 100644 --- a/config.org +++ b/config.org @@ -471,7 +471,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC (use-package corfu ;; Optional customizations :bind (:map corfu-map ("" . corfu-complete)) @@ -502,7 +502,7 @@ C-c C-c to apply." *** Company-mode -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (use-package company :config (define-key prog-mode-map From ff740ce08eb8949437da7ec73533556d26e2d46e Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Wed, 30 Apr 2025 09:40:43 +0200 Subject: [PATCH 114/143] feat: Add org-download --- config.org | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/config.org b/config.org index af422e5..88e0e25 100644 --- a/config.org +++ b/config.org @@ -1025,6 +1025,15 @@ Preserve indentation in SRC blocks ) #+END_SRC +** Org Download + +#+BEGIN_SRC emacs-lisp +(use-package org-download + :config + (add-hook 'dired-mode-hook 'org-download-enable) + ) +#+END_SRC + * Elisp ** Add demos to describe-function From 22c029b2f44186797fcdb88d86745140c2132601 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:25:41 +0200 Subject: [PATCH 115/143] Remove old eldoc/jsonrpc workarounds and just use built-in packages --- config.org | 59 +++++++++--------------------------------------------- 1 file changed, 9 insertions(+), 50 deletions(-) diff --git a/config.org b/config.org index 88e0e25..6424b85 100644 --- a/config.org +++ b/config.org @@ -61,57 +61,7 @@ (elpaca-wait) #+end_src -* Built-in packages -** Eldoc - -I got the following error message when loading eglot: -#+BEGIN_SRC -eglot failed eldoc installed version (1 13 0) lower than min required 1.14.0 00.239351 -#+END_SRC - -So install the eldoc package to be sure we have the latest version. -But after installing it, we get a new warning: - -#+BEGIN_SRC -⛔ Warning (emacs): eldoc loaded before Elpaca activation -#+END_SRC - -This seemed tricker than expected, but found a solution in the github issues of elpaca: -https://github.com/progfolio/elpaca/issues/236 - -#+BEGIN_SRC emacs-lisp -(use-package eldoc - :preface - ;; avoid loading of built-in eldoc, see https://github.com/progfolio/elpaca/issues/236#issuecomment-1879838229 - (unload-feature 'eldoc t) - (setq custom-delayed-init-variables '()) - (defvar global-eldoc-mode nil) - :demand t - :config - (global-eldoc-mode)) - -#+END_SRC - -** Jsonrpc -After eldoc was taken care of, a new error was reported: -#+BEGIN_SRC -eglot failed jsonrpc installed version (1 0 16) lower than min required 1.0.24 00.280828 -#+END_SRC - -So let's install the latest one: -#+BEGIN_SRC emacs-lisp -(use-package jsonrpc) -#+END_SRC - -** Wait for loading updated packages - -Wait until updated built-in packages are fully loaded: -#+BEGIN_SRC emacs-lisp -(elpaca-wait) -#+END_SRC - * General config - ** Bell The audible bell is annoying AF. @@ -206,6 +156,15 @@ Use list-buffers bigger brother. (global-set-key (kbd "M-SPC") 'mark-word) #+end_src +** Eldoc + +#+BEGIN_SRC emacs-lisp +(use-package eldoc + :ensure nil + :init + (global-eldoc-mode)) +#+END_SRC + ** Isearch Display number of matches: From 49a5164f45a90c369482b6aef1a1a2ee7194b280 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:26:06 +0200 Subject: [PATCH 116/143] Rework isearch configuration using emacs-solo inspiration --- config.org | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/config.org b/config.org index 6424b85..faed9e1 100644 --- a/config.org +++ b/config.org @@ -167,10 +167,26 @@ Use list-buffers bigger brother. ** Isearch -Display number of matches: -#+begin_src emacs-lisp -(setq-default isearch-lazy-count t) -#+end_src +Inspired by [[https://github.com/LionyxML/emacs-solo][emacs-solo]]: + +#+BEGIN_SRC emacs-lisp +(use-package isearch + :ensure nil + :config + (setq isearch-lazy-count t) ; Display number of matches + (setq lazy-count-prefix-format "(%s/%s) ") ; eye-candy to add braces + (defun isearch-copy-selected-word () + "Copy the current `isearch` selection to the kill ring." + (interactive) + (when isearch-other-end + (let ((selection (buffer-substring-no-properties isearch-other-end (point)))) + (kill-new selection) + (isearch-exit)))) + + ;; Bind `M-w` in isearch to copy the selected word, so M-s M-. M-w + ;; does a great job of 'copying the current word under cursor'. + (define-key isearch-mode-map (kbd "M-w") 'isearch-copy-selected-word)) +#+END_SRC Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html From f2dc1fe4961cb9dd54ca1212fa60ce6b2a8beec9 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:26:30 +0200 Subject: [PATCH 117/143] Add flymake configuration --- config.org | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/config.org b/config.org index faed9e1..6d332c9 100644 --- a/config.org +++ b/config.org @@ -191,6 +191,25 @@ Inspired by [[https://github.com/LionyxML/emacs-solo][emacs-solo]]: Reference that might be interesting for later: https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch.html +** Flymake + +#+BEGIN_SRC emacs-lisp +(use-package flymake + :ensure nil + :defer t + :hook + (prog-mode-hook . flymake-mode) + :custom + (flymake-show-diagnostics-at-end-of-line 'short) + (flymake-indicator-type 'margins) + (flymake-margin-indicators-string + `((error "!" compilation-error) + (warning "?" compilation-warning) + (note "i" compilation-info)) + ) + ) +#+END_SRC + ** Abbrev #+begin_src emacs-lisp From 6c24da45031616936063f873284683a2fece8bac Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Sun, 25 May 2025 17:26:38 +0200 Subject: [PATCH 118/143] Rework eglot configuration to use built-in package --- config.org | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 6d332c9..3aa641e 100644 --- a/config.org +++ b/config.org @@ -731,15 +731,21 @@ https://github.com/victorhge/iedit ** Eglot #+BEGIN_SRC emacs-lisp - (use-package eglot) - +(use-package eglot + :ensure nil + :custom + (eglot-autoshutdown t) + :init (setq eglot-stay-out-of '(xref)) (add-hook 'prog-mode-hook 'eglot-ensure) (add-hook 'eglot-managed-mode-hook (lambda () (if (eglot-managed-p) (add-hook 'xref-backend-functions 'eglot-xref-backend) (remove-hook 'xref-backend-functions 'eglot-xref-backend) - ))) + ))) + + ) + #+END_SRC ** Markdown-mode From 2572e8c22199c5e173a020237f941290ddf5736a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 26 May 2025 10:59:38 +0200 Subject: [PATCH 119/143] Fix linting warnings in early-init/init.el There should be no functional changes --- early-init.el | 19 +++++++++++++------ init.el | 6 ++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/early-init.el b/early-init.el index 0fe1b95..3a99e6d 100644 --- a/early-init.el +++ b/early-init.el @@ -1,9 +1,16 @@ +;;; early-init.el --- Early Init -*- lexical-binding: t; -*- + +;;; Commentary: +;; Early init configuration for Emacs Solo +;; + +;;; Code: + + + +;; Recommended by elpaca (setq package-enable-at-startup nil) +(provide 'early-init) -;; Local Variables: -;; no-byte-compile: t -;; no-native-compile: t -;; no-update-autoloads: t -;; End: - +;;; early-init.el ends here diff --git a/init.el b/init.el index 5b96eb9..a57c423 100644 --- a/init.el +++ b/init.el @@ -1,3 +1,9 @@ +;;; init.el --- Init -*- lexical-binding: t; -*- + + +;;; Commentary: +;;; Load init files + ;;; Increase garbage collection threshold during init but leave it to the default value after ;;; There are a LOT of articles/sites/... discussing this: ;;; https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ From a731bab651f9115b4026878ebadce3c62e404a43 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Mon, 26 May 2025 10:59:45 +0200 Subject: [PATCH 120/143] Only pop-up messages buffer if there is an error --- early-init.el | 2 ++ 1 file changed, 2 insertions(+) diff --git a/early-init.el b/early-init.el index 3a99e6d..e163e66 100644 --- a/early-init.el +++ b/early-init.el @@ -7,6 +7,8 @@ ;;; Code: +;; Only care about errors in *Messages* buffer +(setq warning-minimum-level :error) ;; Recommended by elpaca (setq package-enable-at-startup nil) From 7f901b23aec9fde3de5c085587e9e263aa7acdea Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:47:37 +0200 Subject: [PATCH 121/143] feat: Remove elpaca I'm not actually using it and it's just bloat at this point. This speeds up the startup significantly. Remove what you don't need. --- config.org | 168 +++++++++++++++++++------------------------------- early-init.el | 2 +- 2 files changed, 64 insertions(+), 106 deletions(-) diff --git a/config.org b/config.org index 3aa641e..63b47ad 100644 --- a/config.org +++ b/config.org @@ -3,65 +3,61 @@ #+CREATOR: Laurens Miers #+LANGUAGE: en -* Elpaca - -** Core +* General config #+BEGIN_SRC emacs-lisp -(defvar elpaca-installer-version 0.11) -(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory)) -(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory)) -(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory)) -(defvar elpaca-order '(elpaca :repo "https://github.com/progfolio/elpaca.git" - :ref nil :depth 1 :inherit ignore - :files (:defaults "elpaca-test.el" (:exclude "extensions")) - :build (:not elpaca--activate-package))) -(let* ((repo (expand-file-name "elpaca/" elpaca-repos-directory)) - (build (expand-file-name "elpaca/" elpaca-builds-directory)) - (order (cdr elpaca-order)) - (default-directory repo)) - (add-to-list 'load-path (if (file-exists-p build) build repo)) - (unless (file-exists-p repo) - (make-directory repo t) - (when (<= emacs-major-version 28) (require 'subr-x)) - (condition-case-unless-debug err - (if-let* ((buffer (pop-to-buffer-same-window "*elpaca-bootstrap*")) - ((zerop (apply #'call-process `("git" nil ,buffer t "clone" - ,@(when-let* ((depth (plist-get order :depth))) - (list (format "--depth=%d" depth) "--no-single-branch")) - ,(plist-get order :repo) ,repo)))) - ((zerop (call-process "git" nil buffer t "checkout" - (or (plist-get order :ref) "--")))) - (emacs (concat invocation-directory invocation-name)) - ((zerop (call-process emacs nil buffer nil "-Q" "-L" "." "--batch" - "--eval" "(byte-recompile-directory \".\" 0 'force)"))) - ((require 'elpaca)) - ((elpaca-generate-autoloads "elpaca" repo))) - (progn (message "%s" (buffer-string)) (kill-buffer buffer)) - (error "%s" (with-current-buffer buffer (buffer-string)))) - ((error) (warn "%s" err) (delete-directory repo 'recursive)))) - (unless (require 'elpaca-autoloads nil t) - (require 'elpaca) - (elpaca-generate-autoloads "elpaca" repo) - (let ((load-source-file-function nil)) (load "./elpaca-autoloads")))) -(add-hook 'after-init-hook #'elpaca-process-queues) -(elpaca `(,@elpaca-order)) + (use-package emacs + :ensure nil + :custom + (inhibit-startup-message t) + :init + (with-current-buffer (get-buffer-create "*scratch*") + (insert (format ";; + ;; ██╗ ██╗███████╗██╗ ██╗ ██████╗ + ;; ██║ ██║██╔════╝██║ ██║ ██╔═══██╗ + ;; ███████║█████╗ ██║ ██║ ██║ ██║ + ;; ██╔══██║██╔══╝ ██║ ██║ ██║ ██║ + ;; ██║ ██║███████╗███████╗███████╗╚██████╔╝ + ;; ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ ╚═════╝ + ;; + ;; ███████╗███╗ ███╗ █████╗ ██████╗███████╗ + ;; ██╔════╝████╗ ████║██╔══██╗██╔════╝██╔════╝ + ;; █████╗ ██╔████╔██║███████║██║ ███████╗ + ;; ██╔══╝ ██║╚██╔╝██║██╔══██║██║ ╚════██║ + ;; ███████╗██║ ╚═╝ ██║██║ ██║╚██████╗███████║ + ;; ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚══════╝ + ;; + ;; Loading time : %s + ;; Packages : %s + ;; + " + (emacs-init-time) + (number-to-string (length package-activated-list))))) + + (message (emacs-init-time)) + ) #+END_SRC -** Use-package integration +** Package repos -#+begin_src emacs-lisp -;; Install use-package support -(elpaca elpaca-use-package - ;; Enable use-package :ensure support for Elpaca. - (elpaca-use-package-mode) - ) +#+BEGIN_SRC emacs-lisp +(require 'package) +(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) +;; Comment/uncomment this line to enable MELPA Stable if desired. See `package-archive-priorities` +;; and `package-pinned-packages`. Most users will not need or want to do this. +;;(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t) +(package-initialize) +#+END_SRC -;; wait to get elpaca use-package integration -(elpaca-wait) -#+end_src +** Use-package + +*** Always ensure + +#+BEGIN_SRC emacs-lisp +(require 'use-package-ensure) +(setq use-package-always-ensure t) +#+END_SRC -* General config ** Bell The audible bell is annoying AF. @@ -246,15 +242,6 @@ Narrow-region/page is a really handy feature, enable it: (put 'narrow-to-region 'disabled nil) #+END_SRC -** Use-package - -*** Always ensure - -#+BEGIN_SRC emacs-lisp -(require 'use-package-ensure) -(setq use-package-always-ensure t) -#+END_SRC - ** Adaptive cursor width Make cursor the width of the character it is under f.e. full width of a tab. @@ -650,29 +637,26 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+begin_src emacs-lisp (use-package dashboard :config - (add-hook 'elpaca-after-init-hook #'dashboard-insert-startupify-lists) - (add-hook 'elpaca-after-init-hook #'dashboard-initialize) (dashboard-setup-startup-hook)) #+end_src * Hydra -Install and wait for hydra to be available since we are using it in this init.el : -#+begin_src emacs-lisp +https://github.com/abo-abo/hydra + +#+BEGIN_SRC emacs-lisp (use-package hydra - :ensure (:wait t) + :defer t + :config + ;; Zoom hydra + (defhydra hydra-zoom (global-map "") + "zoom" + ("g" text-scale-increase "in") + ("l" text-scale-decrease "out") + ) + ) -#+end_src - -** Text zoom - -#+begin_src emacs-lisp -(defhydra hydra-zoom (global-map "") - "zoom" - ("g" text-scale-increase "in") - ("l" text-scale-decrease "out") -) -#+end_src +#+END_SRC * Zygospore @@ -770,41 +754,15 @@ https://github.com/victorhge/iedit ** Magit -*** Transient - -Magit depends on this and it seems it's not installed as a dependency, so install it explicitly. - -#+BEGIN_SRC emacs-lisp -(use-package transient - :ensure (:wait t) -) -#+END_SRC - *** Core #+BEGIN_SRC emacs-lisp (use-package magit -:ensure (:wait t) -) + :defer t + ) #+END_SRC -**** Extra commands - -***** Update all submodules - -#+BEGIN_SRC emacs-lisp -(transient-define-suffix magit-submodule-update-all () - "Update all submodules" - :description "Update All git submodule update --init --recursive" - (interactive) - (magit-with-toplevel - (magit-run-git-async "submodule" "update" "--force"))) - -(transient-append-suffix 'magit-submodule "f" - '("U" magit-submodule-update-all)) -#+END_SRC - ** Dumb-jump #+BEGIN_SRC emacs-lisp diff --git a/early-init.el b/early-init.el index e163e66..5d83494 100644 --- a/early-init.el +++ b/early-init.el @@ -10,7 +10,7 @@ ;; Only care about errors in *Messages* buffer (setq warning-minimum-level :error) -;; Recommended by elpaca +;; We control when packages are enabled (setq package-enable-at-startup nil) (provide 'early-init) From adab1147e0da42c890d047d55b0f2dc5082db383 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:48:31 +0200 Subject: [PATCH 122/143] fix: Docs on keys to use when resizing --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index 63b47ad..d80c79b 100644 --- a/config.org +++ b/config.org @@ -301,8 +301,8 @@ C-c C-c to apply." :global t (if (<= (length (window-list)) 1) (progn (setq resize-frame nil) - (message "Only root frame exists, abort.")) - (message "Use arrow-keys or i/j/k/l to adjust frames."))) + (message "Only root frame exists, abort.")) + (message "Use arrow-keys or C-p/n/f/b to adjust frames."))) (defun resize-frame-done () (interactive) From 377a5cadff3a82543095840bf97255fde13eaf06 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:48:46 +0200 Subject: [PATCH 123/143] fix: whitespace has a separate built-in package It has a better hook (whitespace-cleanup) than the barebones delete-trailing-whitespace. --- config.org | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index d80c79b..cb19b82 100644 --- a/config.org +++ b/config.org @@ -72,10 +72,16 @@ The audible bell is annoying AF. (setq column-number-mode 1) #+END_SRC -** Delete trailing whitespaces +** Whitespace cleanup #+BEGIN_SRC emacs-lisp -(add-hook 'before-save-hook 'delete-trailing-whitespace) +(use-package whitespace + :ensure nil + :defer t + :hook (before-save-hook . whitespace-cleanup) + ;; if we wanna remove this hook at any time, eval: + ;; (remove-hook 'before-save-hook #'whitespace-cleanup) + ) #+END_SRC ** Save history and recent files From 80b3e4dbc16e0ed8b3fbc314366c733d1a208d3c Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:49:59 +0200 Subject: [PATCH 124/143] feat: enable vertico-cycle and call hook when appropriate --- config.org | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index cb19b82..55f545b 100644 --- a/config.org +++ b/config.org @@ -322,15 +322,14 @@ C-c C-c to apply." ** Minibuffer #+BEGIN_SRC emacs-lisp -;; Enable vertico (use-package vertico - ;; :custom + :custom ;; (vertico-scroll-margin 0) ;; Different scroll margin ;; (vertico-count 20) ;; Show more candidates ;; (vertico-resize t) ;; Grow and shrink the Vertico minibuffer - ;; (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' - :init - (vertico-mode)) + (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' + :hook (after-init . vertico-mode) + ) #+END_SRC ** Consult From 3f93a19d4b92287ffc670adc74bd546e0b41853f Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:51:20 +0200 Subject: [PATCH 125/143] feat: enable corfu iso company-mode No issues so far when using melpa iso latest git repo (elpaca behaviour) --- config.org | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/config.org b/config.org index 55f545b..346c55e 100644 --- a/config.org +++ b/config.org @@ -457,7 +457,7 @@ C-c C-c to apply." *** Corfu -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp (use-package corfu ;; Optional customizations :bind (:map corfu-map ("" . corfu-complete)) @@ -486,19 +486,6 @@ C-c C-c to apply." (global-corfu-mode)) #+end_src -*** Company-mode - -#+BEGIN_SRC emacs-lisp -(use-package company - :config - (define-key prog-mode-map - (kbd "TAB") - #'company-indent-or-complete-common) - :init - (global-company-mode) - ) -#+END_SRC - ** Orderless #+begin_src emacs-lisp From a79987f30fba939724c39a7aaed91b541aebf82a Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:52:05 +0200 Subject: [PATCH 126/143] chore: stylefix --- config.org | 187 ++++++++++++++++++++++++++--------------------------- 1 file changed, 93 insertions(+), 94 deletions(-) diff --git a/config.org b/config.org index 346c55e..0390fca 100644 --- a/config.org +++ b/config.org @@ -182,8 +182,8 @@ Inspired by [[https://github.com/LionyxML/emacs-solo][emacs-solo]]: (interactive) (when isearch-other-end (let ((selection (buffer-substring-no-properties isearch-other-end (point)))) - (kill-new selection) - (isearch-exit)))) + (kill-new selection) + (isearch-exit)))) ;; Bind `M-w` in isearch to copy the selected word, so M-s M-. M-w ;; does a great job of 'copying the current word under cursor'. @@ -338,58 +338,58 @@ C-c C-c to apply." (use-package consult ;; Replace bindings. Lazily loaded by `use-package'. :bind (;; C-c bindings in `mode-specific-map' - ;; ("C-c M-x" . consult-mode-command) - ;; ("C-c h" . consult-history) - ;; ("C-c k" . consult-kmacro) - ;; ("C-c m" . consult-man) - ;; ("C-c i" . consult-info) - ([remap Info-search] . consult-info) - ;; C-x bindings in `ctl-x-map' - ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command - ("C-x b" . consult-buffer) ;; orig. switch-to-buffer - ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window - ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame - ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab - ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump - ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer - ;; Custom M-# bindings for fast register access - ;; ("M-#" . consult-register-load) - ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) - ;; ("C-M-#" . consult-register) - ;; Other custom bindings - ("M-y" . consult-yank-pop) ;; orig. yank-pop - ;; M-g bindings in `goto-map' - ("M-g e" . consult-compile-error) - ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck - ("M-g g" . consult-goto-line) ;; orig. goto-line - ("M-g M-g" . consult-goto-line) ;; orig. goto-line - ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading - ;; ("M-g m" . consult-mark) - ;; ("M-g k" . consult-global-mark) - ("M-i" . consult-imenu) - ("M-I" . consult-imenu-multi) - ;; M-s bindings in `search-map' - ("M-s d" . consult-find) ;; Alternative: consult-fd - ;; ("M-s c" . consult-locate) - ("M-s g" . consult-grep) - ;; ("M-s G" . consult-git-grep) - ;; ("M-s r" . consult-ripgrep) - ("M-s l" . consult-line) - ;; ("M-s L" . consult-line-multi) - ;; ("M-s k" . consult-keep-lines) - ;; ("M-s u" . consult-focus-lines) - ;; Isearch integration - ("M-s e" . consult-isearch-history) - :map isearch-mode-map - ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string - ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string - ("M-s l" . consult-line) ;; needed by consult-line to detect isearch - ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch - ;; Minibuffer history - :map minibuffer-local-map - ("M-s" . consult-history) ;; orig. next-matching-history-element - ("M-r" . consult-history) ;; orig. previous-matching-history-element - ) + ;; ("C-c M-x" . consult-mode-command) + ;; ("C-c h" . consult-history) + ;; ("C-c k" . consult-kmacro) + ;; ("C-c m" . consult-man) + ;; ("C-c i" . consult-info) + ([remap Info-search] . consult-info) + ;; C-x bindings in `ctl-x-map' + ("C-x M-:" . consult-complex-command) ;; orig. repeat-complex-command + ("C-x b" . consult-buffer) ;; orig. switch-to-buffer + ("C-x 4 b" . consult-buffer-other-window) ;; orig. switch-to-buffer-other-window + ("C-x 5 b" . consult-buffer-other-frame) ;; orig. switch-to-buffer-other-frame + ("C-x t b" . consult-buffer-other-tab) ;; orig. switch-to-buffer-other-tab + ("C-x r b" . consult-bookmark) ;; orig. bookmark-jump + ("C-x p b" . consult-project-buffer) ;; orig. project-switch-to-buffer + ;; Custom M-# bindings for fast register access + ;; ("M-#" . consult-register-load) + ("M-'" . consult-register-store) ;; orig. abbrev-prefix-mark (unrelated) + ;; ("C-M-#" . consult-register) + ;; Other custom bindings + ("M-y" . consult-yank-pop) ;; orig. yank-pop + ;; M-g bindings in `goto-map' + ("M-g e" . consult-compile-error) + ("M-g f" . consult-flymake) ;; Alternative: consult-flycheck + ("M-g g" . consult-goto-line) ;; orig. goto-line + ("M-g M-g" . consult-goto-line) ;; orig. goto-line + ;; ("M-g o" . consult-outline) ;; Alternative: consult-org-heading + ;; ("M-g m" . consult-mark) + ;; ("M-g k" . consult-global-mark) + ("M-i" . consult-imenu) + ("M-I" . consult-imenu-multi) + ;; M-s bindings in `search-map' + ("M-s d" . consult-find) ;; Alternative: consult-fd + ;; ("M-s c" . consult-locate) + ("M-s g" . consult-grep) + ;; ("M-s G" . consult-git-grep) + ;; ("M-s r" . consult-ripgrep) + ("M-s l" . consult-line) + ;; ("M-s L" . consult-line-multi) + ;; ("M-s k" . consult-keep-lines) + ;; ("M-s u" . consult-focus-lines) + ;; Isearch integration + ("M-s e" . consult-isearch-history) + :map isearch-mode-map + ("M-e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s e" . consult-isearch-history) ;; orig. isearch-edit-string + ("M-s l" . consult-line) ;; needed by consult-line to detect isearch + ("M-s L" . consult-line-multi) ;; needed by consult-line to detect isearch + ;; Minibuffer history + :map minibuffer-local-map + ("M-s" . consult-history) ;; orig. next-matching-history-element + ("M-r" . consult-history) ;; orig. previous-matching-history-element + ) ;; Enable automatic preview at point in the *Completions* buffer. This is ;; relevant when you use the default completion UI. @@ -402,7 +402,7 @@ C-c C-c to apply." ;; preview for `consult-register', `consult-register-load', ;; `consult-register-store' and the Emacs built-ins. ;; (setq register-preview-delay 0.5 - ;; register-preview-function #'consult-register-format) + ;; register-preview-function #'consult-register-format) ;; Optionally tweak the register preview window. ;; This adds thin lines, sorting and hides the mode line of the window. @@ -410,7 +410,7 @@ C-c C-c to apply." ;; Use Consult to select xref locations with preview (setq xref-show-xrefs-function #'consult-xref - xref-show-definitions-function #'consult-xref) + xref-show-definitions-function #'consult-xref) ;; Configure other variables and modes in the :config section, ;; after lazily loading the package. @@ -449,10 +449,10 @@ C-c C-c to apply." #+BEGIN_SRC emacs-lisp (setq completion-in-region-function (lambda (&rest args) - (apply (if vertico-mode - #'consult-completion-in-region - #'completion--in-region) - args))) + (apply (if vertico-mode + #'consult-completion-in-region + #'completion--in-region) + args))) #+END_SRC *** Corfu @@ -488,7 +488,7 @@ C-c C-c to apply." ** Orderless -#+begin_src emacs-lisp +#+BEGIN_SRC emacs-lisp (use-package orderless :demand t :custom @@ -508,18 +508,18 @@ C-c C-c to apply." ;; ) ;; ) ) -#+end_src +#+END_SRC ** Marginalia -#+begin_src emacs-lisp +#+BEGIN_SRC emacs-lisp ;; Enable rich annotations using the Marginalia package (use-package marginalia ;; Bind `marginalia-cycle' locally in the minibuffer. To make the binding ;; available in the *Completions* buffer, add it to the ;; `completion-list-mode-map'. :bind (:map minibuffer-local-map - ("M-A" . marginalia-cycle)) + ("M-A" . marginalia-cycle)) ;; The :init section is always executed. :init @@ -527,7 +527,7 @@ C-c C-c to apply." ;; the mode gets enabled right away. Note that this forces loading the ;; package. (marginalia-mode)) -#+end_src +#+END_SRC * Dired @@ -541,10 +541,10 @@ C-c C-c to apply." ) (add-hook 'dired-mode-hook - (lambda () - ;; Set dired-x buffer-local variables here. For example: - ;; (dired-omit-mode 1) - )) + (lambda () + ;; Set dired-x buffer-local variables here. For example: + ;; (dired-omit-mode 1) + )) #+end_src ** Guess target directory @@ -565,9 +565,8 @@ Operate on the current line if no region is active. #+begin_src emacs-lisp (use-package whole-line-or-region - - :config - (whole-line-or-region-global-mode 1) + :config + (whole-line-or-region-global-mode 1) ) #+end_src @@ -689,12 +688,12 @@ https://github.com/victorhge/iedit ) (mapc (lambda (mode) - (font-lock-add-keywords - mode - '( - ("\\<\\(FIXME\\)" 1 'highlight-angry-faces t) - ("\\<\\(TODO\\)" 1 'highlight-angry-faces t) - ))) + (font-lock-add-keywords + mode + '( + ("\\<\\(FIXME\\)" 1 'highlight-angry-faces t) + ("\\<\\(TODO\\)" 1 'highlight-angry-faces t) + ))) '(text-mode emacs-lisp-mode rust-mode zig-mode c-ts-mode c-mode prog-mode) ) #+END_SRC @@ -758,10 +757,10 @@ https://github.com/victorhge/iedit ** Dumb-jump #+BEGIN_SRC emacs-lisp - (use-package dumb-jump - :init - (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) - ) +(use-package dumb-jump + :init + (add-hook 'xref-backend-functions #'dumb-jump-xref-activate) +) #+END_SRC ** C-programming @@ -841,8 +840,8 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package comment-dwim-2 - :config - (global-set-key (kbd "M-;") 'comment-dwim-2) + :bind + ("M-;" . comment-dwim-2) ) #+END_SRC @@ -1006,11 +1005,11 @@ Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#fi "Select a single tag from list and filter `org-roam-node' by it." (interactive) (let ((tag (car (completing-read-multiple "Tag: " - (org-roam-tag-completions))))) + (org-roam-tag-completions))))) (org-roam-node-find nil nil - (lambda (node) - (member tag - (org-roam-node-tags node)))))) + (lambda (node) + (member tag + (org-roam-node-tags node)))))) #+END_SRC ** Font @@ -1061,7 +1060,7 @@ in a local directory (on Linux this is ~/.local/share/fonts). (when buffer-file-name (find-alternate-file (concat "/sudo:root@localhost:" - buffer-file-name) + buffer-file-name) ) ) ) @@ -1089,9 +1088,9 @@ in a local directory (on Linux this is ~/.local/share/fonts). (defun myrmi/run-ceedling-tests (&optional file-name) (interactive) (let* ( - (file-path (or file-name buffer-file-name)) - (root-path (or (locate-dominating-file file-path ceedling-project-file-name) ceedling-project-root)) - ) + (file-path (or file-name buffer-file-name)) + (root-path (or (locate-dominating-file file-path ceedling-project-file-name) ceedling-project-root)) + ) (compile (concat "cd " root-path " && " ceedling-cmd) ) @@ -1128,8 +1127,8 @@ in a local directory (on Linux this is ~/.local/share/fonts). (let ((dir default-directory)) (dolist (buffer (buffer-list)) (with-current-buffer buffer - (when (equal default-directory dir) - (myrmi/reload-dir-locals-for-current-buffer)))))) + (when (equal default-directory dir) + (myrmi/reload-dir-locals-for-current-buffer)))))) #+END_SRC ** Visit/reload config From e6e5b5e4613ef26e5b7ca1378aa5ecbaa7218e26 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 11:52:38 +0200 Subject: [PATCH 127/143] feat: Remove org-roam-ui Not using it, so don't have it. --- config.org | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/config.org b/config.org index 0390fca..ea4587d 100644 --- a/config.org +++ b/config.org @@ -917,27 +917,6 @@ Preserve indentation in SRC blocks ) #+END_SRC -*** UI - -#+BEGIN_SRC emacs-lisp -(use-package org-roam-ui - :ensure - (:host github :repo "org-roam/org-roam-ui" :branch "main" :files ("*.el" "out")) - :after org-roam -;; normally we'd recommend hooking orui after org-roam, but since org-roam does not have -;; a hookable mode anymore, you're advised to pick something yourself -;; if you don't care about startup time, use -;; :hook (after-init . org-roam-ui-mode) - :config - (setq org-roam-ui-sync-theme t - org-roam-ui-follow t - org-roam-ui-update-on-save t - org-roam-ui-open-on-start t) - ;; Start UI - ;; (org-roam-ui-mode) - ) -#+END_SRC - *** Consult #+BEGIN_SRC emacs-lisp From 3591e5704e7f4b4645d0f4d5369325dd80ac7368 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:01:17 +0200 Subject: [PATCH 128/143] fix: remove/apply defer only where it makes sense :defer is to defer loading because some other action (hook/config/...) will load it when appropriate. --- config.org | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/config.org b/config.org index ea4587d..cecb401 100644 --- a/config.org +++ b/config.org @@ -77,7 +77,6 @@ The audible bell is annoying AF. #+BEGIN_SRC emacs-lisp (use-package whitespace :ensure nil - :defer t :hook (before-save-hook . whitespace-cleanup) ;; if we wanna remove this hook at any time, eval: ;; (remove-hook 'before-save-hook #'whitespace-cleanup) @@ -637,7 +636,6 @@ https://github.com/abo-abo/hydra #+BEGIN_SRC emacs-lisp (use-package hydra - :defer t :config ;; Zoom hydra (defhydra hydra-zoom (global-map "") @@ -726,7 +724,9 @@ https://github.com/victorhge/iedit ** Markdown-mode #+BEGIN_SRC emacs-lisp -(use-package markdown-mode) +(use-package markdown-mode + :defer t +) #+END_SRC @@ -790,6 +790,7 @@ Move to the end if the compilation finishes. #+BEGIN_SRC emacs-lisp (use-package rust-mode + :defer t :init (setq rust-mode-treesitter-derive t)) #+END_SRC @@ -797,13 +798,17 @@ Move to the end if the compilation finishes. ** Zig #+BEGIN_SRC emacs-lisp -(use-package zig-mode) +(use-package zig-mode + :defer t + ) #+END_SRC ** Python #+BEGIN_SRC emacs-lisp -(use-package python-mode) +(use-package python-mode + :defer t + ) #+END_SRC * Multiple cursors @@ -896,6 +901,8 @@ Preserve indentation in SRC blocks #+BEGIN_SRC emacs-lisp (use-package org-bullets + :defer t + :after org :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC @@ -904,6 +911,8 @@ Preserve indentation in SRC blocks #+BEGIN_SRC emacs-lisp (use-package org-roam + :defer t + :after org :custom (org-roam-directory "~/projects/notes") (org-roam-completion-everywhere t) @@ -957,6 +966,8 @@ Preserve indentation in SRC blocks #+BEGIN_SRC emacs-lisp (use-package org-download + :defer t + :after org :config (add-hook 'dired-mode-hook 'org-download-enable) ) From c809f480bd08d05413ac8f36d817f7e20d7ce536 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:02:27 +0200 Subject: [PATCH 129/143] fix: load theme after it is actually loaded, not at init time --- config.org | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index cecb401..d19c937 100644 --- a/config.org +++ b/config.org @@ -616,8 +616,7 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+BEGIN_SRC emacs-lisp (use-package monokai-theme - - :init + :config (load-theme 'monokai t) ) #+END_SRC From 28b6168110e36e3b4122590d3cbb023c3a975e92 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:03:05 +0200 Subject: [PATCH 130/143] fix: refeactor electric pair It's a built-in package, so we can provide a proper configuration section using use-package. --- config.org | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index d19c937..7af261e 100644 --- a/config.org +++ b/config.org @@ -696,8 +696,12 @@ https://github.com/victorhge/iedit #+END_SRC ** Electric pair + #+BEGIN_SRC emacs-lisp -(add-hook 'prog-mode-hook 'electric-pair-mode) +(use-package elec-pair + :ensure nil + :defer t + :hook (prog-mode-hook . electric-pair-mode)) #+END_SRC ** Eglot From 980ce6750b0aceefba08c22a9203492d160bdabb Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:03:41 +0200 Subject: [PATCH 131/143] feat: Add paren package configuration show-paren-context-when-offscreen is handy to indicate when we are offscreen for a block of code --- config.org | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/config.org b/config.org index 7af261e..994938c 100644 --- a/config.org +++ b/config.org @@ -704,6 +704,18 @@ https://github.com/victorhge/iedit :hook (prog-mode-hook . electric-pair-mode)) #+END_SRC +** Paren + +#+BEGIN_SRC emacs-lisp +(use-package paren + :ensure nil + :hook (after-init-hook . show-paren-mode) + :custom + (show-paren-delay 0) + (show-paren-style 'mixed) + (show-paren-context-when-offscreen t)) ;; show matches within window splits +#+END_SRC + ** Eglot #+BEGIN_SRC emacs-lisp From 015ed00b0f39fd2cad2abc440e7f4afc95050b70 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:04:47 +0200 Subject: [PATCH 132/143] feat: refactor org mode configuration Defer loading to speed up startup and combine all the configuration of org mode in the same block. org-ellipsis is newly added and gives some eye candy when org blocks are folded. --- config.org | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/config.org b/config.org index 994938c..eb1224f 100644 --- a/config.org +++ b/config.org @@ -877,26 +877,27 @@ https://github.com/remyferre/comment-dwim-2 (add-hook 'project-find-functions #'project-projectile) ) #+END_SRC - * Org ** General config -*** Super/Sub-scripts - -Use ={}= for subscripting: - -https://orgmode.org/manual/Subscripts-and-superscripts.html #+BEGIN_SRC emacs-lisp -(setq org-use-sub-superscripts '{}) -#+END_SRC - -*** Indentation - -Preserve indentation in SRC blocks - -#+BEGIN_SRC emacs-lisp -(setq org-src-preserve-indentation t) +(use-package org + :ensure nil + :defer t + :mode ("\\.org\\'" . org-mode) + :config + (setq + ;; Start collapsed for speed + org-startup-folded t + ;; Use ={}= for subscripting: https://orgmode.org/manual/Subscripts-and-superscripts.html + org-use-sub-superscripts '{} + ;; Preserve indentation in SRC blocks + org-src-preserve-indentation t + ) + ;; Ellipsis styling + (setq org-ellipsis " ▼ ") + (set-face-attribute 'org-ellipsis nil :inherit 'default :box nil)) #+END_SRC ** Org-todo From 6a57cbfd1f319404033ddd75311de56da4b35901 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:46:43 +0200 Subject: [PATCH 133/143] feat: Add custom modeline --- config.org | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/config.org b/config.org index eb1224f..4a417e2 100644 --- a/config.org +++ b/config.org @@ -1002,6 +1002,36 @@ https://github.com/remyferre/comment-dwim-2 * Custom +** Modeline + +#+BEGIN_SRC emacs-lisp +(setq-default mode-line-format + '("%e" " " + ;; (:propertize " " display (raise +0.1)) ;; Top padding + ;; (:propertize " " display (raise -0.1)) ;; Bottom padding + (:propertize "𝝮 " face font-lock-keyword-face) + + (:propertize + ("" mode-line-mule-info mode-line-client mode-line-modified mode-line-remote mode-line-window-dedicated)) + + mode-line-frame-identification + mode-line-buffer-identification + " " + mode-line-position + mode-line-format-right-align + " " + (project-mode-line project-mode-line-format) + " " + (vc-mode vc-mode) + " " + mode-line-modes + mode-line-misc-info + mode-line-end-spaces) + project-mode-line t + mode-line-buffer-identification '(" %b") + mode-line-position-column-line-format '(" %l:%c")) +#+END_SRC + ** Org-roam Inspired by https://github.com/org-roam/org-roam/wiki/User-contributed-Tricks#filter-by-a-tag . From 0c18e02686cf000eae1dd4f7451c79ba8c0444aa Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 12:55:07 +0200 Subject: [PATCH 134/143] fix: liniting errors on init.el --- init.el | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/init.el b/init.el index a57c423..3f13d33 100644 --- a/init.el +++ b/init.el @@ -4,6 +4,9 @@ ;;; Commentary: ;;; Load init files + +;;; Code: + ;;; Increase garbage collection threshold during init but leave it to the default value after ;;; There are a LOT of articles/sites/... discussing this: ;;; https://bling.github.io/blog/2016/01/18/why-are-you-changing-gc-cons-threshold/ @@ -19,3 +22,7 @@ (load custom-file :no-error-if-file-is-missing) ) + +(provide 'init) + +;;; init.el ends here From c3a188defe7d1a44cbe87c60c6f683a65d7aba7b Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 13:06:08 +0200 Subject: [PATCH 135/143] fix: Remove unused mark section M-SPC is used for selecting region anyway --- config.org | 6 ------ 1 file changed, 6 deletions(-) diff --git a/config.org b/config.org index 4a417e2..fcb643e 100644 --- a/config.org +++ b/config.org @@ -151,12 +151,6 @@ Use list-buffers bigger brother. (global-set-key [remap list-buffers] 'ibuffer) #+end_src -** Mark - -#+begin_src emacs-lisp -(global-set-key (kbd "M-SPC") 'mark-word) -#+end_src - ** Eldoc #+BEGIN_SRC emacs-lisp From 4aeb92eb6f69853a4ee304c69d5a699fe4448e68 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 13:06:26 +0200 Subject: [PATCH 136/143] feat: Add which-func configuration --- config.org | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.org b/config.org index fcb643e..f91f1a1 100644 --- a/config.org +++ b/config.org @@ -205,6 +205,19 @@ https://endlessparentheses.com/leave-the-cursor-at-start-of-match-after-isearch. ) #+END_SRC +** Which-func + +Show function we are currently in in the mode-line. + +#+BEGIN_SRC emacs-lisp +(use-package which-func + :ensure nil + :defer t + :hook + (prog-mode-hook . which-function-mode) + ) +#+END_SRC + ** Abbrev #+begin_src emacs-lisp From 8ba598127bc7952c8438f655d26ea7f808bf626d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 13:49:51 +0200 Subject: [PATCH 137/143] feat: show line numbers --- config.org | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config.org b/config.org index f91f1a1..1f33c7c 100644 --- a/config.org +++ b/config.org @@ -218,6 +218,13 @@ Show function we are currently in in the mode-line. ) #+END_SRC +** Line-numbers + +Show line numbers. +#+BEGIN_SRC emacs-lisp +(global-display-line-numbers-mode t) +#+END_SRC + ** Abbrev #+begin_src emacs-lisp From b79d782623162449a85c299abd5c67252ff3f76d Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 14:06:08 +0200 Subject: [PATCH 138/143] feat: Make dashboard a bit fancier --- config.org | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config.org b/config.org index 1f33c7c..13cea1e 100644 --- a/config.org +++ b/config.org @@ -639,6 +639,12 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+begin_src emacs-lisp (use-package dashboard + :custom + (dashboard-center-content t) ;; Center content + (dashboard-icon-type 'nerd-icons) ;; Nerd icons used + (dashboard-set-heading-icons t) ;; Heading icons enabled + (dashboard-set-file-icons t) ;; File icons enabled + (dashboard-startup-banner 'logo) ;; Use alternative logo :config (dashboard-setup-startup-hook)) #+end_src From 706b396e1c100092d75d6374a0107d2e75bd70cf Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Tue, 27 May 2025 14:06:22 +0200 Subject: [PATCH 139/143] feat: load org-roam at startup --- config.org | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index 13cea1e..dc42e02 100644 --- a/config.org +++ b/config.org @@ -947,8 +947,7 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package org-roam - :defer t - :after org + :demand :custom (org-roam-directory "~/projects/notes") (org-roam-completion-everywhere t) From 423acecb38166cc301a3be909fd34b55aa57b095 Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 24 Jul 2025 10:24:01 +0200 Subject: [PATCH 140/143] replace whitespace-cleanup with delete-trailing-whitespace whitespace-cleanup seems to do some formatting, tabs-to-whitespace and vice versa,... which are kinda annoying. We should be fine for now with just removing trailing whitespaces. --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index dc42e02..c421d39 100644 --- a/config.org +++ b/config.org @@ -77,7 +77,7 @@ The audible bell is annoying AF. #+BEGIN_SRC emacs-lisp (use-package whitespace :ensure nil - :hook (before-save-hook . whitespace-cleanup) + :hook (before-save-hook . delete-trailing-whitespace) ;; if we wanna remove this hook at any time, eval: ;; (remove-hook 'before-save-hook #'whitespace-cleanup) ) From 06208d5491a1e154721130c803f6aee83edd9bef Mon Sep 17 00:00:00 2001 From: Laurens Miers Date: Thu, 24 Jul 2025 10:24:54 +0200 Subject: [PATCH 141/143] feat: Display function name in header as well --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index c421d39..d40c03f 100644 --- a/config.org +++ b/config.org @@ -213,6 +213,8 @@ Show function we are currently in in the mode-line. (use-package which-func :ensure nil :defer t + :custom + (which-func-display mode-and-header) :hook (prog-mode-hook . which-function-mode) ) From 53aa91408cfb26aa7e7312d39157d6945599b2e6 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Aug 2025 11:44:30 +0200 Subject: [PATCH 142/143] fix: which-func custom setting --- config.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.org b/config.org index d40c03f..fc60742 100644 --- a/config.org +++ b/config.org @@ -214,7 +214,7 @@ Show function we are currently in in the mode-line. :ensure nil :defer t :custom - (which-func-display mode-and-header) + (which-func-display 'mode-and-header) :hook (prog-mode-hook . which-function-mode) ) From b8adef76fb1759b3c63a28e702c1edd220207019 Mon Sep 17 00:00:00 2001 From: laurensmiers Date: Thu, 14 Aug 2025 11:44:38 +0200 Subject: [PATCH 143/143] chore: update gitignore with compile elpa files, org-roam-db, ... --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index ea48958..712c684 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,11 @@ backups eshell elpaca +eln-cache +elpa +org-roam.db +transient + # projectile projectile*