;; Emacs configuration ;; Marcel Kapfer (C) 2016 - 2019 ;; MIT License ;; ----------------------------------------------------------------------------- ;; Package configuration ;; ;; This configuration uses use-package, so we're first ensuring, that it is ;; installed using the emacs package system an MELPA. (package-initialize) (require 'package) (setq package-enable-on-startup nil) ;; Fix for elpa. See: ;; - https://old.reddit.com/r/emacs/comments/cdf48c/failed_to_download_gnu_archive/ (setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3") (add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) ;; install use-package if not already installed (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (setq ;; tell use-package to always ensure use-package-always-ensure t ;; don't load outdated packages load-prefer-newer t) ;; ----------------------------------------------------------------------------- ;; Basic configuration ;; ;; The code in this block should be package independend. ;; Keep emacs Custom-settings in separate file ;; set the file path (setq custom-file (expand-file-name "custom.el" user-emacs-directory)) ;; create the file if not existent (when (not (file-exists-p custom-file)) (with-temp-buffer (write-file custom-file))) ;; finally load it (load custom-file) ;; set name and e-mail (setq user-full-name "Marcel Kapfer" user-mail-address "opensource@mmk2410.org") ;; y/n instead of yes/no for confirm questions (defalias 'yes-or-no-p 'y-or-n-p) ;; Save backup files in ~/.emacs-autosaves/ (defvar user-temporary-file-directory "~/.emacs-autosaves") (make-directory user-temporary-file-directory t) (setq backup-by-copying t backup-directory-alist `(("." . ,user-temporary-file-directory) (tramp-file-name-regexp nil)) auto-save-list-file-prefix (concat user-temporary-file-directory ".auto-saves-") auto-save-file-name-transforms `((".*" ,user-temporary-file-directory t)) ;; version numbers for backup files version-control t ;; delete excess backup versions delete-old-versions t ;; amount of new versions to keep kept-new-versions 20 ;; amount of old versions to keep kept-old-versions 5) ;; set default input encoding (prefer-coding-system 'utf-8-unix) (set-language-environment "UTF-8") ;; general options (setq ;; disable startup screen inhibit-startup-screen t ;; visual bell instead of BEEP visible-bell 1 ;; set text in scratch to nil initial-scratch-message nil ;; Don't truncate lines truncate-lines nil ;; Maximize threshold for garbage collection to 10MB for less gc gc-cons-treshold (* 10 1024 1024) ;; confirm before closing emacs confirm-kill-emacs #'y-or-n-p ;; put a new line at the end of every file require-final-newline t ;; use german directory in ispell ispell-dictionary "german" ;; always follow symlinks to git repos vc-follow-symlinks t ;; indent using spaces, not tabs indent-tabs-mode nil ;; tab width tab-width 2 ;; https://www.reddit.com/r/emacs/comments/819v0h/how_to_speed_up_cursor_movement_by_10x/ auto-window-vscroll nil ;; Tell imenu to rescan tags imenu-auto-rescan t) ;; set timezone (setenv "TZ" "/etc/localtime") ;; disable cursor blinking (blink-cursor-mode -1) ;; activate winner mode (when (fboundp 'winner-mode) (winner-mode 1)) ;; Highlight the current line (global-hl-line-mode t) ;; Show line numbers (global-display-line-numbers-mode) ;; replace selected text by typing (delete-selection-mode t) ;; break lines better (visual-line-mode t) ;; ibuffer configuration (setq ibuffer-saved-filter-groups (quote (("default" ("dired" (mode . dired-mode)) ("org" (name . "^.*org$")) ("shell" (or (mode . eshell-mode) (mode . term-mode))) ("mu4e" (or (mode . mu4e-compose-mode) (name . "\*mu4e\*"))) ("programming" (or (mode . python-mode) (mode . sh-mode) (mode . web-mode) (mode . emacs-lisp-mode) (mode . lisp-mode) (mode . dart-mode))) ("emacs" (or (name . "^\\*scratch\\*$") (name . "^\\*Messages\\*$"))))))) ;; activiate the above ibuffer configuration (add-hook 'ibuffer-mode-hook (lambda () (ibuffer-auto-mode 1) (ibuffer-switch-to-saved-filter-groups "default"))) ;; ibuffer options (setq ;; Don't show filter groups if there are no buffers in that group ibuffer-show-empty-filter-groups nil ;; Don't ask for confirmation to delete marked buffers ibuffer-expert t) ;; delete trailing whitespaces on save (add-hook 'before-save-hook #'delete-trailing-whitespace) ;; set default column width (setq-default fill-column 80) ;; set cursor style to a vertical bar (setq-default cursor-type 'bar) ;; hide tool bar, menu bar and scroll bar (menu-bar-mode 0) (tool-bar-mode 0) (scroll-bar-mode 0) ;; auto-fill mode (add-hook 'mail-mode-hook 'auto-fill-mode) (add-hook 'mail-mode-hook (lambda () (setq fill-column 72))) ;; highlight matching parenthesis (show-paren-mode 1) ;; save minibuffer history (savehist-mode 1) ;; set default web browser (setq browse-url-generic-program "x-www-browser") ;; auto revert externally changed files (global-auto-revert-mode t) ;; set font (set-frame-font "Hermit 9" nil t) ;; set the default font after the frame is created. ;; needed because of some issue with emacsclient. (add-hook 'after-make-frame-functions (lambda (frame) (set-frame-font "Hermit 9" nil t))) ;; ----------------------------------------------------------------------------- ;; Custom keybindings ;; ;; here are custom keybindings for emacs or package functions configured. Custom ;; bindings for own functions are set directly after the function declaration. ;; global keys ;; Emacs Shell (global-set-key (kbd "C-c e") 'eshell) ;; Async shell command (global-set-key (kbd "C-c a") 'async-shell-command) ;; Open link under cursor (global-set-key (kbd "C-c b") 'browse-url-at-point) ;; Open link under cursor (global-set-key (kbd "C-x e") 'mu4e-in-new-frame) ;; eval region (global-set-key (kbd "C-c x") 'eval-region) ;; revert buffer (reload file from disk) (global-set-key (kbd "" ) 'revert-buffer) ;; use ibuffer as default (global-set-key (kbd "C-x C-b") 'ibuffer) ;; toggle auto-fill-mode (global-set-key (kbd "C-c q") 'auto-fill-mode) ;; ----------------------------------------------------------------------------- ;; Custom functions ;; ;; custom functions are defined here, sorted by use-case (if possible) ;; general ;; function for closing all buffers (defun close-all-buffers () "Close all buffers" (interactive) (mapc 'kill-buffer (buffer-list))) ;; ----------------------------------------------------------------------------- ;; Packages and package configuration ;; ;; all packages should be loaded with use-package ;; server (use-package server :if window-system :hook ((after-init-hook . server-start) ;; StumpWM interaction (server-done-hook . (lambda () (shell-command "stumpish 'eval (stumpwm::return-es-called-win stumpwm::*es-win*)'")))) :init (setq server-raise-frame t)) ;; diminish ;; Diminished modes are minor modes with no modeline display (use-package diminish :init (diminish 'abbrev-mode)) ;; curx ;; A Collection of Ridiculously Useful eXtensions for Emacs (use-package crux :bind (("C-a" . crux-move-beginning-of-line))) ;; which-key ;; Display available keybindings in popup (use-package which-key :diminish which-key-mode :config (which-key-mode)) ;; org-bullets ;; Show bullets in org-mode as UTF-8 characters (use-package org-bullets :after org :config (add-hook 'org-mode-hook #'org-bullets-mode)) ;; undo-tree ;; Treat undo history as a tree (use-package undo-tree :diminish undo-tree-mode :config (global-undo-tree-mode)) ;; beacon ;; Highlight the cursor whenever the window scrolls (use-package beacon :diminish beacon-mode :config (beacon-mode)) ;; expand-region ;; Increase selected region by semantic units. (use-package expand-region :bind (("C-=" . er/expand-region))) ;; projectile ;; Manage and navigate projects in Emacs easily (use-package projectile :diminish projectile-mode :defer t :config (projectile-global-mode) (setq projectile-completion-system 'ivy)) ;; dumb-jump ;; jump to definition for multiple languages without configuration. (use-package dumb-jump :config (dumb-jump-mode t)) ;; origami ;; Flexible text folding (use-package origami :defer t) ;; multiple-cursors ;; Multiple cursors for Emacs (use-package multiple-cursors :bind (("C->" . mc/mark-next-like-this) ("C-<" . mc/mark-previous-like-this) ("C-*" . mc/mark-all-like-this) ("C-;" . mc/edit-lines))) ;; pcre2el ;; regexp syntax converter (use-package pcre2el :diminish pcre-mode :config (pcre-mode t)) ;; visual-regexp ;; A regexp/replace command for Emacs with interactive visual feedback (use-package visual-regexp :bind (("C-c r" . vr/replace) ("C-c q" . vr/query-replace) ("C-c m" . vr/mc-mark))) ;; highlight-indent-guides ;; show vertical lines to guide indentation (use-package highlight-indent-guides :diminish highlight-indent-guides-mode :config (setq highlight-indent-guides-method 'character) :hook (prog-mode . highlight-indent-guides-mode)) ;; org ;; Outline-based notes management and organizer (use-package org :mode "\\.org$" :config ;; Add org modules (setq org-modules '(org-habit)) ;; add scrartcl LaTeX class to org (with-eval-after-load 'ox-latex (add-to-list 'org-latex-classes '("scrartcl" "\\documentclass{scrartcl}" ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") ("\\subsubsection{%s}" . "\\subsubsection*{%s}") ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))) ;; latex related option (mainly support for lualatex) (setq ;; scrartcl as default class org-latex-default-class "scrartcl" ;; lualatex as default compiler org-latex-compiler "lualatex" ;; add latex packages and configurations org-latex-packages-alist '( ("" "booktabs" t) ("" "listings" t) ("" "xcolor" t) ("" "polyglossia" t) ("utf8" "luainputenc" t) ("" "fontspec" t) ("hidelinks" "hyperref" t) "\\setmainfont{Linux Libertine O}" "\\setsansfont{Linux Biolinum O}" "\\setmonofont[Scale=0.9]{AnonymousPro}" "\\setdefaultlanguage{german}") ;; enable latex listings org-latex-listings 'listings ;; latex listings options org-latex-listings-options '( ("frame" "single") ("rulesep" "6pt") ("backgroundcolor" "\\color{gray!20}") ("basicstyle" "\\footnotesize\\ttfamily") ("breaklines" "true"))) ;; remove unused default packages (unless (boundp 'org-latex-default-packages-alist) (setq org-latex-default-packages-alist nil)) (setq org-latex-default-packages-alist (remove '("AUTO" "inputenc" t) org-latex-default-packages-alist) org-latex-default-packages-alist (remove '("" "fixltx2e" nil) org-latex-default-packages-alist) org-latex-default-packages-alist (remove '("" "hyperref" nil) org-latex-default-packages-alist) org-latex-default-packages-alist (remove '"\\tolerance=1000" org-latex-default-packages-alist)) ;; add comment to easy templates ;; Credits: http://acidwords.com/posts/2018-03-02-extending-org-mode-easy-templates.html (add-to-list 'org-structure-template-alist '("C" "#+BEGIN_COMMENT\n?\n#+END_COMMENT" "")) ;; org todo keywords ;; Creadits: https://changelog.complete.org/archives/9877-emacs-3-more-on-org-mode (setq org-todo-keywords '((sequence "TODO(t!)" "NEXT(n!)" "STARTED(a!)" "WAIT(w@/!)" "OTHERS(o!)" "|" "DONE(d)" "CANCELLED(c)"))) (setq ;; syntax highlighting org-src-fontify-natively t ;; Don't break line on M-RET org-M-RET-may-split-line nil ;; Log done time org-log-done 'time ;; Log time when resheduled org-log-reschedule 'time ;; Log time when redeadlined org-log-redeadline 'time ;; only show last star org-hide-leading-stars t ;; Forbid closing of todos with open subtasks org-enforce-todo-dependencies t org-enforce-todo-checkbox-dependencies t ;; show something instead of ... org-ellipsis "⤵") ;; set default agenda file (setq org-agenda-files (list "~/cloud/org/todo.org" "~/cloud/org/projects.org" "~/cloud/org/projects/") org-agenda-text-search-extra-files (list "~/cloud/org/archive/" "~/cloud/org/articles/")) ;; set priority range from A to C with A being the highest (setq org-priority-faces '((?A . (:foreground "#F0DFAF" :weight bold)) (?B . (:foreground "LightSteelBlue")) (?C . (:foreground "OliveDrab")))) ;; open agenda in current window (setq org-agenda-window-setup (quote current-window)) ;; bind capture templates (setq org-capture-templates '(("t" "todo" entry (file+headline "~/cloud/org/todo.org" "Tasks") "* TODO %? %^G\n :PROPERTIES:\n :CREATED: %U\n :END:") ("s" "scheduled todo" entry (file+headline "~/cloud/org/todo.org" "Tasks") "* TODO %?\n SCHEDULED: %^T\n :PROPERTIES:\n :CREATED: %U\n :END:\n") ("m" "scheduled mail" entry (file+headline "~/cloud/org/todo.org" "Tasks") "* TODO %?\n SCHEDULED: %^T\n :PROPERTIES:\n :CREATED: %U\n :END:\n %a\n") ("p" "Project Idea" entry (file+headline "~/cloud/org/projects.org" "INBOX") "* TODO %?\n %i\n :PROPERTIES:\n :CREATED: %U\n :END:\n"))) ;; change org-agenda category/file display (setq org-agenda-prefix-format '((agenda . " %i %-18:c%?-12t% s") (todo . " %i %-18:c") (tags . " %i %-18:c") (search . " %i %-18:c"))) ;; set org refile targets (setq org-refile-targets '((org-agenda-files :maxlevel . 2))) ;; allow creating new targets on refile (setq org-refile-allow-creating-parent-nodes 'confirm) ;; warn of deadlines in the next seven days (setq org-deadline-warning-days 7) ;; show tasks of the day (setq org-agenda-span (quote day)) ;; org sorthing strategy (setq org-agenda-sorting-strategy '(time-up priority-down)) ;; don't show tasks as scheduled if they are already shown as a deadline (setq org-agenda-skip-scheduled-if-deadline-is-shown t) ;; don't give awarning colour to tasks with impending deadlines ;; if they are scheduled to be done (setq org-agenda-skip-deadline-prewarning-if-scheduled (quote pre-scheduled)) ;; store link to message if in header view, not to header query (setq org-mu4e-link-query-in-headers-mode nil) ;; Adjust fontification block length (setcar (nthcdr 4 org-emphasis-regexp-components) 10) (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components) :bind (("C-c l" . org-store-link) ("C-c c" . org-capture) ("C-c o" . org-switchb) ("C-c a" . org-agenda)) :hook (org-mode-hook . flyspell-mode)) ;; org-super-agenda ;; Supercharge your Org daily/weekly agenda by grouping items (use-package org-super-agenda :after org :init (org-super-agenda-mode 1) :config (setq org-super-agenda-groups '( (:name "Today" :time-grid t :scheduled today) (:name "Important from the past" :and (:priority "A" :scheduled past)) (:name "Waiting..." :todo "WAIT") (:name "Scheduled earlier" :scheduled past) (:name "Not scheduled" :scheduled nil) (:priority<= "B")))) ;; fill-column-indicator ;; Graphically indicate the fill column (use-package fill-column-indicator :config (setq ;; set rule width to 5px fci-rule-width 5 ;; set rule color fci-rule-color "#5B6268")) ;; diff-hl ;; Highlight uncommitted changes using VC (use-package diff-hl :defer nil :config (global-diff-hl-mode t) :hook (magit-post-refresh-hook . diff-hl-magit-post-refresh)) ;; winum ;; Navigate windows and frames using numbers (use-package winum :config (winum-mode)) ;; treemacs ;; A tree style file explorer package (use-package treemacs :init (with-eval-after-load 'winum (define-key winum-keymap (kbd "M-0") #'treemacs-select-window)) :config (setq treemacs-is-never-other-window t treemacs-project-follow-cleanup t treemacs-python-executable (executable-find "python3") treemacs-recenter-after-file-follow t) (treemacs-follow-mode t) (treemacs-git-mode 'extended) (treemacs-filewatch-mode) :bind (:map global-map ("M-0" . treemacs-select-window) ("C-x t 1" . treemacs-delete-other-window) ("C-x t t" . treemacs) ("C-x t B" . treemacs-bookmark) ("C-x t C-t" . treemacs-find-file) ("C-x t M-t" . treemacs-find-tag))) ;; treemacs-projectile ;; Projectile integration for treemacs (use-package treemacs-projectile :after treemacs projectile) ;; magit ;; A Git porcelain inside Emacs (use-package magit :bind ("C-x g" . magit-status)) ;; rainbow-delimiters ;; Highlight brackets according to their depth (use-package rainbow-delimiters :config (add-hook 'prog-mode-hook #'rainbow-delimiters-mode)) ;; pdf-tools ;; Support library for PDF documents. (use-package pdf-tools :unless (string= user-login-name "ftu15") :defer t :config (pdf-tools-install)) ;; counsel ;; Various completion functions using Ivy (use-package counsel :bind (("M-x" . counsel-M-x) ("C-x C-f" . counsel-find-file) (" f" . counsel-describe-function) (" v" . counsel-describe-variable) (" l" . counsel-find-library) (" i" . counsel-info-lookup-symbol) (" u" . counsel-unicode-char) ("C-c g" . counsel-git) ("C-c j" . counsel-git-grep) ("C-c k" . counsel-ag) ("C-x l" . counsel-locate) ("C-S-o" . counsel-rhythmbox))) ;; ivy ;; Incremental Vertical completYon (use-package ivy :diminish (ivy-mode) :config (ivy-mode t) (setq ivy-use-virtual-buffers t ivy-count-format "(%d/%d) " ivy-display-style 'fancy ivy-extra-directories nil ivy-initial-inputs-alist nil) :bind (("C-c C-r" . ivy-resume))) ;; swiper ;; Isearch with an overview. Oh, man! (use-package swiper :config (ivy-mode 1) (setq ivy-use-virtual-buffers t ivy-display-style 'fancy ivy-extra-directories nil) :bind (("C-s" . swiper) ("C-r" . swiper) :map read-expression-map ("C-r" . counsel-expression-history))) ;; counsel-projectile ;; Ivy UI for Projectile (use-package counsel-projectile :after (projectile) :config (counsel-projectile-mode)) ;; avy ;; Jump to arbitrary positions in visible text and select text quickly. (use-package avy :bind (("s-s" . avy-goto-char-2) ("s-l" . avy-goto-line))) ;; smooth-scrolling ;; Make emacs scroll smoothly (use-package smooth-scrolling :config (smooth-scrolling-mode t) (setq smooth-scroll-margin 5)) ;; ox-pandoc ;; org exporter for pandoc (use-package ox-pandoc :mode ("\\.org$" . org-mode) :config ;; use lualatex instead of pdflatex (setq org-pandoc-options-for-latex-pdf '((latex-engine . "lualatex")) org-pandoc-options-for-beamer-pdf '((latex-engine . "lualatex")))) ;; web-beautify ;; Format HTML, CSS and JavaScript/JSON (use-package web-beautify :bind (:map js2-mode-map ("C-c b" . web-beautify-js) :map json-mode-map ("C-c b" . web-beautify-js) :map html-mode-map ("C-c b" . web-beautify-html) :map css-mode-map ("C-c b" . web-beautify-css))) ;; company ;; Modular text completion framework (use-package company :diminish company-mode :init (global-company-mode t) :config (setq company-show-numbers t)) ;; company-math ;; Completion backends for unicode math symbols and latex tags (use-package company-math :after (company tex) :hook (TeX-mode-hook . (lambda () (setq-local company-backends (append '((company-math-symbols-latex company-latex-commands)) company-backends))))) (use-package company-shell :after (company shell-mode)) ;; beginend ;; Redefine M-< and M-> for some modes (use-package beginend :diminish (beginend-global-mode beginend-prog-mode beginend-magit-status-mode) :config (beginend-global-mode t)) ;; markdown-mode ;; Major mode for Markdown-formatted text (use-package markdown-mode :commands (markdown-mode gfm-mode) :mode (("README\\.md\\'" . markdown-mode) ("\\.md\\'" . markdown-mode) ("\\.markdown\\'" . markdown-mode)) :init (setq markdown-command "kramdown")) ;; markdown-preview-mode ;; markdown realtime preview minor mode (use-package markdown-preview-mode :after (markdown-mode) :config (add-to-list 'markdown-preview-javascript "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML")) ;; web-mode ;; major mode for editing web templates (use-package web-mode :mode (("\\.phtml\\'" . web-mode)) (("\\.tpl\\.php\\'" . web-mode)) (("\\.[agj]sp\\'" . web-mode)) (("\\.erb\\'" . web-mode)) (("\\.mustache\\'" . web-mode)) (("\\.djhtml\\'" . web-mode)) (("\\.html?\\'" . web-mode)) (("\\.css?\\'" . web-mode)) :config (setq web-mode-markup-indent-offset 2 web-mode-css-indent-offset 2 web-mode-enable-css-colorization t web-mode-code-indent-offset 2 web-mode-indent-style 2)) ;; LESS style sheet support (use-package less-css-mode :mode (("\\.less\\'" . less-css-mode))) ;; js2-mode ;; Major mode for editing JavaScript files (use-package js2-mode :mode (("\\.js\\'" . js2-mode))) ;; dart-mode ;; Major mode for editing Dart files (use-package dart-mode :mode (("\\.dart\\'" . dart-mode))) ;; ruby ;; Support for the ruby language (use-package enh-ruby-mode :after (robe inf-ruby) :mode (("\\(?:\\.rb\\|ru\\|rake\\|thor\\|jbuilder\\|gemspec\\|podspec\\|/\\(?:Gem\\|Rake\\|Cap\\|Thor\\|Vagrant\\|Guard\\|Pod\\)file\\)\\'" . enh-ruby-mode)) :hook (('enh-ruby-mode-hook 'robe-mode) ('enh-ruby-mode-hook 'inf-ruby-minor-mode))) (use-package robe :after (company-mode) :config (push 'company-robe company-backends)) (use-package inf-ruby :defer t) ;; csv-mode ;; Major mode for editing comma/char separated values (use-package csv-mode :mode (("\\.csv\\'" . csv-mode)) :config (setq csv-separators '(";"))) ;; json-mode ;; Major mode for editing JSON files (use-package json-mode :mode (("\\.json\\'" . json-mode))) ;; focus ;; Dim the font color of text in surrounding sections (use-package focus :defer t) ;; phpunit ;; Launch PHP unit tests using phpunit (use-package phpunit :bind (:map web-mode-map ("C-x t" . phpunit-current-test) ("C-x c" . phpunit-current-class) ("C-x p" . phpunit-current-project))) ;; php-mode ;; Major mode for editing PHP files (use-package php-mode :mode (("\\.php\\'" . php-mode))) ;; fish-mode ;; Major mode for fish shell scripts (use-package fish-mode :mode (("\\.fish\\'" . fish-mode))) ;; easy-hugo ;; Write blogs made with hugo by markdown or org-mode (use-package easy-hugo :defer t) ;; stumpwm-mode ;; special lisp mode for evaluating code into running stumpwm (use-package stumpwm-mode :mode (("stumpwmrc" . stumpwm-mode))) ;; slime ;; Superior Lisp Interaction Mode for Emacs (use-package slime :mode (("\\.lisp\\'" . slime) ("stumpwmrc" . slime)) :config (load (expand-file-name "~/quicklisp/slime-helper.el")) (setq inferior-lisp-program "/usr/bin/sbcl")) ;; slime-company ;; slime completion backend for company mode (use-package slime-company :after (slime company) :config (setq slime-contribs '(slime-fancy slime-company))) ;; yaml-mode ;; Major mode for editing YAML files (use-package yaml-mode :config (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))) ;; sass-mode ;; Major mode for editing Sass files (use-package sass-mode :mode (("\\.scss\\'" . scss-mode) ("\\.sass\\'" . sass-mode))) ;; coffee-mode ;; Major mode for CoffeeScript code (use-package coffee-mode :mode (("\\.coffee\\'" . coffee-mode)) :config (setq whitespace-action '(auto-cleanup) whitespace-style '(trailing space-before-tab indentation empty space-after-tab) coffee-tab-width 2) :hook (coffee-mode-hook whitespace-mode)) ;; python ;; Python's flying circus support for Emacs (use-package python :mode (("\\.py\\'" . python-mode)) :config (setq flycheck-python-pylint-executable "pylint3")) ;; moinmoin ;; Major mode for editing MoinMoin wiki entries (use-package moinmoin :load-path "moinmoin/" :mode (("\\.wiki\\'" . moinmoin-mode))) ;; typoscript-mode ;; A mode for TYPO3 typoscript (use-package typoscript-mode :mode (("\\.typoscript\\'" . typoscript-mode))) ;; mu4e ;; emacs mail client (use-package mu4e :unless (string= user-login-name "ftu15") :load-path "/usr/share/emacs/site-lisp/mu4e/" :commands mu4e :config ;; get mail (setq mu4e-get-mail-command "mbsync -a" mu4e-update-interval 300 mu4e-change-filenames-when-moving t) ;; faster reindexing (setq mu4e-maildir-index-cleanup nil mu4e-index-lazy-check t) ;; smtpmail settings (setq message-send-mail-function 'smtpmail-send-it send-mail-function 'smtpmail-send-it) ;; general mu4e options (setq ;; use mu4e as default emacs mailer mail-user-agent 'mu4e-user-agent ;; don't keep message buffers around message-kill-buffer-on-exit t ;; don't save sent messages to "Sent" folder mu4e-sent-messages-behavior 'delete ;; complete date format mu4e-headers-date-format "%Y-%m-%d %H:%M" ;; show full addresses mu4e-view-show-addresses 't ;; attachment directory mu4e-attachment-dir "/tmp" ;; don't reply to myself mu4e-compose-dont-reply-to-self t ;; maildir mu4e-maildir "~/.mbsync" ;; use correct account context when sending mail based from headers message-sendmail-envelope-from 'header) ;; list of email addresses (setq mu4e-user-mail-address-list '("marcel.kapfer@uni-ulm.de" "marcel@marcel-kapfer.de" "tex@mmk2410.org" "me@mmk2410.org" "debian@mmk2410.org" "hugo@marcel-kapfer.de" "info@marcel-kapfer.de" "contact@marcel-kapfer.de" "kontakt@marcel-kapfer.de" "opensource@mmk2410.org")) ;; custom header field for maildir (add-to-list 'mu4e-header-info-custom '(:mdir . (:name "Maildir" :shortname "Maildir" :help "Maildir of current message" :function (lambda (msg) (or (replace-regexp-in-string "^/\\(.\\)[A-Za-z0-9]*" "\\1" (mu4e-message-field msg :maildir)) ""))))) ;; customize mu4e list view (setq mu4e-headers-fields '((:human-date . 20) (:flags . 6) (:mdir . 15) (:mailing-list . 15) (:from-or-to . 22) (:subject . nil))) ;; convenience function for starting the whole mu4e in its own frame ;; posted by the author of mu4e on the mailing list (defun mu4e-in-new-frame () "Start mu4e in new frame." (interactive) (select-frame (make-frame)) (mu4e)) ;; set citation line (setq message-citation-line-format "%f @ %Y-%m-%d %T %Z:\n") (setq message-citation-line-function (lambda () (message-insert-formatted-citation-line nil nil (car (current-time-zone))))) ;; macro for creating university mu4e contexts (defmacro mu4e-add-university-context (context-name match-func mail-address full-name signature-file) "Add a university context to `mu4e-contexts. context-name is the name of the context. match-func a function when the context should be selected. full-name is the full name of the sender. mail-address is the mail address of the sender. signature-file is the path to the file which contains the signature." `(add-to-list 'mu4e-contexts (make-mu4e-context :name ,context-name :enter-func (lambda () (mu4e-message ,(concat context-name " Context"))) :match-func ,match-func :vars '((user-mail-address . ,mail-address) (user-full-name . ,full-name) (message-signature-file . ,signature-file) ;; smtp (smtpmail-stream-type . starttls) (smtpmail-default-smtp-server . "smtp.uni-ulm.de") (smtpmail-smtp-server . "smtp.uni-ulm.de") (smtpmail-smtp-user . "ftu15") (smtpmail-smtp-service . 587) ;; folders (mu4e-sent-folder . "/university/Sent") (mu4e-drafts-folder . "/university/Drafts") (mu4e-trash-folder . "/university/Trash") (mu4e-refile-folder . "/university/Archives"))) t)) ;; mu4e contexts / mail identities (setq mu4e-contexts `( ,(make-mu4e-context :name "Mailbox" :enter-func (lambda () (mu4e-message "Mailbox Context")) :match-func (lambda (msg) (when msg (string-prefix-p "/mailbox" (mu4e-message-field msg :maildir)))) :vars '((user-mail-address . "marcel.kapfer@mailbox.org") (user-full-name . "Marcel Kapfer") (message-signature-file . "~/dotfiles/mutt/sig") ;; smtp (smtpmail-stream-type . ssl) (smtpmail-smtp-server . "smtp.mailbox.org") (smtpmail-smtp-user . "marcel.kapfer@mailbox.org") (smtpmail-smtp-service . 465) ;; folders (mu4e-sent-folder . "/mailbox/Sent") (mu4e-drafts-folder . "/mailbox/Drafts") (mu4e-trash-folder . "/mailbox/Trash") (mu4e-refile-folder . "/mailbox/Archives"))))) ;; university contexts (mu4e-add-university-context "A University" nil "marcel.kapfer@uni-ulm.de" "Marcel Kapfer" nil) (mu4e-add-university-context "B StuVe Oeff-Ref" nil "stuve.oeffentlichkeit@uni-ulm.de" "StuVe Öffentlichkeitsreferat" "~/dotfiles/dotdotfiles/sig/stuve-oeffentlichkeit") (mu4e-add-university-context "C FIN Oeff-Team" nil "oeffentlichkeit.fin@uni-ulm.de" "FIN Öffentlichkeits-Team" "~/dotfiles/dotdotfiles/sig/fin-oeffentlichkeit") (mu4e-add-university-context "D uulmhack" nil "uulmhack@uni-ulm.de" "uulmhack Orga Team" "~/dotfiles/dotdotfiles/sig/uulmhack") ;; custom bookmarks (setq mu4e-bookmarks (delete '("flag:unread AND NOT flag:trashed" "Unread messages" 117) mu4e-bookmarks)) (add-to-list 'mu4e-bookmarks (make-mu4e-bookmark :name "Open Messages" :query "(flag:unread AND NOT flag:trashed AND NOT m:/university/fin/service/open) OR m:/university/inbox OR m:/mailbox/inbox OR m:/university/oeffref/inbox" :key ?o)) (add-to-list 'mu4e-bookmarks (make-mu4e-bookmark :name "Open University Messages" :query "(flag:unread AND NOT flag:trashed AND m:/university/* AND NOT m:/university/fin/service/open) OR m:/university/inbox OR m:/university/oeffref/inbox" :key ?u)) (add-to-list 'mu4e-bookmarks (make-mu4e-bookmark :name "Open Private Messages" :query "(flag:unread AND NOT flag:trashed AND m:/mailbox/*) OR m:/mailbox/inbox" :key ?m)) (add-to-list 'mu4e-bookmarks (make-mu4e-bookmark :name "Flagged messages" :query "flag:flagged AND NOT flag:trashed" :key ?f)) ;; custom shortcuts (setq mu4e-maildir-shortcuts '(("/university/inbox" . ?u) ("/university/fin/fin" . ?f) ("/university/fin/intern" . ?i) ("/university/fin/service/open" . ?s) ("/mailbox/inbox" . ?m) ("/mailbox/debian/devel-changes" . ?c) ("/mailbox/debian/user" . ?d))) ;; enable spell checking (add-hook 'mu4e-compose-mode-hook #'flyspell-mode) ;; always BCC myself (add-hook 'mu4e-compose-mode-hook (lambda () (save-excursion (message-add-header (concat "Bcc: " user-mail-address "\n"))))) ;; sign message ;; (add-hook 'mu4e-compose-mode-hook (lambda () (mml-secure-message-sign-pgpmime)))) ) ;; elfeed ;; emacs feed reader (use-package elfeed :defer t :config (defun elfeed-search-format-date (date) (format-time-string "%Y-%m-%d %H:%M" (seconds-to-time date)))) ;; elfeed-protocol ;; use Nextcloud as RSS server (use-package elfeed-protocol :after (elfeed) :config (setq elfeed-use-curl t) (elfeed-set-timeout 36000) (setq elfeed-feeds (list (list "owncloud+https://mmk2410@cloud.mmk2410.org" :password (funcall (plist-get (nth 0 (auth-source-search :host "cloud.mmk2410.org" :user "mmk2410" :require '(:secret))) :secret))))) (elfeed-protocol-enable)) ;; bug-hunter ;; Hunt down errors by bisecting elisp files (use-package bug-hunter :defer t) ;; hl-todo ;; highlight TODOs and similar keywords (use-package hl-todo :init (global-hl-todo-mode)) ;; yasnippets ;; Yet another snippet extension for Emacs. (use-package yasnippet) ;; company-quickhelp ;; Documentation popup for Company (use-package company-quickhelp :after (company) :init (company-quickhelp-mode 1) :config (setq company-quickhelp-delay 0.5)) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package tex-site ;; AUCTeX initialization :ensure auctex) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package tex :ensure auctex :config (setq ;; Parse file after loading it if no style hook is found for it. TeX-parse-self t ;; Automatically save style information when saving the buffer. TeX-auto-save t ;; Automatically interst braces after sub- and superscript in math mode ;; TeX-electric-sub-and-superscript t ;; Don't ask the user when saving a file for each file. TeX-save-query nil ;; enable synctex correlation. TeX-source-correlate-mode t TeX-source-correlate-start-server t ;; use pdf-tools with synctex TeX-view-program-selection '((output-pdf "PDF Tools")) TeX-source-correlate-start-server t) (setq-default ;; set to nil, so AUCTeX always asks for the master file TeX-master nil ;; use a decent, modern TeX engine TeX-engine 'luatex)) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package tex-buf :ensure auctex :defer t ;; Don't ask for confirmation when saving before processing :config (setq TeX-save-query nil)) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package tex-style :ensure auctex :defer t :config ;; Enable support for csquotes (setq LaTeX-csquotes-close-quote "}" LaTeX-csquotes-open-quote "\\enquote{")) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package tex-fold :ensure auctex :defer t :init (add-hook 'TeX-mode-hook #'TeX-fold-mode)) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package tex-mode :ensure auctex :defer t) ;; LaTeX with AUCTeX ;; Integrated environment for TeX (use-package latex :ensure auctex :defer t :config ;; No language-specific hyphens please (setq LaTeX-babel-hyphen nil) ;; helper for a new (La)TeX style guide concept. ;; inserts a line break, a empty comment line and another line break (defun TeX-insert-comment-line () "Insert a linebreak followed by a '%' and another line break" (interactive) (newline-and-indent) (insert "%") (newline-and-indent)) ;; Easy math input (add-hook 'TeX-mode-hook #'LaTeX-math-mode) ;; Start flyspell (add-hook 'TeX-mode-hook #'flyspell-mode) ;; Update PDF buffers after successful LaTeX runs (add-hook 'TeX-after-TeX-LaTeX-command-finished-hook #'TeX-revert-document-buffer) ;; hooks for outline mode (add-hook 'TeX-mode-hook #'outline-minor-mode) ;; reload pdf document after compliation (add-hook 'TeX-after-compilation-finished-functions #'TeX-revert-document-buffer) ;; hook for rainbox delimiters mode (add-hook 'TeX-mode-hook #'rainbow-delimiters-mode) ;; start auto-fill mode (add-hook 'TeX-mode-hook #'visual-line-mode) :bind (:map latex-mode-map ("" . TeX-insert-comment-line))) ;; bibtex ;; BibTeX editing (use-package bibtex :after (latex) ;; Use a modern BibTeX dialect :config (bibtex-set-dialect 'biblatex) ;; Run prog mode hooks for bibtex :hook (bibtex-mode-hook . (lambda () (run-hooks 'prog-mode-hook)))) ;; reftex ;; TeX cross-reference management (use-package reftex :after (latex) :diminish reftex-mode :config (setq ;; Plug into AUCTeX reftex-plug-into-AUCTeX t ;; Automatically derive labels, and prompt for confirmation reftex-insert-label-flags '(t t)) :hook (LaTeX-mode-hook . reftex-mode)) ;; term / ansi-term ;; terminal in emacs (use-package term :defer t :init (defalias 'sh 'ansi-term) :config ;; set default shell ;; from https://ogbe.net/emacsconfig.html (defvar my-term-shell "/usr/bin/fish") (defadvice ansi-term (before force-bash) (interactive (list my-term-shell))) (ad-activate 'ansi-term) ;; close ansi-term, when shell session exists ;; from https://ogbe.net/emacsconfig.html (defadvice term-sentinel (around my-advice-term-sentinel (proc msg)) (if (memq (process-status proc) '(signal exit)) (let ((buffer (process-buffer proc))) ad-do-it (kill-buffer buffer)) ad-do-it)) (ad-activate 'term-sentinel) (add-hook 'term-mode-hook (lambda () ;; enable visual line mode (visual-line-mode 1))) :bind (("C-c s" . ansi-term) :map term-raw-map ("C-y" . term-paste))) ;; saveplace ;; save the last cursor position in a file (use-package saveplace :init (save-place-mode t)) ;; tramp ;; do stuff over ssh at al. (use-package tramp :defer t :init ;; Set default connection method for TRAMP (setq tramp-default-method "ssh") (require 'em-tramp) (setq password-cache-expiry 3600)) ;; edit-server (use-package edit-server :init (edit-server-start)) ;; org-moinmoin ;; moinmoin export in org-mode (use-package ox-moinmoin :after (org) :load-path "org-moinmoin/") ;; ox-reveal ;; Exports Org-mode contents to Reveal.js HTML presentation. (use-package ox-reveal :after (org)) ;; org-tree-slide (use-package org-tree-slide :after (org) :bind (:map org-tree-slide-mode-map ("" . org-tree-slide-move-previous-tree) ("" . org-tree-slide-move-next-tree) :map org-mode-map ("" . org-tree-slide-mode) ("S-" . org-tree-slide-skip-done-toggle))) ;; exec-path-from-shell ;; get environmet variables (use-package exec-path-from-shell :init (exec-path-from-shell-initialize) (exec-path-from-shell-copy-env "SSH_AUTH_SOCK") (exec-path-from-shell-copy-env "SSH_AGENT_PID")) ;; rust-mode (use-package rust-mode :mode (("\\.rs\\'" . rust-mode))) ;; nix-mode (use-package nix-mode :mode (("\\.nix\\'" . nix-mode))) ;; haskell-mode (use-package haskell-mode :mode (("\\.hs\\'" . haskell-mode))) ;; editorconfig plugin (use-package editorconfig :ensure t :config (editorconfig-mode 1)) ;; all-the-icons ;; A utility package to collect various Icon Fonts and propertized them within Emacs (use-package all-the-icons) ;; spaceline ;; Powerline theme from Spacemacs (use-package spaceline) ;; fancy-battery ;; Fancy battery display (use-package fancy-battery :after spaceline :init (fancy-battery-mode)) ;; spaceline-all-the-icons ;; A Spaceline Mode Line theme using All The Icons (use-package spaceline-all-the-icons :after fancy-battery :config (spaceline-all-the-icons-theme) (spaceline-toggle-all-the-icons-battery-status-on)) ;; Doom theme ;; https://github.com/hlissner/emacs-doom-themes (use-package doom-themes :init (setq doom-themes-enable-bold t doom-themes-enable-italic t) :config (load-theme 'doom-one-light t) (doom-themes-treemacs-config) (doom-themes-org-config))