.emacs.d/init.el

1594 lines
53 KiB
EmacsLisp
Raw Normal View History

;;; Init.el --- Daniel's Emacs Configuration -*- lexical-binding: t -*-
2017-07-16 18:07:00 +02:00
;;; Commentary:
2017-11-11 11:44:20 +01:00
;; This is the main entry point for Emacs to load this configuration. The
;; structure is roughly as follows:
;; * first comes some preliminary setup, mostly setting up `package;
;; * the main activation of the configuration is done in the function
;; `db/run-init, which is installed in `after-init-hook; it is thus run
;; after init.el has been read
;; * then comes setting up all the packages that can be used by this
;; configuration; most of these packages are not loaded however, and only
;; configuration hooks are installed (using `use-package); this way a user
;; can choose in `db/run-init which configruation to activate without
;; changing much of the rest of the file.
;; * this file also introduces a new customization group `personal-settings
;; containing variables (mostly file paths) that must be set to enable some
;; of the provied functionality.
2017-11-11 11:44:20 +01:00
2017-07-16 18:07:00 +02:00
;;; Code:
2017-11-11 11:44:30 +01:00
;; * Constants
2017-07-16 18:07:00 +02:00
(defconst emacs-d (file-name-directory
(file-chase-links load-file-name))
"The giant turtle on which the world rests.")
2017-11-11 11:44:30 +01:00
(defconst on-windows (memq system-type '(windows-nt cygwin))
"Non-nil if and only if this instance of Emacs runs on Windows.")
;; * Packages
2017-07-16 18:07:00 +02:00
(require 'package)
(setq package-user-dir (expand-file-name "elpa" emacs-d))
(setq package-archives
'(("melpa" . "https://melpa.org/packages/")
("gnu" . "https://elpa.gnu.org/packages/")
("melpa-stable" . "https://stable.melpa.org/packages/")
2018-02-22 16:28:33 +01:00
("org" . "https://orgmode.org/elpa/")))
2017-07-16 18:07:00 +02:00
(setq package-enable-at-startup nil
load-prefer-newer t)
2017-07-16 18:07:00 +02:00
(package-initialize)
(eval-when-compile
(dolist (package '(diminish use-package bind-key))
(unless (package-installed-p package)
(package-install package))
(require package)))
2017-07-16 18:07:00 +02:00
(put 'use-package 'lisp-indent-function 1)
(setq use-package-verbose t
use-package-minimum-reported-time 0.01)
2017-07-16 18:07:00 +02:00
(add-to-list 'load-path (expand-file-name "site-lisp" emacs-d))
2017-07-16 18:07:00 +02:00
;; * Mode activation
(defun db/run-init ()
"Run main initialization after everything is set up."
;; Load customizations
(when (file-exists-p custom-file)
(load-file custom-file))
;; Activate modes (builtin)
2017-07-16 18:07:00 +02:00
(show-paren-mode 1)
(transient-mark-mode 1)
(global-font-lock-mode 1)
(column-number-mode 1)
;; (display-time)
(delete-selection-mode 1)
(dolist (mode '(tool-bar-mode
scroll-bar-mode
menu-bar-mode
blink-cursor-mode
tooltip-mode))
2017-07-16 18:07:00 +02:00
(when (fboundp mode)
(funcall mode 0)))
(when (<= 24 emacs-major-version)
(electric-indent-mode -1))
(appt-activate +1)
(savehist-mode 1)
(quietly-read-abbrev-file)
(size-indication-mode 1)
(display-battery-mode -1)
(electric-pair-mode +1)
2017-07-16 18:07:00 +02:00
(recentf-mode t)
(winner-mode 1)
(global-auto-revert-mode -1)
(which-function-mode +1)
;; Activate modes (packages)
(dolist (mode '(global-undo-tree-mode
ace-window-display-mode
key-chord-mode
sml/setup
ivy-mode
2018-11-02 20:57:34 +01:00
which-key-mode
eyebrowse-mode))
(with-demoted-errors "Cannot activate mode: %s"
2017-10-28 19:34:58 +02:00
(funcall mode +1)))
2017-07-16 18:07:00 +02:00
2018-10-20 11:25:49 +02:00
(projectile-mode +1)
(unless on-windows
(with-demoted-errors "Error: %s"
(pdf-tools-install)))
2017-09-15 16:27:56 +02:00
;; Global Hooks
2017-07-16 18:07:00 +02:00
(add-hook 'minibuffer-setup-hook 'conditionally-enable-lispy)
(add-hook 'minibuffer-setup-hook 'cursor-intangible-mode)
(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'prog-mode-hook 'page-break-lines-mode)
2017-07-16 18:07:00 +02:00
(when (<= 24 emacs-major-version)
(add-hook 'prog-mode-hook 'electric-indent-local-mode))
(add-hook 'lisp-mode-hook 'lispy-mode)
(unless (eq system-type 'windows-nt)
;; flyspell doesnt work on windows right now, need to further investigate
;; what is happening here
(add-hook 'text-mode-hook 'turn-on-flyspell))
(add-hook 'text-mode-hook 'yas-minor-mode-on)
(add-hook 'text-mode-hook 'electric-quote-mode)
2017-07-16 18:07:00 +02:00
;; Auto-Modes
(dolist (mode-spec '(("\\.clj\\'" . clojure-mode)
("\\.cl\\'" . lisp-mode)
("\\.lisp\\'" . lisp-mode)
("\\.plx\\" . cperl-mode)
("\\.hs\\'" . haskell-mode)
("\\.lhs\\'" . haskell-mode)
("\\.md\\'" . markdown-mode)
("\\.html\\'" . nxml-mode)
("\\.xml\\'" . nxml-mode)))
(add-to-list 'auto-mode-alist mode-spec))
2017-08-04 17:49:43 +02:00
;; Top-Level Keybindings
2017-07-16 18:07:00 +02:00
(bind-key "<XF86Back>" #'winner-undo)
(bind-key "<XF86Forward>" #'winner-redo)
(bind-key "<f1>" #'db/run-or-hide-eshell)
(bind-key "<f2> i" #'counsel-info-lookup-symbol)
(bind-key "<f2> u" #'counsel-unicode-char)
(bind-key "<f5>" #'rgrep)
2017-07-16 18:07:00 +02:00
(bind-key "<f6>" #'hydra-zoom/body)
(bind-key "<f7>" #'dictcc)
(bind-key "<f8>" #'counsel-locate)
(bind-key "<f9>" #'helm-org-agenda-files-headings)
2017-07-16 18:07:00 +02:00
(bind-key "<f10>" #'magit-status)
2017-07-18 14:33:31 +02:00
(bind-key "<f11>" #'org-capture)
2017-07-16 18:07:00 +02:00
(bind-key "<f12>" #'db/helm-shortcuts)
2017-09-29 21:25:41 +02:00
(bind-key "C-;" #'iedit-mode)
2017-07-16 18:07:00 +02:00
(bind-key "C-<" #'mc/mark-previous-like-this)
(bind-key "C->" #'mc/mark-next-like-this)
(bind-key "C-." #'mc/skip-to-next-like-this)
(bind-key "C-," #'mc/skip-to-previous-like-this)
2017-07-16 18:07:00 +02:00
(bind-key "C-@" #'er/expand-region)
(bind-key "C-M-\\" #'crux-cleanup-buffer-or-region)
(bind-key "C-S-c C-S-c" #'mc/edit-lines)
(bind-key "C-Z" #'undo-tree-redo)
(bind-key "C-c C-<" #'mc/mark-all-like-this)
(bind-key "C-c C-r" #'ivy-resume)
(bind-key "C-c D" #'define-word)
(bind-key "C-c J" #'avy-goto-word-or-subword-1)
(bind-key "C-c P" #'ivy-pages)
(bind-key "C-c a" #'org-agenda)
(bind-key "C-c c" #'org-capture)
(bind-key "C-c d" #'define-word-at-point)
(bind-key "C-c e" #'crux-eval-and-replace)
(bind-key "C-c i" #'hydra-ispell/body)
(bind-key "C-c j" #'avy-goto-char-timer)
(bind-key "C-c l" #'org-store-link)
(bind-key "C-c m" #'emms-control/body)
(bind-key "C-c o" #'hydra-org-clock/body)
(bind-key "C-c s" #'synonyms)
(bind-key "C-h C-f" #'find-function)
(bind-key "C-h C-k" #'find-function-on-key)
(bind-key "C-s" #'isearch-forward)
(bind-key "M-i" #'swiper-from-isearch isearch-mode-map)
(bind-key "C-x C-d" #'dired)
(bind-key "C-x C-r" #'revert-buffer)
(bind-key "C-x g" #'db/helm-shortcuts)
2017-07-16 18:07:00 +02:00
(bind-key "C-x SPC" #'hydra-rectangle/body)
(bind-key "C-x r v" #'list-registers)
(bind-key "C-x t" #'hydra-toggle/body)
(bind-key "C-z" #'undo)
(bind-key "M-/" #'hippie-expand)
(bind-key "M-:" #'pp-eval-expression)
(bind-key "M-=" #'count-words)
(bind-key "M-SPC" #'cycle-spacing)
(bind-key "M-Z" #'zap-to-char)
(bind-key "M-g M-g" #'avy-goto-line)
(bind-key "M-g g" #'avy-goto-line)
(bind-key "M-g j b" #'dumb-jump-back)
(bind-key "M-g j g" #'dumb-jump-go)
(bind-key "M-j" #'(lambda () (interactive) (join-line -1)))
(bind-key "M-o" nil)
(bind-key "M-z" #'zap-up-to-char)
(bind-key [insert] nil)
(bind-key [kp-insert] nil)
(bind-key [remap fill-paragraph] #'endless/fill-or-unfill)
;; Overwrite certain keybindings only if packages are avilable
(when (package-installed-p 'counsel)
2017-09-15 17:53:59 +02:00
(bind-key "M-x" #'counsel-M-x) ; gets nicer sorting with smex installed
(bind-key "C-c r" #'counsel-recentf)
(bind-key "C-x C-f" #'counsel-find-file)
(bind-key "C-h f" #'counsel-describe-function)
(bind-key "C-h v" #'counsel-describe-variable)
(bind-key "C-S-s" #'counsel-grep-or-swiper))
(when (package-installed-p 'helm)
(bind-key "M-y" #'helm-show-kill-ring))
(when (package-installed-p 'crux)
(bind-key [remap kill-whole-line] #'crux-kill-whole-line)
(bind-key [remap open-line] #'crux-smart-open-line-above))
(when (package-installed-p 'ace-window)
(bind-key "C-x o" #'ace-window))
2017-07-16 18:07:00 +02:00
(when (executable-find "ag")
(bind-key "<f5>" #'counsel-ag))
2017-07-16 18:07:00 +02:00
;; Environment Variables
(unless on-windows
(with-demoted-errors "Cannot import environment variables: %s"
(exec-path-from-shell-copy-envs '("SSH_AUTH_SOCK"
"SSH_AGENT_PID"
"PATH"
"TEXMFHOME"
"PERL5LIB"
"PERL_LOCAL_LIB_ROOT"
"PERL_MB_OPT"
"PERL_MM_OPT"))))
2017-08-12 10:53:17 +02:00
;; Fixes
(with-eval-after-load 'enriched
(defun enriched-decode-display-prop (start end &optional params)
(ignore params)
(list start end)))
;; Start Server when not running already
2017-09-15 13:40:10 +02:00
(unless (server-running-p)
2017-09-15 13:40:10 +02:00
(server-start))
2017-07-16 18:07:00 +02:00
t)
(add-hook 'after-init-hook #'db/run-init)
2017-10-17 22:21:28 +02:00
;; * Personal customization
2017-07-16 18:07:00 +02:00
(defgroup personal-settings nil
"A bunch of functions and variables for personalizing emacs."
:prefix "db/"
:group 'convenience
:group 'help
:tag "Personal settings")
2017-07-16 18:07:00 +02:00
(defcustom db/additional-mail-addresses nil
"List of additional email addresses (apart from `user-mail-address)."
2017-11-14 15:53:25 +01:00
:group 'personal-settings
:type '(repeat string))
2017-11-14 15:53:25 +01:00
(defcustom db/jabber-id ""
"Personal XMPP ID."
:group 'personal-settings
:type 'string)
2017-10-17 22:21:28 +02:00
;; * Builtin Variables
(setq custom-file
(expand-file-name "private/custom.el" emacs-d))
2017-07-16 18:07:00 +02:00
(use-package cl-lib)
(use-package subr-x)
2017-07-16 18:07:00 +02:00
(use-package warnings
:config (cl-pushnew '(undo discard-info) warning-suppress-types
:test #'equal))
(set-default-coding-systems 'utf-8)
(prefer-coding-system 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(setq buffer-file-coding-system 'utf-8)
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING))
(setq inhibit-startup-message t
initial-scratch-message nil
initial-major-mode 'fundamental-mode
2017-07-16 18:07:00 +02:00
ring-bell-function #'ignore
garbage-collection-messages nil
load-prefer-newer nil) ; t breaks `org-reload'
(fset 'yes-or-no-p 'y-or-n-p)
(setq-default fill-column 80)
(setq-default indent-tabs-mode nil)
(setq frame-title-format "emacs")
(setq select-enable-clipboard t
select-enable-primary t
save-interprogram-paste-before-kill t
mouse-yank-at-point t
require-final-newline nil
sentence-end-double-space t
recenter-positions '(top middle bottom)
scroll-conservatively 10
message-log-max t
inhibit-eol-conversion nil
tab-always-indent 'complete
enable-recursive-minibuffers t
set-mark-command-repeat-pop t
2018-02-22 16:28:44 +01:00
large-file-warning-threshold 10000000
2017-07-16 18:07:00 +02:00
echo-keystrokes 0.1
delete-by-moving-to-trash t
delete-trailing-lines nil
x-underline-at-descent-line t
search-whitespace-regexp "[ \t\r\n]+"
visual-line-fringe-indicators '(left-curly-arrow right-curly-arrow))
2017-07-16 18:07:00 +02:00
(when on-windows
;; treat memory for display time ... but hey, this is Windows, memory doesnt
;; matter!
(setq inhibit-compacting-font-caches t))
2017-07-16 18:07:00 +02:00
(setq-default cursor-type 'bar)
2017-07-27 13:08:05 +02:00
(setq visual-line-fringe-indicators '(left-curly-arrow right-curly-arrow))
2017-07-16 18:07:00 +02:00
;; don't let the cursor go into minibuffer prompt
(setq minibuffer-prompt-properties '(read-only t
face minibuffer-prompt
cursor-intangible t))
;; Make M-v undo C-v
(setq scroll-preserve-screen-position 'always)
;; Backups and Autosave
(defvar backup-dir (expand-file-name "ebackup/" emacs-d))
(defvar autosave-dir (expand-file-name "eautosave/" emacs-d))
(setq make-backup-files t
backup-directory-alist (list (cons ".*" backup-dir))
auto-save-list-file-prefix autosave-dir
auto-save-file-name-transforms `((".*" ,autosave-dir t))
version-control t
kept-old-versions 2
kept-new-versions 4
delete-old-versions t
vc-make-backup-files t)
(setq-default async-shell-command-buffer 'new-buffer)
(add-to-list 'display-buffer-alist
'("^\*Async Shell Command*" . (display-buffer-no-window)))
(put 'set-goal-column 'disabled nil)
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)
(put 'narrow-to-region 'disabled nil)
(use-package calendar
:init
(setq calendar-date-style 'iso
calendar-bahai-all-holidays-flag nil
calendar-chinese-all-holidays-flag nil
calendar-christian-all-holidays-flag t
calendar-islamic-all-holidays-flag nil
calendar-hebrew-all-holidays-flag nil
holiday-other-holidays '((holiday-fixed 5 1 "Labour Day")
(holiday-fixed 10 3 "German Unity Day")
(holiday-fixed 10 31 "Reformation Day")
(holiday-float 11 3 -1 "Day of Repentance and Prayer" 22))
diary-show-holidays-flag t
calendar-view-holidays-initially-flag t))
2017-07-16 18:07:00 +02:00
(setq-default font-lock-maximum-decoration '((t . t)))
(setq-default savehist-file (expand-file-name "savehist" emacs-d))
(use-package tramp
:config (setq tramp-save-ad-hoc-proxies t))
2017-07-16 18:07:00 +02:00
(use-package re-builder
:commands (re-builder)
:config (setq reb-re-syntax 'string))
2017-07-16 18:07:00 +02:00
(setq lisp-indent-function #'lisp-indent-function)
2017-07-16 18:07:00 +02:00
(setq custom-theme-directory (expand-file-name "themes/" emacs-d))
;; https://florian.adamsky.it/2016/03/31/emacs-calc-for-programmers-and-cs.html
(setq math-additional-units
'((bit nil "Bit")
(byte "8 * bit" "Byte")
(bps "bit / s" "Bit per second"))
math-units-table nil)
(setq default-input-method "TeX")
(setq browse-url-browser-function 'browse-url-generic
browse-url-generic-program "firefox")
2017-07-16 18:07:00 +02:00
;; * Basic Builtin Packages
(use-package misc
:commands (zap-up-to-char zap-to-char))
(use-package grep
:commands (rgrep zrgrep)
:config (progn
(bind-key "C-x C-q" #'wgrep-change-to-wgrep-mode grep-mode-map)
(bind-key "C-c C-c" #'wgrep-finish-edit grep-mode-map)))
(use-package winner
:commands (winner-mode winner-undo winner-redo))
(use-package abbrev
2017-10-02 18:09:32 +02:00
:commands (quietly-read-abbrev-file)
:init (progn
(setq-default abbrev-mode t)
(setq save-abbrevs 'silently))
2017-07-16 18:07:00 +02:00
:diminish abbrev-mode)
(use-package appt
:commands (appt-activate)
:init (setq appt-display-mode-line nil))
2017-07-16 18:07:00 +02:00
(use-package ediff
2017-09-24 12:34:59 +02:00
:defer t
:init (setq ediff-diff-options "-w"
ediff-window-setup-function 'ediff-setup-windows-plain
ediff-split-window-function 'split-window-horizontally)
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'ediff-keymap-setup-hook
'(lambda ()
(bind-key "j" #'ediff-next-difference ediff-mode-map)
(bind-key "k" #'ediff-previous-difference ediff-mode-map)))
2017-07-16 18:07:00 +02:00
(add-hook 'ediff-after-quit-hook-internal 'winner-undo)))
(use-package ispell
:commands (ispell-change-directory
hydra-ispell/body)
:init (setq ispell-dictionary "en_US"
ispell-really-hunspell t)
:config (defhydra hydra-ispell (:color blue)
"ispell"
("g" (lambda ()
(interactive)
(setq ispell-dictionary "de_DE")
(ispell-change-dictionary "de_DE"))
"german")
("e" (lambda ()
(interactive)
(setq ispell-dictionary "en_US")
(ispell-change-dictionary "en_US"))
"english")))
2017-07-16 18:07:00 +02:00
(use-package mailcap
2017-09-24 12:34:59 +02:00
:defer t
2017-07-16 18:07:00 +02:00
:config (progn
2017-11-11 17:43:27 +01:00
;; Remove doc-view so pdf will open with default viewer
2017-07-16 18:07:00 +02:00
(setcdr
(assoc "application" mailcap-mime-data)
(remove '("pdf"
(viewer . doc-view-mode)
(type . "application/pdf")
(test eq window-system 'x))
(cdr (assoc "application" mailcap-mime-data))))))
(use-package quail
:defer t
:config (add-hook 'input-method-activate-hook
#'db/add-symbols-to-TeX-input-method))
(defun db/add-symbols-to-TeX-input-method ()
"Add some new symbols to TeX input method."
(when (string= current-input-method "TeX")
(let ((quail-current-package (assoc "TeX" quail-package-alist)))
(quail-define-rules
((append . t))
("\\land" ?∧)
("\\lor" ?)
("\\lnot" )
("\\implies" ?⇒)
("\\powerset" ?𝔓)
("\\mathbbK" ?𝕂)
("\\mathbbR" ?)
("\\mathbbN" ?)
("\\mathbbZ" ?)
("\\mathbbP" ?)
("\\mathcalA" ?𝒜)
("\\mathcalB" ?)
("\\mathcalC" ?𝒞)
("\\mathcalD" ?𝒟)
("\\mathcalE" ?)
("\\mathcalH" ?)
("\\mathcalI" ?)
("\\mathcalJ" ?𝒥)
("\\mathcalK" ?𝒦)
("\\mathcalL" ?)
("\\mathcalM" ?)
("\\mathcalR" ?)
("\\mathcalQ" ?𝒬)
("\\mathcalS" ?𝒮)
("\\mathfrakP" ?𝔓)))))
2017-07-16 18:07:00 +02:00
(use-package server
:commands (server-running-p server-start))
(use-package rect
:commands (hydra-rectangle/body)
:config
(defhydra hydra-rectangle (:body-pre (rectangle-mark-mode 1)
:color pink
:post (deactivate-mark))
"
^_k_^ _d_elete _s_tring
_h_ _l_ _o_k _y_ank
^_j_^ _n_ew-copy _r_eset
^^^^ _e_xchange _u_ndo
^^^^ ^ ^ _p_aste
"
("h" backward-char nil)
("l" forward-char nil)
("k" previous-line nil)
("j" next-line nil)
("n" copy-rectangle-as-kill nil)
("d" delete-rectangle nil)
("r" (if (region-active-p)
(deactivate-mark)
(rectangle-mark-mode 1))
nil)
("y" yank-rectangle nil)
("u" undo nil)
("s" string-rectangle nil)
("p" kill-rectangle nil)
("e" rectangle-exchange-point-and-mark nil)
("o" nil nil)))
2017-07-16 18:07:00 +02:00
2017-10-21 09:08:15 +02:00
;; * Some essential packages
2017-07-16 18:07:00 +02:00
(use-package db-utils
:commands (endless/fill-or-unfill
db/delete-trailing-whitespace-maybe
db/go-dark
db/go-light
db/show-current-org-task
db/run-or-hide-shell
db/run-or-hide-eshell
db/run-or-hide-ansi-term
db/helm-shortcuts
db/hex-to-ascii
conditionally-enable-lispy
db/export-diary))
2017-07-16 18:07:00 +02:00
(use-package db-emacsclient)
2017-07-16 18:07:00 +02:00
(use-package hydra
:commands (defhydra
hydra-toggle/body
hydra-zoom/body)
:config
(defhydra hydra-toggle (:color blue)
"toggle"
("c" column-number-mode "column")
("d" toggle-debug-on-error "debug-on-error")
("e" toggle-debug-on-error "debug-on-error")
("f" auto-fill-mode "auto-fill")
("l" toggle-truncate-lines "truncate lines")
("q" toggle-debug-on-quit "debug-on-quit")
("r" read-only-mode "read-only"))
;; zooming with single keystrokes (from oremacs)
(defhydra hydra-zoom (:color red)
"zoom"
("g" text-scale-increase "increase")
("l" text-scale-decrease "decrease")))
2017-07-16 18:07:00 +02:00
(use-package magit
:commands (magit-status)
:init (setq magit-diff-refine-hunk t
magit-commit-show-diff nil
magit-popup-use-prefix-argument 'default
magit-completing-read-function 'ivy-completing-read)
2017-07-16 18:07:00 +02:00
:config (progn
2018-09-09 12:14:56 +02:00
(global-magit-file-mode -1)
(with-demoted-errors "Non-Fatal Error: %s"
(eval-when-compile
(require 'projectile))
(setq magit-repository-directories
(mapcar
(lambda (dir)
(cons (substring dir 0 -1) 0))
(cl-remove-if-not
(lambda (project)
(unless (file-remote-p project)
(file-exists-p (concat project "/.git"))))
projectile-known-projects))))))
2017-07-16 18:07:00 +02:00
(use-package projectile
:commands (projectile-mode)
2017-08-12 00:18:42 +02:00
:defines (projectile-known-projects)
:bind (:map projectile-mode-map ("C-c p" . projectile-command-map))
:init (setq projectile-switch-project-action 'projectile-dired
projectile-completion-system 'ivy
projectile-ignored-project-function #'file-remote-p
projectile-create-missing-test-files t)
:config (projectile-cleanup-known-projects)
2017-07-16 18:07:00 +02:00
:diminish projectile-mode)
2017-08-04 16:00:04 +02:00
(use-package counsel-projectile
:commands counsel-projectile)
(use-package exec-path-from-shell
:commands (exec-path-from-shell-copy-envs))
2017-07-16 18:07:00 +02:00
;; * Org
(use-package db-org
:commands (db/find-parent-task
db/ensure-running-clock
db/save-current-org-task-to-file))
(use-package org
:commands (org-agenda
org-capture
org-store-link
hydra-org-clock/body)
2018-11-03 09:45:00 +01:00
:bind (:map org-mode-map
([remap org-return] . org-return-indent))
:config (progn
(require 'db-org)
;; avoid important buffers to end up in `org-agenda-new-buffers by
;; opening them manually
(mapc #'find-file-noselect org-agenda-files)
(unless (memq #'org-clock-save
(mapcar #'timer--function timer-list))
(run-with-timer 0 3600 #'org-clock-save))
(unless (memq #'db/export-diary
(mapcar #'timer--function timer-idle-list))
(run-with-idle-timer 20 t #'db/export-diary))))
;; Default Tasks for Working, Home, Breaks
(defcustom org-working-task-id ""
"Task ID of default working task."
:group 'personal-settings
:type 'string)
(defcustom org-break-task-id ""
"Task ID of default break task."
:group 'personal-settings
:type 'string)
(defcustom org-home-task-id ""
"Task ID of default home task."
:group 'personal-settings
:type 'string)
(defcustom db/org-clock-current-task-file "~/.org-current-task"
"File to save the currently clocked in task to."
:group 'personal-settings
:type 'string)
(use-package org-clock
:init (setq org-clock-history-length 23
org-clock-in-resume t
org-clock-into-drawer t
org-clock-idle-time nil
org-clock-out-remove-zero-time-clocks t
org-clock-out-when-done '("DONE" "CANC" "WAIT" "HOLD")
org-clock-auto-clock-resolution 'when-no-clock-is-running
org-clock-mode-line-total 'auto
org-clock-report-include-clocking-task t
org-clock-in-switch-to-state (lambda (_)
(when (not
(and (boundp 'org-capture-mode)
org-capture-mode))
(cond
((member (org-get-todo-state)
(list "TODO" "READ"))
"CONT")
((member (org-get-todo-state)
(list "GOTO"))
"ATTN"))))
org-clock-persist t
org-clock-persist-query-resume nil
org-duration-format 'h:mm
org-time-stamp-rounding-minutes '(1 1))
:config (progn
(org-clock-persistence-insinuate)
(add-hook 'org-clock-in-hook ; mark current default task
(lambda ()
(let ((current-id (org-id-get org-clock-marker)))
(when (member current-id (list org-working-task-id
org-home-task-id))
(org-clock-mark-default-task)))))
;; Clock in default task if no other task is given
(add-hook 'org-clock-out-hook #'db/ensure-running-clock 'append)
;; Communicate the currently clocked in task to the outside world
(add-hook 'org-clock-in-hook #'db/save-current-org-task-to-file)))
(use-package ox-icalendar
:commands (org-icalendar-combine-agenda-files)
:init (setq org-icalendar-include-body nil
org-icalendar-store-UID t
org-icalendar-use-deadline nil
org-icalendar-use-scheduled nil
org-icalendar-include-todo nil
org-icalendar-exclude-tags '("NO_EXPORT")))
(use-package ox
:defer t
:init (setq org-export-with-broken-links 'mark
org-export-with-sub-superscripts '{}
org-export-with-author nil
org-export-with-date nil
org-export-with-toc nil
org-export-with-archived-trees nil
org-export-with-tags t
org-export-with-priority nil
org-export-with-creator nil
org-export-with-entities t
org-export-with-special-strings t
org-export-with-todo-keywords nil
org-export-exclude-tags '("NO_EXPORT"))
:config (with-demoted-errors "Cannot load package: %s"
(require 'ox-md)
(require 'ox-pandoc)))
(use-package ox-latex
:defer t
:config (progn
(setq org-latex-default-class "scrartcl"
org-latex-listings t
org-latex-compiler "lualatex")
(add-to-list 'org-latex-classes
`("scrartcl"
,(concat "\\documentclass[parskip=half,colorlinks]{scrartcl}\n"
"[DEFAULT-PACKAGES]"
"[PACKAGES]"
"
\\lstset{
basewidth=0.5em,
keywordstyle=\\textcolor{blue!80!white},
basicstyle=\\ttfamily,
commentstyle={\\itshape},
frame=tb,
showspaces=false,
showtabs=false,
showstringspaces=false,
}
"
"[EXTRA]\n")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
(add-to-list 'org-latex-classes
`("beamer"
,(concat "\\documentclass[presentation]{beamer}\n"
"[DEFAULT-PACKAGES]"
"[PACKAGES]"
"
\\lstset{
basewidth=0.5em,
keywordstyle=\\textcolor{blue!80!white},
basicstyle=\\ttfamily,
commentstyle={\\itshape},
frame=tb,
showspaces=false,
showtabs=false,
showstringspaces=false,
}
"
"[EXTRA]\n")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
(add-to-list 'org-latex-packages-alist
'("" "listings"))
(add-to-list 'org-latex-packages-alist
'("" "xcolor"))))
(use-package ox-html
:defer t
:init (setq org-html-postamble nil))
2017-07-16 18:07:00 +02:00
;; * Mail
(use-package bbdb
:commands (bbdb-search-name bbab-initialize bbdb-mua-auto-update-init bbdb-save)
:init (setq bbdb-completion-display-record nil
bbdb-complete-mail-allow-cycling t
bbdb-mua-auto-update-p 'query
bbdb-default-country "Germany"
bbdb-user-mail-address-re (regexp-opt
(cons user-mail-address
db/additional-mail-addresses)))
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'message-setup-hook 'bbdb-mail-aliases)
(add-hook 'mail-setup-hook 'bbdb-mail-aliases)
(run-with-timer 0 3600 #'bbdb-save)))
2017-07-16 18:07:00 +02:00
(use-package gnus
:defines (gnus-init-file)
:commands (gnus)
:init (setq gnus-init-file (expand-file-name "gnus.el" emacs-d)
gnus-home-directory (expand-file-name "~/Mail/news/")
gnus-directory (expand-file-name "~/Mail/news/")
gnus-kill-files-directory gnus-directory
gnus-startup-file (expand-file-name "~/Mail/gnus-newsrc")
gnus-cache-directory (expand-file-name "cache/" gnus-directory))
2017-07-16 18:07:00 +02:00
:config (progn
(eval-when-compile
(require 'gnus-start))
2017-07-16 18:07:00 +02:00
(bbdb-initialize 'gnus 'message)
(bbdb-mua-auto-update-init 'message)))
2017-07-16 18:07:00 +02:00
;; * Crypto
(use-package nsm
2017-09-24 12:34:59 +02:00
:defer t
:init (setq network-security-level 'high
nsm-save-host-names t)
:config (advice-add 'nsm-write-settings
:before #'db/sort-nsm-permanent-settings))
2017-07-16 18:07:00 +02:00
(defun db/sort-nsm-permanent-settings ()
"Sort values in `nsm-permanent-host-settings."
(setq nsm-permanent-host-settings
(cl-sort nsm-permanent-host-settings
#'string<
:key #'second)))
2017-07-16 18:07:00 +02:00
(use-package gnutls
2017-09-24 12:34:59 +02:00
:defer t
:init (setq gnutls-log-level 0 ; too noisy otherwise
gnutls-min-prime-bits 1024
gnutls-verify-error t))
2017-07-16 18:07:00 +02:00
(defun db/update-cert-file-directory (symbol new-value)
"Set SYMBOL to NEW-VALUE and add all certificate in it to `gnutls-trustfiles.
Assumes that NEW-VALUE points to a directory, and certificates
are assumed to be of the form *.crt."
(set symbol new-value)
(when (file-directory-p new-value)
(dolist (cert-file (directory-files new-value t ".crt$"))
(add-to-list 'gnutls-trustfiles cert-file))))
(defcustom db/cert-file-directory "~/.local/etc/certs/"
"Local directory with additional certificates."
:group 'personal-settings
:type 'string
:set #'db/update-cert-file-directory)
2017-07-16 18:07:00 +02:00
(use-package epg
2017-09-24 12:34:59 +02:00
:defer t
:init (setq epg-debug t
epg-gpg-program "gpg"))
2017-07-16 18:07:00 +02:00
;; * Appearance
(use-package solarized-theme
2017-09-24 12:34:59 +02:00
:defer t
2017-07-16 18:07:00 +02:00
:init (setq solarized-use-less-bold t
solarized-emphasize-indicators t
solarized-use-variable-pitch nil))
(use-package smart-mode-line
:init (setq sml/mode-width 'full
sml/name-width 30
sml/theme 'respectful)
:commands (sml/setup))
2017-07-16 18:07:00 +02:00
;; * Dired
(use-package dired
2017-09-24 12:34:59 +02:00
:defer t
:bind (:map dired-mode-map
("e" . ora-ediff-files)
("z" . dired-get-size)
([remap beginning-of-buffer] . dired-back-to-top)
([remap end-of-buffer] . dired-jump-to-bottom)
("<f1>" . nil))
:init (progn
(setq dired-dwim-target t
dired-listing-switches "-alh"
dired-hide-details-hide-information-lines t
dired-hide-details-hide-symlink-targets t
dired-recursive-copies 'top
dired-recursive-deletes 'top
;; Dont use obsolete diredx local variables
dired-enable-local-variables nil
dired-local-variables-file nil
dired-omit-files "^\\.?#\\|^\\.$\\|^\\.\\.$\\|^\\..*$"
diredp-hide-details-initially-flag t)
(if on-windows
(setq dired-guess-shell-alist-user '((".*" "cmd /c")))
(setq dired-guess-shell-alist-user
'(("\\.pdf\\'" "evince")
("\\.ps\\'" "evince")
("\\.\\(?:djvu\\|eps\\)\\'" "evince")
("\\.\\(?:jpg\\|jpeg\\|png\\|gif\\|xpm\\)\\'" "eog")
("\\.\\(?:xcf\\)\\'" "gimp")
("\\.\\(?:mp4\\|mkv\\|avi\\|flv\\|ogv\\|webm\\)\\(?:\\.part\\)?\\'"
"vlc")
("\\.\\(?:mp3\\|flac\\|ogg\\)\\'" "mplayer")
("\\.html?\\'" "firefox")
("\\.docx?\\'" "loffice"))))
(when on-windows
(setq directory-free-space-program nil)))
2017-07-16 18:07:00 +02:00
:config (progn
(put 'dired-find-alternate-file 'disabled nil)
(require 'dired-x)
(with-demoted-errors "Non-Fatal Error: %s"
(require 'dired+)
(when (and (eq system-type 'windows-nt)
(not (package-installed-p 'w32-browser)))
(warn "`w32-browser not installed, dired will have reduced functionality."))
(when (and (require 'dired-open)
(eq system-type 'gnu/linux))
(bind-key "M-RET" #'dired-open-xdg dired-mode-map)))
2017-07-16 18:07:00 +02:00
2017-07-23 11:01:54 +02:00
;; Gnus support in dired
(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
2017-07-16 18:07:00 +02:00
;; omitting files
(add-hook 'dired-mode-hook 'dired-omit-mode)
2017-08-06 22:03:37 +02:00
(dolist (extension '(".out" ".synctex.gz" ".thm"))
(add-to-list 'dired-latex-unclean-extensions extension))
2017-07-16 18:07:00 +02:00
;; disable exaggerated fontification of dired+
(require 'font-lock)
2017-07-16 18:07:00 +02:00
(add-to-list 'font-lock-maximum-decoration '(wdired-mode . 1))
(add-to-list 'font-lock-maximum-decoration '(dired-mode . 1))
(defun ora-ediff-files ()
"Compare marked files in dired with ediff."
;; from: https://oremacs.com/2017/03/18/dired-ediff/
(interactive)
(lexical-let ((files (dired-get-marked-files))
(wnd (current-window-configuration)))
(if (<= (length files) 2)
(lexical-let ((file1 (car files))
(file2 (if (cdr files)
(cadr files)
(read-file-name
"file: "
(dired-dwim-target-directory)))))
(if (file-newer-than-file-p file1 file2)
(ediff-files file2 file1)
(ediff-files file1 file2))
(add-hook 'ediff-after-quit-hook-internal
(lambda ()
(setq ediff-after-quit-hook-internal nil)
(set-window-configuration wnd))))
(error "No more than 2 files should be marked"))))
(defun dired-back-to-top ()
"Jump to first non-trivial line in dired."
(interactive)
(goto-char (point-min))
(dired-next-line 1))
(defun dired-jump-to-bottom ()
"Jump to last non-trivial line in dired."
(interactive)
(goto-char (point-max))
(dired-next-line -1))
(defun dired-get-size () ; from emacswiki, via oremacs
"Print size of all files marked in the current dired buffer."
(interactive)
(let ((files (dired-get-marked-files)))
(with-temp-buffer
(apply 'call-process "/usr/bin/du" nil t nil "-sch" files)
(message
"size of all marked files: %s"
(progn
(re-search-backward "\\(^[0-9.,]+[a-za-z]+\\).*total$")
(match-string 1))))))))
2017-07-16 18:07:00 +02:00
(use-package find-dired
:commands (find-dired)
:init (setq find-ls-option '("-print0 | xargs -0 ls -ld" . "-ld")))
2017-07-16 18:07:00 +02:00
2018-08-09 21:34:03 +02:00
(use-package dired-open
:config (add-to-list 'dired-open-functions #'dired-open-guess-shell-alist))
(use-package gnus-dired
:commands (turn-on-gnus-dired-mode))
2017-07-16 18:07:00 +02:00
;; * Completion
(use-package hippie-exp
:commands (hippie-expand))
(use-package helm-config
:init (setq helm-command-prefix-key "C-c h"))
(use-package helm
:commands (helm-show-kill-ring
helm-org-agenda-files-headings)
2017-07-16 18:07:00 +02:00
:diminish helm-mode
:bind (:map helm-command-map
("#" . helm-emms)
("P" . helm-pages))
:init (setq helm-input-idle-delay 0.0
helm-buffers-fuzzy-matching t
helm-mode-fuzzy-match t
helm-autoresize-min-height 20
helm-ff-auto-update-initial-value t
helm-ff-file-name-history-use-recentf t
helm-ff-search-library-in-sexp t
helm-ff-skip-boring-files nil
helm-split-window-inside-p t
helm-move-to-line-cycle-in-source nil
helm-scroll-amount nil
helm-locate-command nil
helm-candidate-number-limit 100
helm-follow-mode-persistent t
helm-buffer-details-flag t
helm-buffer-skip-remote-checking t
helm-mini-default-sources '(helm-source-buffers-list
helm-source-recentf
db/helm-frequently-used-features
db/helm-frequently-visited-locations
helm-source-buffer-not-found
helm-source-bookmarks
helm-source-bookmark-set))
2017-07-16 18:07:00 +02:00
:config (progn
(eval-when-compile
(require 'helm-mode)
(require 'helm-buffers)
(require 'helm-ring)
(require 'helm-org))
(bind-key "<tab>" #'helm-execute-persistent-action helm-map)
(bind-key "C-i" #'helm-execute-persistent-action helm-map)
(bind-key "C-z" #'helm-select-action helm-map)
2017-07-16 18:07:00 +02:00
;; Add action to clock in at current heading to
;; `helm-org-agenda-files-headings
(defun helm-org--clock-in-at-heading (marker)
"Clock in to current heading at MARKER."
(org-with-point-at marker
(org-clock-in)))
(defun helm-org-clock-in-at-heading ()
(interactive)
(with-helm-alive-p
(helm-exit-and-execute-action 'helm-org--clock-in-at-heading)))
(add-to-list 'helm-org-headings-actions
'("Clock in to this heading"
. helm-org--clock-in-at-heading)
t)
(bind-key "C-c c" #'helm-org-clock-in-at-heading helm-org-headings-map)))
2017-07-16 18:07:00 +02:00
(use-package ivy
:commands (ivy-mode
2017-08-12 00:18:42 +02:00
ivy-resume)
2017-07-16 18:07:00 +02:00
:diminish ivy-mode
:init (setq ivy-use-virtual-buffers t
enable-recursive-minibuffers t
ivy-magic-tilde nil
ivy-count-format "(%d/%d) "
ivy-format-function #'(lambda (cands)
(ivy--format-function-generic
(lambda (str)
(concat "" str))
(lambda (str)
(concat " " str))
cands
"\n"))
ivy-initial-inputs-alist '((counsel-describe-function . "^")
(counsel-describe-variable . "^")
(man . "^")
(woman . "^")))
:config (add-to-list 'ivy-completing-read-handlers-alist
'(org-capture . completing-read-default)))
2017-07-16 18:07:00 +02:00
(use-package counsel
:commands (counsel-org-goto-all
counsel-ag
counsel-M-x
counsel-find-file
counsel-info-lookup-symbol
counsel-unicode-char
counsel-describe-variable
2017-08-12 00:18:42 +02:00
counsel-describe-function
counsel-recentf))
2017-07-16 18:07:00 +02:00
(use-package swiper
:commands (swiper
swiper-from-isearch))
2017-07-16 18:07:00 +02:00
(use-package recentf
:commands (recentf-mode recentf-save-list)
:init (setq recentf-max-saved-items 1000)
:config (run-with-timer 0 3600 #'recentf-save-list))
2017-07-16 18:07:00 +02:00
(use-package company
2018-08-04 12:32:29 +02:00
:commands (company-mode global-company-mode)
:init (setq company-show-numbers t))
2017-07-16 18:07:00 +02:00
;; * Navigation
(use-package ace-window
:commands (ace-window ace-window-display-mode)
:config (setq aw-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l)
aw-background nil
aw-leading-char-style 'char
aw-scope 'frame))
2017-11-11 17:43:27 +01:00
2017-07-16 18:07:00 +02:00
(use-package avy
:commands (avy-goto-char-timer
avy-goto-word-or-subword-1
avy-goto-line))
(use-package dumb-jump
:commands (dumb-jump-go-other-window
dumb-jump-go
dumb-jump-back
dumb-jump-quick-look
dumb-jump-go-prefer-external
dumb-jump-go-prefer-external-other-window)
:config (setq dumb-jump-selector 'helm))
2018-08-04 12:32:43 +02:00
(use-package helm-pages
:commands (helm-pages))
2018-08-04 12:32:43 +02:00
2018-11-02 20:57:34 +01:00
(use-package eyebrowse
:commands (eyebrowse-mode)
:init (setq eyebrowse-keymap-prefix (kbd "C-c w")))
2018-11-02 20:57:34 +01:00
2017-07-16 18:07:00 +02:00
;; * Media
2017-07-16 18:07:00 +02:00
(use-package emms-source-file
2018-01-28 11:08:40 +01:00
:config (require 'db-emms))
2017-07-16 18:07:00 +02:00
(use-package db-emms
:commands (db/play-playlist
emms-control/body))
2017-07-16 18:07:00 +02:00
(use-package helm-emms
:commands (helm-emms)
:init (setq helm-emms-use-track-description-function t
helm-emms-default-sources '(helm-source-emms-streams
helm-source-emms-dired
helm-source-emms-files))
:config (progn
(require 'db-emms)
(require 'helm-adaptive)))
2017-07-16 18:07:00 +02:00
;; * Shells and such
(use-package comint
2017-09-24 12:34:59 +02:00
:defer t
:init (setq comint-scroll-to-bottom-on-input t
comint-scroll-to-bottom-on-output nil
comint-scroll-show-maximum-output t
comint-completion-addsuffix t
comint-buffer-maximum-size 100000
comint-input-ring-size 5000))
2017-07-16 18:07:00 +02:00
(use-package term
:commands (term-send-string)
:init (setq explicit-shell-file-name shell-file-name)
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'term-exec-hook ; oremacs.com
(lambda ()
(let* ((buff (current-buffer))
(proc (get-buffer-process buff)))
(set-process-sentinel
proc
`(lambda (process event)
(if (string= event "finished\n")
(kill-buffer ,buff)))))))
;; does not work; C-c is shadowed by some minor modes like semantic,
;; projectile, and winner
(bind-key "C-c" #'term-send-raw term-raw-map)
2017-07-16 18:07:00 +02:00
;; unbind some keys to allow the global keymap to handle them
(unbind-key "M-:" term-raw-map)
(unbind-key "C-h" term-raw-map)
(unbind-key "M-x" term-raw-map)
(unbind-key "M-o" term-raw-map)
;; we need to set keys starting with C-x after `ansi-term' has been
;; called, as it resets the escape character to C-x.
(defadvice ansi-term (after ansi-term-set-keys activate)
(unbind-key "C-x C-j" term-raw-map)
(unbind-key "C-x g" term-raw-map))
(add-hook 'term-mode-hook (lambda () (yas-minor-mode -1)))))
2017-07-16 18:07:00 +02:00
;; http://endlessparentheses.com/ansi-colors-in-the-compilation-buffer-output.html
(defun endless/colorize-compilation ()
"Colorize from `compilation-filter-start' to `point'."
(let ((inhibit-read-only t))
(ansi-color-apply-on-region compilation-filter-start (point))))
2017-07-16 18:07:00 +02:00
(use-package ansi-color
:commands (ansi-color-for-comint-mode-on
2018-01-27 17:50:27 +01:00
ansi-color-apply-on-region)
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'compilation-filter-hook 'endless/colorize-compilation)))
2017-07-16 18:07:00 +02:00
(use-package shell
:commands (shell)
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
(add-hook 'comint-output-filter-functions 'comint-strip-ctrl-m)
(add-hook 'shell-mode-hook 'with-editor-export-editor)))
2017-07-16 18:07:00 +02:00
(use-package eshell
:commands (eshell)
:config (require 'db-eshell))
2017-07-16 18:07:00 +02:00
(use-package with-editor
:commands (with-editor-export-editor))
2017-07-16 18:07:00 +02:00
;; * Lisp
;; General Stuff first
(use-package lispy
:commands (lispy-mode)
:diminish lispy-mode)
2017-07-16 18:07:00 +02:00
(use-package eldoc
:commands (eldoc-mode)
:diminish eldoc-mode)
;; Lisp Dialects
(use-package elisp-mode
2017-09-24 12:34:59 +02:00
:defer t
:config (progn
(add-hook 'emacs-lisp-mode-hook 'lispy-mode)
(add-hook 'emacs-lisp-mode-hook 'db/add-use-package-to-imenu)
(add-hook 'ielm-mode-hook 'eldoc-mode)
(add-hook 'emacs-lisp-mode-hook 'eldoc-mode)))
(defun db/add-use-package-to-imenu ()
"Add `use-package statements to `imenu-generic-expression."
(add-to-list 'imenu-generic-expression
'("Used Packages"
"\\(^\\s-*(use-package +\\)\\(\\_<.+\\_>\\)"
2)))
2017-07-16 18:07:00 +02:00
(use-package geiser
:commands (geiser-mode))
(use-package cider
:commands (cider-jack-in)
:init (setq nrepl-hide-special-buffers t
cider-auto-select-error-buffer t
cider-stacktrace-default-filters '(tooling dup)
cider-stacktrace-fill-column 80
cider-save-file-on-load nil
cider-repl-result-prefix ";; => "
cider-repl-use-clojure-font-lock t
cider-repl-wrap-history t
cider-repl-history-size 1000
;;cider-lein-parameters "trampoline repl :headless"
cider-lein-parameters "repl :headless"
cider-repl-history-file (expand-file-name ".cider-history" emacs-d)
cider-repl-display-help-banner nil
cider-cljs-lein-repl "(cemerick.piggieback/cljs-repl (cljs.repl.rhino/repl-env))")
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'cider-repl-mode-hook 'subword-mode)
(add-hook 'cider-repl-mode-hook 'lispy-mode)
(add-hook 'cider-repl-mode-hook 'cider-repl-toggle-pretty-printing)
(add-hook 'cider-repl-mode-hook 'company-mode)
(add-hook 'cider-mode-hook 'eldoc-mode)))
2017-07-16 18:07:00 +02:00
(use-package clojure-mode
:defer t
:config (progn
(define-clojure-indent
(forall 'defun)
(exists 'defun)
(dopar 'defun))
(add-hook 'clojure-mode-hook 'lispy-mode)
(add-hook 'clojure-mode-hook 'clj-refactor-mode)
(add-hook 'clojure-mode-hook 'yas-minor-mode)
(add-hook 'clojure-mode-hook 'company-mode)))
2017-07-16 18:07:00 +02:00
(use-package clj-refactor
:commands (clj-refactor-mode)
:config (progn
(cljr-add-keybindings-with-prefix "C-c C-m")
(setq cljr-eagerly-build-asts-on-startup nil
cljr-warn-on-eval nil)))
(use-package slime
:commands (slime slime-mode slime-connect)
:init (progn
(setq inferior-lisp-program "sbcl --noinform --no-linedit"
slime-compile-file-options '(:fasl-directory "/tmp/slime-fasls/")
slime-net-coding-system 'utf-8-unix
slime-completion-at-point-functions 'slime-fuzzy-complete-symbol
slime-lisp-implementations '((sbcl ("sbcl") :coding-system utf-8-unix)
(cmucl ("cmucl") :coding-system utf-8-unix)
(ccl ("ccl") :coding-system utf-8-unix))
slime-repl-history-remove-duplicates t
slime-repl-history-trim-whitespaces t)
2017-07-16 18:07:00 +02:00
(add-hook 'lisp-mode-hook '(lambda () (slime-mode +1)) t))
:config (progn
(make-directory "/tmp/slime-fasls/" t)
(slime-setup '(slime-repl slime-fancy slime-autodoc))
(add-hook 'slime-mode-hook 'slime-redirect-inferior-output)))
2017-07-16 18:07:00 +02:00
(use-package hy-mode
:commands (hy-mode)
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'hy-mode-hook 'lispy-mode)
(add-hook 'hy-mode-hook 'inferior-lisp)))
2017-07-16 18:07:00 +02:00
;; * TeX
(use-package reftex
:commands (turn-on-reftex)
:config (progn
(with-eval-after-load 'helm-mode
(add-to-list 'helm-completing-read-handlers-alist
'(reftex-citation . nil)))
(setq reftex-plug-into-AUCTeX t)))
2017-07-16 18:07:00 +02:00
(use-package tex
:defer t
:config (require 'db-latex))
2017-07-16 18:07:00 +02:00
(use-package ebib
:commands (ebib))
(use-package helm-bibtex
:commands (helm-bibtex))
2017-07-16 18:07:00 +02:00
;; * Various Mode Configurations
;; These are packages that are not essential, but still nice to have. They
;; provide optional functionality and may redefine builtin commands.
(use-package cperl-mode
:commands (cperl-mode)
:init (progn
;; replace perl-mode with cperl-mode
(mapc
(lambda (pair)
(if (eq (cdr pair) 'perl-mode)
(setcdr pair 'cperl-mode)))
(append auto-mode-alist interpreter-mode-alist))
(setq cperl-hairy nil))
:config (progn
(add-hook 'cperl-mode-hook 'flycheck-mode)
(add-hook 'cperl-mode-hook 'prettify-symbols-mode)))
2017-10-21 09:08:15 +02:00
(use-package crux
:commands (crux-eval-and-replace
crux-smart-open-line-above
crux-kill-whole-line
crux-cleanup-buffer-or-region
crux-delete-buffer-and-file))
2017-10-21 09:08:15 +02:00
(use-package db-projects
:commands (projects-add-project projects-archive-project))
2017-07-16 18:07:00 +02:00
(use-package define-word
:commands (define-word-at-point define-word))
(use-package dictcc
2017-11-17 08:02:49 +01:00
:commands (dictcc)
:config (require 'gnutls))
2017-07-16 18:07:00 +02:00
(use-package edit-list
:commands edit-list)
(use-package electric
:commands (electric-quote-mode))
(use-package elec-pair
:commands (electric-pair-mode)
2017-07-16 18:07:00 +02:00
:config (progn
(add-to-list 'electric-pair-pairs '(?“ . ?”))
(add-to-list 'electric-pair-text-pairs '(?“ . ?”))
(add-to-list 'electric-pair-pairs '(?„ . ?“))
(add-to-list 'electric-pair-text-pairs '(?„ . ?“))))
(defun db/turn-off-local-electric-pair-mode ()
"Locally turn off electric pair mode."
(interactive)
(electric-pair-local-mode -1))
2017-07-16 18:07:00 +02:00
(use-package expand-region
:commands (er/expand-region))
(use-package flycheck
:commands (global-flycheck-mode flycheck-mode))
(use-package flyspell
:commands (flyspell-mode turn-on-flyspell)
:config (progn
(unbind-key "C-M-i" flyspell-mode-map)
(unbind-key "C-c $" flyspell-mode-map)))
(use-package haskell-mode
:defer t
2017-07-16 18:07:00 +02:00
:defines (haskell-program-name)
:init (setq haskell-program-name "ghci")
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'haskell-mode-hook 'haskell-doc-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
(add-hook 'haskell-mode-hook
(lambda ()
(company-mode +1)
2017-07-16 18:07:00 +02:00
(set (make-local-variable 'company-backends)
(append '((company-capf company-dabbrev-code))
company-backends))))
(add-hook 'haskell-mode-hook 'flycheck-mode)
(with-demoted-errors "Non-Fatal Error: %s"
(require 'haskell-indentation)
(add-hook 'haskell-mode-hook
'haskell-indentation-mode))
2017-07-16 18:07:00 +02:00
(add-hook 'haskell-mode-hook
'interactive-haskell-mode)))
(use-package ivy-pages
:commands (ivy-pages))
(use-package highlight-indentation
:commands highlight-indentation-mode)
(use-package iedit
2017-09-29 21:25:41 +02:00
:commands (iedit-mode))
2017-07-16 18:07:00 +02:00
(use-package key-chord
:commands (key-chord-mode)
:config (progn
(key-chord-define-global "``" "")
(key-chord-define-global "''" "")
(key-chord-define-global ",," "")))
(use-package mastodon
:commands (mastodon))
2017-07-16 18:07:00 +02:00
(use-package multiple-cursors
:commands (mc/edit-lines
mc/mark-next-like-this
mc/mark-previous-like-this
mc/mark-all-like-this))
2017-10-21 09:08:15 +02:00
(use-package org-ref
:defer t
:config (progn
(require 'org-ref-pdf)
(require 'org-ref-url-utils)))
2017-07-16 18:07:00 +02:00
(use-package page-break-lines
:commands (page-break-lines-mode)
2017-07-16 18:07:00 +02:00
:diminish page-break-lines-mode)
(use-package python
2017-09-24 12:34:59 +02:00
:defer t
:init (setq python-indent-offset 2)
2017-07-16 18:07:00 +02:00
:config (progn
(add-hook 'python-mode-hook 'highlight-indentation-mode)
(when (package-installed-p 'elpy)
(elpy-enable))))
2017-07-16 18:07:00 +02:00
(use-package semantic
:commands (semantic-mode)
:config (progn
(require 'semantic/ia)
(require 'semantic/bovine/el)
;; recognize `use-package' as include statement; the function seems
;; to have to be a byte-compiled function, for otherwise it just
;; wont work … ?
(eval `(semantic-elisp-setup-form-parser
,(lambda (form start end)
(ignore start end)
(semantic-tag-new-include (symbol-name (nth 1 form))
nil))
use-package))))
2017-07-16 18:07:00 +02:00
(use-package sh-scripts
:defer t
:init (setq sh-basic-offset 2
sh-indentation 2))
2017-07-16 18:07:00 +02:00
(use-package synonyms
:commands (synonyms))
(use-package timeline-tools
:load-path "site-lisp"
:commands (timeline-tools-format-timeline
timeline-tools-format-timeline-of-day
timeline-tools-copy-clocklines))
2017-10-05 18:24:14 +02:00
(use-package typing
:commands (typing-of-emacs)
:init (setq toe-highscore-file nil))
2017-10-05 18:24:14 +02:00
2017-07-16 18:07:00 +02:00
(use-package undo-tree
:commands (global-undo-tree-mode
undo
undo-tree-redo)
:init (setq undo-tree-visualizer-timestamps t
undo-tree-visualizer-diff t)
2017-07-16 18:07:00 +02:00
:diminish undo-tree-mode)
2018-02-22 16:43:06 +01:00
(use-package vlf-setup)
2017-07-16 18:07:00 +02:00
(use-package wgrep
:commands (wgrep-finish-edit
wgrep-change-to-wgrep-mode))
(use-package which-key
:commands (which-key-mode)
:diminish which-key-mode
:init (setq which-key-side-window-max-width 0.33
which-key-side-window-max-height 0.25)
:config (which-key-setup-side-window-bottom))
2017-07-16 18:07:00 +02:00
(use-package yasnippet
:commands (yas-minor-mode-on yas-minor-mode)
:diminish yas-minor-mode
:config (yas-reload-all))
2017-07-16 18:07:00 +02:00
;;; init.el ends here