emacs-config/conf/main.el

949 lines
30 KiB
EmacsLisp
Raw Normal View History

2018-07-15 20:51:57 -04:00
(use-package spacemacs-theme
:defer t
2018-07-20 00:50:51 -04:00
:config
(setq spacemacs-theme-custom-colors '((lnum . "#64707c"))))
2018-07-15 20:51:57 -04:00
(defvar nd/theme 'spacemacs-dark)
(defvar nd/theme-window-loaded nil)
(defvar nd/theme-terminal-loaded nil)
;; required for emacsclient/daemon setup
(if (daemonp)
(add-hook 'after-make-frame-functions
2018-11-22 00:49:47 -05:00
(lambda (frame)
2018-07-15 20:51:57 -04:00
(select-frame frame)
(if (window-system frame)
(unless nd/theme-window-loaded
(if nd/theme-terminal-loaded
(enable-theme nd/theme)
(load-theme nd/theme t))
(setq nd/theme-window-loaded t))
(unless nd/theme-terminal-loaded
(if nd/theme-window-loaded
(enable-theme nd/theme)
(load-theme nd/theme t))
(setq nd/theme-terminal-loaded t)))))
(progn
(load-theme nd/theme t)
(if (display-graphic-p)
(setq nd/theme-window-loaded t)
(setq nd/theme-terminal-loaded t))))
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(use-package spaceline
:ensure t
:config
(require 'spaceline-config)
(setq powerline-default-separator 'arrow
2018-11-22 00:49:47 -05:00
spaceline-buffer-size-p nil)
2018-07-20 02:23:08 -04:00
(spaceline-spacemacs-theme))
(line-number-mode 1)
(column-number-mode 1)
2018-12-11 19:33:59 -05:00
2018-07-15 00:04:47 -04:00
(use-package delight
:ensure t)
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(setq inhibit-startup-screen t)
(tool-bar-mode -1)
(menu-bar-mode -1)
(scroll-bar-mode -1)
(setq make-backup-files nil)
(setq auto-save-default nil)
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(setq pop-up-windows nil) ; no popups (eg ediff)
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(set-default 'truncate-lines t)
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(setq scroll-conservatively 100)
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(when (fboundp 'imagemagick-register-types)
(imagemagick-register-types))
2018-12-11 19:33:59 -05:00
2018-07-20 02:23:08 -04:00
(defalias 'yes-or-no-p 'y-or-n-p) ; eliminate yes or no prompt on killing procs
2018-12-11 19:33:59 -05:00
2018-07-15 00:04:47 -04:00
(use-package beacon
:ensure t
:delight
:init
(beacon-mode 1))
2018-12-11 19:33:59 -05:00
2018-07-15 00:04:47 -04:00
(use-package which-key
:ensure t
:delight
:init
(which-key-mode))
2018-12-11 19:33:59 -05:00
2018-07-13 20:05:50 -04:00
(use-package helm
:ensure t
2018-07-14 20:42:20 -04:00
:delight
2018-07-13 20:05:50 -04:00
:init
(helm-mode 1)
:config
2018-07-20 00:50:51 -04:00
(setq helm-autoresize-max-height 0
2018-11-22 00:49:47 -05:00
helm-autoresize-max-height 40
helm-M-x-fuzzy-match t
helm-buffers-fuzzy-matching t
helm-recentf-fuzzy-match t
helm-semantic-fuzzy-match t
helm-imenu-fuzzy-match t
helm-scroll-amount 8)
2018-07-14 23:36:42 -04:00
(add-to-list 'display-buffer-alist
`(,(rx bos "*helm" (* not-newline) "*" eos)
(display-buffer-in-side-window)
(inhibit-same-window . t)
2018-07-15 00:04:47 -04:00
(window-height . 0.4)))
(helm-autoresize-mode 1)
(require 'helm-config))
2018-12-11 19:33:59 -05:00
2018-09-21 01:03:17 -04:00
(use-package helm-swoop
:ensure t)
2018-12-11 19:33:59 -05:00
2018-07-15 00:04:47 -04:00
(use-package rainbow-delimiters
:ensure t
:delight
:hook
((prog-mode . rainbow-delimiters-mode)
(inferior-ess-mode . rainbow-delimiters-mode)
(ess-mode . rainbow-delimiters-mode)
(LaTeX-mode . rainbow-delimiters-mode)
(Tex-latex-mode . rainbow-delimiters-mode)))
2018-12-11 19:33:59 -05:00
2018-07-03 22:27:12 -04:00
(use-package ace-window
:ensure t
2018-07-20 00:50:51 -04:00
:config
(setq aw-background t)
(custom-set-faces '(aw-leading-char-face
2018-11-22 00:49:47 -05:00
((t (:foreground "#292b2e"
:background "#bc6ec5"
:height 1.0
:box nil))))))
2018-12-11 19:33:59 -05:00
(use-package avy
:ensure t
:config
(setq avy-background t))
(use-package sudo-edit
:ensure t)
2018-07-15 00:04:47 -04:00
(use-package undo-tree
:ensure t
:delight
:config
2018-07-20 00:50:51 -04:00
(setq undo-tree-visualizer-diff t)
2018-07-15 00:04:47 -04:00
(global-undo-tree-mode))
2018-12-11 19:33:59 -05:00
2018-06-09 18:31:40 -04:00
(use-package fill-column-indicator
:ensure t
2018-07-20 00:50:51 -04:00
:config
(setq fci-rule-use-dashes t)
2018-07-15 00:04:47 -04:00
:hook
(prog-mode . fci-mode))
2018-12-11 19:33:59 -05:00
(use-package rainbow-mode
:ensure t)
2018-12-11 19:33:59 -05:00
(use-package async
:ensure t
:delight dired-async-mode
:init
(dired-async-mode 1))
2018-12-11 19:33:59 -05:00
(use-package csv-mode
:ensure t
:hook (csv-mode . (lambda () (csv-align-fields nil (point-min) (point-max)))))
2018-12-11 19:33:59 -05:00
2018-08-10 10:15:09 -04:00
(use-package markdown-mode
:ensure t)
2018-12-11 19:33:59 -05:00
2018-08-10 10:15:09 -04:00
(use-package polymode
:ensure t
:after markdown-mode
:mode
(("\\.Rmd\\'" . poly-markdown+r-mode)
("\\.rmd\\'" . poly-markdown+r-mode))
:config
(require 'poly-R)
(require 'poly-markdown))
2018-12-11 19:33:59 -05:00
(org-babel-load-file (expand-file-name "lib/lib.org" nd/conf-dir))
2018-12-11 19:33:59 -05:00
(setq-default indent-tabs-mode nil
2018-11-22 00:49:47 -05:00
tab-width 4)
2018-12-11 19:33:59 -05:00
2018-07-17 23:27:53 -04:00
(use-package company
:ensure t
2018-07-22 07:37:44 -04:00
:delight " ©"
2018-07-17 23:27:53 -04:00
:config
(setq company-idle-delay 0
2018-11-22 00:49:47 -05:00
company-minimum-prefix-length 3))
2018-12-11 19:33:59 -05:00
2018-07-17 23:27:53 -04:00
(use-package flycheck
:ensure t
:hook
2018-07-18 13:45:26 -04:00
(prog-mode . flycheck-mode)
:config
(setq flycheck-check-syntax-automatically '(save
2018-11-22 00:49:47 -05:00
idle-change
mode-enabled)
flycheck-idle-change-delay 2
flycheck-error-list-minimum-level 'warning
flycheck-navigation-minimum-level 'warning))
2018-12-11 19:33:59 -05:00
2018-07-17 23:27:53 -04:00
(use-package yasnippet
:ensure t)
(use-package yasnippet-snippets
:ensure t
:after yasnippet
:hook
((prog-mode . yas-minor-mode))
:config
(yas-reload-all))
2018-12-11 19:33:59 -05:00
;; (electric-pair-mode t)
2018-12-11 19:33:59 -05:00
(use-package flyspell-correct-helm
:ensure t
:after (helm flyspell))
2018-10-11 17:08:13 -04:00
2018-11-22 00:49:47 -05:00
;; (add-hook 'flyspell-mode-hook 'flyspell-buffer)
2018-12-11 19:33:59 -05:00
(add-hook 'prog-mode-hook #'prettify-symbols-mode)
2018-08-18 18:07:39 -04:00
(add-hook 'prog-mode-hook #'flyspell-prog-mode)
(setq flyspell-issue-message-flag nil)
2018-12-11 19:33:59 -05:00
(add-hook 'emacs-lisp-mode-hook 'company-mode)
2018-12-11 19:33:59 -05:00
(defun nd/init-ess-company ()
2018-10-10 19:23:21 -04:00
"Set the company backends for ess modes."
(setq-local company-backends '((company-R-objects company-R-args))))
(use-package ess
:ensure t
:init
(load "ess-site")
:hook
2018-07-18 12:06:51 -04:00
((ess-mode . flycheck-mode)
(ess-mode . company-mode)
(ess-mode . nd/init-ess-company)
(ess-mode . prettify-symbols-mode)
2018-07-18 15:39:30 -04:00
(ess-mode . fci-mode)
(inferior-ess-mode . company-mode)
(inferior-ess-mode . nd/init-ess-company)
(inferior-ess-mode . prettify-symbols-mode))
:config
(setq inferior-R-args "--quiet --no-save"
2018-11-22 00:49:47 -05:00
ess-history-file "session.Rhistory"
ess-history-directory (substitute-in-file-name "${XDG_CONFIG_HOME}/r/")))
2018-12-11 19:33:59 -05:00
2018-03-21 21:44:31 -04:00
(elpy-enable)
;; make python tabs 4 chars
(add-hook 'python-mode-hook
(lambda ()
(setq indent-tabs-mode t)
(setq tab-width 4)
2018-12-11 19:59:10 -05:00
(setq python-offset 4)))
2018-10-21 01:18:11 -04:00
(setq python-shell-interpreter "ipython"
python-shell-interpreter-args "--colors=Linux --profile=default")
2018-12-11 19:33:59 -05:00
(use-package haskell-mode
:ensure t
2018-07-20 00:50:51 -04:00
:config
(setq haskell-interactive-popup-errors nil))
(use-package intero
2018-07-22 07:37:44 -04:00
:ensure t
:after haskell-mode
2018-07-22 07:37:44 -04:00
:hook
(haskell-mode . intero-mode))
2018-12-11 19:33:59 -05:00
2018-11-18 23:30:26 -05:00
(add-hook 'haskell-mode-hook #'subword-mode)
2018-12-11 19:33:59 -05:00
2018-10-10 19:23:21 -04:00
(add-hook 'LaTeX-mode-hook #'flycheck-mode)
(add-hook 'Tex-latex-mode-hook #'flycheck-mode)
2018-12-11 19:33:59 -05:00
2018-10-10 19:23:21 -04:00
(defun nd/init-company-auctex ()
"Set the company backends for auctex modes."
(setq-local company-backends '((company-auctex-labels
2018-11-22 00:49:47 -05:00
company-auctex-bibs
company-auctex-macros
company-auctex-symbols
company-auctex-environments
;; company-latex-commands
company-math-symbols-latex
company-math-symbols-unicode))))
2018-10-10 19:23:21 -04:00
(use-package company-math
:ensure t
:after company
:config
(setq company-math-allow-unicode-symbols-in-faces '(font-latex-math-face)
2018-11-22 00:49:47 -05:00
company-math-disallow-latex-symbols-in-faces nil))
2018-10-10 19:23:21 -04:00
(use-package company-auctex
:ensure t
:after (company company-math)
:hook
((LaTeX-mode . company-mode)
(LaTeX-mode . nd/init-company-auctex)
(Tex-latex-mode . company-mode)
(Tex-latex-mode . nd/init-company-auctex)))
2018-12-11 19:33:59 -05:00
2018-10-11 14:19:49 -04:00
(defun nd/turn-on-auto-fill-maybe ()
"Prompts user to turn on `auto-fill-mode'."
(when (y-or-n-p "Activate Auto Fill Mode? ")
2018-11-22 00:49:47 -05:00
(turn-on-auto-fill)))
2018-10-11 14:19:49 -04:00
(add-hook 'LaTeX-mode-hook #'nd/turn-on-auto-fill-maybe)
(add-hook 'LaTeX-mode-hook #'fci-mode)
2018-12-11 19:33:59 -05:00
2018-10-11 17:08:13 -04:00
(add-hook 'LaTeX-mode-hook (lambda () (flyspell-mode 1)))
2018-12-11 19:33:59 -05:00
2018-12-11 20:16:02 -05:00
(org-babel-load-file (expand-file-name "org/org.org" nd/conf-dir))
2018-12-11 19:33:59 -05:00
2018-10-09 23:22:42 -04:00
(defun nd/helm-set-printer-name ()
2018-10-09 23:23:18 -04:00
"Set the printer name using helm-completion to select printer."
2018-10-09 23:22:42 -04:00
(interactive)
(let ((pl (or helm-ff-printer-list (helm-ff-find-printers))))
2018-11-22 00:49:47 -05:00
(if pl (setq printer-name (helm-comp-read "Printer: " pl)))))
2018-12-11 19:33:59 -05:00
(use-package magit
:ensure t
:config
:delight auto-revert-mode
(setq magit-push-always-verify nil
2018-11-22 00:49:47 -05:00
git-commit-summary-max-length 50))
2018-12-11 19:33:59 -05:00
(setq dired-no-confirm '(move copy))
2018-12-11 19:33:59 -05:00
(if (file-exists-p "/usr/bin/7z")
2018-11-22 00:49:47 -05:00
(add-to-list 'dired-compress-files-alist
'("\\.7z\\'" . "7z a %o %i")))
(if (file-exists-p "/usr/bin/lrzip")
2018-11-22 00:49:47 -05:00
(progn
(add-to-list 'dired-compress-files-alist
'("\\.lrz\\'" . "lrzip -L 9 -o %o %i &"))
(add-to-list 'dired-compress-files-alist
'("\\.lzo\\'" . "lrzip -l -L 9 -o %o %i &"))
(add-to-list 'dired-compress-files-alist
'("\\.zpaq\\'" . "lrzip -z -L 9 -o %o %i &"))))
;; NOTE: this must be after the shorter lrz algos otherwise it will
;; always default to .lrz and not .tar.lrz
(if (file-exists-p "/usr/bin/lrztar")
2018-11-22 00:49:47 -05:00
(progn
(add-to-list 'dired-compress-files-alist
'("\\.tar\\.lrz\\'" . "lrztar -L 9 -o %o %i &"))
(add-to-list 'dired-compress-files-alist
'("\\.tar\\.lzo\\'" . "lrztar -l -L 9 -o %o %i &"))
(add-to-list 'dired-compress-files-alist
'("\\.tar\\.zpaq\\'" . "lrztar -z -L 9 -o %o %i &"))))
2018-12-11 19:33:59 -05:00
(setq dired-listing-switches "-Alh")
2018-12-11 19:33:59 -05:00
;; from here:
;; https://www.djcbsoftware.nl/code/mu/mu4e/Dired.html#Dired
(require 'gnus-dired)
(eval-after-load 'gnus-dired
'(defun gnus-dired-mail-buffers ()
2018-11-22 00:49:47 -05:00
"Return a list of active mu4e message buffers."
(let (buffers)
(save-current-buffer
2018-11-22 00:49:47 -05:00
(dolist (buffer (buffer-list t))
(set-buffer buffer)
(when (and (derived-mode-p 'message-mode)
2018-11-22 00:49:47 -05:00
(null message-sent-message-via))
(push (buffer-name buffer) buffers))))
(nreverse buffers))))
(setq gnus-dired-mail-mode 'mu4e-user-agent)
(add-hook 'dired-mode-hook 'turn-on-gnus-dired-mode)
2018-12-11 19:33:59 -05:00
2018-10-03 00:11:05 -04:00
(use-package dired-du
:ensure t
:config
(setq dired-du-size-format t))
2018-12-11 19:33:59 -05:00
2018-11-02 00:07:18 -04:00
(defun nd/helm-devices ()
"Mount, unmount, and navigate to removable media using helm."
(interactive)
2018-11-02 00:07:18 -04:00
(let* ((mounted (mapcar
(lambda (d)
`(,(file-name-base d) . ,d))
(nd/get-mounted-directories)))
(mountable (seq-filter
(lambda (d) (not (member (car d) (mapcar #'car mounted))))
(nd/get-mountable-devices))))
(helm
:sources
(list
(helm-build-sync-source "Mounted Devices"
2018-11-22 00:49:47 -05:00
:candidates mounted
:action
'(("Open" . (lambda (s) (find-file s)))
2018-11-02 00:07:18 -04:00
("Unmount" . (lambda (s) (start-process "unmount" nil "udevil" "unmount" s)))))
(helm-build-sync-source "Mountable Devices"
2018-11-22 00:49:47 -05:00
:candidates mountable
:action
'(("Mount and Follow" . (lambda (s)
2018-11-02 00:07:18 -04:00
(nd/mount-device s)
(find-file (nd/get-mountpoint s))))
("Mount" . (lambda (s) (nd/mount-device s))))))
:buffer "*helm device buffer*"
:prompt "Device: ")))
2018-12-11 19:33:59 -05:00
2018-07-10 18:59:31 -04:00
(require 'mu4e)
2018-07-10 18:59:31 -04:00
(setq mail-user-agent 'mu4e-user-agent
2018-11-22 00:49:47 -05:00
mu4e-maildir "/mnt/data/Mail"
2018-07-15 11:23:55 -04:00
2018-11-22 00:49:47 -05:00
mu4e-attachment-dir "~/Downloads"
2018-07-17 22:49:04 -04:00
2018-11-22 00:49:47 -05:00
mu4e-view-show-images t
mu4e-headers-show-target nil
2018-12-03 21:03:32 -05:00
mu4e-view-show-addresses t
2018-11-22 00:49:47 -05:00
2018-07-17 22:49:04 -04:00
message-kill-buffer-on-exit t
2018-11-22 00:49:47 -05:00
mu4e-change-filenames-when-moving t
2018-07-15 11:23:55 -04:00
2018-11-22 00:49:47 -05:00
mu4e-confirm-quit nil
2018-11-22 00:49:47 -05:00
mu4e-view-prefer-html t
2018-11-22 00:49:47 -05:00
mu4e-compose-dont-reply-to-self t
2018-11-22 00:49:47 -05:00
mu4e-get-mail-command "systemctl --user start mbsync"
2018-09-15 00:18:47 -04:00
2018-11-22 00:49:47 -05:00
user-full-name "Dwarshuis, Nathan J")
2018-12-11 19:33:59 -05:00
2018-09-12 09:15:03 -04:00
(setq mu4e-headers-fields '((:human-date . 11)
2018-11-22 00:49:47 -05:00
(:flags . 5)
(:from . 22)
(:thread-subject))
mu4e-headers-date-format "%F"
mu4e-headers-time-format "%R"
mu4e-use-fancy-chars nil)
2018-12-11 19:33:59 -05:00
;; necessary for the header macros below
(require 'nnheader)
(defun nd/message-insert-citation-header ()
"Insert the header of the reply message."
(let* ((h message-reply-headers)
2018-11-22 00:49:47 -05:00
(sep "________________________________")
(from (concat "From: " (mail-header-from h)))
(date (concat "Sent: " (mail-header-date h)))
(to (concat "To: " user-full-name))
(subj (concat "Subject: " (message-strip-subject-re (mail-header-subject h)))))
(insert (string-join `("" ,sep ,from ,date ,to ,subj "") "\n"))))
(setq message-citation-line-function 'nd/message-insert-citation-header)
2018-09-21 01:59:59 -04:00
(setq message-yank-prefix "")
(setq message-yank-cited-prefix "")
(setq message-yank-empty-prefix "")
(setq
mu4e-compose-pre-hook
(lambda ()
(let* ((msg mu4e-compose-parent-message)
2018-11-22 00:49:47 -05:00
(html (and msg (plist-get msg :body-html)))
;; oops, mu4e screwed up
(mu4e-html2text-command
(if (file-exists-p "/usr/bin/html2text")
"html2text --ignore-emphasis --images-to-alt --body-width=0"
'mu4e-shr2text)))
(when (and html mu4e-view-prefer-html (member compose-type '(reply forward)))
;; hackity hack, since the normal mu4e-message-body-text function
;; does not render the desired html, do it here and force the
;; aforementioned function to only look at text by removing
;; the html
(plist-put msg :body-txt (mu4e~html2text-shell msg mu4e-html2text-command))
(plist-put msg :body-html nil)))))
2018-12-11 19:33:59 -05:00
2018-09-15 20:33:25 -04:00
(require 'smtpmail)
;; (require 'smtpmail-async)
2018-09-15 20:33:25 -04:00
;; (require 'secrets)
;; (setq secrets-enabled t)
(setq send-mail-function 'smtpmail-send-it
2018-11-22 00:49:47 -05:00
message-send-mail-function 'smtpmail-send-it)
2018-09-15 20:33:25 -04:00
(add-to-list 'auth-sources (expand-file-name "~/.emacs.d/.authinfo_mu4e.gpg"))
;; (add-to-list 'auth-sources "secrets:default")
2018-12-11 19:33:59 -05:00
2018-09-06 22:01:30 -04:00
(setq mu4e-context-policy 'pick-first
2018-11-22 00:49:47 -05:00
mu4e-compose-context-policy 'ask-if-none
mu4e-user-mail-address-list '("natedwarshuis@gmail.com" "ndwarshuis3@gatech.edu" "ndwarsh@emory.edu")
2018-09-06 22:01:30 -04:00
mu4e-contexts
2018-11-22 00:49:47 -05:00
`( ,(make-mu4e-context
:name "personal"
:match-func
(lambda (msg)
(when msg
(let ((pfx (mu4e-message-field msg :maildir)))
(string-prefix-p "/gmail" pfx))))
:vars '((mu4e-trash-folder . "/gmail/trash")
(mu4e-drafts-folder . "/gmail/drafts")
(mu4e-sent-folder . "/gmail/sent")
(mu4e-refile-folder . "/gmail/archive")
(mu4e-sent-messages-behavior . delete)
(smtpmail-stream-type . starttls)
(smtpmail-smtp-server . "smtp.gmail.com")
(smtpmail-smtp-service . 587)
(smtpmail-smtp-user . "natedwarshuis@gmail.com")
(user-mail-address . "natedwarshuis@gmail.com")
(mu4e-maildir-shortcuts .
(("/gmail/inbox" . ?i)
("/gmail/sent" . ?s)
("/gmail/trash" . ?t)
("/gmail/drafts" . ?d)
("/gmail/archive" . ?a)))))
,(make-mu4e-context
:name "gatech"
:match-func
(lambda (msg)
(when msg
(let ((pfx (mu4e-message-field msg :maildir)))
(string-prefix-p "/gatech" pfx))))
:vars '((mu4e-trash-folder . "/gatech/trash")
(mu4e-drafts-folder . "/gatech/drafts")
(mu4e-sent-folder . "/gatech/sent")
(mu4e-refile-folder . "/gatech/archive")
(mu4e-sent-messages-behavior . sent)
(smtpmail-stream-type . starttls)
(smtpmail-smtp-server . "smtp.office365.com")
(smtpmail-smtp-service . 587)
(smtpmail-smtp-user . "ndwarshuis3@gatech.edu")
(user-mail-address . "ndwarshuis3@gatech.edu")
(mu4e-maildir-shortcuts .
(("/gatech/inbox" . ?i)
("/gatech/sent" . ?s)
("/gatech/trash" . ?t)
("/gatech/drafts" . ?d)
("/gatech/archive" . ?a)))))
,(make-mu4e-context
:name "emory"
:match-func
(lambda (msg)
(when msg
(let ((pfx (mu4e-message-field msg :maildir)))
(string-prefix-p "/emory" pfx))))
:vars '((mu4e-trash-folder . "/emory/trash")
(mu4e-drafts-folder . "/emory/drafts")
(mu4e-sent-folder . "/emory/sent")
(mu4e-refile-folder . "/emory/archive")
(mu4e-sent-messages-behavior . sent)
(smtpmail-stream-type . starttls)
(smtpmail-smtp-server . "smtp.office365.com")
(smtpmail-smtp-service . 587)
(smtpmail-smtp-user . "ndwarsh@emory.edu")
(user-mail-address . "ndwarsh@emory.edu")
(mu4e-maildir-shortcuts .
(("/emory/inbox" . ?i)
("/emory/sent" . ?s)
("/emory/trash" . ?t)
("/emory/drafts" . ?d)
2018-11-22 00:49:47 -05:00
("/emory/archive" . ?a)))))))
2018-12-11 19:33:59 -05:00
(use-package org-mu4e
:after (org mu4e)
:config
(setq
;; for using mu4e in org-capture templates
org-mu4e-link-query-in-headers-mode nil
;; for composing rich-text emails using org mode
org-mu4e-convert-to-html t))
2018-12-11 19:33:59 -05:00
2018-09-16 15:17:00 -04:00
(setq mu4e-compose-signature-auto-include nil
2018-11-22 00:49:47 -05:00
mu4e-compose-signature
(string-join
'("Nathan Dwarshuis"
""
"PhD Student - Biomedical Engineering - Krish Roy Lab"
"Georgia Institute of Technology and Emory University"
"ndwarshuis3@gatech.edu")
"\n"))
2018-12-11 19:33:59 -05:00
(add-hook 'mu4e-compose-mode-hook 'turn-off-auto-fill)
(add-hook 'mu4e-compose-mode-hook 'visual-line-mode)
(add-hook 'mu4e-view-mode-hook 'turn-off-auto-fill)
(add-hook 'mu4e-view-mode-hook 'visual-line-mode)
2018-12-11 19:33:59 -05:00
2018-11-08 19:41:52 -05:00
(add-hook 'mu4e-compose-mode-hook (lambda () (flyspell-mode 1)))
2018-12-11 19:33:59 -05:00
(load "auctex.el" nil t t)
(require 'tex-mik)
(setq TeX-view-program-selection '(((output-dvi has-no-display-manager)
2018-11-22 00:49:47 -05:00
"dvi2tty")
((output-dvi style-pstricks)
"dvips and gv")
(output-dvi "xdvi")
(output-pdf "Okular")
(output-html "xdg-open")))
;; remove ugly section size
(setq font-latex-fontify-sectioning 'color)
(add-hook 'LaTeX-mode-hook (lambda () (outline-minor-mode 1)))
(add-hook 'Tex-latex-mode-hook (lambda () (outline-minor-mode 1)))
(use-package outline-magic
:ensure t
:after outline)
2018-12-11 19:33:59 -05:00
(use-package org-ref
:ensure t
:after org
:config
(setq reftex-default-bibliography (expand-file-name "~/BibTeX/master.bib")
2018-11-22 00:49:47 -05:00
org-ref-bibliography-notes (expand-file-name "~/BibTeX/notes.org")
org-ref-default-bibliography (expand-file-name "~/BibTeX/master.bib")))
2018-09-12 16:46:59 -04:00
(use-package helm-bibtex
:ensure t
:after helm
:config
(setq bibtex-completion-bibliography (expand-file-name "~/BibTeX/master.bib")
2018-11-22 00:49:47 -05:00
bibtex-completion-library-path (expand-file-name "~/BibTeX/pdf")
bibtex-completion-pdf-field "File"))
2018-12-11 19:33:59 -05:00
2018-11-22 00:49:47 -05:00
(use-package ebib
:ensure t)
2018-12-11 19:33:59 -05:00
2018-03-21 21:44:31 -04:00
(defadvice ansi-term (before force-bash)
2018-07-21 18:41:42 -04:00
(interactive (list "/bin/zsh")))
2018-03-21 21:44:31 -04:00
(ad-activate 'ansi-term)
2018-09-16 23:46:33 -04:00
(defun nd/term-send-raw-escape ()
"Send a raw escape character to the running terminal."
(interactive)
(term-send-raw-string "\e"))
2018-12-11 19:33:59 -05:00
2018-03-21 21:44:31 -04:00
(setq ediff-window-setup-function 'ediff-setup-windows-plain)
2018-12-11 19:33:59 -05:00
2018-07-14 20:42:20 -04:00
(use-package evil
:ensure t
:init
;; this is required to make evil collection work
(setq evil-want-integration nil)
:config
2018-07-21 17:30:35 -04:00
(evil-mode 1))
2018-12-11 19:33:59 -05:00
2018-09-11 08:26:05 -04:00
(setq sentence-end-double-space nil)
2018-12-11 19:33:59 -05:00
(add-to-list 'evil-motion-state-modes 'ess-help-mode)
(add-to-list 'evil-insert-state-modes 'inferior-ess-mode)
2018-12-11 19:33:59 -05:00
2018-08-18 18:06:18 -04:00
(use-package evil-surround
:ensure t
:after evil
:config
(global-evil-surround-mode 1))
2018-12-11 19:33:59 -05:00
2018-09-06 20:37:44 -04:00
(use-package evil-commentary
:ensure t
:after evil
:delight
:config
(evil-commentary-mode))
2018-12-11 19:33:59 -05:00
2018-09-06 20:37:44 -04:00
(use-package evil-replace-with-register
:ensure t
:after evil
:config
(evil-replace-with-register-install))
2018-12-11 19:33:59 -05:00
2018-07-21 17:30:35 -04:00
(mapc (lambda (k) (nd/move-key global-map evil-emacs-state-map (eval k)))
2018-11-22 00:49:47 -05:00
'((kbd "C-s")
(kbd "C-p")
(kbd "C-n")
(kbd "C-f")
(kbd "C-b")
(kbd "C-a")
(kbd "C-e")
(kbd "C-<SPC>")
(kbd "C-x C-;")
(kbd "C-x C-l")
(kbd "C-x C-u")
(kbd "C-x C-z")
(kbd "C-x C-c")
(kbd "M-c")
(kbd "M-d")
(kbd "M-e")
(kbd "M-r")
(kbd "M-f")
(kbd "M-h")
(kbd "M-j")
(kbd "C-M-j")
(kbd "M-k")
(kbd "M-l")
(kbd "M-m")
(kbd "M-q")
(kbd "M-w")
(kbd "M-t")
(kbd "M-u")
(kbd "M-i")
(kbd "M-z")
(kbd "M-v")
(kbd "M-/")
(kbd "M-;")
(kbd "M-DEL")))
2018-12-11 19:33:59 -05:00
2018-07-14 20:42:20 -04:00
(use-package evil-org
:ensure t
2018-07-14 22:16:32 -04:00
:after (evil org)
2018-07-14 20:42:20 -04:00
:delight
:config
2018-07-15 00:08:00 -04:00
(add-hook 'org-mode-hook 'evil-org-mode)
2018-07-14 22:32:34 -04:00
(add-hook 'evil-org-mode-hook 'evil-org-set-key-theme)
2018-07-14 20:42:20 -04:00
(require 'evil-org-agenda)
(evil-org-agenda-set-keys)
;; some of the defaults bug me...
(evil-define-key 'motion org-agenda-mode-map
2018-11-22 00:49:47 -05:00
"t" 'nd/toggle-project-toplevel-display
"D" 'org-agenda-day-view
"W" 'org-agenda-week-view
"M" 'org-agenda-month-view
"Y" 'org-agenda-year-view
"ct" nil
"sC" 'nd/org-agenda-filter-non-context
"sE" 'nd/org-agenda-filter-non-effort
"sD" 'nd/org-agenda-filter-delegate
"sP" 'nd/org-agenda-filter-non-peripheral
"e" 'org-agenda-set-effort
"ce" nil))
2018-12-11 19:33:59 -05:00
2018-07-20 02:47:34 -04:00
(use-package evil-magit
:ensure t
:after (evil magit))
2018-12-11 19:33:59 -05:00
2018-07-21 17:30:35 -04:00
(evil-define-key '(normal visual) 'visual-line-mode
"j" 'evil-next-visual-line
"k" 'evil-previous-visual-line
"0" 'beginning-of-visual-line
"$" 'end-of-visual-line)
2018-12-11 19:33:59 -05:00
(defun nd/comint-char-mode-evil-insert ()
2018-07-21 21:53:56 -04:00
"If not at the last line, go to the end of the buffer and enter insert mode. Else just enter insert mode."
(interactive)
(if (/= (line-number-at-pos (point)) (line-number-at-pos (point-max)))
2018-11-22 00:49:47 -05:00
(goto-char (point-max))))
(defun nd/comint-send-input-evil-insert (&optional send-input-cmd)
"Go into insert mode after calling SEND-INPUT-CMD which is usually
the function that send the command to the interactive process in the
REPL. If no SEND-INPUT-CMD then `comint-send-input' is used."
2018-07-21 21:53:56 -04:00
(interactive)
(if send-input-cmd (funcall send-input-cmd) (comint-send-input))
2018-07-21 21:53:56 -04:00
(evil-insert 1))
(evil-define-key '(normal insert) comint-mode-map
2018-08-01 11:39:47 -04:00
(kbd "C-k") 'comint-previous-input
(kbd "C-j") 'comint-next-input)
2018-12-11 19:33:59 -05:00
(evil-define-key 'normal inferior-ess-mode-map
(kbd "RET") (lambda () nd/comint-send-input-evil-insert
'inferior-ess-send-input))
2018-07-21 21:53:56 -04:00
(add-hook 'inferior-ess-mode-hook
2018-11-22 00:49:47 -05:00
(lambda ()
(add-hook 'evil-insert-state-entry-hook
'nd/comint-char-mode-evil-insert nil t)))
2018-12-11 19:33:59 -05:00
(evil-define-key 'normal intero-repl-mode-map
(kbd "RET") 'nd/comint-send-input-evil-insert)
(add-hook 'intero-repl-mode-hook
2018-11-22 00:49:47 -05:00
(lambda ()
(add-hook 'evil-insert-state-entry-hook
'nd/comint-char-mode-evil-insert nil t)))
2018-12-11 19:33:59 -05:00
2018-07-14 20:42:20 -04:00
(use-package evil-collection
:ensure t
:after evil
:init
(setq evil-collection-mode-list
2018-11-22 00:49:47 -05:00
'(company dired ediff flycheck helm minibuffer mu4e term which-key))
2018-07-20 00:50:51 -04:00
(setq evil-collection-setup-minibuffer t)
2018-07-14 22:05:02 -04:00
:config
(evil-collection-init))
2018-12-11 19:33:59 -05:00
(defun nd/dired-move-to-parent-directory ()
"Move buffer to parent directory (like 'cd ..')."
(interactive)
(find-alternate-file ".."))
(defun nd/dired-xdg-open ()
"Open all non-text files in external app using xdg-open.
Only regular files are considered."
(interactive)
(let* ((file-list (seq-filter #'file-regular-p (dired-get-marked-files)))
2018-11-22 00:49:47 -05:00
(do-it (if (<= (length file-list) 5)
t
(y-or-n-p "Open more then 5 files? "))))
(when do-it
(mapc
(lambda (f) (let ((process-connection-type nil))
(start-process "" nil "xdg-open" f)))
file-list))))
(defun nd/dired-open-with ()
"Open marked non-text files in external app via open-with dialog
according to mime types as listed in all available desktop files."
(interactive)
(let* ((mf (seq-filter #'file-regular-p (dired-get-marked-files)))
2018-11-22 00:49:47 -05:00
(qmf (mapcar #'shell-quote-argument mf))
(file-mime-list (mapcar (lambda (f) (list f (nd/get-mime-type f))) qmf)))
(if (= (length file-mime-list) 0)
(message "No files selected")
(let* ((first-pair (car file-mime-list))
(last-pairs (cdr file-mime-list))
mime-alist file-list)
(setq file-list (nth 0 first-pair)
mime-alist (nd/get-apps-from-mime (nth 1 first-pair)))
;; if multiple files selected, add to the selection list
(if last-pairs
(progn
(setq file-list (string-join (mapcar #'car file-mime-list) " "))
(dolist (mime (mapcar (lambda (f) (nth 1 f)) last-pairs))
(setq mime-alist (intersection mime-alist
(nd/get-apps-from-mime mime)
:test #'equal)))))
(if (= (length mime-alist) 0)
(let* ((ml (delete-dups (mapcan #'cdr file-mime-list)))
(mls (string-join ml ", ")))
(if (= (length ml) 1)
(message (concat "No apps found for mime type: " mls))
(message (concat "No common apps found for mime types: " mls))))
(helm
:sources (helm-build-sync-source "Apps"
:candidates mime-alist
:action '(("Open" . (lambda (f) (nd/execute-desktop-command f file-list)))))
:buffer "*helm open with*"))))))
(defun nd/dired-sort-by ()
"Sort current dired buffer by a list of choices presented in helm menu.
Note this assumes there are no sorting switches on `dired-ls'"
(interactive)
(let ((sort-alist '(("Name" . "")
2018-11-22 00:49:47 -05:00
("Date" . "-t")
("Size" . "-S")
("Extension" . "-X")
("Dirs First" . "--group-directories-first"))))
(helm
:sources
(helm-build-sync-source "Switches"
:candidates sort-alist
:action
'(("Sort" . (lambda (s) (dired-sort-other (concat dired-listing-switches " " s))))))
:buffer "*helm sort buffer*")))
2018-07-20 00:54:53 -04:00
(put 'dired-find-alternate-file 'disabled nil)
2018-07-20 00:33:40 -04:00
(evil-define-key 'normal dired-mode-map
"a" 'dired-find-file
"za" 'gnus-dired-attach
2018-09-01 15:49:24 -04:00
"gs" 'nd/dired-sort-by
2018-09-16 23:37:47 -04:00
"^" 'nd/dired-move-to-parent-directory
"q" 'nd/kill-current-buffer
2018-07-20 00:33:40 -04:00
(kbd "<return>") 'dired-find-alternate-file
(kbd "C-<return>") 'nd/dired-xdg-open
2018-09-16 23:37:47 -04:00
(kbd "M-<return>") 'nd/dired-open-with)
2018-12-11 19:33:59 -05:00
2018-07-21 17:30:35 -04:00
(evil-define-key '(normal insert) helm-map
(kbd "<tab>") 'helm-execute-persistent-action
(kbd "C-<tab>") 'helm-select-action)
2018-12-11 19:33:59 -05:00
2018-07-21 18:41:42 -04:00
(evil-define-key 'insert term-raw-map
2018-09-16 23:46:33 -04:00
(kbd "<escape>") 'nd/term-send-raw-escape
2018-07-21 18:41:42 -04:00
(kbd "C-<escape>") 'evil-normal-state)
2018-12-11 19:33:59 -05:00
2018-07-14 20:42:20 -04:00
(add-hook 'org-mode-hook
(lambda ()
2018-11-29 17:56:31 -05:00
;; override default TODO timestamp creation to insert the creation date
(local-set-key (kbd "M-S-<return>") 'nd/org-insert-todo-heading-inactive-timestamp)
2018-11-29 17:56:31 -05:00
2018-12-03 20:52:20 -05:00
;; use the hyper keys/vim arrows with the shifters instead of shift/arrows
(local-set-key (kbd "H-k") 'org-shiftup)
(local-set-key (kbd "H-l") 'org-shiftright)
(local-set-key (kbd "H-j") 'org-shiftdown)
(local-set-key (kbd "H-h") 'org-shiftleft)
2018-11-29 17:56:31 -05:00
;; this is just a useful function I made (actually I think I stole)
2018-07-14 20:42:20 -04:00
(local-set-key (kbd "C-c C-x x") 'nd/mark-subtree-done)
2018-11-29 17:56:31 -05:00
;; override default org subtree cloning with something that clones and resets
2018-07-14 20:42:20 -04:00
(local-set-key (kbd "C-c C-x c") 'nd/org-clone-subtree-with-time-shift)))
(add-hook 'org-agenda-mode-hook
(lambda ()
(local-set-key (kbd "C-c C-c") 'org-agenda-set-tags)
2018-12-04 23:28:33 -05:00
(local-set-key (kbd "C-c C-x c") 'nd/org-agenda-clone-subtree-with-time-shift)
(local-set-key (kbd "C-c C-x C-b") 'nd/org-agenda-toggle-checkbox)))
2018-12-11 19:33:59 -05:00
(define-key mu4e-headers-mode-map (kbd "C-c C-l") 'org-store-link)
(define-key mu4e-view-mode-map (kbd "C-c C-l") 'org-store-link)
2018-12-11 19:33:59 -05:00
(define-key dired-mode-map (kbd "C-x g") 'magit)
2018-12-11 19:33:59 -05:00
(define-key helm-command-prefix (kbd "b") 'helm-bibtex)
2018-09-21 01:04:04 -04:00
(define-key helm-command-prefix (kbd "S") 'helm-swoop)
(define-key helm-command-prefix (kbd "<f8>") 'helm-resume)
2018-10-11 17:08:13 -04:00
(define-key helm-command-prefix (kbd "f") 'helm-flyspell-correct)
(define-key helm-command-prefix (kbd "F") 'helm-multi-files)
2018-12-11 19:33:59 -05:00
(define-key outline-minor-mode-map (kbd "<tab>") 'outline-cycle)
2018-12-11 19:33:59 -05:00
2018-07-14 20:42:20 -04:00
(global-set-key (kbd "<f1>") 'org-agenda)
(global-set-key (kbd "<f2>") 'org-capture)
2018-07-21 02:44:10 -04:00
(global-set-key (kbd "<f3>") 'cfw:open-org-calendar)
(global-set-key (kbd "<f4>") 'org-clock-goto)
(global-set-key (kbd "<f5>") 'ansi-term)
(global-set-key (kbd "<f8>") 'helm-command-prefix)
2018-08-22 00:20:31 -04:00
(global-set-key (kbd "C-<f5>") 'nd/open-urxvt)
2018-07-18 10:35:37 -04:00
(global-set-key (kbd "<f12>") 'mu4e)
(global-set-key (kbd "C-<f12>") 'global-hl-line-mode)
2018-07-14 20:42:20 -04:00
(global-set-key (kbd "S-<f12>") 'display-line-numbers-mode)
2018-12-11 19:33:59 -05:00
(global-set-key (kbd "C-<SPC>") 'company-complete)
2018-07-14 20:42:20 -04:00
(global-set-key (kbd "C-c e") 'nd/config-visit)
2018-07-14 23:36:42 -04:00
(global-set-key (kbd "C-c r") 'nd/config-reload)
(global-set-key (kbd "C-c s") 'sudo-edit)
2018-07-14 20:42:20 -04:00
(global-set-key (kbd "C-x 2") 'nd/split-and-follow-horizontally)
(global-set-key (kbd "C-x 3") 'nd/split-and-follow-vertically)
2018-07-18 12:06:51 -04:00
(global-unset-key (kbd "C-x c"))
2018-07-18 10:35:37 -04:00
(global-set-key (kbd "C-x k") 'nd/kill-current-buffer)
(global-set-key (kbd "C-x C-d") 'helm-bookmarks)
2018-11-02 00:07:18 -04:00
(global-set-key (kbd "C-x C-c C-d") 'nd/helm-devices)
2018-07-14 23:36:42 -04:00
(global-set-key (kbd "C-x C-f") 'helm-find-files)
(global-set-key (kbd "C-x C-b") 'helm-buffers-list)
(global-set-key (kbd "C-M-S-k") 'nd/close-all-buffers)
(global-set-key (kbd "C-M-S-o") 'nd/org-close-all-buffers)
(global-set-key (kbd "C-M-S-a") 'org-agenda-kill-all-agenda-buffers)
2018-07-18 10:35:37 -04:00
2018-07-14 23:36:42 -04:00
(global-set-key (kbd "M-b") 'nd/switch-to-previous-buffer)
(global-set-key (kbd "M-o") 'ace-window)
(global-set-key (kbd "M-s") 'avy-goto-char)
(global-set-key (kbd "M-x") 'helm-M-x)