diff --git a/.gitignore b/.gitignore index 712c684..ea48958 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,6 @@ backups eshell elpaca -eln-cache -elpa -org-roam.db -transient - # projectile projectile* diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f8db735 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "extra/sunrise-commander"] + path = extra/sunrise-commander + url = https://github.com/escherdragon/sunrise-commander diff --git a/cheat-sheet.txt b/cheat-sheet.txt new file mode 100644 index 0000000..ddd8cdd --- /dev/null +++ b/cheat-sheet.txt @@ -0,0 +1,8 @@ +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 fc60742..aced26d 100644 --- a/config.org +++ b/config.org @@ -2,62 +2,61 @@ #+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 -#+BEGIN_SRC emacs-lisp - (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 - -** Package repos - -#+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 - -** Use-package - -*** Always ensure - -#+BEGIN_SRC emacs-lisp -(require 'use-package-ensure) -(setq use-package-always-ensure t) -#+END_SRC - ** Bell The audible bell is annoying AF. @@ -72,15 +71,10 @@ The audible bell is annoying AF. (setq column-number-mode 1) #+END_SRC -** Whitespace cleanup +** Delete trailing whitespaces #+BEGIN_SRC emacs-lisp -(use-package whitespace - :ensure nil - :hook (before-save-hook . delete-trailing-whitespace) - ;; if we wanna remove this hook at any time, eval: - ;; (remove-hook 'before-save-hook #'whitespace-cleanup) - ) +(add-hook 'before-save-hook 'delete-trailing-whitespace) #+END_SRC ** Save history and recent files @@ -151,82 +145,22 @@ Use list-buffers bigger brother. (global-set-key [remap list-buffers] 'ibuffer) #+end_src -** Eldoc +** Mark -#+BEGIN_SRC emacs-lisp -(use-package eldoc - :ensure nil - :init - (global-eldoc-mode)) -#+END_SRC +#+begin_src emacs-lisp +(global-set-key (kbd "M-SPC") 'mark-word) +#+end_src ** Isearch -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 +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 -** 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 - -** Which-func - -Show function we are currently in in the mode-line. - -#+BEGIN_SRC emacs-lisp -(use-package which-func - :ensure nil - :defer t - :custom - (which-func-display 'mode-and-header) - :hook - (prog-mode-hook . which-function-mode) - ) -#+END_SRC - -** Line-numbers - -Show line numbers. -#+BEGIN_SRC emacs-lisp -(global-display-line-numbers-mode t) -#+END_SRC - ** Abbrev #+begin_src emacs-lisp @@ -263,6 +197,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 + ** Adaptive cursor width Make cursor the width of the character it is under f.e. full width of a tab. @@ -271,12 +214,6 @@ 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 -(global-auto-revert-mode t) -#+END_SRC - * Resize-mode Minor-mode to easily resize frames (works with EXWM (firefox, ...)). @@ -322,8 +259,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 C-p/n/f/b to adjust frames."))) + (message "Only root frame exists, abort.")) + (message "Use arrow-keys or i/j/k/l to adjust frames."))) (defun resize-frame-done () (interactive) @@ -337,14 +274,15 @@ 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' - :hook (after-init . vertico-mode) - ) + ;; (vertico-cycle t) ;; Enable cycling for `vertico-next/previous' + :init + (vertico-mode)) #+END_SRC ** Consult @@ -353,58 +291,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. @@ -417,7 +355,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. @@ -425,7 +363,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. @@ -457,27 +395,11 @@ C-c C-c to apply." ) #+END_SRC -** In-buffer completion - -*** Consult - -#+BEGIN_SRC emacs-lisp -(setq completion-in-region-function - (lambda (&rest args) - (apply (if vertico-mode - #'consult-completion-in-region - #'completion--in-region) - args))) -#+END_SRC - -*** Corfu +** Corfu #+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 @@ -503,7 +425,7 @@ C-c C-c to apply." ** Orderless -#+BEGIN_SRC emacs-lisp +#+begin_src emacs-lisp (use-package orderless :demand t :custom @@ -523,18 +445,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 @@ -542,7 +464,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 @@ -556,21 +478,12 @@ 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 - -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: @@ -580,8 +493,9 @@ 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 @@ -632,7 +546,8 @@ For the keybindings, we have to defien them in both raw and line mode. From the #+BEGIN_SRC emacs-lisp (use-package monokai-theme - :config + + :init (load-theme 'monokai t) ) #+END_SRC @@ -641,32 +556,30 @@ 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 + (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 -https://github.com/abo-abo/hydra - -#+BEGIN_SRC emacs-lisp +Install and wait for hydra to be available since we are using it in this init.el : +#+begin_src emacs-lisp (use-package hydra - :config - ;; Zoom hydra - (defhydra hydra-zoom (global-map "") - "zoom" - ("g" text-scale-increase "in") - ("l" text-scale-decrease "out") - ) - + :ensure (:wait t) ) -#+END_SRC +#+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 * Zygospore @@ -707,63 +620,39 @@ 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 ** Electric pair - #+BEGIN_SRC emacs-lisp -(use-package elec-pair - :ensure nil - :defer t - :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 +(add-hook 'prog-mode-hook 'electric-pair-mode) #+END_SRC ** Eglot #+BEGIN_SRC emacs-lisp -(use-package eglot - :ensure nil - :custom - (eglot-autoshutdown t) - :init + (use-package eglot) + (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 #+BEGIN_SRC emacs-lisp -(use-package markdown-mode - :defer t -) +(use-package markdown-mode) #+END_SRC @@ -774,7 +663,6 @@ 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) ) @@ -782,22 +670,48 @@ 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 - :defer t - ) +: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 -(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 @@ -827,7 +741,6 @@ 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 @@ -835,17 +748,13 @@ Move to the end if the compilation finishes. ** Zig #+BEGIN_SRC emacs-lisp -(use-package zig-mode - :defer t - ) +(use-package zig-mode) #+END_SRC ** Python #+BEGIN_SRC emacs-lisp -(use-package python-mode - :defer t - ) +(use-package python-mode) #+END_SRC * Multiple cursors @@ -882,8 +791,8 @@ https://github.com/remyferre/comment-dwim-2 #+BEGIN_SRC emacs-lisp (use-package comment-dwim-2 - :bind - ("M-;" . comment-dwim-2) + :config + (global-set-key (kbd "M-;") 'comment-dwim-2) ) #+END_SRC @@ -899,117 +808,36 @@ 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 -(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)) +(setq org-use-sub-superscripts '{}) #+END_SRC -** Org-todo +*** Indentation -*** Mark parent entry as DONE when children are DONE +Preserve indentation in SRC blocks #+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) +(setq org-src-preserve-indentation t) #+END_SRC ** Org bullets #+BEGIN_SRC emacs-lisp (use-package org-bullets - :defer t - :after org :config (add-hook 'org-mode-hook (lambda () (org-bullets-mode)))) #+END_SRC -** Org Roam - -#+BEGIN_SRC emacs-lisp -(use-package org-roam - :demand - :custom - (org-roam-directory "~/projects/notes") - (org-roam-completion-everywhere t) - :config - (org-roam-setup) - (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$"))) - (load (expand-file-name "init.el" org-roam-directory) :no-error-if-file-is-missing) -) -#+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) - ("C-c n d" . org-roam-dailies-goto-today) - ) -#+END_SRC - -** Org Download - -#+BEGIN_SRC emacs-lisp -(use-package org-download - :defer t - :after org - :config - (add-hook 'dired-mode-hook 'org-download-enable) - ) -#+END_SRC - * Elisp ** Add demos to describe-function @@ -1023,91 +851,6 @@ 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 . - -#+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 - -** 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 @@ -1117,12 +860,13 @@ 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) ) ) ) #+END_SRC + ** Save symbol at point #+BEGIN_SRC emacs-lisp @@ -1145,9 +889,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) ) @@ -1184,8 +928,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 @@ -1195,58 +939,12 @@ This should normally be done by the init.el to load this configuration. #+BEGIN_SRC emacs-lisp (defun myrmi/visit-config () - "Visit emacs config" + "Reloads ~/.emacs.d/config.org at runtime" (interactive) (find-file my-config-file)) (defun myrmi/reload-config () - "Reload emacs config at runtime" + "Reloads ~/.emacs.d/config.org at runtime" (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 | - -** 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 diff --git a/early-init.el b/early-init.el index 5d83494..0fe1b95 100644 --- a/early-init.el +++ b/early-init.el @@ -1,18 +1,9 @@ -;;; early-init.el --- Early Init -*- lexical-binding: t; -*- - -;;; Commentary: -;; Early init configuration for Emacs Solo -;; - -;;; Code: - - -;; Only care about errors in *Messages* buffer -(setq warning-minimum-level :error) - -;; We control when packages are enabled (setq package-enable-at-startup nil) -(provide 'early-init) -;;; early-init.el ends here +;; Local Variables: +;; no-byte-compile: t +;; no-native-compile: t +;; no-update-autoloads: t +;; End: + diff --git a/extra/sunrise-commander b/extra/sunrise-commander new file mode 160000 index 0000000..cf8305a --- /dev/null +++ b/extra/sunrise-commander @@ -0,0 +1 @@ +Subproject commit cf8305a149a321d028858057e7a7c92f0038a06a diff --git a/img/dash_logo.png b/img/dash_logo.png new file mode 100644 index 0000000..bd8c88b Binary files /dev/null and b/img/dash_logo.png differ diff --git a/init.el b/init.el index 3f13d33..e442e9c 100644 --- a/init.el +++ b/init.el @@ -1,12 +1,3 @@ -;;; init.el --- Init -*- lexical-binding: t; -*- - - -;;; 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/ @@ -20,9 +11,6 @@ (when (file-readable-p my-config-file) (org-babel-load-file (expand-file-name my-config-file))) - (load custom-file :no-error-if-file-is-missing) + (when (file-readable-p custom-file) + (load custom-file)) ) - -(provide 'init) - -;;; init.el ends here diff --git a/snippets/c-mode/kaboom b/snippets/c-mode/kaboom deleted file mode 100644 index d4220a2..0000000 --- a/snippets/c-mode/kaboom +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: kaboom -# key: kb -# -- - -char (*__kaboom)[sizeof($1)] = 1; diff --git a/snippets/org-mode/emacs-lisp-source-block b/snippets/org-mode/emacs-lisp-source-block index 25f00aa..2f90c13 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 +# name: Lisp source code block +# key: s> # -- #+BEGIN_SRC emacs-lisp diff --git a/snippets/org-mode/filetags b/snippets/org-mode/filetags deleted file mode 100644 index b3f283d..0000000 --- a/snippets/org-mode/filetags +++ /dev/null @@ -1,6 +0,0 @@ -# -*- mode: snippet -*- -# name: Filetags -# key: ft -# -- - -#+FILETAGS: :$1: diff --git a/snippets/org-mode/source_block_emacs b/snippets/org-mode/source_block_emacs index 215d78e..73ed1eb 100644 --- a/snippets/org-mode/source_block_emacs +++ b/snippets/org-mode/source_block_emacs @@ -1,8 +1,8 @@ # -*- mode: snippet -*- -# name: Org source code block -# key: s +# name: Start emacs source block +# key: se> # -- -#+BEGIN_SRC +#+BEGIN_SRC emacs-lisp ${1} #+END_SRC