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