;;; $DOOMDIR/config.el -*- lexical-binding: t; -*- ;; Place your private configuration here! Remember, you do not need to run 'doom ;; sync' after modifying this file! ;; Some functionality uses this to identify you, e.g. GPG configuration, email ;; clients, file templates and snippets. It is optional. ;; (setq user-full-name "John Doe" ;; user-mail-address "john@doe.com") ;; Doom exposes five (optional) variables for controlling fonts in Doom: ;; ;; - `doom-font' -- the primary font to use ;; - `doom-variable-pitch-font' -- a non-monospace font (where applicable) ;; - `doom-big-font' -- used for `doom-big-font-mode'; use this for ;; presentations or streaming. ;; - `doom-symbol-font' -- for symbols ;; - `doom-serif-font' -- for the `fixed-pitch-serif' face ;; ;; See 'C-h v doom-font' for documentation and more examples of what they ;; accept. For example: ;; ;;(setq doom-font (font-spec :family "Fira Code" :size 12 :weight 'semi-light) ;; doom-variable-pitch-font (font-spec :family "Fira Sans" :size 13)) ;; ;; If you or Emacs can't find your font, use 'M-x describe-font' to look them ;; up, `M-x eval-region' to execute elisp code, and 'M-x doom/reload-font' to ;; refresh your font settings. If Emacs still can't find your font, it likely ;; wasn't installed correctly. Font issues are rarely Doom issues! ;; There are two ways to load a theme. Both assume the theme is installed and ;; available. You can either set `doom-theme' or manually load a theme with the ;; `load-theme' function. This is the default: (setq doom-theme 'doom-one) ;; This determines the style of line numbers in effect. If set to `nil', line ;; numbers are disabled. For relative line numbers, set this to `relative'. (setq display-line-numbers-type t) ;; If you use `org' and don't want your org files in the default location below, ;; change `org-directory'. It must be set before org loads! (setq org-directory "~/org/") ;; Whenever you reconfigure a package, make sure to wrap your config in an ;; `after!' block, otherwise Doom's defaults may override your settings. E.g. ;; ;; (after! PACKAGE ;; (setq x y)) ;; ;; The exceptions to this rule: ;; ;; - Setting file/directory variables (like `org-directory') ;; - Setting variables which explicitly tell you to set them before their ;; package is loaded (see 'C-h v VARIABLE' to look up their documentation). ;; - Setting doom variables (which start with 'doom-' or '+'). ;; ;; Here are some additional functions/macros that will help you configure Doom. ;; ;; - `load!' for loading external *.el files relative to this one ;; - `use-package!' for configuring packages ;; - `after!' for running code after a package has loaded ;; - `add-load-path!' for adding directories to the `load-path', relative to ;; this file. Emacs searches the `load-path' when you load packages with ;; `require' or `use-package'. ;; - `map!' for binding new keys ;; ;; To get information about any of these functions/macros, move the cursor over ;; the highlighted symbol at press 'K' (non-evil users must press 'C-c c k'). ;; This will open documentation for it, including demos of how they are used. ;; Alternatively, use `C-h o' to look up a symbol (functions, variables, faces, ;; etc). ;; ;; You can also try 'gd' (or 'C-c c d') to jump to their definition and see how ;; they are implemented. ;; (setq doom-theme 'catppuccin) ;;(setq org-startup-with-inline-images t) ;; for inline images in org mode (setq org-display-inline-images t) (setq org-redisplay-inline-images t) (setq org-startup-with-inline-images "inlineimages") ;; (defun my/org-insert-latest-screenshot () ;; "Copy the latest screenshot into the current directory and insert it as [[filename]]." ;; (interactive) ;; (let* ((src (car (sort (directory-files "~/Bilder/Bildschirmfotos/" t ".*\\.png$") ;; (lambda (a b) ;; (time-less-p (file-attribute-modification-time (file-attributes b)) ;; (file-attribute-modification-time (file-attributes a)))))) ;; (filename (format "Pasted image %s.png" ;; (format-time-string "%Y%m%dT%H%M%S"))) ;; (dst (expand-file-name filename default-directory))) ;; (copy-file src dst) ;; (insert (format "[[%s]]" filename)))) ;; ;; (map! :after org ;; :map org-mode-map ;; :leader ;; "i l" #'my/org-insert-latest-screenshot) ;; (with-eval-after-load "ispell" ;; ;; Configure `LANG`, otherwise ispell.el cannot find a 'default ;; ;; dictionary' even though multiple dictionaries will be configured ;; ;; in next line. ;; (setenv "LANG" "en_US.UTF-8") ;; (setq ispell-program-name "hunspell") ;; ;; Configure German, Swiss German, and two variants of English. ;; (setq ispell-dictionary "de_DE,en_US") ;; ;; ispell-set-spellchecker-params has to be called ;; ;; before ispell-hunspell-add-multi-dic will work ;; (ispell-set-spellchecker-params) ;; (ispell-hunspell-add-multi-dic "de_DE,en_US") ;; ;; For saving words to the personal dictionary, don't infer it from ;; ;; the locale, otherwise it would save to ~/.hunspell_de_DE. ;; (setq ispell-personal-dictionary "~/.hunspell_personal")) ;; ;; ;; The personal dictionary file has to exist, otherwise hunspell will ;; ;; silently not use it. ;; (unless (file-exists-p ispell-personal-dictionary) ;; (write-region "" nil ispell-personal-dictionary nil 0)) ;; ;; (use-package flycheck ;; :ensure t ;; :config ;; (add-hook 'after-init-hook #'global-flycheck-mode)) ;; (after! lsp-mode ;; (setq lsp-diagnostics-provider :flycheck)) (use-package! flycheck) (require 'ansi-color) (defun display-ansi-colors () (interactive) (ansi-color-apply-on-region (point-min) (point-max))) (remove-hook 'org-mode-hook #'ws-butler-mode) (add-hook 'org-mode-hook (lambda () (ws-butler-mode -1))) (use-package ox-typst :after org) (use-package! ox-typst :after ox) (require 'ox-typst) ;;(use-package! org-fragtog ;; :after org ;; :hook (org-mode . org-fragtog) ; this auto-enables it when you enter an org-buffer, remove if you do not want this ;; :config ;; ;; whatever you want ;; ) (defun toggle-org-latex-preview-on-save () (interactive) (if (memq 'org-latex-preview after-save-hook) (progn (remove-hook 'after-save-hook 'org-latex-preview) ;; (remove-hook 'after-save-hook 'org-latex-preview t) (message "Disabled org latex preview on save for current buffer...")) (add-hook 'after-save-hook 'org-latex-preview) ;; (add-hook 'after-save-hook 'org-latex-preview nil t) (message "Enabled org latex preview on save for current buffer..."))) ;; (add-to-list 'org-latex-packages-alist '("" "tikz" t)) ;; ;; (eval-after-load "preview" ;; '(add-to-list 'preview-default-preamble ;; "\\PreviewEnvironment{tikzpicture}" t)) (org-babel-do-load-languages 'org-babel-load-languages '((latex . t))) (after! org (setq org-startup-with-latex-preview t) (setq font-lock-maximum-decoration t)) (add-hook 'org-mode-hook #'turn-on-font-lock) (menu-bar--display-line-numbers-mode-relative) ;; (setq org-preview-latex-default-process :imagemagick) ;; ;; (setq org-babel-latex-htlatex "htlatex") ;; (defmacro by-backend (&rest body) ;; `(case org-export-current-backend ,@body)) ;; #+REVEAL_ROOT: https://cdn.jsdelivr.net/npm/reveal.js ;; Reveal.js + Org mode (use-package ox-reveal :after org) (use-package! ox-reveal :after ox) (require 'ox-reveal) (setq Org-Reveal-title-slide nil) ;; Wrong number of arguments?!?! ;;(setq org-export-backends md ascii html icalendar latex odt typst reveal) ;; (defun org-insert-src-block (src-code-type) ;; "Insert a `SRC-CODE-TYPE' type source code block in org-mode." ;; (interactive ;; (let ((src-code-types ;; '("emacs-lisp" "python" "C" "sh" "java" "js" "clojure" "C++" "css" ;; "calc" "asymptote" "dot" "gnuplot" "ledger" "lilypond" "mscgen" ;; "octave" "oz" "plantuml" "R" "sass" "screen" "sql" "awk" "ditaa" ;; "haskell" "latex" "lisp" "matlab" "ocaml" "org" "perl" "ruby" ;; "scheme" "sqlite"))) ;; (list (ido-completing-read "Source code type: " src-code-types)))) ;; (progn ;; (newline-and-indent) ;; (insert (format "#+BEGIN_SRC %s\n" src-code-type)) ;; (newline-and-indent) ;; (insert "#+END_SRC\n") ;; (previous-line 2) ;; (org-edit-src-code) ;; ) ;; ) (defun org-insert-c-src() "Insert a C src block with a helper function to run it." (interactive) (progn (newline-and-indent) (insert "#+NAME: cprog\n#+BEGIN_SRC C :tangle (concat (org-get-heading t t t t) \".c\") :results output") (newline-and-indent) (insert "#+END_SRC\n") (newline-and-indent) ;;(insert "#+BEGIN_SRC sh :dir . :results output :exports both :var filename=(concat (org-get-heading t t t t) \".c\") output=(concat (org-get-heading t t t t) \".o\")\n# output=${filename%.*}.o\ngcc $filename -o $output\n./$output\n# ./$output <$filename\n<>\nEOF\n\n# output=${filename%.*}.o\ngcc $filename -o $output\n./$output\n# ./$output < // / \/ ;; //_________| / |/ |/ \__// / / /_/ \/ ;; | / | : | / /__/ ;; |/ |/ E V A N G E L I O N ;; (defun evangelion-splash () (let* ((banner '(" _ ____ " " : \\ | \\ . " " | \\ . | : |\\ /\\ " " . | :|\\__ | | | \\ / \\ " " |\\ | |! \\ \\ | | | |\\ / / " " \\\"-.______ | \\: ||\\ \\ \\ | | | | \\ / / " " \\_ \"-_| |\\ || \\ \\/ | |___| ! |\\____/ _/-. /\\ " " \"-_ ____: |_\\ || \\/ ___\\ __ _// | | ___ \\---\" / " " \\ \\ | _____, /___\\___\\/ / / \\_! | // _/ / / " " ___\\_ \\__| | | __. _/____ / / / > // / \\/ " " //_________| / |/ |/ \\__// / / /_/ \\/ " " | / | : | / /__/ " " |/ |/ " " E M A C S ")) (longest-line (apply #'max (mapcar #'length banner)))) (put-text-property (point) (dolist (line banner (point)) (insert (+doom-dashboard--center +doom-dashboard--width (concat line (make-string (max 0 (- longest-line (length line))) 50))) "\n")) 'face 'doom-dashboard-banner))) (setq +doom-dashboard-ascii-banner-fn #'evangelion-splash) ;; .doom.d/config.el ;; (let ((alternatives '("nameoffirstfile.svg" ;; "nameofanotherfile.png" ;; "nameofathirdfile.svg"))) ;; (setq fancy-splash-image ;; (concat doom-private-dir "splash/" ;; (nth (random (length alternatives)) alternatives)))) (setq vterm-shell "/usr/bin/env zsh") ;; for installing c and cpp tree sitter languages ;; probably only need this once and run ;; M-x treesit-install-language-grammar RET c RET ;; M-x treesit-install-language-grammar RET cpp RET ;; can comment out after ;; (after! treesit ;; (setq treesit-language-source-alist ;; '((c "https://github.com/tree-sitter/tree-sitter-c") ;; (cpp "https://github.com/tree-sitter/tree-sitter-cpp")))) ;; for org blocks: (setq company-org-block-edit-style 'auto) ;; 'auto, 'prompt, or 'inline (add-hook 'org-mode-hook (lambda () (add-to-list (make-local-variable 'company-backends) 'company-org-block))) ;; for better csv handling ;; disable line wrap (defun disable-linewrap () "csv line wrap setup" (visual-line-mode -1) (toggle-truncate-lines 1)) (add-hook 'csv-mode-hook #'disable-linewrap) ;; 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-hooks () "Toggle my CSV mode hooks (add/remove)." (interactive) (if (memq #'disable-linewrap csv-mode-hook) (progn (remove-hook 'csv-mode-hook #'disable-linewrap) (visual-line-mode t) (toggle-truncate-lines) (remove-hook 'csv-mode-hook #'csv-guess-set-separator) (csv-guess-set-separator) (remove-hook 'csv-mode-hook #'csv-align-mode) (csv-align-mode) (remove-hook 'csv-mode-hook #'csv-header-line) (csv-header-line) (normal-mode) (message "CSV hooks removed")) (progn (add-hook 'csv-mode-hook #'disable-linewrap) (add-hook 'csv-mode-hook #'csv-guess-set-separator) (add-hook 'csv-mode-hook #'csv-align-mode) (add-hook 'csv-mode-hook #'csv-header-line) (normal-mode) (message "CSV hooks added")))) ;; (map! :map csv-mode-map "SPC t ;" #'toggle-csv-mode-hooks) (map! :after csv-mode :map csv-mode-map :desc "Toggle CSV hooks" :n "SPC t ;" #'toggle-csv-mode-hooks) ;; :leader ;; "t;" #'toggle-csv-mode-hooks) ;; make invisible characters more visible (setq! glyphless-char-display-control '((format-control . empty-box) (variation-selectors . thin-space) (no-font . hex-code))) ;; A starting point for a conservative, MISRA-friendly layout. ;; CC Mode style approximating the example (Allman + 4 spaces + aligned args). (c-add-style "misra-allman" '("bsd" (c-basic-offset . 4) (indent-tabs-mode . nil) ;; Make { for functions and control statements go on the next line when typing. ;; Note: this affects "on-the-fly" formatting; reindent won't move braces by itself. (c-hanging-braces-alist . ((defun-open before) (substatement-open before))) ;; Keep the brace itself not additionally indented relative to the if/for/while. ;; After-the-fact cleanup: turn "} else {" into "}\nelse\n{". (c-cleanup-list . (brace-else-brace)) ; key part for else placement (c-offsets-alist . ((statement-block-intro . +) (substatement-open . 0) (case-label . +) (statement-case-intro . +) (arglist-cont-nonempty . c-lineup-arglist) ;; Align wrapped function call/decl arguments under the first arg. (arglist-intro . +) (arglist-cont-nonempty . c-lineup-arglist) (arglist-close . 0)))))