Compare commits

..

No commits in common. "master" and "v3.0" have entirely different histories.
master ... v3.0

12 changed files with 254 additions and 582 deletions

5
.gitignore vendored
View file

@ -3,11 +3,6 @@ backups
eshell
elpaca
eln-cache
elpa
org-roam.db
transient
# projectile
projectile*

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "extra/sunrise-commander"]
path = extra/sunrise-commander
url = https://github.com/escherdragon/sunrise-commander

8
cheat-sheet.txt Normal file
View file

@ -0,0 +1,8 @@
C-M-Space : smartparens wrapping
C-c C-c : calculator (see init.el)
C-h k <key-sequence>: lookup key sequence
C-x 0 : close current window
C-q <tab> : insert a <tab>
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

View file

@ -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, ...)).
@ -323,7 +260,7 @@ C-c C-c to apply."
(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 "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
@ -374,8 +312,8 @@ 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 f" . consult-flymake) ;; Alternative: consult-flycheck
;; ("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
@ -384,9 +322,9 @@ 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-grep)
;; ("M-s G" . consult-git-grep)
;; ("M-s r" . consult-ripgrep)
("M-s l" . consult-line)
@ -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 ("<tab>" . 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,11 +445,11 @@ 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
@ -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
@ -562,15 +484,6 @@ 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:
@ -580,6 +493,7 @@ 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)
)
@ -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
:ensure (:wait t)
)
#+end_src
** Text zoom
#+begin_src emacs-lisp
(defhydra hydra-zoom (global-map "<f1>")
"zoom"
("g" text-scale-increase "in")
("l" text-scale-decrease "out")
)
)
#+END_SRC
#+end_src
* Zygospore
@ -718,34 +631,15 @@ https://github.com/victorhge/iedit
#+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 ()
@ -753,17 +647,12 @@ https://github.com/victorhge/iedit
(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,15 +670,41 @@ 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
@ -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
@ -1123,6 +866,7 @@ in a local directory (on Linux this is ~/.local/share/fonts).
)
#+END_SRC
** Save symbol at point
#+BEGIN_SRC emacs-lisp
@ -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 <key-sequence> | Lookup key sequencesmartparens wrapping |
| C-q <key> | Insert <key> 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

View file

@ -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:

@ -0,0 +1 @@
Subproject commit cf8305a149a321d028858057e7a7c92f0038a06a

BIN
img/dash_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

16
init.el
View file

@ -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

View file

@ -1,6 +0,0 @@
# -*- mode: snippet -*-
# name: kaboom
# key: kb
# --
char (*__kaboom)[sizeof($1)] = 1;

View file

@ -1,6 +1,6 @@
# -*- mode: snippet -*-
# name: Start emacs source block
# key: se
# name: Lisp source code block
# key: s>
# --
#+BEGIN_SRC emacs-lisp

View file

@ -1,6 +0,0 @@
# -*- mode: snippet -*-
# name: Filetags
# key: ft
# --
#+FILETAGS: :$1:

View file

@ -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