You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1408 lines
39 KiB

;; 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.
(require 'package)
(setq package-enable-on-startup nil)
;; Fix for elpa. See:
;; -
(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")
(add-to-list 'package-archives '("org" . "") t)
(add-to-list 'package-archives '("melpa" . "") t)
;; install use-package if not already installed
(unless (package-installed-p 'use-package)
(package-install 'use-package))
;; 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 "")
;; 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
;; 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
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
;; 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
;; 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 "<f5>" ) '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"
(mapc 'kill-buffer (buffer-list)))
;; -----------------------------------------------------------------------------
;; Packages and package configuration
;; all packages should be loaded with use-package
;; server
(use-package server
:if window-system
((after-init-hook . server-start)
;; StumpWM interaction
(server-done-hook . (lambda ()
"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
(diminish 'abbrev-mode))
;; curx
;; A Collection of Ridiculously Useful eXtensions for Emacs
(use-package crux
(("C-a" . crux-move-beginning-of-line)))
;; which-key
;; Display available keybindings in popup
(use-package which-key
:diminish 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
;; beacon
;; Highlight the cursor whenever the window scrolls
(use-package beacon
:diminish 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
(setq projectile-completion-system 'ivy))
;; dumb-jump
;; jump to definition for multiple languages without configuration.
(use-package dumb-jump
(dumb-jump-mode t))
;; origami
;; Flexible text folding
(use-package origami
:defer t)
;; multiple-cursors
;; Multiple cursors for Emacs
(use-package multiple-cursors
(("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
(pcre-mode t))
;; visual-regexp
;; A regexp/replace command for Emacs with interactive visual feedback
(use-package visual-regexp
(("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
(setq highlight-indent-guides-method 'character)
(prog-mode . highlight-indent-guides-mode))
;; org
;; Outline-based notes management and organizer
(use-package org
:mode "\\.org$"
;; 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
("\\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)
;; scrartcl as default class
org-latex-default-class "scrartcl"
;; lualatex as default compiler
org-latex-compiler "lualatex"
;; add latex packages and configurations
("" "booktabs" t)
("" "listings" t)
("" "xcolor" t)
("" "polyglossia" t)
("utf8" "luainputenc" t)
("" "fontspec" t)
("hidelinks" "hyperref" t)
"\\setmainfont{Linux Libertine O}"
"\\setsansfont{Linux Biolinum O}"
;; enable latex listings
org-latex-listings 'listings
;; 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))
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:
(add-to-list 'org-structure-template-alist
'("C" "#+BEGIN_COMMENT\n?\n#+END_COMMENT" ""))
;; org todo keywords
;; Creadits:
(setq org-todo-keywords '((sequence
"TODO(t!)" "NEXT(n!)" "STARTED(a!)" "WAIT(w@/!)" "OTHERS(o!)"
"|" "DONE(d)" "CANCELLED(c)")))
;; 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/"
org-agenda-text-search-extra-files (list "~/cloud/org/archive/"
;; 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/" "Tasks")
"* TODO %? %^G\n :PROPERTIES:\n :CREATED: %U\n :END:")
("s" "scheduled todo" entry (file+headline "~/cloud/org/" "Tasks")
("m" "scheduled mail" entry (file+headline "~/cloud/org/" "Tasks")
"* TODO %?\n SCHEDULED: %^T\n :PROPERTIES:\n :CREATED: %U\n :END:\n %a\n")
("p" "Project Idea" entry (file+headline "~/cloud/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)
(("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
;; 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
(with-eval-after-load 'winum
(define-key winum-keymap (kbd "M-0") #'treemacs-select-window))
(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)
(: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
("C-x g" . magit-status))
;; rainbow-delimiters
;; Highlight brackets according to their depth
(use-package rainbow-delimiters
(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
;; counsel
;; Various completion functions using Ivy
(use-package counsel
(("M-x" . counsel-M-x)
("C-x C-f" . counsel-find-file)
("<f1> f" . counsel-describe-function)
("<f1> v" . counsel-describe-variable)
("<f1> l" . counsel-find-library)
("<f2> i" . counsel-info-lookup-symbol)
("<f2> 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)
(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)
(("C-c C-r" . ivy-resume)))
;; swiper
;; Isearch with an overview. Oh, man!
(use-package swiper
(ivy-mode 1)
(setq ivy-use-virtual-buffers t
ivy-display-style 'fancy
ivy-extra-directories nil)
(("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)
;; avy
;; Jump to arbitrary positions in visible text and select text quickly.
(use-package avy
(("s-s" . avy-goto-char-2)
("s-l" . avy-goto-line)))
;; smooth-scrolling
;; Make emacs scroll smoothly
(use-package smooth-scrolling
(smooth-scrolling-mode t)
(setq smooth-scroll-margin 5))
;; ox-pandoc
;; org exporter for pandoc
(use-package ox-pandoc
:mode ("\\.org$" . org-mode)
;; 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
(: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
(global-company-mode t)
(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))
(use-package company-shell
:after (company shell-mode))
;; beginend
;; Redefine M-< and M-> for some modes
(use-package beginend
:diminish (beginend-global-mode
(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)
(add-to-list 'markdown-preview-javascript ""))
;; web-mode
;; major mode for editing web templates
(use-package web-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))
(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
(: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))
(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)
(setq slime-contribs '(slime-fancy slime-company)))
;; yaml-mode
;; Major mode for editing YAML files
(use-package yaml-mode
(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
;; get mail
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
;; 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
;; 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)
(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."
(select-frame (make-frame))
;; set citation line
(setq message-citation-line-format "%f @ %Y-%m-%d %T %Z:\n")
(setq message-citation-line-function
(lambda ()
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."
: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 . "")
(smtpmail-smtp-server . "")
(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")))
;; 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 . "")
(user-full-name . "Marcel Kapfer")
(message-signature-file . "~/dotfiles/mutt/sig")
;; smtp
(smtpmail-stream-type . ssl)
(smtpmail-smtp-server . "")
(smtpmail-smtp-user . "")
(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
"A University"
"Marcel Kapfer"
"B StuVe Oeff-Ref"
"StuVe Öffentlichkeitsreferat"
"C FIN Oeff-Team"
"FIN Öffentlichkeits-Team"
"D uulmhack"
"uulmhack Orga Team"
;; custom bookmarks
(setq mu4e-bookmarks (delete '("flag:unread AND NOT flag:trashed" "Unread messages" 117) mu4e-bookmarks))
(add-to-list 'mu4e-bookmarks
: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
: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
: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
: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
(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)
(setq elfeed-use-curl t)
(elfeed-set-timeout 36000)
(setq elfeed-feeds (list
(list "owncloud+"
:password (funcall
(nth 0
:host ""
:user "mmk2410"
:require '(:secret)))
;; 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)
(company-quickhelp-mode 1)
(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
;; 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)
;; 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
;; 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
;; 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"
(insert "%")
;; 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
;; hooks for outline mode
(add-hook 'TeX-mode-hook #'outline-minor-mode)
;; reload pdf document after compliation
(add-hook 'TeX-after-compilation-finished-functions
;; 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
("<C-return>" . 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
;; 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)
;; set default shell
;; from
(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
(defadvice term-sentinel (around my-advice-term-sentinel (proc msg))
(if (memq (process-status proc) '(signal exit))
(let ((buffer (process-buffer proc)))
(kill-buffer buffer))
(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
;; 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
("<f9>" . org-tree-slide-move-previous-tree)
("<f10>" . org-tree-slide-move-next-tree)
:map org-mode-map
("<f8>" . org-tree-slide-mode)
("S-<f8>" . org-tree-slide-skip-done-toggle)))
;; exec-path-from-shell
;; get environmet variables
(use-package exec-path-from-shell
(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
(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
;; Doom theme
(use-package doom-themes
(setq doom-themes-enable-bold t
doom-themes-enable-italic t)
(load-theme 'doom-one-light t)