Files
emacs-conf/init.el
T
2026-05-29 10:16:49 +02:00

669 lines
20 KiB
EmacsLisp

;; add melpa
(package-initialize)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
;; sets :defer t in use-package as default
;; (setq use-package-always-defer t)
;; remove menu bar, tool bar, scroll bar
(menu-bar-mode 0)
(tool-bar-mode 0)
(scroll-bar-mode 0)
;; highlight parens when on them
(show-paren-mode 1)
;; better line numbers
(global-display-line-numbers-mode)
(setq display-line-numbers 'relative)
;; y or n instead of yes or no
(setopt use-short-answers t)
;; dynamic loading of file in init dir to put custom
(setq custom-file (replace-regexp-in-string "/[^/]+$" "/custom.el" user-init-file))
(load custom-file)
;; enable dracula theme
;; (use-package dracula-theme :ensure t :config (load-theme 'dracula) :hook after-init)
;; mark dracula as safe, so it doesnt have to be in custom.el
;; (setq custom-safe-themes
;; '("0223215a464167d93b9cfef9b1cdf9b0768ab660f33b3068b647f7b12aa453a0"
;; "0223215a464167d93b9cfef9b1cdf9b0768ab660f33b3068b647f7b12aa453a0"
;; default))
;; (use-package dracula-theme :ensure t :config (load-theme 'dracula))
;; (use-package gruber-darker-theme :ensure t :config (load-theme 'gruber-darker))
;; (load-theme 'modus-vivendi-tinted)
(load-theme 'modus-operandi-tinted)
;; fixes line number scaling:
(set-face-attribute 'line-number nil :inherit 'default)
;; add time in modeline
(setopt display-time-format "%a %d %T")
(setopt display-time-interval 1)
(display-time-mode)
;; add column number in modeline
(column-number-mode 1)
;; add which key
(use-package which-key :ensure t :hook after-init)
(which-key-mode)
;; install and add hook(s) for paredit mode
(use-package paredit :ensure t)
(defun turn-on-paredit ()
(interactive)
(paredit-mode))
(add-hook 'emacs-lisp-mode-hook 'turn-on-paredit)
(use-package emacs-everywhere :ensure t :hook after-init)
;; --- from better-defaults ---
;; ibuffer as default buffer list
(global-set-key (kbd "C-x C-b") 'ibuffer)
;; regex isearches as default
(global-set-key (kbd "C-s") 'isearch-forward-regexp)
(global-set-key (kbd "C-r") 'isearch-backward-regexp)
(global-set-key (kbd "C-M-S-s") 'isearch-forward)
(global-set-key (kbd "C-M-S-r") 'isearch-backward)
;; (global-set-key (kbd "C-M-s") 'isearch-forward-regexp)
;; (global-set-key (kbd "C-M-r") 'isearch-backward-regexp)
;; i don't really use find-file-read-only so i switched in recentf
(global-set-key (kbd "C-x C-S-r") 'find-file-read-only)
(global-set-key (kbd "C-x C-r") 'recentf)
;; apropos?
(setq apropos-do-all t)
;; ignore case for file name, buffer name, competion
(setq read-file-name-completion-ignore-case t)
(setq read-buffer-completion-ignore-case t)
(setq completion-ignore-case t)
;; --- from emacs bedrock ---
;; Automatically reread from disk if the underlying file changes
(setopt auto-revert-avoid-polling t)
;; Some systems don't do file notifications well; see
;; https://todo.sr.ht/~ashton314/emacs-bedrock/11
(setopt auto-revert-interval 5)
(setopt auto-revert-check-vc-info t)
(global-auto-revert-mode)
;; Move through windows with Ctrl-<arrow keys>
;; (windmove-default-keybindings 'control) ; You can use other modifiers here
;; Fix archaic defaults
(setopt sentence-end-double-space nil)
;; magit <3
(use-package magit
:ensure t
:bind (("C-x g" . magit-status)))
;; (add-hook 'prog-mode 'electric-pair-mode)
;; completion stuff
;; Vertico: better vertical completion for minibuffer commands
(use-package vertico
:ensure t
:init
;; You'll want to make sure that e.g. fido-mode isn't enabled
(vertico-mode))
(use-package vertico-directory
:ensure nil
:after vertico
:bind (:map vertico-map
("M-DEL" . vertico-directory-delete-word)))
(use-package consult
:ensure t
:bind (
;; Drop-in replacements
("C-x b" . consult-buffer) ; orig. switch-to-buffer
("M-y" . consult-yank-pop) ; orig. yank-pop
;; Searching
("C-S-f". consult-fd)
("C-S-r" . consult-ripgrep)
("C-S-s" . consult-line) ; Alternative: rebind C-s to use
("M-s s" . consult-line) ; consult-line instead of isearch, bind
("M-s L" . consult-line-multi) ; isearch to M-s s
("M-s o" . consult-outline)
;; Isearch integration
:map isearch-mode-map
("M-e" . consult-isearch-history) ; orig. isearch-edit-string
("M-s e" . consult-isearch-history) ; orig. isearch-edit-string
("M-s l" . consult-line) ; needed by consult-line to detect isearch
("M-s L" . consult-line-multi) ; needed by consult-line to detect innsearch
)
:config
;; Narrowing lets you restrict results to certain groups of candidates
(setq consult-narrow-key "<"))
;; Vertico: better vertical completion for minibuffer commands
(use-package vertico
:ensure t
:init
;; You'll want to make sure that e.g. fido-mode isn't enabled
(vertico-mode))
(use-package vertico-directory
:ensure nil
:after vertico
:bind (:map vertico-map
("M-DEL" . vertico-directory-delete-word)))
;; Marginalia: annotations for minibuffer
(use-package marginalia
:ensure t
:config
(marginalia-mode))
;; Corfu: Popup completion-at-point
(use-package corfu
:ensure t
:init
(global-corfu-mode)
:bind
(:map corfu-map
("SPC" . corfu-insert-separator)
("C-n" . corfu-next)
("C-p" . corfu-previous)))
;; Part of corfu
(use-package corfu-popupinfo
:after corfu
:ensure nil
:hook (corfu-mode . corfu-popupinfo-mode)
:custom
(corfu-popupinfo-delay '(0.25 . 0.1))
(corfu-popupinfo-hide nil)
:config
(corfu-popupinfo-mode))
;; Make corfu popup come up in terminal overlay
(use-package corfu-terminal
:if (not (display-graphic-p))
:ensure t
:config
(corfu-terminal-mode))
;; Fancy completion-at-point functions; there's too much in the cape package to
;; configure here; dive in when you're comfortable!
(use-package cape
:ensure t
:init
(add-to-list 'completion-at-point-functions #'cape-dabbrev)
(add-to-list 'completion-at-point-functions #'cape-file))
;; Pretty icons for corfu
(use-package kind-icon
:if (display-graphic-p)
:ensure t
:after corfu
:config
(add-to-list 'corfu-margin-formatters #'kind-icon-margin-formatter))
;; Orderless: powerful completion style
(use-package orderless
:ensure t
:config
(setq completion-styles '(orderless)))
;; highlight todo
;; (use-package hl-todo :ensure t :hook (prog-mode . hl-todo-mode) (latex-mode . hl-todo-mode))
(use-package hl-todo :ensure t)
(global-hl-todo-mode)
(setq hl-todo-keyword-faces
'(("TODO" . "#FF0000")
("FIXME" . "#FF0000")
("DEBUG" . "#A020F0")
("GOTCHA" . "#FF4500")
("STUB" . "#1E90FF")))
(add-hook 'after-init-hook 'hl-todo-mode)
;; with magit
(with-eval-after-load 'magit
(add-hook 'magit-log-wash-summary-hook
#'hl-todo-search-and-highlight t)
(add-hook 'magit-revision-wash-message-hook
#'hl-todo-search-and-highlight t))
;; make color codes be highlighted in their color
(use-package rainbow-mode :ensure t :hook (prog-mode . rainbow-mode))
(add-hook 'after-init-hook 'rainbow-mode)
;; TODO add fast rudimentary spell check
;; leaving this in for now, maybe i could add fast rudimentary spell checking and then use languagetool for slower more thorough spell checks
;; doesnt work yet?
;; it should only do these when ispell is loaded
;; idk
;; (eval-after-load "ispell"
;; '(progn
;; (setq ispell-really-hunspell)
;; (setq ispell-program-name "hunspell")
;; (setq ispell-dictionary "en_US,de_DE")
;; (ispell-set-spellchecker-params)
;; (ispell-hunspell-add-multi-dic "en_US,de_DE")))
(use-package flycheck :ensure t :hook after-init)
;; (use-package flycheck-languagetool
;; :ensure t
;; :hook (text-mode . flycheck-languagetool-setup)
;; :init
;; (setq flycheck-languagetool-server-jar "~/.languagetool-server.jar"))
(use-package company :ensure t :hook after-init)
(add-hook 'after-init-hook 'global-company-mode)
;;; multiple cursors
(use-package multiple-cursors
:ensure t
:hook after-init
:bind (
( "C-S-c" . mc/edit-lines)
( "C->" . mc/mark-next-like-this)
( "C-<" . mc/mark-previous-like-this)
( "C-c C-<" . mc/mark-all-like-this)
( "C-^\"" . mc/skip-to-next-like-this)
( "C-:" . mc/skip-to-previous-like-this)
)
)
(setq mc/always-run-for-all t)
;; make emacs remember last session
(setq save-place-file (concat user-emacs-directory ".saveplace"))
(setq desktop-dirname (concat user-emacs-directory ".desktop.d"))
;; (setq-default save-place t)
;; (require 'saveplace)
(save-place-mode 1)
(desktop-save-mode 1)
(setq recentf-save-file (concat user-emacs-directory ".recentf"))
;; Save history of minibuffer
(savehist-mode)
(setq savehist-file (concat user-emacs-directory ".history"))
;; Helpful resources:
;;
;; - https://www.masteringemacs.org/article/seamlessly-merge-multiple-documentation-sources-eldoc
(use-package eglot
;; no :ensure t here because it's built-in
;; Configure hooks to automatically turn-on eglot for selected modes
; :hook
; (((python-mode ruby-mode elixir-mode) . eglot-ensure))
:custom
(eglot-send-changes-idle-time 0.1)
(eglot-extend-to-xref t) ; activate Eglot in referenced non-project files
:config
(fset #'jsonrpc--log-event #'ignore) ; massive perf boost---don't log every event
;; Sometimes you need to tell Eglot where to find the language server
; (add-to-list 'eglot-server-programs
; '(haskell-mode . ("haskell-language-server-wrapper" "--lsp")))
)
;; spell checking with languagetool, slow but thorough
;; downloaded:
;; https://languagetool.org/download/ngram-data/ngrams-de-20150819.zip
;; https://languagetool.org/download/ngram-data/ngrams-en-20150817.zip
;; https://languagetool.org/download/LanguageTool-stable.zip
;; and put them in a directory like this:
;; emacs-init-dir/.languagetool/contents of LanguageTool-stable.zip like languagetool-server
;; emacs-init-dir/.languagetool/contents of ngram.* like de or en
(use-package languagetool
:ensure t
:commands (languagetool-check
languagetool-clear-suggestions
languagetool-correct-at-point
languagetool-correct-buffer
languagetool-set-language
languagetool-server-mode
languagetool-server-start
languagetool-server-stop)
:config (setq languagetool-java-arguments '("-Dfile.encoding=UTF-8")
languagetool-console-command (concat user-emacs-directory "languagetool/languagetool-commandline.jar")
languagetool-console-arguments (list "--languagemodel" (concat user-emacs-directory "languagetool/ngram-data"))
languagetool-server-command (concat user-emacs-directory "languagetool/languagetool-server.jar")
languagetool-server-arguments (list "--languageModel" (concat user-emacs-directory "languagetool/ngram-data"))
)
)
;; TODO make languagetool language toggle function
;; defun my/languagetool-toggle-language
;; switch between auto, en, de
;; have it be auto or de by default and then switch either to en or to de
;; like auto -> de
;; or de -> en
;; or maybe just like that
;; first auto then de then en
;; TODO evaluate how i wanna do this
;; (with-eval-after-load 'eglot
;; (add-to-list 'eglot-server-programs
;; '(text-mode . ("harper-ls" "--stdio"))
;; '(markdown-mode . ("harper-ls" "--stdio"))
;; ))
;; make screen flash instead of annoying bell
(setq visible-bell t)
;; bind super - m to maximize emacs-everywhere
(global-set-key (kbd "s-m") 'toggle-frame-maximized)
;; for Calendar
(setq calendar-week-start-day 1)
(setq calendar-intermonth-text
'(propertize
(format "%2d"
(car
(calendar-iso-from-absolute
(calendar-absolute-from-gregorian (list month day year)))))
'font-lock-face 'font-lock-warning-face))
(setq calendar-intermonth-header
(propertize "W" ; or e.g. "KW" in Germany
'font-lock-face 'font-lock-keyword-face))
(setq calendar-set-date-style 'european)
(setq calendar-month-header
'(propertize
(format "%s (%d) %d" (calendar-month-name month) month year)
'font-lock-face 'calendar-month-header))
;; stole from prelude:
;; reduce the frequency of garbage collection by making it happen on
;; each 50MB of allocated data (the default is on every 0.76MB)
(setq gc-cons-threshold 50000000)
;; warn when opening files bigger than 100MB
(setq large-file-warning-threshold 100000000)
;; latex
(use-package pdf-tools :ensure t)
(pdf-tools-install)
(setq pdf-annot-activate-created-annotations t)
(setq pdf-view-resize-factor 1.1)
;; pdfview
;; (add-hook 'pdf-view-mode-hook (lambda () (pdf-view-themed-minor-mode t)))
(setq pdf-view-themed-minor-mode t)
(add-to-list 'pdf-view-incompatible-modes 'display-line-numbers-mode)
(add-hook 'pdf-view-mode-hook (lambda () (display-line-numbers-mode -1)))
(add-hook 'pdf-view-mode-hook (lambda () (hl-todo-mode)))
(add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer)
(add-hook 'LaTeX-mode-hook 'TeX-source-correlate-mode)
(setq TeX-source-correlate-method 'synctex)
;; (with-eval-after-load 'tex
;; (add-to-list 'TeX-view-program-selection
;; '(output-pdf ("PDF Tools"))))
(setq TeX-view-program-selection '((output-pdf "PDF Tools"))
TeX-source-correlate-start-server t)
;; idk
;; (define-key LaTeX-mode-map (kbd "C-c C-x") (TeX-command (TeX-command-default (TeX-master-file)) 'TeX-master-file -1))
;; for pdf tools run (pdf-tools-install)
(use-package auctex :ensure t)
(use-package company-auctex :ensure t)
(company-auctex-init)
(use-package auctex-latexmk :ensure t)
(auctex-latexmk-setup)
(use-package latex-preview-pane :ensure t)
(latex-preview-pane-enable)
(use-package company-math :ensure t)
(add-to-list 'company-backends 'company-math-symbols-unicode)
(use-package citar
:ensure t
:custom
(org-cite-global-bibliography '("~/Bachelor/Literatur/Bibliothek/Bibliothek.bib"))
(citar-bibliography '("~/Bachelor/Literatur/Bibliothek/Bibliothek.bib")))
(define-key LaTeX-mode-map (kbd "C-c c") 'citar-insert-citation)
;; make invisible characters visible
(setq glyphless-char-display-control '((format-control . empty-box) (variation-selectors . thin-space) (no-font . hex-code)))
(use-package yasnippet :ensure t)
(setq yas-snippet-dirs
'("~/.emacs.d/snippets" ;; personal snippets
))
(yas-reload-all)
(yas-global-mode 1) ;; or M-x yas-reload-all if you've started YASnippet already.
;; Add yasnippet support for all company backends
;; https://github.com/syl20bnr/spacemacs/pull/179
(defvar company-mode/enable-yas t
"Enable yasnippet for all backends.")
(defun company-mode/backend-with-yas (backend)
(if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
backend
(append (if (consp backend) backend (list backend))
'(:with company-yasnippet))))
(setq company-backends (mapcar #'company-mode/backend-with-yas company-backends))
;; vterm
;; vterm doesnt work on windows so I'm only installing it, if the system is not windows
(if (not (eq system-type 'windows-nt))
(use-package vterm :ensure t))
;; (setq doom-font (font-spec :family "Go Mono" :size 18))
;; (setq doom-variable-pitch-font (font-spec :family "Alegreya" :size 20))
;; (append mixed-pitch-fixed-pitch-faces '(line-number line-number-current-line cursor))
(windmove-default-keybindings)
(global-font-lock-mode)
;; for guile scheme
(use-package geiser-guile :ensure t)
;; TODO: git-timemachine
;; TODO: mu4e
;; TODO: mindstream
;; TODO: goggles
;; TODO: vc gutter
;; TODO: look at this: https://baty.net/posts/2025/03/i-went-a-little-nuts-with-remember-mode-in-emacs/
;; csv mode
(use-package csv-mode :ensure t)
;; for better csv handling
;; disable line wrap
(add-hook 'csv-mode-hook (lambda () (visual-line-mode 'nil)))
(add-hook 'csv-mode-hook (lambda () (toggle-truncate-lines 't)))
;; auto detect separator
(add-hook 'csv-mode-hook 'csv-guess-set-separator)
;; turn on field alignment
(add-hook 'csv-mode-hook 'csv-align-mode)
;; add csv header line
(add-hook 'csv-mode-hook 'csv-header-line)
(defun toggle-csv-mode ()
"Toggle my CSV mode, with extra settings."
(interactive)
(with-current-buffer (current-buffer) (if (eq major-mode 'csv-mode)
(progn
(text-mode)
(visual-line-mode 't)
(toggle-truncate-lines 'nil)
(csv-align-mode 0)
(message "deactivated csv-mode"))
(progn
(csv-mode)
(font-lock-mode)
(message "activated csv-mode")))))
;; (global-set-key (kbd "C-c ;") 'toggle-csv-mode)
(define-key csv-mode-map (kbd "C-c ;") 'toggle-csv-mode)
;; (global-set-key (kbd "C-x S-u") 'undo-redo)
;; doesn't work for some reason:
;; https://stackoverflow.com/questions/24177014/how-to-create-a-case-sensitive-keybinding-in-emacs
;; https://stackoverflow.com/questions/38180797/why-the-key-binding-m-s-t-fails-while-c-s-t-works
;; https://emacs.stackexchange.com/questions/83254/clarification-on-how-emacs-binds-capital-letters
(global-set-key (kbd "C-x U") 'undo-redo)
(use-package ob-cypher
:ensure t
:config
(add-to-list 'org-babel-load-languages '(cypher . t))
(org-babel-do-load-languages 'org-babel-load-languages org-babel-load-languages)
(add-to-list 'org-babel-tangle-lang-exts '("cypher" . "cypher")))
(setq dired-dwim-target t)
;; from https://emacsredux.com/blog/2026/04/07/stealing-from-the-best-emacs-configs/
;; Disable Bidirectional Text Scanning
(setq-default bidi-display-reordering 'left-to-right
bidi-paragraph-direction 'left-to-right)
(setq bidi-inhibit-bpa t)
;; Skip Fontification During Input
(setq redisplay-skip-fontification-on-input t)
;; Increase Process Output Buffer for LSP
(setq read-process-output-max (* 4 1024 1024)) ; 4MB
;; Save the Clipboard Before Killing
(setq save-interprogram-paste-before-kill t)
;; No Duplicates in the Kill Ring
(setq kill-do-not-save-duplicates t)
;; Persist the Kill Ring Across Sessions
(setq savehist-additional-variables
'(search-ring regexp-search-ring kill-ring))
;; Strip text properties before saving to kill ring
(add-hook 'savehist-save-hook
(lambda ()
(setq kill-ring
(mapcar #'substring-no-properties
(cl-remove-if-not #'stringp kill-ring)))))
;; Repeat mode
(repeat-mode 1)
;; Live Regexp Feedback
(minibuffer-regexp-mode 1)
;; keep M-x re-builder in mind
(setq reb-re-syntax 'string)
;; Auto-Chmod Scripts on Save
(add-hook 'after-save-hook
#'executable-make-buffer-file-executable-if-script-p)
;; Prevent ffap from Pinging Hostnames
(setq ffap-machine-p-known 'reject)
;; Proportional Window Resizing
(setq window-combination-resize t)
;; Reversible C-x 1
(winner-mode +1)
(defun toggle-delete-other-windows ()
"Delete other windows in frame if any, or restore previous window config."
(interactive)
(if (and winner-mode
(equal (selected-window) (next-window)))
(winner-undo)
(delete-other-windows)))
(global-set-key (kbd "C-x 1") #'toggle-delete-other-windows)
;; Faster Mark Popping
;; after the first C-u C-SPC you can keep pressing just C-SPC to continue popping
(setq set-mark-command-repeat-pop t)
;; Auto-Select Help Window
(setq help-window-select t)
;; Recenter After save-place Restores Position
(advice-add 'save-place-find-file-hook :after
(lambda (&rest _)
(when buffer-file-name (ignore-errors (recenter)))))
;; Reveal.js + Org mode
(use-package ox-reveal :ensure t :after org )
;; (require 'ox-reveal)
;; (setq Org-Reveal-title-slide nil)
(setq dired-dwim-target t)
;; recovery utf8 function:
;; \344 ä
;; \366 ö
;; \374 ü
;; \337 ß
(prefer-coding-system 'utf-8)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
;; backwards compatibility as default-buffer-file-coding-system
;; is deprecated in 23.2.
(if (boundp 'buffer-file-coding-system)
(setq-default buffer-file-coding-system 'utf-8)
(setq default-buffer-file-coding-system 'utf-8)
)
;; Treat clipboard input as UTF-8 string first; compound text next, etc.
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
;; flycheck told me to do this:
(provide 'init)
;;; init.el ends here