;; 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)) ;; 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- ;; (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"))) ;; 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) (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) ;; flycheck told me to do this: (provide 'init) ;;; init.el ends here