#+TITLE: My New Emacs Config #+AUTHOR: Benjamin Stürz #+OPTIONS: toc:2 * Initialization ** Variables #+begin_src emacs-lisp (set-face-attribute 'default nil :height 64) (add-to-list 'bdf-directory-list (expand-file-name "~/.local/share/fonts")) ;(add-to-list 'bdf-directory-list "a") (setq max-lisp-eval-depth 2000) ;;(defalias 'yes-or-no-p 'y-or-no-p) #+end_src ** Package Management #+begin_src emacs-lisp (require 'package) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("org" . "https://orgmode.org/elpa/") ("elpa" . "https://elpa.gnu.org/packages/"))) (package-initialize) (unless package-archive-contents (package-refresh-contents)) ;; Initialize use-package (unless (package-installed-p 'use-package) (package-install 'use-package)) (require 'use-package) (setq use-package-always-ensure t) ;;(setq use-package-verbose t) (use-package no-littering) (setq auto-save-file-name-transforms `((".*" ,(no-littering-expand-var-file-name "auto-save/") t))) (setq backup-directory-alist `(("." . ,(no-littering-expand-var-file-name "auto-save/")))) #+end_src ** Modes #+begin_src emacs-lisp (scroll-bar-mode -1) ;; Disable visible scroll bar (tool-bar-mode -1) ;; Disable the toolbar (tooltip-mode -1) ;; Disable tooltips (menu-bar-mode -1) ;; Disable the menubar (set-fringe-mode 10) ;; Give some breathing room (column-number-mode) ;; (setq display-line-numbers-type 'relative) ;; Relative line numbers (global-display-line-numbers-mode t) ;; Display line numbers (recentf-mode 1) ;; Save recently opened files mode ;;(recentf-load-list) ;; Load recently opened files (setq history-length 100) ;; (savehist-mode 1) ;; Save history (save-place-mode 1) ;; Save place in file (setq global-auto-revert-non-file-buffers t) (global-auto-revert-mode 1) ;; #+end_src ** UI Configuration #+begin_src emacs-lisp (setq ring-bell-function 'ignore ;; Disable the bell inhibit-startup-message t ;; Don't display the startup screen scroll-step 1 ;; Make scrolling smoother scroll-conservatively 10000 ;; Remove the jumpiness use-dialog-box nil ;; Don't show the dialog box custom-file (locate-user-emacs-file "custom.el")) (load custom-file 'noerror 'nomessage) ;; Make the frame fullscreen (set-frame-parameter (selected-frame) 'fullscreen 'maximized) (add-to-list 'default-frame-alist '(fullscreen . maximized)) ;; Disable line numbers for some modes (dolist (mode '(term-mode-hook shell-mode-hook treemacs-mode-hook eshell-mode-hook vterm-mode-hook)) (add-hook mode (lambda () (display-line-numbers-mode 0)))) #+end_src * Packages ** Appearence #+begin_src emacs-lisp (use-package doom-themes :init (load-theme 'doom-palenight t)) (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) ;; (use-package all-the-icons ;; :if (display-graphic-p) ;; :commands all-the-icons-install-fonts ;; :init ;; (unless (find-font (font-spec :name "all-the-icons")) ;; (all-the-icons-install-fonts t))) ;; (use-package moody ;; :config ;; (setq x-underline-at-descent-line t ;; mood-mode-line-height 10) ;; (moody-replace-mode-line-buffer-identification) ;; (moody-replace-vc-mode) ;; (moody-replace-eldoc-minibuffer-message-function)) ;;(use-package doom-modeline ;; :init ;; (doom-modeline-mode 1) ;; :custom ;; (doom-modeline-height 10)) #+end_src ** Dashboard #+begin_src emacs-lisp (use-package page-break-lines) (use-package dashboard :after page-break-lines :config (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*")) dashboard-banner-logo-title "Emacs Dashboard" dashboard-startup-banner 'logo dashboard-center-content t dashboard-set-heading-icons t dashboard-set-file-icons t dashboard-set-navigator t dashboard-items '((recents . 5) (bookmarks . 5) (projects . 5) (agenda . 5) (registers . 5))) (dashboard-setup-startup-hook)) #+end_src ** Undo #+begin_src emacs-lisp (if (version< emacs-version "28.1") (progn (use-package undo-fu) (setq benni/redo 'undo-fu)) (setq benni/redo 'undo-redo)) #+end_src ** Evil #+begin_src emacs-lisp (use-package evil :init (setq evil-want-integration t evil-want-keybinding nil evil-want-C-u-scroll t evil-want-C-i-jump nil evil-want-fine-undo t evil-undo-system benni/redo) :config (evil-mode 1) (define-key evil-insert-state-map (kbd "C-g") 'evil-normal-state) (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join) (define-key evil-normal-state-map (kbd "C-.") 'evil-switch-to-windows-last-buffer) (global-set-key (kbd "C-.") 'evil-switch-to-windows-last-buffer) ;; Use visual line motions even outside of visual-line-mode buffers. (evil-global-set-key 'motion "j" 'evil-next-visual-line) (evil-global-set-key 'motion "k" 'evil-previous-visual-line) (evil-set-initial-state 'messages-buffer-mode 'normal) (evil-set-initial-state 'dashboard-mode 'normal)) (use-package evil-collection :after evil :config (evil-collection-init)) #+end_src ** Ivy #+begin_src emacs-lisp (use-package ivy :diminish :bind (("C-s" . swiper) :map ivy-minibuffer-map ("TAB" . ivy-alt-done)) :config (ivy-mode 1)) (use-package ivy-rich :after ivy :init (ivy-rich-mode 1)) (use-package ivy-prescient :after (ivy counsel prescient) :config (setq ivy-prescient-retain-classic-highlighting t) (ivy-prescient-mode 1)) #+end_src ** Consel #+begin_src emacs-lisp (use-package counsel :defer nil :bind (("M-x" . counsel-M-x) ("C-x b" . counsel-ibuffer) ("C-x C-f" . counsel-find-file) :map minibuffer-local-map ("C-r" . 'counsel-minibuffer-history)) :config (setq ivy-initial-inputs-alist nil)) (use-package counsel-projectile :after (counsel projectile) :config (counsel-projectile-mode)) #+end_src ** Company #+begin_src emacs-lisp (use-package company :after lsp-mode :hook (lsp-mode . company-mode) :bind (:map lsp-mode-map ("" . company-indent-or-complete-common)) (:map company-active-map ("" . company-complete-selection)) :custom (company-minimum-prefix-length 1) (company-idle-delay 0.5)) (use-package company-box :hook (company-mode . company-box-mode)) (use-package company-prescient :after (company prescient) :config (company-prescient-mode 1)) #+end_src ** Flycheck #+begin_src emacs-lisp (use-package flycheck :after lsp-mode) #+end_src ** Prescient #+begin_src emacs-lisp (use-package prescient :config (setq prescient-sort-length-enable t prescient-filter-method '(literal regexp initialism)) (prescient-persist-mode 1)) #+end_src ** which-key #+begin_src emacs-lisp (use-package which-key :diminish which-key-mode :config (which-key-mode) (setq which-key-idle-delay 0.5)) #+end_src ** helpful #+begin_src emacs-lisp (use-package helpful :after (counsel) :commands (helpful-callable helpful-variable helpful-command helpful-key) :custom (counsel-describe-function-function #'helpful-callable) (counsel-describe-variable-function #'helpful-variable) :bind ([remap describe-function] . counsel-describe-function) ([remap describe-variable] . counsel-describe-variable) ([remap describe-command] . helpful-command) ([remap describe-key] . helpful-key)) #+end_src ** vterm #+begin_src emacs-lisp (use-package vterm :commands vterm :config (setq vterm-max-scrollback 10000)) #+end_src ** Perspective #+begin_src emacs-lisp (use-package perspective :custom (persp-mode-prefix-key (kbd "C-c TAB")) :init (persp-mode)) (use-package treemacs-perspective :after (treemacs perspective) :config (treemacs-set-scope-type 'Perspectives)) #+end_src ** General #+begin_src emacs-lisp (global-set-key (kbd "") 'keyboard-escape-quit) (use-package general :config (general-create-definer benni/leader-keys :keymaps '(normal insert visual emacs) :prefix "SPC" :global-prefix "C-SPC")) #+end_src ** Hydra #+begin_src emacs-lisp (use-package hydra :defer t) (benni/leader-keys "." '(counsel-find-file :which-key "open file") "V" '(vterm-other-window :which-key "vterm-other-window") "b" '(:ignore t :which-key "buffer") "bK" '(kill-buffer :which-key "kill buffer") "bb" '(persp-counsel-switch-buffer :which-key "switch buffer") "bk" '(kill-current-buffer :which-key "kill current buffer") "c" '(counsel-compile :which-key "compile") "g" '(magit-status :which-key "magit") "m" '(mu4e :which-key "mu4e") "r" '(counsel-recentf :which-key "recent files") "R" '(package-refresh-contents :which-key "update packages") "t" '(:ignore t :which-key "toggles") "tm" '(treemacs :which-key "treemacs") "ts" '(hydra-text-scale/body :which-key "scale text") "tt" '(counsel-load-theme :which-key "choose theme") "v" '(vterm :which-key "vterm") "w" '(:ignore t :which-key "workspace") "ww" '(persp-switch :which-key "switch") "wl" '(persp-switch-last :which-key "switch last") "wk" '(persp-kill :which-key "kill")) (defhydra hydra-text-scale (:timeout 5) "scale text" ("+" text-scale-increase "in") ("-" text-scale-decrease "out")) #+end_src ** Magit #+begin_src emacs-lisp (use-package magit :defer t :commands (magit-status) :config (setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)) #+end_src ** Treemacs #+begin_src emacs-lisp (use-package treemacs :defer t :commands (treemacs) :bind (:map treemacs-mode-map ("J" . treemacs-select-directory)) :config (setq treemacs-width 25)) (use-package treemacs-evil :after (treemacs evil)) (use-package treemacs-projectile :after (treemacs projectile)) (use-package treemacs-magit :after (treemacs magit)) #+end_src ** Projectile #+begin_src emacs-lisp (use-package projectile :diminish projectile-mode :config (projectile-mode) :custom ((projectile-completion-system 'ivy)) :bind-keymap ("C-c p" . projectile-command-map) :init (when (file-directory-p "~/src") (setq projectile-project-searchpath '("~/src"))) (setq projectile-switch-project-action #'projectile-dired)) #+end_src * Org ** Setup #+begin_src emacs-lisp (use-package gnuplot) (defun benni/org-mode-setup () (org-indent-mode) (variable-pitch-mode 0) (auto-fill-mode 0) (visual-line-mode 1) (setq evil-auto-indent nil)) #+end_src ** org #+begin_src emacs-lisp (use-package org :defer t :pin org :hook (org-mode . benni/org-mode-setup) :config (setq org-ellipsis " ▾" org-hide-emphasis-markers t org-done 'time org-agenda-start-with-log-mode t org-log-into-drawer t org-confirm-babel-evaluate nil)) #+end_src ** org-tempo #+begin_src emacs-lisp (use-package org-tempo :ensure nil :after org :config (setq org-structure-template-alist '(("c" . "src c") ("bash" . "src bash") ("sh" . "src shell") ("rs" . "src rust") ("hs" . "src haskell") ("java" . "src java") ("el" . "src emacs-lisp") ("a" . "export ascii") ("C" . "comment") ("e" . "example") ("E" . "export") ("h" . "export html") ("l" . "export latex") ("q" . "quote") ("s" . "src") ("v" . "verse")))) #+end_src ** org-bullets #+begin_src emacs-lisp (use-package org-bullets :after org :hook (org-mode . org-bullets-mode) :custom (org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●"))) #+end_src ** org-babel #+begin_src emacs-lisp (use-package ob-rust) (org-babel-do-load-languages 'org-babel-load-languages '((shell . t) (gnuplot . t) (C . t) (rust . t) (haskell . t) (java . t))) #+end_src * Development ** lsp-mode #+begin_src emacs-lisp (use-package lsp-mode :commands (lsp lsp-deferred) :init (setq lsp-keymap-prefix "C-c l") :config (lsp-enable-which-key-integration t)) (use-package lsp-ui :hook (lsp-mode . lsp-ui-mode) :custom (lsp-ui-doc-position 'bottom)) (use-package lsp-treemacs :after (lsp treemacs)) (use-package lsp-ivy :after (lsp ivy)) (add-hook 'c-mode-hook 'lsp) (add-hook 'c++-mode-hook 'lsp) #+end_src ** Indentation Style #+begin_src emacs-lisp (add-hook 'c-mode-hook (lambda () (setq c-default-style "linux" indent-tabs-mode t))) (add-hook 'c-mode-hook 'c-guess) #+end_src ** Editorconfig #+begin_src emacs-lisp (use-package editorconfig :defer 1 :config (editorconfig-mode 1)) #+end_src ** CompilerExplorer #+begin_src emacs-lisp ;; (use-package compiler-explorer ;; :commands (compiler-explorer)) #+end_src ** Rust #+begin_src emacs-lisp (add-to-list 'exec-path "~/.cargo/bin") (use-package rust-mode :mode "\\.rs\\'") (use-package rustic :after rust-mode :bind (:map rustic-mode-map ("C-c r" . rustic-cargo-run) ("C-c b" . rustic-cargo-build) ("C-c t" . rustic-cargo-test))) (use-package cargo :after rust-mode :init (add-hook 'rust-mode-hook 'cargo-minor-mode) (add-hook 'toml-mode-hook 'cargo-minor-mode)) #+end_src ** Java #+begin_src emacs-lisp (use-package lsp-java :after lsp-mode :config (add-hook 'java-mode-hook 'lsp)) #+end_src ** Haskell #+begin_src emacs-lisp (use-package haskell-mode :mode "\\.hs\\'") (use-package lsp-haskell :init (add-hook 'haskell-mode-hook 'lsp) (add-hook 'haskell-mode-hook 'haskell-indent-mode) (add-hook 'haskell-literate-mode-hook 'lsp)) #+end_src ** Verilog #+begin_src emacs-lisp (use-package verilog-mode :defer t :config (require 'lsp) (lsp-register-client (make-lsp-client :new-connection (lsp-stdio-connection '("svls")) :major-modes '(verilog-mode) :priority -1)) :hook (verilog-mode . (lambda () (lsp) (flycheck-mode t) (add-to-list 'lsp-language-id-configuration '(verilog-mode . "verilog"))))) (use-package verilog-ext :mode "\\.v\\'") #+end_src * Mail #+begin_src emacs-lisp (use-package mu4e :defer 10 :ensure nil :commands (mu4e) ;; :load-path "/usr/local/share/emacs/site-lisp/mu4e/" :config (setq mu4e-change-filenames-when-moving t mu4e-update-interval (* 10 60) mu4e-get-mail-command "mbsync -a" mu4e-maildir "~/Mail/benni@stuerz.xyz" mu4e-drafts-folder "/Drafts" mu4e-sent-folder "/Sent" mu4e-trash-folder "/Trash" mu4e-maildir-shortcuts '(("/Inbox" . ?i) ("/Sent" . ?s) ("/Trash" . ?t) ("/Drafts" . ?d) ("/openbsd" . ?O))) (mu4e t)) #+end_src