Blob


1 #+TITLE: My New Emacs Config
2 #+AUTHOR: Benjamin Stürz
3 #+OPTIONS: toc:2
5 * Initialization
6 ** Variables
7 #+begin_src emacs-lisp
8 (set-face-attribute 'default nil :height 64)
9 (add-to-list 'bdf-directory-list (expand-file-name "~/.local/share/fonts"))
10 ;(add-to-list 'bdf-directory-list "a")
12 (setq max-lisp-eval-depth 2000)
13 ;;(defalias 'yes-or-no-p 'y-or-no-p)
14 #+end_src
16 ** Package Management
17 #+begin_src emacs-lisp
18 (require 'package)
19 (setq package-archives '(("melpa" . "https://melpa.org/packages/")
20 ("org" . "https://orgmode.org/elpa/")
21 ("elpa" . "https://elpa.gnu.org/packages/")))
23 (package-initialize)
24 (unless package-archive-contents
25 (package-refresh-contents))
27 ;; Initialize use-package
28 (unless (package-installed-p 'use-package)
29 (package-install 'use-package))
31 (require 'use-package)
32 (setq use-package-always-ensure t)
33 ;;(setq use-package-verbose t)
35 (use-package no-littering)
36 (setq auto-save-file-name-transforms `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))
37 (setq backup-directory-alist `(("." . ,(no-littering-expand-var-file-name "auto-save/"))))
38 #+end_src
40 ** Modes
41 #+begin_src emacs-lisp
42 (scroll-bar-mode -1) ;; Disable visible scroll bar
43 (tool-bar-mode -1) ;; Disable the toolbar
44 (tooltip-mode -1) ;; Disable tooltips
45 (menu-bar-mode -1) ;; Disable the menubar
46 (set-fringe-mode 10) ;; Give some breathing room
47 (column-number-mode) ;;
48 (setq display-line-numbers-type 'relative) ;; Relative line numbers
49 (global-display-line-numbers-mode t) ;; Display line numbers
50 (recentf-mode 1) ;; Save recently opened files mode
51 ;;(recentf-load-list) ;; Load recently opened files
52 (setq history-length 100) ;;
53 (savehist-mode 1) ;; Save history
54 (save-place-mode 1) ;; Save place in file
55 (setq global-auto-revert-non-file-buffers t)
56 (global-auto-revert-mode 1) ;;
57 #+end_src
59 ** UI Configuration
60 #+begin_src emacs-lisp
61 (setq ring-bell-function 'ignore ;; Disable the bell
62 inhibit-startup-message t ;; Don't display the startup screen
63 scroll-step 1 ;; Make scrolling smoother
64 scroll-conservatively 10000 ;; Remove the jumpiness
65 use-dialog-box nil ;; Don't show the dialog box
66 custom-file (locate-user-emacs-file "custom.el"))
68 (load custom-file 'noerror 'nomessage)
70 ;; Make the frame fullscreen
71 (set-frame-parameter (selected-frame) 'fullscreen 'maximized)
72 (add-to-list 'default-frame-alist '(fullscreen . maximized))
74 ;; Disable line numbers for some modes
75 (dolist (mode '(term-mode-hook
76 shell-mode-hook
77 treemacs-mode-hook
78 eshell-mode-hook
79 vterm-mode-hook))
80 (add-hook mode (lambda () (display-line-numbers-mode 0))))
81 #+end_src
83 * Packages
84 ** Appearence
85 #+begin_src emacs-lisp
86 (use-package doom-themes
87 :init
88 (load-theme 'doom-palenight t))
90 (use-package rainbow-delimiters
91 :hook (prog-mode . rainbow-delimiters-mode))
93 ;; (use-package all-the-icons
94 ;; :if (display-graphic-p)
95 ;; :commands all-the-icons-install-fonts
96 ;; :init
97 ;; (unless (find-font (font-spec :name "all-the-icons"))
98 ;; (all-the-icons-install-fonts t)))
100 ;; (use-package moody
101 ;; :config
102 ;; (setq x-underline-at-descent-line t
103 ;; mood-mode-line-height 10)
104 ;; (moody-replace-mode-line-buffer-identification)
105 ;; (moody-replace-vc-mode)
106 ;; (moody-replace-eldoc-minibuffer-message-function))
108 ;;(use-package doom-modeline
109 ;; :init
110 ;; (doom-modeline-mode 1)
111 ;; :custom
112 ;; (doom-modeline-height 10))
113 #+end_src
115 ** Dashboard
116 #+begin_src emacs-lisp
117 (use-package page-break-lines)
118 (use-package dashboard
119 :after page-break-lines
120 :config
121 (setq initial-buffer-choice (lambda () (get-buffer-create "*dashboard*"))
122 dashboard-banner-logo-title "Emacs Dashboard"
123 dashboard-startup-banner 'logo
124 dashboard-center-content t
125 dashboard-set-heading-icons t
126 dashboard-set-file-icons t
127 dashboard-set-navigator t
128 dashboard-items '((recents . 5) (bookmarks . 5) (projects . 5) (agenda . 5) (registers . 5)))
129 (dashboard-setup-startup-hook))
130 #+end_src
132 ** Undo
133 #+begin_src emacs-lisp
134 (if (version< emacs-version "28.1")
135 (progn
136 (use-package undo-fu)
137 (setq benni/redo 'undo-fu))
138 (setq benni/redo 'undo-redo))
139 #+end_src
140 ** Evil
141 #+begin_src emacs-lisp
142 (use-package evil
143 :init
144 (setq evil-want-integration t
145 evil-want-keybinding nil
146 evil-want-C-u-scroll t
147 evil-want-C-i-jump nil
148 evil-want-fine-undo t
149 evil-undo-system benni/redo)
151 :config
152 (evil-mode 1)
153 (define-key evil-insert-state-map (kbd "C-g") 'evil-normal-state)
154 (define-key evil-insert-state-map (kbd "C-h") 'evil-delete-backward-char-and-join)
155 (define-key evil-normal-state-map (kbd "C-.") 'evil-switch-to-windows-last-buffer)
156 (global-set-key (kbd "C-.") 'evil-switch-to-windows-last-buffer)
158 ;; Use visual line motions even outside of visual-line-mode buffers.
159 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
160 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
162 (evil-set-initial-state 'messages-buffer-mode 'normal)
163 (evil-set-initial-state 'dashboard-mode 'normal))
165 (use-package evil-collection
166 :after evil
167 :config
168 (evil-collection-init))
169 #+end_src
171 ** Ivy
172 #+begin_src emacs-lisp
173 (use-package ivy
174 :diminish
175 :bind (("C-s" . swiper)
176 :map ivy-minibuffer-map
177 ("TAB" . ivy-alt-done))
178 :config
179 (ivy-mode 1))
181 (use-package ivy-rich
182 :after ivy
183 :init
184 (ivy-rich-mode 1))
186 (use-package ivy-prescient
187 :after (ivy counsel prescient)
188 :config
189 (setq ivy-prescient-retain-classic-highlighting t)
190 (ivy-prescient-mode 1))
191 #+end_src
193 ** Consel
194 #+begin_src emacs-lisp
195 (use-package counsel
196 :defer nil
197 :bind (("M-x" . counsel-M-x)
198 ("C-x b" . counsel-ibuffer)
199 ("C-x C-f" . counsel-find-file)
200 :map minibuffer-local-map
201 ("C-r" . 'counsel-minibuffer-history))
202 :config
203 (setq ivy-initial-inputs-alist nil))
205 (use-package counsel-projectile
206 :after (counsel projectile)
207 :config (counsel-projectile-mode))
208 #+end_src
210 ** Company
211 #+begin_src emacs-lisp
212 (use-package company
213 :after lsp-mode
214 :hook (lsp-mode . company-mode)
215 :bind
216 (:map lsp-mode-map ("<tab>" . company-indent-or-complete-common))
217 (:map company-active-map ("<tab>" . company-complete-selection))
218 :custom
219 (company-minimum-prefix-length 1)
220 (company-idle-delay 0.5))
222 (use-package company-box
223 :hook (company-mode . company-box-mode))
225 (use-package company-prescient
226 :after (company prescient)
227 :config
228 (company-prescient-mode 1))
229 #+end_src
231 ** Flycheck
232 #+begin_src emacs-lisp
233 (use-package flycheck
234 :after lsp-mode)
235 #+end_src
237 ** Prescient
238 #+begin_src emacs-lisp
239 (use-package prescient
240 :config
241 (setq prescient-sort-length-enable t
242 prescient-filter-method '(literal regexp initialism))
243 (prescient-persist-mode 1))
244 #+end_src
246 ** which-key
247 #+begin_src emacs-lisp
248 (use-package which-key
249 :diminish which-key-mode
250 :config
251 (which-key-mode)
252 (setq which-key-idle-delay 0.5))
253 #+end_src
255 ** helpful
256 #+begin_src emacs-lisp
257 (use-package helpful
258 :after (counsel)
259 :commands (helpful-callable helpful-variable helpful-command helpful-key)
260 :custom
261 (counsel-describe-function-function #'helpful-callable)
262 (counsel-describe-variable-function #'helpful-variable)
263 :bind
264 ([remap describe-function] . counsel-describe-function)
265 ([remap describe-variable] . counsel-describe-variable)
266 ([remap describe-command] . helpful-command)
267 ([remap describe-key] . helpful-key))
268 #+end_src
270 ** vterm
271 #+begin_src emacs-lisp
272 (use-package vterm
273 :commands vterm
274 :config
275 (setq vterm-max-scrollback 10000))
276 #+end_src
278 ** Perspective
279 #+begin_src emacs-lisp
280 (use-package perspective
281 :custom
282 (persp-mode-prefix-key (kbd "C-c TAB"))
283 :init
284 (persp-mode))
286 (use-package treemacs-perspective
287 :after (treemacs perspective)
288 :config
289 (treemacs-set-scope-type 'Perspectives))
291 #+end_src
292 ** General
293 #+begin_src emacs-lisp
294 (global-set-key (kbd "<escape>") 'keyboard-escape-quit)
296 (use-package general
297 :config
298 (general-create-definer
299 benni/leader-keys
300 :keymaps '(normal insert visual emacs)
301 :prefix "SPC"
302 :global-prefix "C-SPC"))
303 #+end_src
304 ** Hydra
305 #+begin_src emacs-lisp
306 (use-package hydra
307 :defer t)
309 (benni/leader-keys
310 "." '(counsel-find-file :which-key "open file")
311 "V" '(vterm-other-window :which-key "vterm-other-window")
312 "b" '(:ignore t :which-key "buffer")
313 "bK" '(kill-buffer :which-key "kill buffer")
314 "bb" '(persp-counsel-switch-buffer :which-key "switch buffer")
315 "bk" '(kill-current-buffer :which-key "kill current buffer")
316 "c" '(counsel-compile :which-key "compile")
317 "g" '(magit-status :which-key "magit")
318 "m" '(mu4e :which-key "mu4e")
319 "r" '(counsel-recentf :which-key "recent files")
320 "R" '(package-refresh-contents :which-key "update packages")
321 "t" '(:ignore t :which-key "toggles")
322 "tm" '(treemacs :which-key "treemacs")
323 "ts" '(hydra-text-scale/body :which-key "scale text")
324 "tt" '(counsel-load-theme :which-key "choose theme")
325 "v" '(vterm :which-key "vterm")
326 "w" '(:ignore t :which-key "workspace")
327 "ww" '(persp-switch :which-key "switch")
328 "wl" '(persp-switch-last :which-key "switch last")
329 "wk" '(persp-kill :which-key "kill"))
331 (defhydra hydra-text-scale
332 (:timeout 5)
333 "scale text"
334 ("+" text-scale-increase "in")
335 ("-" text-scale-decrease "out"))
336 #+end_src
338 ** Magit
339 #+begin_src emacs-lisp
340 (use-package magit
341 :defer t
342 :commands (magit-status)
343 :config
344 (setq magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1))
345 #+end_src
347 ** Treemacs
348 #+begin_src emacs-lisp
349 (use-package treemacs
350 :defer t
351 :commands (treemacs)
352 :bind (:map treemacs-mode-map
353 ("J" . treemacs-select-directory))
354 :config
355 (setq treemacs-width 25))
357 (use-package treemacs-evil
358 :after (treemacs evil))
360 (use-package treemacs-projectile
361 :after (treemacs projectile))
363 (use-package treemacs-magit
364 :after (treemacs magit))
365 #+end_src
367 ** Projectile
368 #+begin_src emacs-lisp
369 (use-package projectile
370 :diminish projectile-mode
371 :config (projectile-mode)
372 :custom ((projectile-completion-system 'ivy))
373 :bind-keymap ("C-c p" . projectile-command-map)
374 :init
375 (when (file-directory-p "~/src")
376 (setq projectile-project-searchpath '("~/src")))
377 (setq projectile-switch-project-action #'projectile-dired))
378 #+end_src
380 * Org
381 ** Setup
382 #+begin_src emacs-lisp
383 (use-package gnuplot)
384 (defun benni/org-mode-setup ()
385 (org-indent-mode)
386 (variable-pitch-mode 0)
387 (auto-fill-mode 0)
388 (visual-line-mode 1)
389 (setq evil-auto-indent nil))
390 #+end_src
391 ** org
392 #+begin_src emacs-lisp
393 (use-package org
394 :defer t
395 :pin org
396 :hook (org-mode . benni/org-mode-setup)
397 :config
398 (setq org-ellipsis " ▾"
399 org-hide-emphasis-markers t
400 org-done 'time
401 org-agenda-start-with-log-mode t
402 org-log-into-drawer t
403 org-confirm-babel-evaluate nil))
405 #+end_src
406 ** org-tempo
407 #+begin_src emacs-lisp
408 (use-package org-tempo
409 :ensure nil
410 :after org
411 :config
412 (setq org-structure-template-alist '(("c" . "src c")
413 ("bash" . "src bash")
414 ("sh" . "src shell")
415 ("rs" . "src rust")
416 ("hs" . "src haskell")
417 ("java" . "src java")
418 ("el" . "src emacs-lisp")
419 ("a" . "export ascii")
420 ("C" . "comment")
421 ("e" . "example")
422 ("E" . "export")
423 ("h" . "export html")
424 ("l" . "export latex")
425 ("q" . "quote")
426 ("s" . "src")
427 ("v" . "verse"))))
428 #+end_src
430 ** org-bullets
431 #+begin_src emacs-lisp
432 (use-package org-bullets
433 :after org
434 :hook (org-mode . org-bullets-mode)
435 :custom
436 (org-bullets-bullet-list '("◉" "○" "●" "○" "●" "○" "●")))
437 #+end_src
439 ** org-babel
440 #+begin_src emacs-lisp
441 (use-package ob-rust)
442 (org-babel-do-load-languages 'org-babel-load-languages '((shell . t)
443 (gnuplot . t)
444 (C . t)
445 (rust . t)
446 (haskell . t)
447 (java . t)))
448 #+end_src
449 * Development
450 ** lsp-mode
451 #+begin_src emacs-lisp
452 (use-package lsp-mode
453 :commands (lsp lsp-deferred)
454 :init
455 (setq lsp-keymap-prefix "C-c l")
456 :config
457 (lsp-enable-which-key-integration t))
459 (use-package lsp-ui
460 :hook (lsp-mode . lsp-ui-mode)
461 :custom
462 (lsp-ui-doc-position 'bottom))
464 (use-package lsp-treemacs
465 :after (lsp treemacs))
467 (use-package lsp-ivy
468 :after (lsp ivy))
470 (add-hook 'c-mode-hook 'lsp)
471 (add-hook 'c++-mode-hook 'lsp)
472 #+end_src
473 ** Indentation Style
474 #+begin_src emacs-lisp
475 (add-hook 'c-mode-hook
476 (lambda ()
477 (setq c-default-style "linux"
478 indent-tabs-mode t)))
479 (add-hook 'c-mode-hook 'c-guess)
480 #+end_src
481 ** Editorconfig
482 #+begin_src emacs-lisp
483 (use-package editorconfig
484 :defer 1
485 :config
486 (editorconfig-mode 1))
487 #+end_src
488 ** CompilerExplorer
489 #+begin_src emacs-lisp
490 ;; (use-package compiler-explorer
491 ;; :commands (compiler-explorer))
492 #+end_src
493 ** Rust
494 #+begin_src emacs-lisp
495 (add-to-list 'exec-path "~/.cargo/bin")
497 (use-package rust-mode
498 :mode "\\.rs\\'")
500 (use-package rustic
501 :after rust-mode
502 :bind (:map rustic-mode-map
503 ("C-c r" . rustic-cargo-run)
504 ("C-c b" . rustic-cargo-build)
505 ("C-c t" . rustic-cargo-test)))
507 (use-package cargo
508 :after rust-mode
509 :init
510 (add-hook 'rust-mode-hook 'cargo-minor-mode)
511 (add-hook 'toml-mode-hook 'cargo-minor-mode))
512 #+end_src
513 ** Java
514 #+begin_src emacs-lisp
515 (use-package lsp-java
516 :after lsp-mode
517 :config
518 (add-hook 'java-mode-hook 'lsp))
519 #+end_src
520 ** Haskell
521 #+begin_src emacs-lisp
522 (use-package haskell-mode
523 :mode "\\.hs\\'")
525 (use-package lsp-haskell
526 :init
527 (add-hook 'haskell-mode-hook 'lsp)
528 (add-hook 'haskell-mode-hook 'haskell-indent-mode)
529 (add-hook 'haskell-literate-mode-hook 'lsp))
530 #+end_src
531 ** Verilog
532 #+begin_src emacs-lisp
533 (use-package verilog-mode
534 :defer t
535 :config
536 (require 'lsp)
537 (lsp-register-client
538 (make-lsp-client :new-connection (lsp-stdio-connection '("svls"))
539 :major-modes '(verilog-mode)
540 :priority -1))
541 :hook (verilog-mode . (lambda ()
542 (lsp)
543 (flycheck-mode t)
544 (add-to-list 'lsp-language-id-configuration '(verilog-mode . "verilog")))))
546 (use-package verilog-ext
547 :mode "\\.v\\'")
548 #+end_src
549 * Mail
550 #+begin_src emacs-lisp
551 (use-package mu4e
552 :defer 10
553 :ensure nil
554 :commands (mu4e)
555 ;; :load-path "/usr/local/share/emacs/site-lisp/mu4e/"
556 :config
557 (setq mu4e-change-filenames-when-moving t
558 mu4e-update-interval (* 10 60)
559 mu4e-get-mail-command "mbsync -a"
560 mu4e-maildir "~/Mail/benni@stuerz.xyz"
561 mu4e-drafts-folder "/Drafts"
562 mu4e-sent-folder "/Sent"
563 mu4e-trash-folder "/Trash"
564 mu4e-maildir-shortcuts
565 '(("/Inbox" . ?i)
566 ("/Sent" . ?s)
567 ("/Trash" . ?t)
568 ("/Drafts" . ?d)
569 ("/openbsd" . ?O)))
570 (mu4e t))
571 #+end_src