chore: update emacs structure

This commit is contained in:
Leon Schwarzäugl 2026-03-06 12:59:12 +01:00
parent 7ad9d84109
commit 7cff749776
Signed by: swarsel
GPG key ID: 26A54C31F2A4FD84
3 changed files with 519 additions and 621 deletions

View file

@ -31689,22 +31689,22 @@ Also packed into the hook function is the line =(fset 'epg-wait-for-status 'igno
(defvar swarsel-file-name-handler-alist file-name-handler-alist) (defvar swarsel-file-name-handler-alist file-name-handler-alist)
(defvar swarsel-vc-handled-backends vc-handled-backends) (defvar swarsel-vc-handled-backends vc-handled-backends)
(setq gc-cons-threshold most-positive-fixnum (defun swarsel/restore-startup-settings ()
gc-cons-percentage 0.6 "Restore startup-tuned variables to their regular runtime values."
file-name-handler-alist nil
vc-handled-backends nil)
(add-hook 'emacs-startup-hook
(lambda ()
(progn
(setq gc-cons-threshold (* 32 1024 1024) (setq gc-cons-threshold (* 32 1024 1024)
gc-cons-percentage 0.1 gc-cons-percentage 0.1
jit-lock-defer-time 0.05 jit-lock-defer-time 0.05
read-process-output-max (* 1024 1024) read-process-output-max (* 1024 1024)
file-name-handler-alist swarsel-file-name-handler-alist file-name-handler-alist swarsel-file-name-handler-alist
vc-handled-backends swarsel-vc-handled-backends) vc-handled-backends swarsel-vc-handled-backends)
(fset 'epg-wait-for-status 'ignore) (fset 'epg-wait-for-status #'ignore))
)))
(setq gc-cons-threshold most-positive-fixnum
gc-cons-percentage 0.6
file-name-handler-alist nil
vc-handled-backends nil)
(add-hook 'emacs-startup-hook #'swarsel/restore-startup-settings)
#+end_src #+end_src
*** Setup frames *** Setup frames
@ -32183,7 +32183,27 @@ We set a hook that runs everytime we save the file. It would be a bit more effic
(swarsel/run-formatting) (swarsel/run-formatting)
))) )))
(setq org-html-htmlize-output-type nil) (defun swarsel/org-babel-tangle-single-block-advice (orig-fun &rest args)
"Run ORIG-FUN with redisplay and messages temporarily inhibited."
(let ((inhibit-redisplay t)
(inhibit-message t))
(apply orig-fun args)))
(defun swarsel/org-babel-tangle-timing-advice (orig-fun &rest args)
"Run ORIG-FUN and report elapsed tangle time."
(let ((tim (current-time)))
(prog1 (apply orig-fun args)
(message "org-tangle took %f sec" (float-time (time-subtract (current-time) tim))))))
(defun swarsel/markdown-mode-keys ()
"Local markdown key customizations."
(local-set-key (kbd "C-c C-x C-l") #'org-latex-preview)
(local-set-key (kbd "C-c C-x C-u") #'markdown-toggle-url-hiding))
(defun swarsel/eglot-ensure-and-format ()
"Ensure eglot is running and enable format-on-save for current buffer."
(eglot-ensure)
(add-hook 'before-save-hook #'eglot-format nil 'local))
;; (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'swarsel/org-babel-tangle-config))) ;; (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'swarsel/org-babel-tangle-config)))
@ -32421,7 +32441,7 @@ I also define some keybinds to some combinations directly. Those are used mostly
"wm" '(delete-other-windows :wk "maximize") "wm" '(delete-other-windows :wk "maximize")
"<right>" 'up-list "<right>" 'up-list
"<left>" 'down-list "<left>" 'down-list
)) )
;; General often used hotkeys ;; General often used hotkeys
(general-define-key (general-define-key
@ -32441,7 +32461,7 @@ I also define some keybinds to some combinations directly. Those are used mostly
"C->" 'mc/mark-next-like-this "C->" 'mc/mark-next-like-this
"C-<" 'mc/mark-previous-like-this "C-<" 'mc/mark-previous-like-this
"C-c C-<" 'mc/mark-all-like-this "C-c C-<" 'mc/mark-all-like-this
) ))
#+end_src #+end_src
*** Directory setup / File structure *** Directory setup / File structure
@ -32481,9 +32501,10 @@ This section also sets the emacs directory to the =~/.cache/= directory which is
url-history-file (expand-file-name "url/history" user-emacs-directory)) url-history-file (expand-file-name "url/history" user-emacs-directory))
;; Use no-littering to automatically set common paths to the new user-emacs-directory ;; Use no-littering to automatically set common paths to the new user-emacs-directory
(use-package no-littering) (use-package no-littering
:config
(setq custom-file (make-temp-file "emacs-custom-")) (setq custom-file (make-temp-file "emacs-custom-"))
(load custom-file t) (load custom-file t))
#+end_src #+end_src
@ -32511,7 +32532,8 @@ Many people dislike the Emacs backup files; I do enjoy them, but have to admit t
delete-old-versions t ; Clean up the backups delete-old-versions t ; Clean up the backups
version-control t ; Use version numbers on backups, version-control t ; Use version numbers on backups,
kept-new-versions 5 ; keep some new versions kept-new-versions 5 ; keep some new versions
kept-old-versions 2) ; and some old ones, too kept-old-versions 2 ; and some old ones, too
backup-by-copying-when-linked t)
#+end_src #+end_src
** General init.el setup + UI ** General init.el setup + UI
@ -32548,7 +32570,7 @@ Here I set up some things that are too minor to put under other categories.
(add-hook 'before-save-hook 'delete-trailing-whitespace) (add-hook 'before-save-hook 'delete-trailing-whitespace)
(global-hl-line-mode 1) (global-hl-line-mode 1)
;; (setq redisplay-dont-pause t) ;; obsolete ;; (setq redisplay-dont-pause t) ;; obsolete
(setq blink-cursor-mode nil) ;; blink-cursor is an unexpected source of slowdown (blink-cursor-mode -1) ;; blink-cursor is an unexpected source of slowdown
(global-subword-mode 1) ; Iterate through CamelCase words (global-subword-mode 1) ; Iterate through CamelCase words
(setq blink-matching-paren nil) ;; this makes the cursor jump around annoyingly (setq blink-matching-paren nil) ;; this makes the cursor jump around annoyingly
(delete-selection-mode 1) (delete-selection-mode 1)
@ -32560,7 +32582,6 @@ Here I set up some things that are too minor to put under other categories.
bidi-display-reordering 'left-to-right bidi-display-reordering 'left-to-right
bidi-inhibit-bpa t) bidi-inhibit-bpa t)
(global-so-long-mode) (global-so-long-mode)
(setq process-adaptive-read-buffering nil) ;; not sure if this is a good idea
(setq fast-but-imprecise-scrolling t (setq fast-but-imprecise-scrolling t
redisplay-skip-fontification-on-input t redisplay-skip-fontification-on-input t
inhibit-compacting-font-caches t) inhibit-compacting-font-caches t)
@ -32568,9 +32589,7 @@ Here I set up some things that are too minor to put under other categories.
which-func-update-delay 1.0) which-func-update-delay 1.0)
(setq undo-limit 80000000 (setq undo-limit 80000000
evil-want-fine-undo t evil-want-fine-undo t
auto-save-default t auto-save-default t)
password-cache-expiry nil
)
(setq browse-url-browser-function 'browse-url-firefox) (setq browse-url-browser-function 'browse-url-firefox)
;; (setenv "DISPLAY" ":0") ;; needed for firefox ;; (setenv "DISPLAY" ":0") ;; needed for firefox
;; disable a keybind that does more harm than good ;; disable a keybind that does more harm than good
@ -32661,16 +32680,18 @@ Lastly, I load the =highlight-indent-guides= package. This adds a neat visual in
tab-width 2) tab-width 2)
(setq tab-always-indent 'complete) (setq tab-always-indent 'complete)
(setq python-indent-guess-indent-offset-verbose nil)
(use-package python
:ensure nil
:custom
(python-indent-guess-indent-offset-verbose nil))
(use-package highlight-indent-guides (use-package highlight-indent-guides
:hook (prog-mode . highlight-indent-guides-mode) :hook (prog-mode . highlight-indent-guides-mode)
:init :custom
(setq highlight-indent-guides-method 'column) (highlight-indent-guides-method 'column)
(setq highlight-indent-guides-responsive 'top) (highlight-indent-guides-responsive nil)
) :config
(with-eval-after-load 'highlight-indent-guides
(set-face-attribute 'highlight-indent-guides-even-face nil :background "gray10") (set-face-attribute 'highlight-indent-guides-even-face nil :background "gray10")
(set-face-attribute 'highlight-indent-guides-odd-face nil :background "gray20") (set-face-attribute 'highlight-indent-guides-odd-face nil :background "gray20")
(set-face-attribute 'highlight-indent-guides-stack-even-face nil :background "gray40") (set-face-attribute 'highlight-indent-guides-stack-even-face nil :background "gray40")
@ -32779,8 +32800,7 @@ This gives support for many different modes, and works beautifully out of the bo
(use-package evil-collection (use-package evil-collection
:after evil :after evil
:config :config
(evil-collection-init) (evil-collection-init))
(setq forge-add-default-bindings nil))
#+end_src #+end_src
**** evil-snipe **** evil-snipe
:PROPERTIES: :PROPERTIES:
@ -32839,7 +32859,7 @@ This makes it so that when setting a mark in evil mode (using =m <key>=), it cre
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package evil-visual-mark-mode (use-package evil-visual-mark-mode
:config (evil-visual-mark-mode)) :commands evil-visual-mark-mode)
#+end_src #+end_src
**** evil-textobj-tree-sitter **** evil-textobj-tree-sitter
@ -32853,14 +32873,14 @@ This adds support for tree-sitter objects. This allows for the following chords:
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package evil-textobj-tree-sitter) (use-package evil-textobj-tree-sitter
:config
;; bind `function.outer`(entire function block) to `f` for use in things like `vaf`, `yaf` ;; bind `function.outer`(entire function block) to `f` for use in things like `vaf`, `yaf`
(define-key evil-outer-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.outer")) (define-key evil-outer-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.outer"))
;; bind `function.inner`(function block without name and args) to `f` for use in things like `vif`, `yif` ;; bind `function.inner`(function block without name and args) to `f` for use in things like `vif`, `yif`
(define-key evil-inner-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.inner")) (define-key evil-inner-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.inner"))
;; You can also bind multiple items and we will match the first one we can find ;; You can also bind multiple items and we will match the first one we can find
(define-key evil-outer-text-objects-map "a" (evil-textobj-tree-sitter-get-textobj ("if_statement.outer" "conditional.outer" "loop.outer") '((python-mode . ((if_statement.outer) @if_statement.outer)) (python-ts-mode . ((if_statement.outer) @if_statement.outer))))) (define-key evil-outer-text-objects-map "a" (evil-textobj-tree-sitter-get-textobj ("if_statement.outer" "conditional.outer" "loop.outer") '((python-mode . ((if_statement.outer) @if_statement.outer)) (python-ts-mode . ((if_statement.outer) @if_statement.outer))))))
#+end_src #+end_src
**** evil-numbers **** evil-numbers
@ -33015,21 +33035,21 @@ This is really the perfect solution for me, but it might not be for everyone.
(use-package mini-modeline (use-package mini-modeline
:after smart-mode-line :after smart-mode-line
:config :custom
(mini-modeline-mode t) (mini-modeline-display-gui-line nil)
(setq mini-modeline-display-gui-line nil) (mini-modeline-enhance-visual nil)
(setq mini-modeline-enhance-visual nil) (mini-modeline-truncate-p nil)
(setq mini-modeline-truncate-p nil) (mini-modeline-l-format nil)
(setq mini-modeline-l-format nil) (mini-modeline-right-padding 5)
(setq mini-modeline-right-padding 5) (mini-modeline-r-format '("%e" mode-line-front-space mode-line-mule-info mode-line-client
(setq window-divider-mode t)
(setq window-divider-default-places t)
(setq window-divider-default-bottom-width 1)
(setq window-divider-default-right-width 1)
(setq mini-modeline-r-format '("%e" mode-line-front-space mode-line-mule-info mode-line-client
mode-line-modified mode-line-remote mode-line-frame-identification mode-line-modified mode-line-remote mode-line-frame-identification
mode-line-buffer-identification " " mode-line-position " " mode-name evil-mode-line-tag)) mode-line-buffer-identification " " mode-line-position " " mode-name evil-mode-line-tag))
) :config
(mini-modeline-mode t)
(setq window-divider-default-places t
window-divider-default-bottom-width 1
window-divider-default-right-width 1)
(window-divider-mode 1))
(use-package smart-mode-line (use-package smart-mode-line
:config :config
@ -33139,8 +33159,8 @@ The big winner here are the convenient keybinds being setup here for general use
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package consult (use-package consult
:config :custom
(setq consult-fontify-max-size 1024) (consult-fontify-max-size 1024)
:bind :bind
(("C-x b" . consult-buffer) (("C-x b" . consult-buffer)
("C-c <C-m>" . consult-global-mark) ("C-c <C-m>" . consult-global-mark)
@ -33248,8 +33268,8 @@ This pair of packages provides information on keybinds in addition to function n
(use-package which-key (use-package which-key
:init (which-key-mode) :init (which-key-mode)
:diminish which-key-mode :diminish which-key-mode
:config :custom
(setq which-key-idle-delay 0.3)) (which-key-idle-delay 0.3))
(use-package helpful (use-package helpful
:bind :bind
@ -33257,8 +33277,8 @@ This pair of packages provides information on keybinds in addition to function n
("C-h v" . helpful-variable) ("C-h v" . helpful-variable)
("C-h k" . helpful-key) ("C-h k" . helpful-key)
("C-h C-." . helpful-at-point)) ("C-h C-." . helpful-at-point))
:config :custom
(setq help-window-select nil)) (help-window-select nil))
#+end_src #+end_src
*** Ligatures *** Ligatures
@ -33420,6 +33440,12 @@ This part of the configuration mostly makes some aesthetic changes, enables neat
:bind :bind
(("C-<tab>" . org-fold-outer) (("C-<tab>" . org-fold-outer)
("C-c s" . org-store-link)) ("C-c s" . org-store-link))
:custom
(org-html-htmlize-output-type nil)
(org-fold-core-style 'overlays)
(org-src-preserve-indentation nil)
(org-export-with-broken-links 'mark)
(org-confirm-babel-evaluate nil)
:config :config
(setq org-ellipsis " ⤵" (setq org-ellipsis " ⤵"
org-link-descriptive t org-link-descriptive t
@ -33442,13 +33468,32 @@ This part of the configuration mostly makes some aesthetic changes, enables neat
(setq org-capture-templates (setq org-capture-templates
'(("t" "Todo" entry (file+headline "~/Org/Tasks.org" "Inbox") '(("t" "Todo" entry (file+headline "~/Org/Tasks.org" "Inbox")
"* TODO %?\n %i\n %a") "* TODO %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/Org/Journal.org") ("j" "Journal" entry (file+olp+datetree "~/Org/Journal.org")
"* %?\nEntered on %U\n %i\n %a"))) "* %?\nEntered on %U\n %i\n %a")))
(setq org-refile-targets (setq org-refile-targets
'((swarsel-archive-org-file :maxlevel . 1) '((swarsel-archive-org-file :maxlevel . 1)
(swarsel-tasks-org-file :maxlevel . 1))) (swarsel-tasks-org-file :maxlevel . 1)))
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(python . t)
(js . t)
(shell . t)))
(add-to-list 'org-src-lang-modes '("conf-unix" . conf-unix))
(advice-add 'org-babel-tangle-single-block :around #'swarsel/org-babel-tangle-single-block-advice)
(advice-add 'org-babel-tangle :around #'swarsel/org-babel-tangle-timing-advice)
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("py" . "src python :results output"))
(add-to-list 'org-structure-template-alist '("nix" . "src nix-ts :tangle"))
(add-to-list 'org-structure-template-alist '("ne" . "bash :exports both"))
) )
#+end_src #+end_src
@ -33487,87 +33532,6 @@ Function definition in: [[#h:fa710375-2efe-49b4-af6a-a875aca6e4a2][Visual-fill c
#+end_src #+end_src
**** Fix headings not folding sometimes
:PROPERTIES:
:CUSTOM_ID: h:c1a0adea-ca97-43d7-b5a0-b856d2ebc9a8
:END:
There is a weird bug in org-mode that makes it so that headings were not folding correctly sometimes. This setting seems to fix it.
#+begin_src emacs-lisp
(setq org-fold-core-style 'overlays)
#+end_src
**** Babel
:PROPERTIES:
:CUSTOM_ID: h:3e0b6da3-0497-4080-bb49-bab949c03bc4
:END:
org-babel allows to run blocks in other programming languages within an org-mode buffer, similar to what e.g. jupyterhub offers for python.
It also offers a very useful utility of exporting org-mode buffers to different formats; the feature I enjoy most is what makes this file useful: the tangling functionality.
***** Language Configuration
:PROPERTIES:
:CUSTOM_ID: h:5d5ed7be-ec5f-4e17-bbb8-820ab6a9961c
:END:
- This configures the languages that babel recognizes.
#+begin_src emacs-lisp
(setq org-src-preserve-indentation nil)
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(python . t)
(js . t)
(shell . t)
))
(push '("conf-unix" . conf-unix) org-src-lang-modes)
(setq org-export-with-broken-links 'mark)
(setq org-confirm-babel-evaluate nil)
;; tangle is too slow, try to speed it up
(defadvice org-babel-tangle-single-block (around inhibit-redisplay activate protect compile)
"inhibit-redisplay and inhibit-message to avoid flicker."
(let ((inhibit-redisplay t)
(inhibit-message t))
ad-do-it))
(defadvice org-babel-tangle (around time-it activate compile)
"Display the execution time"
(let ((tim (current-time)))
ad-do-it
(message "org-tangle took %f sec" (float-time (time-subtract (current-time) tim)))))
#+end_src
***** old easy structure templates (org-tempo)
:PROPERTIES:
:CUSTOM_ID: h:d112ed66-b2dd-45cc-8d70-9cf6631f28a9
:END:
- org 9.2 changed the way structure templates work. This brings back the old way it worked.
Usage: Type =<=, followed by one of the below keywords and press =TAB=. The corresponding source block should appear.
#+begin_src emacs-lisp
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("py" . "src python :results output"))
(add-to-list 'org-structure-template-alist '("nix" . "src nix-ts :tangle"))
(add-to-list 'org-structure-template-alist '("ne" . "bash :exports both"))
#+end_src
**** aucTex **** aucTex
:PROPERTIES: :PROPERTIES:
:CUSTOM_ID: h:4696e2fc-3296-47dc-8fc3-66912c329d4c :CUSTOM_ID: h:4696e2fc-3296-47dc-8fc3-66912c329d4c
@ -33577,33 +33541,20 @@ This provides several utilities for LaTeX in Emacs, including many completions a
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package auctex) (use-package auctex
(setq TeX-auto-save t) :hook ((LaTeX-mode . visual-line-mode)
(setq TeX-save-query nil) (LaTeX-mode . flyspell-mode)
(setq TeX-parse-self t) (LaTeX-mode . LaTeX-math-mode)
(setq-default TeX-engine 'luatex) (LaTeX-mode . reftex-mode))
(setq-default TeX-master nil) :custom
(TeX-auto-save t)
(add-hook 'LaTeX-mode-hook 'visual-line-mode) (TeX-save-query nil)
(add-hook 'LaTeX-mode-hook 'flyspell-mode) (TeX-parse-self t)
(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode) (TeX-engine 'luatex)
(add-hook 'LaTeX-mode-hook 'reftex-mode) (TeX-master nil)
(setq LaTeX-electric-left-right-brace t) (LaTeX-electric-left-right-brace t)
(setq font-latex-fontify-script nil) (font-latex-fontify-script nil)
(setq TeX-electric-sub-and-superscript t) (TeX-electric-sub-and-superscript t))
;; (setq reftex-plug-into-AUCTeX t)
#+end_src
**** org-download
:PROPERTIES:
:CUSTOM_ID: h:406e5ecb-66f0-49bf-85ca-8b499f73ec5b
:END:
This package allows to download and copy images into org-mode buffers. Sadly it does not work in a very stable manner - if you copy images that are also links to another page (like is often the case in a Google image search), Emacs might crash from this.
#+begin_src emacs-lisp
#+end_src #+end_src
@ -33616,9 +33567,9 @@ This package automatically toggles LaTeX-fragments in org-files. It seems to als
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package org-fragtog) (use-package org-fragtog
(add-hook 'org-mode-hook 'org-fragtog-mode) :hook ((org-mode . org-fragtog-mode)
(add-hook 'markdown-mode-hook 'org-fragtog-mode) (markdown-mode . org-fragtog-mode)))
#+end_src #+end_src
@ -33659,6 +33610,8 @@ When holding presentations, I think it is important to not have too many distrac
("<right>" . swarsel/org-present-next)) ("<right>" . swarsel/org-present-next))
:hook ((org-present-mode . swarsel/org-present-start) :hook ((org-present-mode . swarsel/org-present-start)
(org-present-mode-quit . swarsel/org-present-end)) (org-present-mode-quit . swarsel/org-present-end))
:config
(add-hook 'org-present-after-navigate-functions #'swarsel/org-present-slide)
) )
@ -33744,14 +33697,6 @@ When holding presentations, I think it is important to not have too many distrac
(swarsel/org-present-slide) (swarsel/org-present-slide)
)) ))
(defun clojure-leave-clojure-mode-function ()
)
(add-hook 'buffer-list-update-hook #'clojure-leave-clojure-mode-function)
(add-hook 'org-present-mode-hook 'swarsel/org-present-start)
(add-hook 'org-present-mode-quit-hook 'swarsel/org-present-end)
(add-hook 'org-present-after-navigate-functions 'swarsel/org-present-slide)
#+end_src #+end_src
**** Render markdown blocks as body to expand noweb blocks **** Render markdown blocks as body to expand noweb blocks
@ -33808,16 +33753,6 @@ It supports all functions that I normally need. Note that getting completions fo
lsp-nix-nixd-home-manager-options-expr "(builtins.getFlake \"/home/swarsel/.dotfiles\").nixosConfigurations.pyramid.options.home-manager.users.type.getSubOptions []" lsp-nix-nixd-home-manager-options-expr "(builtins.getFlake \"/home/swarsel/.dotfiles\").nixosConfigurations.pyramid.options.home-manager.users.type.getSubOptions []"
)) ))
(add-to-list 'auto-mode-alist '("\\.nix\\.enc\\'" . nix-mode))
(add-to-list 'auto-mode-alist '("\\.nix\\.enc\\'" . nix-ts-mode))
(with-eval-after-load 'lsp-mode
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection "nixd")
:major-modes '(nix-mode nix-ts-mode)
:priority 0
:server-id 'nixd)))
#+end_src #+end_src
*** HCL Mode *** HCL Mode
:PROPERTIES: :PROPERTIES:
@ -33830,8 +33765,8 @@ This adds support for Hashicorp Configuration Language. Used at work, it is most
(use-package hcl-mode (use-package hcl-mode
:mode "\\.hcl\\'" :mode "\\.hcl\\'"
:config :custom
(setq hcl-indent-level 2)) (hcl-indent-level 2))
#+end_src #+end_src
*** Jenkinsfile/Groovy *** Jenkinsfile/Groovy
@ -33886,11 +33821,10 @@ This adds support for Terraform configuration files. This is basically the same
(use-package terraform-mode (use-package terraform-mode
:mode "\\.tf\\'" :mode "\\.tf\\'"
:config :hook (terraform-mode . outline-minor-mode)
(setq terraform-indent-level 2) :custom
(setq terraform-format-on-save t)) (terraform-indent-level 2)
(terraform-format-on-save t))
(add-hook 'terraform-mode-hook #'outline-minor-mode)
#+end_src #+end_src
*** nix formatting *** nix formatting
@ -33918,9 +33852,9 @@ Adds functions for formatting shellscripts. Similarly to [[id:460a47fd-cddc-4080
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package shfmt (use-package shfmt
:config :custom
(setq shfmt-command "shfmt") (shfmt-command "shfmt")
(setq shfmt-arguments '("-i" "4" "-s" "-sr"))) (shfmt-arguments '("-i" "4" "-s" "-sr")))
#+end_src #+end_src
@ -33937,14 +33871,16 @@ Adds a mode for markdown, specifically MultiMarkdown, which allows me to render
#+begin_src emacs-lisp #+begin_src emacs-lisp
(setq markdown-command "pandoc")
(use-package markdown-mode (use-package markdown-mode
:ensure t :ensure t
:mode ("README\\.md\\'" . gfm-mode) :mode ("README\\.md\\'" . gfm-mode)
:init (setq markdown-command "multimarkdown") :init
(setq markdown-command "multimarkdown")
:hook (markdown-mode . swarsel/markdown-mode-keys)
:bind (:map markdown-mode-map :bind (:map markdown-mode-map
("C-c C-e" . markdown-do))) ("C-c C-e" . markdown-do)
("C-c C-x C-l" . org-latex-preview)
("C-c C-x C-u" . markdown-toggle-url-hiding)))
#+end_src #+end_src
@ -33955,13 +33891,9 @@ Adds a mode for markdown, specifically MultiMarkdown, which allows me to render
Allows me to render LaTeX just where I write it. I do not need this as much anymore, but during my studies this was very valuable to me. Allows me to render LaTeX just where I write it. I do not need this as much anymore, but during my studies this was very valuable to me.
#+begin_src emacs-lisp #+begin_src emacs-lisp :tangle no
(add-hook 'markdown-mode-hook ;; Keybindings are configured in use-package markdown-mode above.
(lambda ()
(local-set-key (kbd "C-c C-x C-l") 'org-latex-preview)
(local-set-key (kbd "C-c C-x C-u") 'markdown-toggle-url-hiding)
))
#+end_src #+end_src
@ -33974,37 +33906,37 @@ This adds elfeed, a neat RSS reader for Emacs. I use this as a client for [[#h:9
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package elfeed) (use-package elfeed
:custom
(use-package elfeed-goodies) (elfeed-db-directory "~/.elfeed/db/")
(elfeed-goodies/setup) (elfeed-use-curl t)
(elfeed-set-timeout 36000)
(setq elfeed-db-directory "~/.elfeed/db/") :config
(define-key elfeed-show-mode-map (kbd ";") #'visual-fill-column-mode)
(define-key elfeed-show-mode-map (kbd "j") #'elfeed-goodies/split-show-next)
(define-key elfeed-show-mode-map (kbd "k") #'elfeed-goodies/split-show-prev)
(define-key elfeed-search-mode-map (kbd "j") #'next-line)
(define-key elfeed-search-mode-map (kbd "k") #'previous-line)
(define-key elfeed-show-mode-map (kbd "S-SPC") #'scroll-down-command))
(use-package elfeed-goodies
:after elfeed
:config
(elfeed-goodies/setup))
(use-package elfeed-protocol (use-package elfeed-protocol
:after elfeed) :after elfeed
:custom
(elfeed-protocol-enabled-protocols '(fever))
(elfeed-protocol-fever-update-unread-only t)
(elfeed-protocol-fever-fetch-category-as-tag t)
:config
(elfeed-protocol-enable) (elfeed-protocol-enable)
(setq elfeed-use-curl t)
(setq elfeed-set-timeout 36000)
(setq elfeed-protocol-enabled-protocols '(fever))
(setq elfeed-protocol-fever-update-unread-only t)
(setq elfeed-protocol-fever-fetch-category-as-tag t)
(let ((domain (getenv "SWARSEL_RSS_DOMAIN"))) (let ((domain (getenv "SWARSEL_RSS_DOMAIN")))
(setq elfeed-protocol-feeds (setq elfeed-protocol-feeds
`((,(concat "fever+https://Swarsel@" domain) `((,(concat "fever+https://Swarsel@" domain)
:api-url ,(concat "https://" domain "/api/fever.php") :api-url ,(concat "https://" domain "/api/fever.php")
:password-file "~/.emacs.d/.fever")))) :password-file "~/.emacs.d/.fever")))))
(define-key elfeed-show-mode-map (kbd ";") 'visual-fill-column-mode)
(define-key elfeed-show-mode-map (kbd "j") 'elfeed-goodies/split-show-next)
(define-key elfeed-show-mode-map (kbd "k") 'elfeed-goodies/split-show-prev)
(define-key elfeed-search-mode-map (kbd "j") 'next-line)
(define-key elfeed-search-mode-map (kbd "k") 'previous-line)
(define-key elfeed-show-mode-map (kbd "S-SPC") 'scroll-down-command)
#+end_src #+end_src
@ -34071,7 +34003,7 @@ In order to update the language grammars, run the next command below. NOTE: sinc
(use-package treesit-auto (use-package treesit-auto
:custom :custom
(setq treesit-auto-install t) (treesit-auto-install t)
:config :config
(treesit-auto-add-to-auto-mode-alist 'all) (treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode)) (global-treesit-auto-mode))
@ -34112,8 +34044,8 @@ In emacs, there are two packages for managing dev environments - emacs-direnv (d
(use-package avy (use-package avy
:bind :bind
(("M-o" . avy-goto-char-timer)) (("M-o" . avy-goto-char-timer))
:config :custom
(setq avy-all-windows 'all-frames)) (avy-all-windows 'all-frames))
#+end_src #+end_src
@ -34128,22 +34060,14 @@ To install a documentation, use the =devdocs=install= command and select the app
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package devdocs) (use-package devdocs
:hook ((python-mode . (lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1"))))
(add-hook 'python-mode-hook (python-ts-mode . (lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1"))))
(lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1")))) (c-mode . (lambda () (setq-local devdocs-current-docs '("c"))))
(add-hook 'python-ts-mode-hook (c-ts-mode . (lambda () (setq-local devdocs-current-docs '("c"))))
(lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1")))) (c++-mode . (lambda () (setq-local devdocs-current-docs '("cpp"))))
(c++-ts-mode . (lambda () (setq-local devdocs-current-docs '("cpp")))))
(add-hook 'c-mode-hook )
(lambda () (setq-local devdocs-current-docs '("c"))))
(add-hook 'c-ts-mode-hook
(lambda () (setq-local devdocs-current-docs '("c"))))
(add-hook 'c++-mode-hook
(lambda () (setq-local devdocs-current-docs '("cpp"))))
(add-hook 'c++-ts-mode-hook
(lambda () (setq-local devdocs-current-docs '("cpp"))))
; (devdocs-update-all) ; (devdocs-update-all)
@ -34205,10 +34129,11 @@ The following settings are needed to make sure emacs works for magit commits and
;; yubikey support for pushing commits ;; yubikey support for pushing commits
;; commiting is enabled through nixos gpg-agent config ;; commiting is enabled through nixos gpg-agent config
(use-package pinentry) (use-package pinentry
:config
(pinentry-start) (pinentry-start)
(setq epg-pinentry-mode 'loopback) (setq epg-pinentry-mode 'loopback)
(setenv "SSH_AUTH_SOCK" (string-chop-newline (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))) (setenv "SSH_AUTH_SOCK" (string-chop-newline (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))))
#+end_src #+end_src
*** Forge *** Forge
@ -34231,7 +34156,9 @@ NOTE: Make sure to configure a GitHub token before using this package!
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package forge (use-package forge
:after magit) :after magit
:init
(setq forge-add-default-bindings nil))
#+end_src #+end_src
@ -34299,7 +34226,7 @@ Complimentary to the delimiters-packages above, this package sets the background
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package rainbow-mode (use-package rainbow-mode
:config (rainbow-mode)) :hook ((css-mode css-ts-mode web-mode html-mode html-ts-mode) . rainbow-mode))
#+end_src #+end_src
*** Corfu *** Corfu
@ -34347,15 +34274,15 @@ Navigation functions defined here: [[#h:a1802f9b-bb71-4fd5-86fa-945da18e8b81][co
("<insert-state> <down>" . swarsel/corfu-quit-and-down)) ("<insert-state> <down>" . swarsel/corfu-quit-and-down))
) )
(use-package nerd-icons-corfu) (use-package nerd-icons-corfu
:after corfu
:config
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter) (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)
(setq nerd-icons-corfu-mapping (setq nerd-icons-corfu-mapping
'((array :style "cod" :icon "symbol_array" :face font-lock-type-face) '((array :style "cod" :icon "symbol_array" :face font-lock-type-face)
(boolean :style "cod" :icon "symbol_boolean" :face font-lock-builtin-face) (boolean :style "cod" :icon "symbol_boolean" :face font-lock-builtin-face)
;; ... ;; ...
(t :style "cod" :icon "code" :face font-lock-warning-face))) (t :style "cod" :icon "code" :face font-lock-warning-face))))
#+end_src #+end_src
@ -34451,9 +34378,6 @@ Tramp allows for SSH access of files over Emacs. I have no ideas what the option
"-o ControlMaster=auto -o ControlPersist=yes")) "-o ControlMaster=auto -o ControlPersist=yes"))
) )
(setq vterm-tramp-shells '(("ssh" "'sh'")))
#+end_src #+end_src
@ -34471,7 +34395,6 @@ This is a simple highlighting utility that uses the margin to visually show the
((prog-mode ((prog-mode
org-mode) . diff-hl-mode) org-mode) . diff-hl-mode)
:init :init
(diff-hl-flydiff-mode)
(diff-hl-margin-mode) (diff-hl-margin-mode)
(diff-hl-show-hunk-mouse-mode)) (diff-hl-show-hunk-mouse-mode))
@ -34530,19 +34453,17 @@ A blocking issue can still occur while entering a direnv that has a longer evalu
;;rustic-mode ;;rustic-mode
tex-mode tex-mode
LaTeX-mode LaTeX-mode
) . (lambda () (progn ) . swarsel/eglot-ensure-and-format)
(eglot-ensure)
(add-hook 'before-save-hook 'eglot-format nil 'local))))
:custom :custom
(eldoc-echo-area-use-multiline-p nil) (eldoc-echo-area-use-multiline-p nil)
(completion-category-defaults nil)
(fset #'jsonrpc--log-event #'ignore)
(eglot-events-buffer-size 0) (eglot-events-buffer-size 0)
(eglot-sync-connect nil) (eglot-sync-connect nil)
(eglot-connect-timeout nil) (eglot-connect-timeout nil)
(eglot-autoshutdown t) (eglot-autoshutdown t)
(eglot-send-changes-idle-time 3) (eglot-send-changes-idle-time 3)
(flymake-no-changes-timeout 5) (flymake-no-changes-timeout 5)
:config
(fset #'jsonrpc--log-event #'ignore)
:bind (:map eglot-mode-map :bind (:map eglot-mode-map
("M-(" . flymake-goto-next-error) ("M-(" . flymake-goto-next-error)
("C-c ," . eglot-code-actions))) ("C-c ," . eglot-code-actions)))
@ -34570,7 +34491,13 @@ company is now disabled since it seems that corfu runs just fine with lsp-mode a
;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
(setq lsp-keymap-prefix "C-c l") (setq lsp-keymap-prefix "C-c l")
(setq lsp-auto-guess-root "t") (setq lsp-auto-guess-root "t")
:commands lsp) :commands lsp
:config
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection "nixd")
:major-modes '(nix-mode nix-ts-mode)
:priority 0
:server-id 'nixd)))
;; (use-package company) ;; (use-package company)
@ -34654,7 +34581,7 @@ This brings back warnings and errors on the sideline for eglot; a feature that I
This setting ensures that hard links are preserved during the backup process, which is useful for maintaining the integrity of files that are linked in multiple locations. This setting ensures that hard links are preserved during the backup process, which is useful for maintaining the integrity of files that are linked in multiple locations.
#+begin_src emacs-lisp #+begin_src emacs-lisp :tangle no
(setq backup-by-copying-when-linked t) (setq backup-by-copying-when-linked t)
@ -34797,6 +34724,8 @@ The hook functions are defined here: [[#h:34506761-06b9-43b5-a818-506d9b3faf28][
:ensure nil :ensure nil
;; :load-path "/usr/share/emacs/site-lisp/mu4e/" ;; :load-path "/usr/share/emacs/site-lisp/mu4e/"
;;:defer 20 ; Wait until 20 seconds after startup ;;:defer 20 ; Wait until 20 seconds after startup
:hook ((mu4e-compose-mode . swarsel/mu4e-send-from-correct-address)
(mu4e-compose-post . swarsel/mu4e-restore-default))
:config :config
;; This is set to 't' to avoid mail syncing issues when using mbsync ;; This is set to 't' to avoid mail syncing issues when using mbsync
@ -34840,11 +34769,30 @@ The hook functions are defined here: [[#h:34506761-06b9-43b5-a818-506d9b3faf28][
;; this does the equivalent of (setq mu4e-user-mail-address-list '(address1@about.com address2@about.com [...]))) ;; this does the equivalent of (setq mu4e-user-mail-address-list '(address1@about.com address2@about.com [...])))
(setq mu4e-user-mail-address-list (setq mu4e-user-mail-address-list
(mapcar #'intern (split-string (or (getenv "SWARSEL_MAIL_ALL") "") "[ ,]+" t))) (mapcar #'intern (split-string (or (getenv "SWARSEL_MAIL_ALL") "") "[ ,]+" t)))
(setq mu4e--log-max-size 1000)
(mu4e t)
(let ((work (getenv "SWARSEL_MAIL_WORK")))
(when (and work (not (string-empty-p work)))
(setq swarsel-smime-cert-path "~/.Certificates/$SWARSEL_MAIL_WORK.pem")
(setq swarsel-smime-cert-path (substitute-env-vars swarsel-smime-cert-path))
(setq mml-secure-prefer-scheme 'smime)
(setq mml-secure-smime-sign-with-sender t)
(add-hook 'mu4e-compose-mode-hook
(lambda ()
(when (and (boundp 'user-mail-address)
(stringp user-mail-address)
(string-equal user-mail-address (getenv "SWARSEL_MAIL_WORK")))
(mml-secure-message-sign-smime))))
(setq smime-keys
`((,(getenv "SWARSEL_MAIL_WORK")
,swarsel-smime-cert-path
("~/Certificates/harica-root.pem"
"~/Certificates/harica-intermediate.pem"))))
))
) )
(add-hook 'mu4e-compose-mode-hook #'swarsel/mu4e-send-from-correct-address)
(add-hook 'mu4e-compose-post-hook #'swarsel/mu4e-restore-default)
#+end_src #+end_src
**** mu4e-alert **** mu4e-alert
@ -34873,40 +34821,8 @@ This adds the simple utility of sending desktop notifications whenever a new mai
(add-hook 'after-init-hook #'mu4e-alert-enable-notifications) (add-hook 'after-init-hook #'mu4e-alert-enable-notifications)
) )
(mu4e t)
#+end_src #+end_src
**** Work: Signing Mails (S/MIME, smime)
:PROPERTIES:
:CUSTOM_ID: h:3584632a-9d6d-4ba6-8aa5-e1383581993c
:END:
Used to automatically sign messages sent from my work email address using S/MIME certificate.
#+begin_src emacs-lisp
(let ((work (getenv "SWARSEL_MAIL_WORK")))
(when (and work (not (string-empty-p work)))
(setq swarsel-smime-cert-path "~/.Certificates/$SWARSEL_MAIL_WORK.pem")
(setq swarsel-smime-cert-path (substitute-env-vars swarsel-smime-cert-path))
(setq mml-secure-prefer-scheme 'smime)
(setq mml-secure-smime-sign-with-sender t)
(add-hook 'mu4e-compose-mode-hook
(lambda ()
(when (and (boundp 'user-mail-address)
(stringp user-mail-address)
(string-equal user-mail-address (getenv "SWARSEL_MAIL_WORK")))
(mml-secure-message-sign-smime))))
(setq smime-keys
`((,(getenv "SWARSEL_MAIL_WORK")
,swarsel-smime-cert-path
("~/Certificates/harica-root.pem"
"~/Certificates/harica-intermediate.pem"
))))
))
#+end_src
*** Calendar *** Calendar
:PROPERTIES: :PROPERTIES:
@ -35057,8 +34973,11 @@ This sets up the =dashboard=, which is really quite useless. But, it looks cool
) )
)))) ))))
(use-package recentf
:ensure nil
:config
(add-to-list 'recentf-exclude "\\Archive\\.org\\'") (add-to-list 'recentf-exclude "\\Archive\\.org\\'")
(add-to-list 'recentf-exclude "\\Tasks\\.org\\'") (add-to-list 'recentf-exclude "\\Tasks\\.org\\'"))
#+end_src #+end_src
@ -35070,7 +34989,9 @@ This sets up the =dashboard=, which is really quite useless. But, it looks cool
#+begin_src emacs-lisp #+begin_src emacs-lisp
(use-package vterm (use-package vterm
:ensure t) :ensure t
:custom
(vterm-tramp-shells '(("ssh" "'sh'"))))
#+end_src #+end_src
@ -35091,7 +35012,6 @@ This sets up the =dashboard=, which is really quite useless. But, it looks cool
#+begin_src emacs-lisp #+begin_src emacs-lisp
(setq mu4e--log-max-size 1000)
(setq message-log-max 30) (setq message-log-max 30)
(setq comint-buffer-maximum-size 50) (setq comint-buffer-maximum-size 50)
(add-hook 'comint-output-filter-functions 'comint-truncate-buffer) (add-hook 'comint-output-filter-functions 'comint-truncate-buffer)

View file

@ -2,22 +2,22 @@
(defvar swarsel-file-name-handler-alist file-name-handler-alist) (defvar swarsel-file-name-handler-alist file-name-handler-alist)
(defvar swarsel-vc-handled-backends vc-handled-backends) (defvar swarsel-vc-handled-backends vc-handled-backends)
(setq gc-cons-threshold most-positive-fixnum (defun swarsel/restore-startup-settings ()
gc-cons-percentage 0.6 "Restore startup-tuned variables to their regular runtime values."
file-name-handler-alist nil
vc-handled-backends nil)
(add-hook 'emacs-startup-hook
(lambda ()
(progn
(setq gc-cons-threshold (* 32 1024 1024) (setq gc-cons-threshold (* 32 1024 1024)
gc-cons-percentage 0.1 gc-cons-percentage 0.1
jit-lock-defer-time 0.05 jit-lock-defer-time 0.05
read-process-output-max (* 1024 1024) read-process-output-max (* 1024 1024)
file-name-handler-alist swarsel-file-name-handler-alist file-name-handler-alist swarsel-file-name-handler-alist
vc-handled-backends swarsel-vc-handled-backends) vc-handled-backends swarsel-vc-handled-backends)
(fset 'epg-wait-for-status 'ignore) (fset 'epg-wait-for-status #'ignore))
)))
(setq gc-cons-threshold most-positive-fixnum
gc-cons-percentage 0.6
file-name-handler-alist nil
vc-handled-backends nil)
(add-hook 'emacs-startup-hook #'swarsel/restore-startup-settings)
(tool-bar-mode 0) (tool-bar-mode 0)
(menu-bar-mode 0) (menu-bar-mode 0)

View file

@ -213,7 +213,27 @@ create a new one."
(swarsel/run-formatting) (swarsel/run-formatting)
))) )))
(setq org-html-htmlize-output-type nil) (defun swarsel/org-babel-tangle-single-block-advice (orig-fun &rest args)
"Run ORIG-FUN with redisplay and messages temporarily inhibited."
(let ((inhibit-redisplay t)
(inhibit-message t))
(apply orig-fun args)))
(defun swarsel/org-babel-tangle-timing-advice (orig-fun &rest args)
"Run ORIG-FUN and report elapsed tangle time."
(let ((tim (current-time)))
(prog1 (apply orig-fun args)
(message "org-tangle took %f sec" (float-time (time-subtract (current-time) tim))))))
(defun swarsel/markdown-mode-keys ()
"Local markdown key customizations."
(local-set-key (kbd "C-c C-x C-l") #'org-latex-preview)
(local-set-key (kbd "C-c C-x C-u") #'markdown-toggle-url-hiding))
(defun swarsel/eglot-ensure-and-format ()
"Ensure eglot is running and enable format-on-save for current buffer."
(eglot-ensure)
(add-hook 'before-save-hook #'eglot-format nil 'local))
;; (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'swarsel/org-babel-tangle-config))) ;; (add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'swarsel/org-babel-tangle-config)))
@ -380,7 +400,7 @@ create a new one."
"wm" '(delete-other-windows :wk "maximize") "wm" '(delete-other-windows :wk "maximize")
"<right>" 'up-list "<right>" 'up-list
"<left>" 'down-list "<left>" 'down-list
)) )
;; General often used hotkeys ;; General often used hotkeys
(general-define-key (general-define-key
@ -400,7 +420,7 @@ create a new one."
"C->" 'mc/mark-next-like-this "C->" 'mc/mark-next-like-this
"C-<" 'mc/mark-previous-like-this "C-<" 'mc/mark-previous-like-this
"C-c C-<" 'mc/mark-all-like-this "C-c C-<" 'mc/mark-all-like-this
) ))
;; set Nextcloud directory for journals etc. ;; set Nextcloud directory for journals etc.
(setq (setq
@ -418,9 +438,10 @@ create a new one."
url-history-file (expand-file-name "url/history" user-emacs-directory)) url-history-file (expand-file-name "url/history" user-emacs-directory))
;; Use no-littering to automatically set common paths to the new user-emacs-directory ;; Use no-littering to automatically set common paths to the new user-emacs-directory
(use-package no-littering) (use-package no-littering
:config
(setq custom-file (make-temp-file "emacs-custom-")) (setq custom-file (make-temp-file "emacs-custom-"))
(load custom-file t) (load custom-file t))
(let ((backup-dir "~/tmp/emacs/backups") (let ((backup-dir "~/tmp/emacs/backups")
(auto-saves-dir "~/tmp/emacs/auto-saves/")) (auto-saves-dir "~/tmp/emacs/auto-saves/"))
@ -437,7 +458,8 @@ create a new one."
delete-old-versions t ; Clean up the backups delete-old-versions t ; Clean up the backups
version-control t ; Use version numbers on backups, version-control t ; Use version numbers on backups,
kept-new-versions 5 ; keep some new versions kept-new-versions 5 ; keep some new versions
kept-old-versions 2) ; and some old ones, too kept-old-versions 2 ; and some old ones, too
backup-by-copying-when-linked t)
;; use UTF-8 everywhere ;; use UTF-8 everywhere
(set-language-environment "UTF-8") (set-language-environment "UTF-8")
@ -452,7 +474,7 @@ create a new one."
(add-hook 'before-save-hook 'delete-trailing-whitespace) (add-hook 'before-save-hook 'delete-trailing-whitespace)
(global-hl-line-mode 1) (global-hl-line-mode 1)
;; (setq redisplay-dont-pause t) ;; obsolete ;; (setq redisplay-dont-pause t) ;; obsolete
(setq blink-cursor-mode nil) ;; blink-cursor is an unexpected source of slowdown (blink-cursor-mode -1) ;; blink-cursor is an unexpected source of slowdown
(global-subword-mode 1) ; Iterate through CamelCase words (global-subword-mode 1) ; Iterate through CamelCase words
(setq blink-matching-paren nil) ;; this makes the cursor jump around annoyingly (setq blink-matching-paren nil) ;; this makes the cursor jump around annoyingly
(delete-selection-mode 1) (delete-selection-mode 1)
@ -464,7 +486,6 @@ create a new one."
bidi-display-reordering 'left-to-right bidi-display-reordering 'left-to-right
bidi-inhibit-bpa t) bidi-inhibit-bpa t)
(global-so-long-mode) (global-so-long-mode)
(setq process-adaptive-read-buffering nil) ;; not sure if this is a good idea
(setq fast-but-imprecise-scrolling t (setq fast-but-imprecise-scrolling t
redisplay-skip-fontification-on-input t redisplay-skip-fontification-on-input t
inhibit-compacting-font-caches t) inhibit-compacting-font-caches t)
@ -472,9 +493,7 @@ create a new one."
which-func-update-delay 1.0) which-func-update-delay 1.0)
(setq undo-limit 80000000 (setq undo-limit 80000000
evil-want-fine-undo t evil-want-fine-undo t
auto-save-default t auto-save-default t)
password-cache-expiry nil
)
(setq browse-url-browser-function 'browse-url-firefox) (setq browse-url-browser-function 'browse-url-firefox)
;; (setenv "DISPLAY" ":0") ;; needed for firefox ;; (setenv "DISPLAY" ":0") ;; needed for firefox
;; disable a keybind that does more harm than good ;; disable a keybind that does more harm than good
@ -519,16 +538,18 @@ create a new one."
tab-width 2) tab-width 2)
(setq tab-always-indent 'complete) (setq tab-always-indent 'complete)
(setq python-indent-guess-indent-offset-verbose nil)
(use-package python
:ensure nil
:custom
(python-indent-guess-indent-offset-verbose nil))
(use-package highlight-indent-guides (use-package highlight-indent-guides
:hook (prog-mode . highlight-indent-guides-mode) :hook (prog-mode . highlight-indent-guides-mode)
:init :custom
(setq highlight-indent-guides-method 'column) (highlight-indent-guides-method 'column)
(setq highlight-indent-guides-responsive 'top) (highlight-indent-guides-responsive nil)
) :config
(with-eval-after-load 'highlight-indent-guides
(set-face-attribute 'highlight-indent-guides-even-face nil :background "gray10") (set-face-attribute 'highlight-indent-guides-even-face nil :background "gray10")
(set-face-attribute 'highlight-indent-guides-odd-face nil :background "gray20") (set-face-attribute 'highlight-indent-guides-odd-face nil :background "gray20")
(set-face-attribute 'highlight-indent-guides-stack-even-face nil :background "gray40") (set-face-attribute 'highlight-indent-guides-stack-even-face nil :background "gray40")
@ -598,8 +619,7 @@ create a new one."
(use-package evil-collection (use-package evil-collection
:after evil :after evil
:config :config
(evil-collection-init) (evil-collection-init))
(setq forge-add-default-bindings nil))
;; enables 2-char inline search ;; enables 2-char inline search
(use-package evil-snipe (use-package evil-snipe
@ -619,16 +639,16 @@ create a new one."
(global-evil-surround-mode 1)) (global-evil-surround-mode 1))
(use-package evil-visual-mark-mode (use-package evil-visual-mark-mode
:config (evil-visual-mark-mode)) :commands evil-visual-mark-mode)
(use-package evil-textobj-tree-sitter) (use-package evil-textobj-tree-sitter
:config
;; bind `function.outer`(entire function block) to `f` for use in things like `vaf`, `yaf` ;; bind `function.outer`(entire function block) to `f` for use in things like `vaf`, `yaf`
(define-key evil-outer-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.outer")) (define-key evil-outer-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.outer"))
;; bind `function.inner`(function block without name and args) to `f` for use in things like `vif`, `yif` ;; bind `function.inner`(function block without name and args) to `f` for use in things like `vif`, `yif`
(define-key evil-inner-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.inner")) (define-key evil-inner-text-objects-map "f" (evil-textobj-tree-sitter-get-textobj "function.inner"))
;; You can also bind multiple items and we will match the first one we can find ;; You can also bind multiple items and we will match the first one we can find
(define-key evil-outer-text-objects-map "a" (evil-textobj-tree-sitter-get-textobj ("if_statement.outer" "conditional.outer" "loop.outer") '((python-mode . ((if_statement.outer) @if_statement.outer)) (python-ts-mode . ((if_statement.outer) @if_statement.outer))))) (define-key evil-outer-text-objects-map "a" (evil-textobj-tree-sitter-get-textobj ("if_statement.outer" "conditional.outer" "loop.outer") '((python-mode . ((if_statement.outer) @if_statement.outer)) (python-ts-mode . ((if_statement.outer) @if_statement.outer))))))
(use-package evil-numbers) (use-package evil-numbers)
@ -681,21 +701,21 @@ create a new one."
(use-package mini-modeline (use-package mini-modeline
:after smart-mode-line :after smart-mode-line
:config :custom
(mini-modeline-mode t) (mini-modeline-display-gui-line nil)
(setq mini-modeline-display-gui-line nil) (mini-modeline-enhance-visual nil)
(setq mini-modeline-enhance-visual nil) (mini-modeline-truncate-p nil)
(setq mini-modeline-truncate-p nil) (mini-modeline-l-format nil)
(setq mini-modeline-l-format nil) (mini-modeline-right-padding 5)
(setq mini-modeline-right-padding 5) (mini-modeline-r-format '("%e" mode-line-front-space mode-line-mule-info mode-line-client
(setq window-divider-mode t)
(setq window-divider-default-places t)
(setq window-divider-default-bottom-width 1)
(setq window-divider-default-right-width 1)
(setq mini-modeline-r-format '("%e" mode-line-front-space mode-line-mule-info mode-line-client
mode-line-modified mode-line-remote mode-line-frame-identification mode-line-modified mode-line-remote mode-line-frame-identification
mode-line-buffer-identification " " mode-line-position " " mode-name evil-mode-line-tag)) mode-line-buffer-identification " " mode-line-position " " mode-name evil-mode-line-tag))
) :config
(mini-modeline-mode t)
(setq window-divider-default-places t
window-divider-default-bottom-width 1
window-divider-default-right-width 1)
(window-divider-mode 1))
(use-package smart-mode-line (use-package smart-mode-line
:config :config
@ -746,8 +766,8 @@ create a new one."
orderless-matching-styles '(orderless-literal orderless-regexp))) orderless-matching-styles '(orderless-literal orderless-regexp)))
(use-package consult (use-package consult
:config :custom
(setq consult-fontify-max-size 1024) (consult-fontify-max-size 1024)
:bind :bind
(("C-x b" . consult-buffer) (("C-x b" . consult-buffer)
("C-c <C-m>" . consult-global-mark) ("C-c <C-m>" . consult-global-mark)
@ -803,8 +823,8 @@ create a new one."
(use-package which-key (use-package which-key
:init (which-key-mode) :init (which-key-mode)
:diminish which-key-mode :diminish which-key-mode
:config :custom
(setq which-key-idle-delay 0.3)) (which-key-idle-delay 0.3))
(use-package helpful (use-package helpful
:bind :bind
@ -812,8 +832,8 @@ create a new one."
("C-h v" . helpful-variable) ("C-h v" . helpful-variable)
("C-h k" . helpful-key) ("C-h k" . helpful-key)
("C-h C-." . helpful-at-point)) ("C-h C-." . helpful-at-point))
:config :custom
(setq help-window-select nil)) (help-window-select nil))
(use-package ligature (use-package ligature
:init :init
@ -901,6 +921,12 @@ create a new one."
:bind :bind
(("C-<tab>" . org-fold-outer) (("C-<tab>" . org-fold-outer)
("C-c s" . org-store-link)) ("C-c s" . org-store-link))
:custom
(org-html-htmlize-output-type nil)
(org-fold-core-style 'overlays)
(org-src-preserve-indentation nil)
(org-export-with-broken-links 'mark)
(org-confirm-babel-evaluate nil)
:config :config
(setq org-ellipsis "" (setq org-ellipsis ""
org-link-descriptive t org-link-descriptive t
@ -923,13 +949,32 @@ create a new one."
(setq org-capture-templates (setq org-capture-templates
'(("t" "Todo" entry (file+headline "~/Org/Tasks.org" "Inbox") '(("t" "Todo" entry (file+headline "~/Org/Tasks.org" "Inbox")
"* TODO %?\n %i\n %a") "* TODO %?\n %i\n %a")
("j" "Journal" entry (file+datetree "~/Org/Journal.org") ("j" "Journal" entry (file+olp+datetree "~/Org/Journal.org")
"* %?\nEntered on %U\n %i\n %a"))) "* %?\nEntered on %U\n %i\n %a")))
(setq org-refile-targets (setq org-refile-targets
'((swarsel-archive-org-file :maxlevel . 1) '((swarsel-archive-org-file :maxlevel . 1)
(swarsel-tasks-org-file :maxlevel . 1))) (swarsel-tasks-org-file :maxlevel . 1)))
(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(python . t)
(js . t)
(shell . t)))
(add-to-list 'org-src-lang-modes '("conf-unix" . conf-unix))
(advice-add 'org-babel-tangle-single-block :around #'swarsel/org-babel-tangle-single-block-advice)
(advice-add 'org-babel-tangle :around #'swarsel/org-babel-tangle-timing-advice)
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("py" . "src python :results output"))
(add-to-list 'org-structure-template-alist '("nix" . "src nix-ts :tangle"))
(add-to-list 'org-structure-template-alist '("ne" . "bash :exports both"))
) )
(use-package org-appear (use-package org-appear
@ -943,64 +988,24 @@ create a new one."
(use-package visual-fill-column (use-package visual-fill-column
:hook (org-mode . swarsel/org-mode-visual-fill)) :hook (org-mode . swarsel/org-mode-visual-fill))
(setq org-fold-core-style 'overlays) (use-package auctex
:hook ((LaTeX-mode . visual-line-mode)
(LaTeX-mode . flyspell-mode)
(LaTeX-mode . LaTeX-math-mode)
(LaTeX-mode . reftex-mode))
:custom
(TeX-auto-save t)
(TeX-save-query nil)
(TeX-parse-self t)
(TeX-engine 'luatex)
(TeX-master nil)
(LaTeX-electric-left-right-brace t)
(font-latex-fontify-script nil)
(TeX-electric-sub-and-superscript t))
(setq org-src-preserve-indentation nil) (use-package org-fragtog
:hook ((org-mode . org-fragtog-mode)
(org-babel-do-load-languages (markdown-mode . org-fragtog-mode)))
'org-babel-load-languages
'((emacs-lisp . t)
(python . t)
(js . t)
(shell . t)
))
(push '("conf-unix" . conf-unix) org-src-lang-modes)
(setq org-export-with-broken-links 'mark)
(setq org-confirm-babel-evaluate nil)
;; tangle is too slow, try to speed it up
(defadvice org-babel-tangle-single-block (around inhibit-redisplay activate protect compile)
"inhibit-redisplay and inhibit-message to avoid flicker."
(let ((inhibit-redisplay t)
(inhibit-message t))
ad-do-it))
(defadvice org-babel-tangle (around time-it activate compile)
"Display the execution time"
(let ((tim (current-time)))
ad-do-it
(message "org-tangle took %f sec" (float-time (time-subtract (current-time) tim)))))
(require 'org-tempo)
(add-to-list 'org-structure-template-alist '("sh" . "src shell"))
(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
(add-to-list 'org-structure-template-alist '("py" . "src python :results output"))
(add-to-list 'org-structure-template-alist '("nix" . "src nix-ts :tangle"))
(add-to-list 'org-structure-template-alist '("ne" . "bash :exports both"))
(use-package auctex)
(setq TeX-auto-save t)
(setq TeX-save-query nil)
(setq TeX-parse-self t)
(setq-default TeX-engine 'luatex)
(setq-default TeX-master nil)
(add-hook 'LaTeX-mode-hook 'visual-line-mode)
(add-hook 'LaTeX-mode-hook 'flyspell-mode)
(add-hook 'LaTeX-mode-hook 'LaTeX-math-mode)
(add-hook 'LaTeX-mode-hook 'reftex-mode)
(setq LaTeX-electric-left-right-brace t)
(setq font-latex-fontify-script nil)
(setq TeX-electric-sub-and-superscript t)
;; (setq reftex-plug-into-AUCTeX t)
(use-package org-fragtog)
(add-hook 'org-mode-hook 'org-fragtog-mode)
(add-hook 'markdown-mode-hook 'org-fragtog-mode)
(use-package org-modern (use-package org-modern
:config (setq org-modern-block-name :config (setq org-modern-block-name
@ -1017,6 +1022,8 @@ create a new one."
("<right>" . swarsel/org-present-next)) ("<right>" . swarsel/org-present-next))
:hook ((org-present-mode . swarsel/org-present-start) :hook ((org-present-mode . swarsel/org-present-start)
(org-present-mode-quit . swarsel/org-present-end)) (org-present-mode-quit . swarsel/org-present-end))
:config
(add-hook 'org-present-after-navigate-functions #'swarsel/org-present-slide)
) )
@ -1102,14 +1109,6 @@ create a new one."
(swarsel/org-present-slide) (swarsel/org-present-slide)
)) ))
(defun clojure-leave-clojure-mode-function ()
)
(add-hook 'buffer-list-update-hook #'clojure-leave-clojure-mode-function)
(add-hook 'org-present-mode-hook 'swarsel/org-present-start)
(add-hook 'org-present-mode-quit-hook 'swarsel/org-present-end)
(add-hook 'org-present-after-navigate-functions 'swarsel/org-present-slide)
(defun org-babel-execute:markdown (body params) (defun org-babel-execute:markdown (body params)
"Just return BODY unchanged, allowing noweb expansion." "Just return BODY unchanged, allowing noweb expansion."
body) body)
@ -1145,21 +1144,10 @@ create a new one."
lsp-nix-nixd-home-manager-options-expr "(builtins.getFlake \"/home/swarsel/.dotfiles\").nixosConfigurations.pyramid.options.home-manager.users.type.getSubOptions []" lsp-nix-nixd-home-manager-options-expr "(builtins.getFlake \"/home/swarsel/.dotfiles\").nixosConfigurations.pyramid.options.home-manager.users.type.getSubOptions []"
)) ))
(add-to-list 'auto-mode-alist '("\\.nix\\.enc\\'" . nix-mode))
(add-to-list 'auto-mode-alist '("\\.nix\\.enc\\'" . nix-ts-mode))
(with-eval-after-load 'lsp-mode
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection "nixd")
:major-modes '(nix-mode nix-ts-mode)
:priority 0
:server-id 'nixd)))
(use-package hcl-mode (use-package hcl-mode
:mode "\\.hcl\\'" :mode "\\.hcl\\'"
:config :custom
(setq hcl-indent-level 2)) (hcl-indent-level 2))
(use-package groovy-mode) (use-package groovy-mode)
@ -1173,65 +1161,60 @@ create a new one."
(use-package terraform-mode (use-package terraform-mode
:mode "\\.tf\\'" :mode "\\.tf\\'"
:config :hook (terraform-mode . outline-minor-mode)
(setq terraform-indent-level 2) :custom
(setq terraform-format-on-save t)) (terraform-indent-level 2)
(terraform-format-on-save t))
(add-hook 'terraform-mode-hook #'outline-minor-mode)
(use-package nixpkgs-fmt) (use-package nixpkgs-fmt)
(use-package shfmt (use-package shfmt
:config :custom
(setq shfmt-command "shfmt") (shfmt-command "shfmt")
(setq shfmt-arguments '("-i" "4" "-s" "-sr"))) (shfmt-arguments '("-i" "4" "-s" "-sr")))
(setq markdown-command "pandoc")
(use-package markdown-mode (use-package markdown-mode
:ensure t :ensure t
:mode ("README\\.md\\'" . gfm-mode) :mode ("README\\.md\\'" . gfm-mode)
:init (setq markdown-command "multimarkdown") :init
(setq markdown-command "multimarkdown")
:hook (markdown-mode . swarsel/markdown-mode-keys)
:bind (:map markdown-mode-map :bind (:map markdown-mode-map
("C-c C-e" . markdown-do))) ("C-c C-e" . markdown-do)
("C-c C-x C-l" . org-latex-preview)
("C-c C-x C-u" . markdown-toggle-url-hiding)))
(add-hook 'markdown-mode-hook (use-package elfeed
(lambda () :custom
(local-set-key (kbd "C-c C-x C-l") 'org-latex-preview) (elfeed-db-directory "~/.elfeed/db/")
(local-set-key (kbd "C-c C-x C-u") 'markdown-toggle-url-hiding) (elfeed-use-curl t)
)) (elfeed-set-timeout 36000)
:config
(use-package elfeed) (define-key elfeed-show-mode-map (kbd ";") #'visual-fill-column-mode)
(define-key elfeed-show-mode-map (kbd "j") #'elfeed-goodies/split-show-next)
(use-package elfeed-goodies) (define-key elfeed-show-mode-map (kbd "k") #'elfeed-goodies/split-show-prev)
(elfeed-goodies/setup) (define-key elfeed-search-mode-map (kbd "j") #'next-line)
(define-key elfeed-search-mode-map (kbd "k") #'previous-line)
(setq elfeed-db-directory "~/.elfeed/db/") (define-key elfeed-show-mode-map (kbd "S-SPC") #'scroll-down-command))
(use-package elfeed-goodies
:after elfeed
:config
(elfeed-goodies/setup))
(use-package elfeed-protocol (use-package elfeed-protocol
:after elfeed) :after elfeed
:custom
(elfeed-protocol-enabled-protocols '(fever))
(elfeed-protocol-fever-update-unread-only t)
(elfeed-protocol-fever-fetch-category-as-tag t)
:config
(elfeed-protocol-enable) (elfeed-protocol-enable)
(setq elfeed-use-curl t)
(setq elfeed-set-timeout 36000)
(setq elfeed-protocol-enabled-protocols '(fever))
(setq elfeed-protocol-fever-update-unread-only t)
(setq elfeed-protocol-fever-fetch-category-as-tag t)
(let ((domain (getenv "SWARSEL_RSS_DOMAIN"))) (let ((domain (getenv "SWARSEL_RSS_DOMAIN")))
(setq elfeed-protocol-feeds (setq elfeed-protocol-feeds
`((,(concat "fever+https://Swarsel@" domain) `((,(concat "fever+https://Swarsel@" domain)
:api-url ,(concat "https://" domain "/api/fever.php") :api-url ,(concat "https://" domain "/api/fever.php")
:password-file "~/.emacs.d/.fever")))) :password-file "~/.emacs.d/.fever")))))
(define-key elfeed-show-mode-map (kbd ";") 'visual-fill-column-mode)
(define-key elfeed-show-mode-map (kbd "j") 'elfeed-goodies/split-show-next)
(define-key elfeed-show-mode-map (kbd "k") 'elfeed-goodies/split-show-prev)
(define-key elfeed-search-mode-map (kbd "j") 'next-line)
(define-key elfeed-search-mode-map (kbd "k") 'previous-line)
(define-key elfeed-show-mode-map (kbd "S-SPC") 'scroll-down-command)
(use-package rg) (use-package rg)
@ -1266,7 +1249,7 @@ create a new one."
(use-package treesit-auto (use-package treesit-auto
:custom :custom
(setq treesit-auto-install t) (treesit-auto-install t)
:config :config
(treesit-auto-add-to-auto-mode-alist 'all) (treesit-auto-add-to-auto-mode-alist 'all)
(global-treesit-auto-mode)) (global-treesit-auto-mode))
@ -1281,25 +1264,17 @@ create a new one."
(use-package avy (use-package avy
:bind :bind
(("M-o" . avy-goto-char-timer)) (("M-o" . avy-goto-char-timer))
:config :custom
(setq avy-all-windows 'all-frames)) (avy-all-windows 'all-frames))
(use-package devdocs) (use-package devdocs
:hook ((python-mode . (lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1"))))
(add-hook 'python-mode-hook (python-ts-mode . (lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1"))))
(lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1")))) (c-mode . (lambda () (setq-local devdocs-current-docs '("c"))))
(add-hook 'python-ts-mode-hook (c-ts-mode . (lambda () (setq-local devdocs-current-docs '("c"))))
(lambda () (setq-local devdocs-current-docs '("python~3.12" "numpy~1.23" "matplotlib~3.7" "pandas~1")))) (c++-mode . (lambda () (setq-local devdocs-current-docs '("cpp"))))
(c++-ts-mode . (lambda () (setq-local devdocs-current-docs '("cpp")))))
(add-hook 'c-mode-hook )
(lambda () (setq-local devdocs-current-docs '("c"))))
(add-hook 'c-ts-mode-hook
(lambda () (setq-local devdocs-current-docs '("c"))))
(add-hook 'c++-mode-hook
(lambda () (setq-local devdocs-current-docs '("cpp"))))
(add-hook 'c++-ts-mode-hook
(lambda () (setq-local devdocs-current-docs '("cpp"))))
; (devdocs-update-all) ; (devdocs-update-all)
@ -1326,13 +1301,16 @@ create a new one."
;; yubikey support for pushing commits ;; yubikey support for pushing commits
;; commiting is enabled through nixos gpg-agent config ;; commiting is enabled through nixos gpg-agent config
(use-package pinentry) (use-package pinentry
:config
(pinentry-start) (pinentry-start)
(setq epg-pinentry-mode 'loopback) (setq epg-pinentry-mode 'loopback)
(setenv "SSH_AUTH_SOCK" (string-chop-newline (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))) (setenv "SSH_AUTH_SOCK" (string-chop-newline (shell-command-to-string "gpgconf --list-dirs agent-ssh-socket"))))
(use-package forge (use-package forge
:after magit) :after magit
:init
(setq forge-add-default-bindings nil))
(use-package git-timemachine (use-package git-timemachine
:hook (git-time-machine-mode . evil-normalize-keymaps) :hook (git-time-machine-mode . evil-normalize-keymaps)
@ -1361,7 +1339,7 @@ create a new one."
;; (if (char-equal c ?<) t (,electric-pair-inhibit-predicate c)))))) ;; (if (char-equal c ?<) t (,electric-pair-inhibit-predicate c))))))
(use-package rainbow-mode (use-package rainbow-mode
:config (rainbow-mode)) :hook ((css-mode css-ts-mode web-mode html-mode html-ts-mode) . rainbow-mode))
(use-package corfu (use-package corfu
:init :init
@ -1394,15 +1372,15 @@ create a new one."
("<insert-state> <down>" . swarsel/corfu-quit-and-down)) ("<insert-state> <down>" . swarsel/corfu-quit-and-down))
) )
(use-package nerd-icons-corfu) (use-package nerd-icons-corfu
:after corfu
:config
(add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter) (add-to-list 'corfu-margin-formatters #'nerd-icons-corfu-formatter)
(setq nerd-icons-corfu-mapping (setq nerd-icons-corfu-mapping
'((array :style "cod" :icon "symbol_array" :face font-lock-type-face) '((array :style "cod" :icon "symbol_array" :face font-lock-type-face)
(boolean :style "cod" :icon "symbol_boolean" :face font-lock-builtin-face) (boolean :style "cod" :icon "symbol_boolean" :face font-lock-builtin-face)
;; ... ;; ...
(t :style "cod" :icon "code" :face font-lock-warning-face))) (t :style "cod" :icon "code" :face font-lock-warning-face))))
(use-package cape (use-package cape
:bind :bind
@ -1460,14 +1438,11 @@ create a new one."
"-o ControlMaster=auto -o ControlPersist=yes")) "-o ControlMaster=auto -o ControlPersist=yes"))
) )
(setq vterm-tramp-shells '(("ssh" "'sh'")))
(use-package diff-hl (use-package diff-hl
:hook :hook
((prog-mode ((prog-mode
org-mode) . diff-hl-mode) org-mode) . diff-hl-mode)
:init :init
(diff-hl-flydiff-mode)
(diff-hl-margin-mode) (diff-hl-margin-mode)
(diff-hl-show-hunk-mouse-mode)) (diff-hl-show-hunk-mouse-mode))
@ -1488,19 +1463,17 @@ create a new one."
;;rustic-mode ;;rustic-mode
tex-mode tex-mode
LaTeX-mode LaTeX-mode
) . (lambda () (progn ) . swarsel/eglot-ensure-and-format)
(eglot-ensure)
(add-hook 'before-save-hook 'eglot-format nil 'local))))
:custom :custom
(eldoc-echo-area-use-multiline-p nil) (eldoc-echo-area-use-multiline-p nil)
(completion-category-defaults nil)
(fset #'jsonrpc--log-event #'ignore)
(eglot-events-buffer-size 0) (eglot-events-buffer-size 0)
(eglot-sync-connect nil) (eglot-sync-connect nil)
(eglot-connect-timeout nil) (eglot-connect-timeout nil)
(eglot-autoshutdown t) (eglot-autoshutdown t)
(eglot-send-changes-idle-time 3) (eglot-send-changes-idle-time 3)
(flymake-no-changes-timeout 5) (flymake-no-changes-timeout 5)
:config
(fset #'jsonrpc--log-event #'ignore)
:bind (:map eglot-mode-map :bind (:map eglot-mode-map
("M-(" . flymake-goto-next-error) ("M-(" . flymake-goto-next-error)
("C-c ," . eglot-code-actions))) ("C-c ," . eglot-code-actions)))
@ -1518,7 +1491,13 @@ create a new one."
;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l") ;; set prefix for lsp-command-keymap (few alternatives - "C-l", "C-c l")
(setq lsp-keymap-prefix "C-c l") (setq lsp-keymap-prefix "C-c l")
(setq lsp-auto-guess-root "t") (setq lsp-auto-guess-root "t")
:commands lsp) :commands lsp
:config
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection "nixd")
:major-modes '(nix-mode nix-ts-mode)
:priority 0
:server-id 'nixd)))
;; (use-package company) ;; (use-package company)
@ -1562,8 +1541,6 @@ create a new one."
; 'line to show errors on the current line ; 'line to show errors on the current line
(setq sideline-backends-right '(sideline-flymake))) (setq sideline-backends-right '(sideline-flymake)))
(setq backup-by-copying-when-linked t)
(use-package dirvish (use-package dirvish
:init :init
(dirvish-override-dired-mode) (dirvish-override-dired-mode)
@ -1638,6 +1615,8 @@ create a new one."
:ensure nil :ensure nil
;; :load-path "/usr/share/emacs/site-lisp/mu4e/" ;; :load-path "/usr/share/emacs/site-lisp/mu4e/"
;;:defer 20 ; Wait until 20 seconds after startup ;;:defer 20 ; Wait until 20 seconds after startup
:hook ((mu4e-compose-mode . swarsel/mu4e-send-from-correct-address)
(mu4e-compose-post . swarsel/mu4e-restore-default))
:config :config
;; This is set to 't' to avoid mail syncing issues when using mbsync ;; This is set to 't' to avoid mail syncing issues when using mbsync
@ -1681,12 +1660,31 @@ create a new one."
;; this does the equivalent of (setq mu4e-user-mail-address-list '(address1@about.com address2@about.com [...]))) ;; this does the equivalent of (setq mu4e-user-mail-address-list '(address1@about.com address2@about.com [...])))
(setq mu4e-user-mail-address-list (setq mu4e-user-mail-address-list
(mapcar #'intern (split-string (or (getenv "SWARSEL_MAIL_ALL") "") "[ ,]+" t))) (mapcar #'intern (split-string (or (getenv "SWARSEL_MAIL_ALL") "") "[ ,]+" t)))
(setq mu4e--log-max-size 1000)
(mu4e t)
(let ((work (getenv "SWARSEL_MAIL_WORK")))
(when (and work (not (string-empty-p work)))
(setq swarsel-smime-cert-path "~/.Certificates/$SWARSEL_MAIL_WORK.pem")
(setq swarsel-smime-cert-path (substitute-env-vars swarsel-smime-cert-path))
(setq mml-secure-prefer-scheme 'smime)
(setq mml-secure-smime-sign-with-sender t)
(add-hook 'mu4e-compose-mode-hook
(lambda ()
(when (and (boundp 'user-mail-address)
(stringp user-mail-address)
(string-equal user-mail-address (getenv "SWARSEL_MAIL_WORK")))
(mml-secure-message-sign-smime))))
(setq smime-keys
`((,(getenv "SWARSEL_MAIL_WORK")
,swarsel-smime-cert-path
("~/Certificates/harica-root.pem"
"~/Certificates/harica-intermediate.pem"))))
))
) )
(add-hook 'mu4e-compose-mode-hook #'swarsel/mu4e-send-from-correct-address)
(add-hook 'mu4e-compose-post-hook #'swarsel/mu4e-restore-default)
(use-package mu4e-alert (use-package mu4e-alert
:config :config
(mu4e-alert-enable-notifications) (mu4e-alert-enable-notifications)
@ -1704,30 +1702,6 @@ create a new one."
(add-hook 'after-init-hook #'mu4e-alert-enable-notifications) (add-hook 'after-init-hook #'mu4e-alert-enable-notifications)
) )
(mu4e t)
(let ((work (getenv "SWARSEL_MAIL_WORK")))
(when (and work (not (string-empty-p work)))
(setq swarsel-smime-cert-path "~/.Certificates/$SWARSEL_MAIL_WORK.pem")
(setq swarsel-smime-cert-path (substitute-env-vars swarsel-smime-cert-path))
(setq mml-secure-prefer-scheme 'smime)
(setq mml-secure-smime-sign-with-sender t)
(add-hook 'mu4e-compose-mode-hook
(lambda ()
(when (and (boundp 'user-mail-address)
(stringp user-mail-address)
(string-equal user-mail-address (getenv "SWARSEL_MAIL_WORK")))
(mml-secure-message-sign-smime))))
(setq smime-keys
`((,(getenv "SWARSEL_MAIL_WORK")
,swarsel-smime-cert-path
("~/Certificates/harica-root.pem"
"~/Certificates/harica-intermediate.pem"
))))
))
(use-package org-caldav (use-package org-caldav
:init :init
;; set org-caldav-sync-initalization ;; set org-caldav-sync-initalization
@ -1856,15 +1830,19 @@ create a new one."
) )
)))) ))))
(use-package recentf
:ensure nil
:config
(add-to-list 'recentf-exclude "\\Archive\\.org\\'") (add-to-list 'recentf-exclude "\\Archive\\.org\\'")
(add-to-list 'recentf-exclude "\\Tasks\\.org\\'") (add-to-list 'recentf-exclude "\\Tasks\\.org\\'"))
(use-package vterm (use-package vterm
:ensure t) :ensure t
:custom
(vterm-tramp-shells '(("ssh" "'sh'"))))
(use-package multiple-cursors) (use-package multiple-cursors)
(setq mu4e--log-max-size 1000)
(setq message-log-max 30) (setq message-log-max 30)
(setq comint-buffer-maximum-size 50) (setq comint-buffer-maximum-size 50)
(add-hook 'comint-output-filter-functions 'comint-truncate-buffer) (add-hook 'comint-output-filter-functions 'comint-truncate-buffer)