2017-05-28 12:32:48 +02:00
|
|
|
;;; Emacs config
|
2016-10-14 14:03:30 +02:00
|
|
|
|
2012-06-15 16:54:02 +02:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Prerequisites
|
2013-06-07 20:17:26 +02:00
|
|
|
|
2018-06-01 11:09:36 +02:00
|
|
|
(let ((minver "26.1"))
|
2017-06-18 19:05:50 +02:00
|
|
|
(when (version< emacs-version minver)
|
|
|
|
(error "Your Emacs is too old -- this config requires v%s or higher" minver)))
|
|
|
|
|
2017-06-18 19:40:38 +02:00
|
|
|
;;; Speed up init.
|
|
|
|
;;; Temporarily reduce garbage collection during startup. Inspect `gcs-done'.
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/reset-gc-cons-threshold ()
|
2017-06-18 19:06:09 +02:00
|
|
|
(setq gc-cons-threshold (car (get 'gc-cons-threshold 'standard-value))))
|
|
|
|
(setq gc-cons-threshold (* 64 1024 1024))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'after-init-hook 'ambrevar/reset-gc-cons-threshold)
|
2017-06-18 19:40:38 +02:00
|
|
|
;;; Temporarily disable the file name handler.
|
|
|
|
(setq default-file-name-handler-alist file-name-handler-alist)
|
|
|
|
(setq file-name-handler-alist nil)
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/reset-file-name-handler-alist ()
|
2018-09-24 16:34:38 +02:00
|
|
|
(setq file-name-handler-alist
|
|
|
|
(append default-file-name-handler-alist
|
2018-09-28 16:24:26 +02:00
|
|
|
file-name-handler-alist))
|
|
|
|
(cl-delete-duplicates file-name-handler-alist :test 'equal))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'after-init-hook 'ambrevar/reset-file-name-handler-alist)
|
2017-06-18 19:06:09 +02:00
|
|
|
|
2018-04-10 21:18:48 +02:00
|
|
|
;;; Avoid the "loaded old bytecode instead of newer source" pitfall.
|
|
|
|
(setq load-prefer-newer t)
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Store additional config in a 'lisp' subfolder and add it to the load path so
|
|
|
|
;;; that `require' can find the files.
|
2018-02-16 23:08:18 +01:00
|
|
|
;;; This must be done before moving `user-emacs-directory'.
|
2017-10-16 19:21:24 +02:00
|
|
|
(add-to-list 'load-path (expand-file-name "lisp/" user-emacs-directory))
|
|
|
|
|
2018-02-16 23:08:18 +01:00
|
|
|
;;; Move user-emacs-directory so that user files don't mix with cache files.
|
|
|
|
(setq user-emacs-directory "~/.cache/emacs/")
|
|
|
|
|
2017-11-26 18:08:17 +01:00
|
|
|
(when (require 'package nil t)
|
2018-02-07 10:28:29 +01:00
|
|
|
;; TODO: MELPA's https sometimes return
|
|
|
|
;; emacs melpa invalid: certificate host does not match hostname
|
|
|
|
;; Try the following:
|
|
|
|
;; (setq tls-checktrust nil)
|
2018-03-01 19:10:37 +01:00
|
|
|
;; Different Emacs version have different byte code. If a versioned ELPA
|
|
|
|
;; directory is found, use it.
|
|
|
|
(let ((versioned-dir (format "elpa-%s.%s" emacs-major-version emacs-minor-version)))
|
|
|
|
(when (member versioned-dir (directory-files (expand-file-name ".." package-user-dir)))
|
|
|
|
(setq package-user-dir (expand-file-name (concat "../" versioned-dir) package-user-dir))))
|
2018-02-07 10:28:29 +01:00
|
|
|
(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")))
|
|
|
|
(add-to-list 'package-archives '("melpa" . "https://melpa.milkbox.net/packages/"))
|
|
|
|
(add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t)
|
2017-11-26 18:08:17 +01:00
|
|
|
(package-initialize))
|
|
|
|
|
2017-10-16 19:21:24 +02:00
|
|
|
;;; Site Lisp folder for local packages and development.
|
2018-01-19 09:12:13 +01:00
|
|
|
;; We need to roll it out manually since we want it first in the `load-path',
|
|
|
|
;; while `normal-top-level-add-subdirs-to-load-path' appends it to the very end.
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/package-refresh-load-path (path)
|
2017-10-16 19:21:24 +02:00
|
|
|
"Add every non-hidden sub-folder of PATH to `load-path'."
|
|
|
|
(when (file-directory-p path)
|
|
|
|
(dolist (dir (directory-files path t "^[^\\.]"))
|
|
|
|
(when (file-directory-p dir)
|
2018-04-06 15:28:09 +02:00
|
|
|
(setq load-path (add-to-list 'load-path dir))
|
|
|
|
(dolist (subdir (directory-files dir t "^[^\\.]"))
|
|
|
|
(when (file-directory-p subdir)
|
|
|
|
(setq load-path (add-to-list 'load-path subdir))))))))
|
2018-02-16 23:08:18 +01:00
|
|
|
(let ((site-lisp (expand-file-name "site-lisp/" "~/.local/share/emacs/")))
|
2017-10-16 19:21:24 +02:00
|
|
|
(add-to-list 'load-path site-lisp)
|
2018-02-13 13:42:11 +01:00
|
|
|
(ambrevar/package-refresh-load-path site-lisp))
|
2012-10-12 13:47:10 +02:00
|
|
|
|
2017-12-25 12:36:31 +01:00
|
|
|
;;; Local config. See below for an example usage.
|
|
|
|
(load "local-before" t)
|
|
|
|
|
2017-09-02 12:10:55 +02:00
|
|
|
(require 'functions)
|
|
|
|
(require 'main)
|
|
|
|
(require 'visual)
|
2014-02-12 17:48:29 +01:00
|
|
|
|
2014-02-12 18:31:00 +01:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2014-03-08 11:48:35 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Assembly
|
2017-06-17 19:01:32 +02:00
|
|
|
(push 'nasm-mode package-selected-packages)
|
2016-06-08 23:31:42 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Asymptote
|
2014-12-16 10:10:41 +01:00
|
|
|
(add-to-list 'load-path "/usr/share/asymptote")
|
2017-07-27 00:08:58 +02:00
|
|
|
(autoload 'asy-mode "asy-mode" "Asymptote major mode." t)
|
|
|
|
(autoload 'lasy-mode "asy-mode" "Hybrid Asymptote/Latex major mode." t)
|
|
|
|
(autoload 'asy-insinuate-latex "asy-mode" "Asymptote insinuate LaTeX." t)
|
2014-12-16 10:10:41 +01:00
|
|
|
(add-to-list 'auto-mode-alist '("\\.asy$" . asy-mode))
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; BBCode
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(bbcode-mode))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'bbcode-mode (require 'init-bbcode))
|
2014-09-11 22:33:39 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Bibtex
|
2017-05-25 11:18:34 +02:00
|
|
|
(setq bibtex-entry-format '(opts-or-alts required-fields numerical-fields whitespace realign last-comma delimiters braces sort-fields))
|
|
|
|
(setq bibtex-field-delimiters 'double-quotes)
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'bibtex-mode-hook 'ambrevar/turn-off-indent-tabs)
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Bison/Flex
|
2017-07-24 16:23:28 +02:00
|
|
|
;; (nconc package-selected-packages '(bison-mode))
|
2014-03-08 15:58:29 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; C/C++
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'cc-mode (require 'init-cc))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; ChangeLog
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/change-log-set-indent-rules ()
|
2017-05-28 14:15:51 +02:00
|
|
|
(setq tab-width 2 left-margin 2))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'change-log-mode-hook 'ambrevar/change-log-set-indent-rules)
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-08-14 11:16:17 +02:00
|
|
|
;;; Completion
|
2018-10-16 20:09:40 +02:00
|
|
|
(nconc package-selected-packages '(company helm-company slime-company))
|
2017-06-18 18:50:31 +02:00
|
|
|
(when (require 'company nil t)
|
|
|
|
(setq company-idle-delay nil))
|
|
|
|
|
|
|
|
;;; Debbugs
|
|
|
|
(nconc package-selected-packages '(debbugs))
|
2017-09-02 12:11:43 +02:00
|
|
|
(with-eval-after-load 'debbugs
|
2018-02-16 23:08:18 +01:00
|
|
|
(setq debbugs-gnu-all-severities t))
|
2017-06-18 18:50:31 +02:00
|
|
|
|
2017-08-03 15:34:22 +02:00
|
|
|
;;; Diff
|
2017-10-24 18:09:36 +02:00
|
|
|
;;; TODO: In diff-mode, both `[[` and `C-M-a` do not go back to previous index
|
|
|
|
;;; once they are at the beginning of an index.
|
2017-08-03 15:34:22 +02:00
|
|
|
(nconc package-selected-packages '(ztree))
|
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Dired
|
2017-07-28 16:19:49 +02:00
|
|
|
;;; Dired is loaded after init.el, so configure it only then.
|
2017-10-08 20:36:28 +02:00
|
|
|
;;; TODO: Improve dired-du:
|
|
|
|
;;; - Hangs when the `ls` time format is changed.
|
|
|
|
;;; - Cache recursive results.
|
2017-07-28 16:19:49 +02:00
|
|
|
(nconc package-selected-packages '(dired-du))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'dired (require 'init-dired))
|
|
|
|
|
2018-03-19 11:33:51 +01:00
|
|
|
;;; Daemons.
|
|
|
|
(nconc package-selected-packages '(daemons))
|
|
|
|
|
2017-06-20 20:38:59 +02:00
|
|
|
;;; Emms
|
2018-04-12 09:55:03 +02:00
|
|
|
(nconc package-selected-packages '(emms helm-emms))
|
2017-06-25 12:57:14 +02:00
|
|
|
(with-eval-after-load 'emms (require 'init-emms))
|
2017-06-20 20:38:59 +02:00
|
|
|
|
2018-06-18 22:21:55 +02:00
|
|
|
;;; Engine
|
|
|
|
(nconc package-selected-packages '(engine-mode))
|
|
|
|
(when (require 'engine-mode nil t)
|
|
|
|
(require 'init-engine))
|
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Evil
|
2017-11-08 17:47:50 +01:00
|
|
|
(nconc package-selected-packages '(evil
|
2018-06-01 11:09:36 +02:00
|
|
|
evil-commentary evil-multiedit
|
2018-06-16 19:25:19 +02:00
|
|
|
evil-magit evil-org evil-collection))
|
2018-10-03 08:59:01 +02:00
|
|
|
(setq evil-want-keybinding nil
|
|
|
|
evil-want-integration t)
|
2017-06-18 18:50:31 +02:00
|
|
|
(when (require 'evil nil t) (require 'init-evil))
|
|
|
|
|
|
|
|
;;; Eshell
|
|
|
|
;;; Extend completion.
|
2017-11-08 17:47:50 +01:00
|
|
|
(nconc package-selected-packages '(fish-completion bash-completion
|
|
|
|
pcomplete-extension pcmpl-args pcmpl-git))
|
2017-12-27 11:35:49 +01:00
|
|
|
(nconc package-selected-packages '(esh-autosuggest))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'eshell (require 'init-eshell))
|
2018-02-15 13:28:49 +01:00
|
|
|
(autoload 'ambrevar/eshell-or-new-session "eshell")
|
2017-06-18 18:50:31 +02:00
|
|
|
|
2018-02-12 12:55:59 +01:00
|
|
|
;;; Eww
|
|
|
|
(with-eval-after-load 'eww (require 'init-eww))
|
2018-02-15 13:28:49 +01:00
|
|
|
(autoload 'ambrevar/eww-switch-back "eww")
|
2018-02-12 12:55:59 +01:00
|
|
|
|
2018-02-15 19:32:13 +01:00
|
|
|
;;; Expand region.
|
|
|
|
(nconc package-selected-packages '(expand-region))
|
|
|
|
(when (require 'expand-region nil t)
|
|
|
|
(global-set-key (kbd "C-=") 'er/expand-region))
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; GLSL
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(glsl-mode))
|
2014-03-08 15:58:29 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Go
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(go-mode go-eldoc go-guru go-rename helm-go-package company-go))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'go-mode (require 'init-go))
|
2014-02-21 15:23:25 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Graphviz dot
|
2017-10-08 20:36:28 +02:00
|
|
|
;;; The view command is broken but the preview command works (it displays the PNG
|
|
|
|
;;; in a new window), which is enough and probably not worth a fix.
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(graphviz-dot-mode))
|
2014-02-13 16:30:05 +01:00
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; GUD (GDB, etc.)
|
|
|
|
(with-eval-after-load 'gud (require 'init-gud))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2018-04-11 13:12:25 +02:00
|
|
|
;;; Guix
|
|
|
|
(when (executable-find "guix")
|
|
|
|
(nconc package-selected-packages '(guix))
|
2018-07-24 09:41:31 +02:00
|
|
|
(require 'init-guix))
|
2018-04-11 13:12:25 +02:00
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Helm
|
|
|
|
(nconc package-selected-packages '(helm helm-descbinds helm-ls-git))
|
|
|
|
(when (require 'helm-config nil t) (require 'init-helm))
|
|
|
|
|
2017-07-29 14:00:49 +02:00
|
|
|
;;; Hex editing
|
|
|
|
(nconc package-selected-packages '(nhexl-mode))
|
|
|
|
|
2018-07-12 17:29:41 +02:00
|
|
|
;;; Highlight
|
|
|
|
(nconc package-selected-packages '(hl-todo))
|
|
|
|
(when (require 'hl-todo nil t)
|
2018-07-17 11:01:59 +02:00
|
|
|
(add-to-list 'hl-todo-keyword-faces `("REVIEW" . ,(alist-get "TODO" hl-todo-keyword-faces nil nil 'equal)))
|
2018-07-12 17:29:41 +02:00
|
|
|
(global-hl-todo-mode)
|
|
|
|
;; (global-set-key (kbd "M-s M-o") 'hl-todo-occur)
|
2018-07-13 17:42:47 +02:00
|
|
|
(define-key hl-todo-mode-map (kbd "M-s t") 'hl-todo-occur))
|
2018-07-12 17:29:41 +02:00
|
|
|
|
2018-02-13 23:25:12 +01:00
|
|
|
;;; Iedit
|
|
|
|
(nconc package-selected-packages '(iedit))
|
|
|
|
(when (require 'iedit nil t)
|
|
|
|
(global-set-key (kbd "C-;") 'iedit-mode))
|
|
|
|
|
2017-10-14 20:24:44 +02:00
|
|
|
;;; Image
|
2017-10-15 14:55:49 +02:00
|
|
|
;;; TODO: Disable white frame.
|
|
|
|
;;; I think it's the cursor.
|
|
|
|
;;; Evil-mode reverts cursor changes.
|
2018-02-15 13:28:49 +01:00
|
|
|
;; (set-face-foreground 'cursor "black")
|
2017-10-15 14:55:49 +02:00
|
|
|
;;; TODO: Implement other sxiv features:
|
|
|
|
;;; - Gamma
|
|
|
|
;;; - Marks
|
|
|
|
;;; - Gallery
|
|
|
|
;;; TODO: Is it possible to display an image fullscreen?
|
2018-02-15 13:28:49 +01:00
|
|
|
;;; TODO: Image+: Dot no auto-adjust animated files
|
2017-10-15 14:55:49 +02:00
|
|
|
;;; https://github.com/mhayashi1120/Emacs-imagex/issues/10
|
|
|
|
;;; TODO: Image+: Restore animation state
|
|
|
|
;;; https://github.com/mhayashi1120/Emacs-imagex/issues/9
|
2017-10-14 20:24:44 +02:00
|
|
|
(nconc package-selected-packages '(image+))
|
|
|
|
(with-eval-after-load 'image
|
|
|
|
(setq image-animate-loop t)
|
|
|
|
(add-hook 'image-mode-hook 'image-toggle-animation)
|
|
|
|
(require 'image+ nil t))
|
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Indentation engine fix.
|
2017-07-19 17:59:36 +02:00
|
|
|
;; (require 'smiext "init-smiext")
|
2017-06-18 18:50:31 +02:00
|
|
|
|
|
|
|
;;; Indentation style guessing.
|
|
|
|
;; (nconc 'package-selected-packages '(dtrt-indent))
|
|
|
|
|
2018-07-12 17:30:11 +02:00
|
|
|
;;; Info-colors
|
|
|
|
;; (nconc 'package-selected-packages '(info-colors))
|
|
|
|
(when (require 'info-colors nil t)
|
|
|
|
(add-hook 'Info-selection-hook 'info-colors-fontify-node))
|
|
|
|
|
2018-10-16 20:12:55 +02:00
|
|
|
;;; IRC
|
|
|
|
(nconc package-selected-packages '(circe))
|
|
|
|
|
2017-08-14 11:16:17 +02:00
|
|
|
;;; JavaScript
|
|
|
|
(add-hook 'js-mode-hook (lambda () (defvaralias 'js-indent-level 'tab-width)))
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Lisp
|
2018-05-11 11:38:10 +02:00
|
|
|
(nconc package-selected-packages '(lispy lispyville rainbow-delimiters geiser slime))
|
2018-03-24 17:02:25 +01:00
|
|
|
(with-eval-after-load 'lisp-mode (require 'init-lisp))
|
2018-06-21 16:08:13 +02:00
|
|
|
(setq geiser-repl-history-filename (expand-file-name "geiser_history" user-emacs-directory))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Lua
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(lua-mode))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'lua-mode (require 'init-lua))
|
|
|
|
|
|
|
|
;;; Magit
|
2017-06-25 14:37:15 +02:00
|
|
|
;;; Magit can be loaded just-in-time.
|
2018-08-01 13:07:51 +02:00
|
|
|
(nconc package-selected-packages '(magit magit-todos))
|
2017-06-25 14:37:15 +02:00
|
|
|
(with-eval-after-load 'magit
|
2017-06-30 18:23:15 +02:00
|
|
|
(setq auto-revert-mode-text "")
|
2017-06-18 18:50:31 +02:00
|
|
|
(set-face-foreground 'magit-branch-remote "orange red")
|
|
|
|
(setq git-commit-summary-max-length fill-column)
|
2018-02-12 12:57:34 +01:00
|
|
|
;; Customize what to fold by default.
|
|
|
|
;; (push (cons [* commitbuf] 'hide) magit-section-initial-visibility-alist)
|
2017-07-26 22:41:32 +02:00
|
|
|
;; Avoid conflict with WM.
|
|
|
|
(define-key magit-mode-map (kbd "s-<tab>") nil)
|
2018-08-01 13:07:51 +02:00
|
|
|
(setq magit-diff-refine-hunk 'all)
|
|
|
|
(when (require 'magit-todos nil t)
|
|
|
|
;; REVIEW: Default scanner does not work on Guix because Git needs be compiled with PCRE.
|
|
|
|
(setq magit-todos-scanner #'magit-todos--scan-with-find|grep)
|
|
|
|
(magit-todos-mode)))
|
2017-06-25 14:37:15 +02:00
|
|
|
(when (fboundp 'magit-status)
|
2017-06-18 18:50:31 +02:00
|
|
|
(global-set-key (kbd "C-x g") 'magit-status))
|
2014-02-21 15:23:25 +01:00
|
|
|
|
2017-07-19 17:17:24 +02:00
|
|
|
;;; Mail
|
2017-08-14 11:16:17 +02:00
|
|
|
;;; mu4e is usually site-local and not part of ELPA.
|
2018-03-27 07:54:29 +02:00
|
|
|
(when (or (fboundp 'mu4e)
|
|
|
|
(delq nil (mapcar (lambda (path) (string-match "/mu4e/\\|/mu4e$" path)) load-path)))
|
2018-01-11 11:32:28 +01:00
|
|
|
;; (nconc package-selected-packages '(mu4e-maildirs-extension))
|
|
|
|
(nconc package-selected-packages '(helm-mu)))
|
2018-06-09 10:53:43 +02:00
|
|
|
(with-eval-after-load 'mu4e
|
|
|
|
;; mu4e-conversation must be enabled here.
|
|
|
|
;; REVIEW: https://github.com/djcb/mu/issues/1258
|
|
|
|
(when (require 'mu4e-conversation nil t)
|
2018-06-23 23:25:30 +02:00
|
|
|
(global-mu4e-conversation-mode)
|
2018-08-06 11:05:54 +02:00
|
|
|
;; (setq mu4e-debug t)
|
2018-06-20 09:34:42 +02:00
|
|
|
(setq mu4e-headers-show-threads nil
|
|
|
|
mu4e-headers-include-related nil)
|
2018-06-09 10:53:43 +02:00
|
|
|
;; For testing purposes:
|
|
|
|
;; (set-face-background mu4e-conversation-sender-1 "#335533")
|
|
|
|
;; (set-face-background mu4e-conversation-sender-2 "#553333")
|
|
|
|
;; (set-face-background mu4e-conversation-sender-3 "#333355")
|
|
|
|
;; (set-face-background mu4e-conversation-sender-4 "#888855")
|
2018-07-20 14:45:45 +02:00
|
|
|
;; (setq mu4e-conversation-print-function 'mu4e-conversation-print-tree)
|
2018-07-17 11:02:10 +02:00
|
|
|
(add-hook 'mu4e-conversation-hook 'flyspell-mode)
|
|
|
|
;; (add-hook
|
|
|
|
;; 'mu4e-conversation-before-send-hook
|
|
|
|
;; (lambda ()
|
|
|
|
;; (setq mu4e-compose-signature-auto-include nil)))
|
2018-07-08 17:58:51 +02:00
|
|
|
(add-hook
|
|
|
|
'mu4e-conversation-after-send-hook
|
|
|
|
(lambda ()
|
|
|
|
(let ((mu4e-get-mail-command "mbsync ambrevar-sent peneidhardt-sent"))
|
2018-07-20 14:45:45 +02:00
|
|
|
(mu4e-update-mail-and-index 'run-in-background))))
|
|
|
|
(add-hook 'mu4e-view-mode-hook 'auto-fill-mode))
|
2018-06-09 10:53:43 +02:00
|
|
|
(require 'init-mu4e))
|
2018-02-15 13:28:49 +01:00
|
|
|
(autoload 'ambrevar/mu4e-headers "mu4e")
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Makefile
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'make-mode (require 'init-makefile))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Markdown
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(markdown-mode))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'markdown-mode (require 'init-markdown))
|
2014-02-21 15:23:25 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Matlab / Octave
|
2017-05-25 11:18:34 +02:00
|
|
|
(add-to-list 'auto-mode-alist '("\\.m\\'" . octave-mode)) ; matlab
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/octave-set-comment-start ()
|
2017-05-28 14:15:51 +02:00
|
|
|
"Set comment character to '%' to be Matlab-compatible."
|
|
|
|
(set (make-local-variable 'comment-start) "% "))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'octave-mode-hook 'ambrevar/octave-set-comment-start)
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Maxima
|
2017-05-25 11:18:34 +02:00
|
|
|
(autoload 'maxima-mode "maxima" "Maxima mode" t)
|
|
|
|
(autoload 'maxima "maxima" "Maxima interaction" t)
|
2017-06-04 13:53:01 +02:00
|
|
|
(add-to-list 'auto-mode-alist '("\\.mac" . maxima-mode))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Mediawiki
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(mediawiki))
|
2017-06-04 13:53:01 +02:00
|
|
|
(add-to-list 'auto-mode-alist '("\\.wiki\\'" . mediawiki-mode))
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'mediawiki (require 'init-mediawiki))
|
2014-02-13 16:30:05 +01:00
|
|
|
|
2017-07-17 08:59:36 +02:00
|
|
|
;;; News
|
2018-09-12 11:05:23 +02:00
|
|
|
(nconc package-selected-packages '(elfeed hackernews))
|
2017-10-22 16:06:43 +02:00
|
|
|
(with-eval-after-load 'elfeed (require 'init-elfeed))
|
2018-02-15 13:28:49 +01:00
|
|
|
(autoload 'ambrevar/elfeed-switch-back "elfeed")
|
2017-07-17 08:59:36 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Org-mode
|
2018-07-08 17:58:27 +02:00
|
|
|
(nconc package-selected-packages '(org-plus-contrib org-bullets helm-org-contacts)) ; org-plus contains latest Org mode.
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'org (require 'init-org))
|
2018-02-15 13:28:49 +01:00
|
|
|
(autoload 'ambrevar/org-switch-agenda-file "org")
|
|
|
|
(autoload 'ambrevar/org-switch-agenda-file-other-window "org")
|
2017-06-18 18:50:31 +02:00
|
|
|
|
2017-11-08 17:47:50 +01:00
|
|
|
;;; Packaging
|
|
|
|
(nconc package-selected-packages '(esup package-lint))
|
|
|
|
|
2018-02-04 15:09:41 +01:00
|
|
|
;;; Pass
|
|
|
|
(nconc package-selected-packages '(helm-pass))
|
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; PDF
|
2017-07-12 23:51:14 +02:00
|
|
|
;;; pdf-tools requires poppler built with cairo support.
|
2017-10-10 16:19:22 +02:00
|
|
|
;;; We cannot defer loading as `pdf-tools-install' is required for PDF
|
|
|
|
;;; association.
|
2017-10-11 17:18:23 +02:00
|
|
|
;;; REVIEW: `save-place' does not seem to work with pdf-tools.
|
|
|
|
;;; See https://github.com/politza/pdf-tools/issues/18.
|
2017-10-22 15:24:43 +02:00
|
|
|
;;; TODO: windmove fails when selecting text and then moving up/down.
|
2018-02-15 13:28:49 +01:00
|
|
|
;;; It only fails in Evil mode.
|
2017-07-02 20:07:19 +02:00
|
|
|
(nconc package-selected-packages '(pdf-tools))
|
|
|
|
(when (require 'pdf-tools nil t)
|
2017-10-22 15:24:43 +02:00
|
|
|
;; (setq pdf-view-midnight-colors '("#ffffff" . "#000000"))
|
|
|
|
(setq pdf-view-midnight-colors '("#ff9900" . "#0a0a12" )) ; Amber
|
|
|
|
(add-hook 'pdf-view-mode-hook 'pdf-view-midnight-minor-mode)
|
2017-08-14 11:16:17 +02:00
|
|
|
(pdf-tools-install t t t))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Perl
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/perl-set-indent-rules ()
|
2017-05-28 14:15:51 +02:00
|
|
|
(defvaralias 'perl-indent-level 'tab-width))
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/perl-set-compiler ()
|
2017-05-28 14:15:51 +02:00
|
|
|
(setq compile-command (concat "perl " (shell-quote-argument buffer-file-name))))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'perl-mode-hook 'ambrevar/perl-set-indent-rules)
|
|
|
|
(add-hook 'perl-mode-hook 'ambrevar/perl-set-compiler)
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2018-02-16 12:33:33 +01:00
|
|
|
;;; Pinentry
|
|
|
|
(nconc package-selected-packages '(pinentry)) ; pinentry.el was remombed from Emacs 26.
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; po
|
2017-06-16 20:42:46 +02:00
|
|
|
(nconc package-selected-packages '(po-mode))
|
2014-02-21 15:23:25 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Python
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'python (require 'init-python))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-08-30 17:42:46 +02:00
|
|
|
;;; Rainbow-mode
|
|
|
|
(nconc package-selected-packages '(rainbow-mode))
|
|
|
|
(when (require 'rainbow-mode nil t)
|
|
|
|
(dolist (hook '(css-mode-hook html-mode-hook sass-mode-hook))
|
|
|
|
(add-hook hook 'rainbow-mode)))
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Roff / Nroff
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'nroff-mode (require 'init-nroff))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2018-02-18 11:42:09 +01:00
|
|
|
;;; Screencast
|
|
|
|
;; (nconc package-selected-packages '(camcorder))
|
|
|
|
(with-eval-after-load 'camcorder
|
|
|
|
(setq camcorder-output-directory (expand-file-name "temp" "~")
|
|
|
|
camcorder-gif-output-directory camcorder-output-directory)
|
|
|
|
(setq camcorder-recording-command '("recordmydesktop" " --fps 10 --no-sound --windowid " window-id " -o " file))
|
|
|
|
(add-to-list 'camcorder-gif-conversion-commands '("ffmpeg-slow" "ffmpeg -i " input-file " -vf 'fps=10,scale=1024:-1:flags=lanczos' " gif-file)))
|
2018-03-19 11:33:51 +01:00
|
|
|
(nconc package-selected-packages '(gif-screencast keycast))
|
2018-03-01 18:41:57 +01:00
|
|
|
(with-eval-after-load 'gif-screencast
|
|
|
|
(define-key gif-screencast-mode-map (kbd "<f8>") 'gif-screencast-toggle-pause)
|
|
|
|
(define-key gif-screencast-mode-map (kbd "<f9>") 'gif-screencast-stop))
|
2018-02-18 11:42:09 +01:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Shell
|
2017-06-18 18:50:31 +02:00
|
|
|
(with-eval-after-load 'sh-script (require 'init-sh))
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Arch Linux PKGBUILD
|
2017-05-25 11:18:34 +02:00
|
|
|
(add-to-list 'auto-mode-alist '("PKGBUILD" . sh-mode))
|
2017-10-14 20:23:52 +02:00
|
|
|
;;; Gentoo
|
|
|
|
(add-to-list 'auto-mode-alist '("\\.ebuild\\'" . sh-mode))
|
2017-10-29 12:44:36 +01:00
|
|
|
(add-to-list 'auto-mode-alist '("\\.eclass\\'" . sh-mode))
|
2017-10-14 20:23:52 +02:00
|
|
|
(add-to-list 'auto-mode-alist '("package\\.accept_keywords" . sh-mode))
|
|
|
|
(add-to-list 'auto-mode-alist '("package\\.mask" . sh-mode))
|
|
|
|
(add-to-list 'auto-mode-alist '("package\\.use" . sh-mode))
|
2017-07-18 18:33:23 +02:00
|
|
|
;;; If we ever need to edit exotic shell configs:
|
|
|
|
;; (nconc package-selected-packages '(fish-mode rc-mode))
|
2016-10-11 17:33:36 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Srt (subtitles)
|
2017-05-25 11:18:34 +02:00
|
|
|
(add-to-list 'auto-mode-alist '("\\.srt\\'" . text-mode))
|
|
|
|
|
2017-06-18 17:57:56 +02:00
|
|
|
;;; StackExchange
|
|
|
|
(nconc package-selected-packages '(sx))
|
|
|
|
|
2018-06-18 22:22:04 +02:00
|
|
|
(nconc package-selected-packages '(strace-mode))
|
|
|
|
|
2018-09-23 16:41:22 +02:00
|
|
|
(nconc package-selected-packages '(synosaurus))
|
|
|
|
|
2017-07-17 18:15:54 +02:00
|
|
|
;;; Syntax checking
|
|
|
|
(nconc package-selected-packages '(flycheck helm-flycheck))
|
2017-07-27 17:29:22 +02:00
|
|
|
(when (require 'flycheck nil t) (require 'init-flycheck))
|
2017-07-17 18:15:54 +02:00
|
|
|
|
2017-12-27 11:38:29 +01:00
|
|
|
;;; System packages
|
|
|
|
(nconc package-selected-packages '(helm-system-packages))
|
2018-01-15 12:17:50 +01:00
|
|
|
(global-set-key (kbd "C-x c #") 'helm-system-packages)
|
2017-12-27 11:38:29 +01:00
|
|
|
|
2017-08-11 10:41:49 +02:00
|
|
|
;;; Terminal
|
|
|
|
(with-eval-after-load 'term
|
2017-11-08 09:13:27 +01:00
|
|
|
;; (require 'init-term)
|
2017-08-11 10:41:49 +02:00
|
|
|
(setq term-buffer-maximum-size 0))
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; TeX / LaTeX / Texinfo
|
2018-01-19 16:56:18 +01:00
|
|
|
(nconc package-selected-packages '(auctex latex-math-preview))
|
|
|
|
(with-eval-after-load 'tex (require 'init-tex))
|
|
|
|
;; LaTeX is defined in the same file as TeX. To separate the loading, we add it
|
|
|
|
;; to the hook.
|
2017-06-18 18:50:31 +02:00
|
|
|
(add-hook 'latex-mode-hook (lambda () (require 'init-latex)))
|
2017-05-16 21:02:51 +02:00
|
|
|
|
2017-06-18 16:21:38 +02:00
|
|
|
;;; Torrent
|
2017-07-12 23:51:57 +02:00
|
|
|
(nconc package-selected-packages '(transmission))
|
2017-12-23 10:09:12 +01:00
|
|
|
(with-eval-after-load 'transmission
|
2017-12-27 11:38:24 +01:00
|
|
|
;; `transmission' will fail to start and will not run any hook if the daemon
|
|
|
|
;; is not up yet.
|
|
|
|
;; We need to advice the function :before to guarantee it starts.
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/transmission-start-daemon ()
|
2017-12-27 11:38:24 +01:00
|
|
|
(unless (member "transmission-da"
|
|
|
|
(mapcar
|
|
|
|
(lambda (pid) (alist-get 'comm (process-attributes pid)))
|
|
|
|
(list-system-processes)))
|
|
|
|
(call-process "transmission-daemon")
|
|
|
|
(sleep-for 1)))
|
2018-02-13 13:42:11 +01:00
|
|
|
(advice-add 'transmission :before 'ambrevar/transmission-start-daemon)
|
2017-07-12 23:51:57 +02:00
|
|
|
(setq transmission-refresh-modes '(transmission-mode transmission-files-mode transmission-info-mode transmission-peers-mode)
|
|
|
|
transmission-refresh-interval 1))
|
2017-06-18 16:21:38 +02:00
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Translator
|
2018-02-04 22:01:15 +01:00
|
|
|
(nconc package-selected-packages '(google-translate))
|
|
|
|
(when (require 'google-translate nil t)
|
|
|
|
(require 'google-translate-default-ui)
|
|
|
|
;; (global-set-key "\C-ct" 'google-translate-at-point)
|
|
|
|
;; (global-set-key "\C-cT" 'google-translate-query-translate)
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/google-translate-line ()
|
2018-02-04 22:01:15 +01:00
|
|
|
"Translate current line and insert result after it, separated by ' = '."
|
|
|
|
(interactive)
|
|
|
|
(let* ((langs (google-translate-read-args nil nil))
|
|
|
|
(source-language (car langs))
|
|
|
|
(target-language (cadr langs))
|
|
|
|
text
|
|
|
|
result)
|
|
|
|
(end-of-line)
|
|
|
|
(just-one-space)
|
|
|
|
(setq text (buffer-substring-no-properties
|
|
|
|
(line-beginning-position) (line-end-position)))
|
|
|
|
(setq result (with-temp-buffer
|
|
|
|
(google-translate-translate
|
|
|
|
source-language target-language
|
|
|
|
text
|
|
|
|
'current-buffer)
|
|
|
|
(buffer-string))
|
|
|
|
(insert "= " result)))))
|
2017-06-18 18:50:31 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Web forms.
|
|
|
|
;;; Remove auto-fill in web edits because wikis and forums do not like it.
|
|
|
|
;;; This works for qutebrowser, but may need changes for other browsers.
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/browser-edit ()
|
2017-06-26 18:13:28 +02:00
|
|
|
(when (require 'with-editor nil t) (with-editor-mode))
|
2017-11-02 15:06:50 +01:00
|
|
|
(text-mode)
|
2017-06-26 18:13:28 +02:00
|
|
|
(auto-fill-mode -1))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-to-list 'auto-mode-alist `(,(concat (getenv "BROWSER") "-editor-*") . ambrevar/browser-edit))
|
2017-05-25 11:18:34 +02:00
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Wgrep
|
|
|
|
(nconc package-selected-packages '(wgrep-helm wgrep-pt))
|
|
|
|
(when (require 'wgrep nil t)
|
2017-08-01 20:55:50 +02:00
|
|
|
;; TODO: wgrep-face is not so pretty.
|
2017-06-18 18:50:31 +02:00
|
|
|
(set-face-attribute 'wgrep-face nil :inherit 'ediff-current-diff-C :foreground 'unspecified :background 'unspecified :box nil))
|
|
|
|
|
2017-07-26 18:39:19 +02:00
|
|
|
;;; Window manager
|
2017-11-22 15:34:08 +01:00
|
|
|
(nconc package-selected-packages '(exwm helm-exwm))
|
2018-02-15 13:52:43 +01:00
|
|
|
(nconc package-selected-packages '(pulseaudio-control))
|
2018-05-11 11:37:58 +02:00
|
|
|
(with-eval-after-load 'pulseaudio-control
|
|
|
|
;; REVIEW: Upstream should set path dynamically.
|
|
|
|
;; https://github.com/flexibeast/pulseaudio-control/issues/7
|
2018-06-28 18:53:22 +02:00
|
|
|
(setq pulseaudio-control-pactl-path (executable-find "pactl")
|
|
|
|
pulseaudio-control-volume-step "2%"))
|
2017-07-26 18:39:19 +02:00
|
|
|
(when (require 'exwm nil t) (require 'init-exwm))
|
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; XML / SGML
|
2018-02-13 13:42:11 +01:00
|
|
|
(defun ambrevar/sgml-setup ()
|
2017-05-28 14:15:51 +02:00
|
|
|
(setq sgml-xml-mode t)
|
|
|
|
;; (toggle-truncate-lines) ; This seems to slow down Emacs.
|
|
|
|
(turn-off-auto-fill))
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'sgml-mode-hook 'ambrevar/sgml-setup)
|
2017-06-23 15:41:22 +02:00
|
|
|
(with-eval-after-load 'nxml-mode
|
2017-06-28 17:02:50 +02:00
|
|
|
(set-face-foreground 'nxml-element-local-name "gold1")
|
2017-06-23 15:41:22 +02:00
|
|
|
(defvaralias 'nxml-child-indent 'tab-width))
|
|
|
|
;;; Because XML is hard to read.
|
2018-02-13 13:42:11 +01:00
|
|
|
(add-hook 'nxml-mode-hook 'ambrevar/turn-on-tab-width-to-4)
|
2014-09-16 09:02:33 +02:00
|
|
|
|
2018-06-21 19:20:27 +02:00
|
|
|
;;; Yasnippet
|
2018-06-23 23:26:06 +02:00
|
|
|
(nconc package-selected-packages '(yasnippet))
|
2018-06-21 19:20:27 +02:00
|
|
|
|
2018-09-12 11:03:06 +02:00
|
|
|
(nconc package-selected-packages '(youtube-dl))
|
|
|
|
(with-eval-after-load 'youtube-dl
|
|
|
|
(setq youtube-dl-directory "~/temp"))
|
|
|
|
|
2014-02-12 18:31:00 +01:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Finalization
|
2016-10-14 14:03:30 +02:00
|
|
|
|
2017-05-28 12:32:48 +02:00
|
|
|
;;; Don't let `customize' clutter my config.
|
2017-07-27 14:56:19 +02:00
|
|
|
(setq custom-file
|
|
|
|
(if (boundp 'server-socket-dir)
|
|
|
|
(expand-file-name "custom.el" server-socket-dir)
|
|
|
|
(expand-file-name (format "emacs-custom-%s.el" (user-uid)) temporary-file-directory)))
|
2017-06-18 16:21:08 +02:00
|
|
|
(load custom-file t)
|
2017-05-21 23:49:20 +02:00
|
|
|
|
2017-06-18 18:50:31 +02:00
|
|
|
;;; Local config. You can use it to set system specific variables, such as the
|
2017-07-27 14:50:55 +02:00
|
|
|
;;; external web browser or the geographical coordinates:
|
2017-05-28 12:32:48 +02:00
|
|
|
;;
|
2017-07-27 14:50:55 +02:00
|
|
|
;; (setq calendar-latitude 20.2158)
|
|
|
|
;; (setq calendar-longitude 105.938)
|
2017-12-25 12:36:31 +01:00
|
|
|
(load "local-after" t)
|