Skip to content

Latest commit

 

History

History
1084 lines (1002 loc) · 34.7 KB

init.org

File metadata and controls

1084 lines (1002 loc) · 34.7 KB

Setup

Personal info and constants

(defconst as/emacs-directory (concat (getenv "HOME") "/.emacs.d/"))
(defconst as/config (concat (getenv "HOME") "/projects/emacs-config/"))
(defconst as/elisp (concat (getenv "HOME") "/projects/emacs-config/elisp/"))
(setq as/org (concat (getenv "HOME") "/org/")
      as/agenda (concat as/org "agenda/")
      as/views (concat (getenv "HOME") "/org/views/")
      as/gtd (concat as/org "gtd.org"))
(add-to-list 'load-path as/elisp)
(add-to-list 'load-path as/config)
(let ((default-directory  as/elisp))
  (normal-top-level-add-subdirs-to-load-path))
(setq user-full-name "Andrew Sanchez"
      user-mail-address "[email protected]")

Package management

(require 'package)
    (add-to-list 'load-path "packages")
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("marmalade" . "http://marmalade-repo.org/packages/")
        ("melpa" . "http://melpa.milkbox.net/packages/")
        ("melpa-stable" . "http://stable.melpa.org/packages/")
        ("elpy" . "https://jorgenschaefer.github.io/packages/")
        ("org" . "http://orgmode.org/elpa/")))
  (package-initialize)
  (unless (package-installed-p 'use-package)
    (package-refresh-contents)
    (package-install 'use-package))
  (eval-when-compile
    (require 'use-package))
  (setq use-package-always-ensure t)
  (setq use-package-verbose t)
(use-package diminish
  :config
  (diminish 'undo-tree-mode))
(setq server-socket-dir (expand-file-name "server" user-emacs-directory))
(server-start)

Tangle init.el

Automatically tangle this file on save.

(defun as/tangle-dotfiles ()
  "If the current file is in 'as/config, tangle blocks"
  (when (equal (file-name-directory (directory-file-name buffer-file-name))
               as/config)
    (org-babel-tangle)
    (message "%s tangled" buffer-file-name)))
(add-hook 'after-save-hook #'as/tangle-dotfiles)

Helpful

(use-package helpful
  :commands
  (helpful-callable
   helpful-function
   helpful-macro
   helpful-command
   helpful-key
   helpful-variable
   helpful-at-point)
  :init
  (global-set-key (kbd "C-h f") #'helpful-callable)
  (global-set-key (kbd "C-h v") #'helpful-variable)
  (global-set-key (kbd "C-h k") #'helpful-key)
  (global-set-key (kbd "C-h o") #'helpful-at-point))

Custom set variables

(setq custom-file (expand-file-name "custom.el" as/elisp))
(when (file-exists-p custom-file)
  (load custom-file))

General Binding Config

Also check out smex

 (global-set-key (kbd "C-6") 'evil-switch-to-windows-last-buffer)
 (global-set-key (kbd "C-w") 'evil-window-next)
 (global-set-key (kbd "C-x f") 'helm-find-files)
 
   (use-package which-key
	:defer 10
	:config
	(which-key-mode))

Toggles

(evil-leader/set-key "ts" 'flyspell-mode)

Evil

(use-package evil-leader
  :config
  (global-evil-leader-mode)
  (setq evil-leader/in-all-states t)
  (setq evil-leader/non-normal-prefix "C-")
  (evil-leader/set-leader "<SPC>"))

(use-package evil
    :config
    (evil-mode 1))

(use-package evil-nerd-commenter
  :config
  (evil-leader/set-key
    "ci" 'evilnc-comment-or-uncomment-lines
    "cl" 'evilnc-quick-comment-or-uncomment-to-the-line
    "ll" 'evilnc-quick-comment-or-uncomment-to-the-line
    "cc" 'evilnc-copy-and-comment-lines
    "cp" 'evilnc-comment-or-uncomment-paragraphs
    "cr" 'comment-or-uncomment-region
    "cv" 'evilnc-toggle-invert-comment-line-by-line
    "."  'evilnc-copy-and-comment-operator
    "\\" 'evilnc-comment-operator))

(use-package evil-surround
    :config
    (global-evil-surround-mode 1))

(use-package evil-lisp-state
    :init (setq evil-lisp-state-global t)
    :config (evil-lisp-state-leader "<SPC> k"))

;; (use-package bind-map) 

(use-package evil-matchit
  :config
  (require 'evil-matchit)
  (global-evil-matchit-mode 1))

Exclude list

(add-to-list 'evil-emacs-state-modes 'dired-mode)
(add-to-list 'evil-emacs-state-modes 'flycheck-error-list-mode)
(evil-set-initial-state 'Info-mode 'emacs)

(evil-set-initial-state 'realgud-short-key-mode 'emacs)
(evil-set-initial-state 'realgud-track-mode 'emacs)
(evil-set-initial-state 'pdb-track-mode 'emacs)

(add-to-list 'evil-emacs-state-modes 'realgud-short-key-mode)
(add-to-list 'evil-emacs-state-modes 'realgud-track-mode)
(add-to-list 'evil-emacs-state-modes 'pdb-track-mode)

Navigation

(use-package avy
  :init
  (defhydra hydra-avy (:color blue)
    "avy-goto"
    ("c" avy-goto-char "char")
    ("C" avy-goto-char-2 "char-2")
    ("w" avy-goto-word-1 "word")
    ("s" avy-goto-subword-1 "subword")
    ("l" avy-goto-line "line")
    ("u" link-hint-open-link "open-URI")
    ("U" link-hint-copy-link "copy-URI"))
  (evil-leader/set-key "j" 'hydra-avy/body)
  :commands hydra-avy/body
  :config
  (use-package link-hint))

Misc

(use-package expand-region
  :commands (er/expand-region)
  :config
  (global-set-key (kbd "C-=") 'er/expand-region))

(evil-leader/set-key
  "!" 'shell-command)

Modeline

Display a more compact mode line

(use-package smart-mode-line
    :init
    (setq sml/no-confirm-load-theme t)
    (sml/setup))
(display-time-mode 1)

Helm

Also check out ivy and swiper and helm-swiper.

 (use-package helm
   :init
   (evil-leader/set-key
	"sg" 'helm-google-suggest
	"<SPC>" 'helm-M-x
	"sj" 'helm-semantic-or-imenu
	"ha" 'helm-apropos
	"ho" 'helm-info-org
	"hi" 'helm-info
	"ss" 'helm-occur)
   :commands
   (helm-google-suggest helm-M-x helm-semantic-or-imenu helm-apropos helm-occur helm-info-org)
   :bind (("M-y" . helm-show-kill-ring)
	   ("C-h a" . helm-apropos)
	   ("M-x" . helm-M-x)
	   ("C-x b" . helm-buffers-list))
   :config
   (require 'helm-config))

   (use-package helm-descbinds
     :bind (("C-h b" . helm-descbinds)))

Hydra

(use-package hydra)

Buffers

(defhydra hydra-buffers (:color blue)
  "Buffers"
  ("d" kill-this-buffer "kill buffer")
  ("s" (lambda () (interactive) (pop-to-buffer "*scratch*")) "*scratch*")
  ("i" (lambda () (interactive) (pop-to-buffer "*info*")) "*info*")
  ("h" (lambda () (interactive) (pop-to-buffer "*Help*")) "*Help*")
  ("e" (lambda () (interactive) (pop-to-buffer "*eshell*")) "*eshell*")
  ("m" (lambda () (interactive) (pop-to-buffer "*Messages*")) "*Messages*")
  ("b" helm-buffers-list "helm buffers list"))

(evil-leader/set-key "b" 'hydra-buffers/body)

Files

(evil-leader/set-key "f" 'hydra-files/body)

(defhydra hydra-files (:color blue)
  "Files"

  ("d" (lambda () (interactive)
         (find-file "~/projects/emacs-config/init.org"))
   "dot-file")

  ("g" (lambda () (interactive)
        (find-file "~/org/gtd.org"))
   "gtd")
  ("f" helm-find-files "helm-find-files")
  ("m" helm-multi-files "helm-multi-files")
  ("b" helm-filtered-bookmarks "helm-filtered-bookmarks")
  ("t" neotree-toggle "neotree-toggle")
  ("F" helm-tramp "helm-tramp")
  ("r" helm-recentf "recentf-open-files"))

Applications

;; (defhydra hydra-applications ()
;;   "Applications"
;;   ("d" deft "deft find file"))
(evil-leader/set-key "ad" 'deft)
(evil-leader/set-key "am" 'mu4e)

Yasnippet

(use-package yasnippet
  :diminish yas-minor-mode
  :init
  (defhydra hydra-yasnippet (:color blue :hint nil)
    "
                ^YASnippets^
  --------------------------------------------
    Modes:    Load/Visit:    Actions:

   _g_lobal  _d_irectory    _i_nsert
   _m_inor   _f_ile         _t_ryout
   _e_xtra   _l_ist         _n_ew
           _a_ll
  "
    ("d" yas-load-directory)
    ("e" yas-activate-extra-mode)
    ("i" yas-insert-snippet)
    ("f" yas-visit-snippet-file :color blue)
    ("n" yas-new-snippet)
    ("t" yas-tryout-snippet)
    ("l" yas-describe-tables)
    ("g" yas/global-mode)
    ("m" yas/minor-mode)
    ("a" yas-reload-all))
  (evil-leader/set-key "y" 'hydra-yasnippet/body)
  :defer 15
  ; not sure why this doesn't work
  ; :commands hydra-yasnippet/body
  :config
  (require 'yasnippet)
  (yas-global-mode 1))
  (use-package yasnippet-snippets)

Org-mode

(use-package org
  :mode (("\\.org$" . org-mode))
  :commands (org-agenda org-capture helm-info-org)
  :load-path "~/.emacs.d/packages/org-mode/lisp"
  :diminish org-mode
  :init
  ;; (add-to-list 'org-modules 'org-protcol)
  ;; (load-library "org-protocol")
  (require 'org-protocol)
  (evil-leader/set-key
      "oa" 'org-agenda
      "oc" 'org-capture
      "ot" 'hydra-org-clock/body)
  :config
  (load "org-config"))

Windows and frames

Toolbar

Save space by not showing the toolbar

(tool-bar-mode -1)

Golden ratio mode

(use-package golden-ratio
  :commands
  (evil-window-next
   evil-window-right
   evil-window-left
   evil-window-down
   evil-window-up)
  :config
  (golden-ratio-mode 1)
  (add-to-list 'golden-ratio-extra-commands 'evil-window-next)
  (add-to-list 'golden-ratio-extra-commands 'evil-window-right)
  (add-to-list 'golden-ratio-extra-commands 'evil-window-left)
  (add-to-list 'golden-ratio-extra-commands 'evil-window-down)
  (add-to-list 'golden-ratio-extra-commands 'evil-window-up))

Winner mode

Undo and redo window configuration

(use-package winner
  :init
  (evil-leader/set-key
    "wu" 'winner-undo
    "wr" 'winner-redo)
  :commands
  (winner-undo winner-redo)
  :config
  (winner-mode))

Zoom

(use-package zoom-frm
  :commands hydra-zoom)

(defhydra hydra-zoom (global-map "M-=")
  "zoom"
  ("g" text-scale-increase)
  ("l" text-scale-decrease)
  ("i" zoom-in)
  ("o" zoom-out))

Backups

;; Special dir for backups
(setq backup-directory-alist '(("." . "~/.emacs.d/backups")))
(setq create-lockfiles nil)

Magit

(use-package magit
  :init (evil-leader/set-key "gs" 'magit-status)
  :commands magit-status
  :config
  (setq magit-git-executable "~/usr/bin/git")
  (add-hook 'git-commit-mode-hook 'git-commit-turn-on-flyspell)
  (evil-set-initial-state 'git-commit-mode 'normal))

Better defaults

Also look at sensible-defaults

(show-paren-mode 1)
(menu-bar-mode -1)
(when (fboundp 'tool-bar-mode)
    (tool-bar-mode -1))
(when (fboundp 'scroll-bar-mode)
    (scroll-bar-mode -1))
(when (fboundp 'horizontal-scroll-bar-mode)
    (horizontal-scroll-bar-mode -1))

(require 'uniquify)
(setq uniquify-buffer-name-style 'forward)

(require 'saveplace)
(setq-default save-place t)
(fset 'yes-or-no-p 'y-or-n-p)
(setq initial-scratch-message "") ;; Uh, I know what Scratch is for

My own

(use-package visual-fill-column
  :init
  (global-visual-fill-column-mode)
  (evil-leader/set-key "tl" 'visual-fill-column-mode)
  :config
  (add-hook 'rst-mode-hook 'visual-line-mode))

Tramp

(setq tramp-default-method "ssh"
      tramp-inline-compress-start-size 1000000
      tramp-verbose 1
      remote-file-name-inhibit-cache nil
      tramp-completion-reread-directory-timeout nil
      projectile-mode-line "Projectile")

(setq vc-ignore-dir-regexp
      (format "\\(%s\\)\\|\\(%s\\)"
              vc-ignore-dir-regexp
              tramp-file-name-regexp))

(use-package helm-tramp
  :commands helm-tramp
  :config
  (setq create-lockfiles nil)
  (add-hook 'helm-tramp-pre-command-hook '
            (lambda ()
              (projectile-mode 0)))
  (add-hook 'helm-tramp-quit-hook
            '(lambda ()
               (projectile-mode 1))))

Python

General

(use-package python
    :mode ("\\.py\\'" . python-mode)
    :interpreter ("python" . python-mode)
    :config
    (load "realgud")
    (flycheck-mode)

    (use-package anaconda-mode
      :config (anaconda-eldoc-mode) (anaconda-mode)
      ;; (add-to-list 'company-backends 'company-anaconda)
      )

    ;; (use-package ob-ipython
    ;;   :config (require 'ob-ipython))
    ;; (org-babel-do-load-languages
    ;;  'org-babel-load-languages
    ;;  (append org-babel-load-languages
    ;;          '((ipython . t)
    ;;            (python . t))))

    (add-hook 'before-save-hook 'py-isort-before-save)
    (add-hook 'python-mode-hook 'smartparens-mode)
    (add-hook 'inferior-python-mode-hook 'smartparens-mode)
    (add-hook 'rst-mode-hook 'turn-on-flyspell)

    (setq python-shell-exec-path '("~/miniconda3/bin/python"))

    (defhydra hydra-python (:color blue :hint nil)
    "
    ^Navigation^                  ^Elpy^                 ^Formatting^
    -------------------------------------------------------------------------
    _d_: find definitions      _t_: elpy-test           _y_: yapfify-buffer
    _a_: find assignments      _z_: switch to shell     _i_: py-isort-buffer
    _r_: find references       _c_: send region/buffer  _f_: flycheck
    _s_: show doc              _C_: send statement      _x_: sphinx-doc
    _v_: pyvenv-activate     
    _V_: pyvenv-deactivate
    _w_: venv-workon
    _W_: venv-deactivate
    _p_: pdb
    "
        ("d" elpy-goto-definition)
        ("a" anaconda-mode-find-assignments)
        ("r" anaconda-mode-find-references)
        ("s" elpy-doc)
        ("S" helm-pydoc)
        ("y" yapfify-buffer)
        ("v" pyvenv-activate)
        ("V" pyvenv-deactivate)
        ("w" venv-workon)
        ("W" venv-deactivate)
        ("i" py-isort-buffer)
        ("f" hydra-flycheck/body)
        ("x" sphinx-doc)
        ("p" realgud:pdb)
        ("t" elpy-hydra/body)
        ("z" elpy-shell-switch-to-shell)
        ("c" elpy-shell-send-region-or-buffer)
        ("C" elpy-shell-send-current-statement))
        (evil-leader/set-key-for-mode 'python-mode "m" 'hydra-python/body)
        (evil-leader/set-key-for-mode 'rst-mode "m" 'hydra-python/body)

      (use-package sphinx-doc
        :commands (sphinx-doc)
        :config (sphinx-doc-mode)) 

    (use-package helm-pydoc :commands helm-pydoc)

    (use-package py-isort :commands py-isort-buffer
      :config (require 'py-isort))

    (use-package virtualenvwrapper :commands (venv-workon)
      :config 
      (venv-initialize-interactive-shells)
      (venv-initialize-eshell)
      (setq venv-location "/Users/andrew/miniconda3/envs"))

    (use-package elpy
      :init (with-eval-after-load 'python (elpy-enable))
      :config 
      (setq python-shell-interpreter "ipython"
            python-shell-interpreter-args "-i --simple-prompt")
      (pyvenv-mode)
      (defun projectile-pyenv-mode-set ()
        "Set pyenv version matching project name."
        (let ((project (projectile-project-name)))
          (if (member project (pyenv-mode-versions))
              (pyenv-mode-set project)
            (pyenv-mode-unset))))
      (add-hook 'projectile-after-switch-project-hook 'projectile-pyenv-mode-set)

      (defhydra elpy-hydra (:color red)
        "
        Elpy in venv: %`pyvenv-virtual-env-name
        "
        ("t" (progn (call-interactively 'elpy-test-pytest-runner) (elpy-nav-errors/body)) "pytest" :color blue)
        ("w" (venv-workon) "workon venv…")
        ("q" nil "quit")
        ("Q" (kill-buffer "*compilation*") "quit and kill compilation buffer" :color blue))

      (defhydra elpy-nav-errors (:color red)
        " Navigate errors "
        ("n" next-error "next error")
        ("p" previous-error "previous error")
        ("s" (progn
               (switch-to-buffer-other-window "*compilation*")
               (goto-char (point-max))) "switch to compilation buffer" :color blue)
        ("q" nil "quit")
        ("Q" (kill-buffer "*compilation*") "quit and kill compilation buffer" :color blue))))

Fix faulty completion bug

Source: jorgenschaefer/elpy#887 Fixes this error message: Warning (python): Your ‘python-shell-interpreter’ doesn’t seem to support readline, yet ‘python-shell-completion-native’ was t and “ipython3” is not part of the ‘python-shell-completion-native-disabled-interpreters’ list. Native completions have been disabled locally.

(with-eval-after-load 'python
  (defun python-shell-completion-native-try ()
    "Return non-nil if can trigger native completion."
    (let ((python-shell-completion-native-enable t)
          (python-shell-completion-native-output-timeout
           python-shell-completion-native-try-output-timeout))
      (python-shell-completion-native-get-completions
       (get-buffer-process (current-buffer))
       nil "_"))))

HPC

Slurm

(add-to-list 'load-path (concat as/elisp "slurm"))
(require 'slurm-mode)
(require 'slurm-script-mode)

Yapfify

(use-package yapfify :commands yapfify-buffer)

Exec-path-from-shell

(use-package exec-path-from-shell)
(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))

Smartparens

(use-package smartparens
  :defer 5
  :config
  (require 'smartparens-config)
  (smartparens-global-mode)
  (autoload 'smartparens-mode "paredit" "Turn on pseudo-structural editing of Lisp code." t)
  (add-hook 'eval-expression-minibuffer-setup-hook #'smartparens-mode)
  (defhydra hydra-smartparens (:hint nil)
    "
Sexps (quit with _q_)

^Nav^            ^Barf/Slurp^                 ^Depth^
^---^------------^----------^-----------------^-----^-----------------
_f_: forward     _<left>_:    slurp forward   _R_:      splice
_b_: backward    _<right>_:   barf forward    _r_:      raise
_u_: backward ↑  _C-<left>_:  slurp backward  _<up>_:   raise backward
_d_: forward ↓   _C-<right>_: barf backward   _<down>_: raise forward
_p_: backward ↓
_n_: forward ↑

^Kill^           ^Misc^                       ^Wrap^
^----^-----------^----^-----------------------^----^------------------
_w_: copy        _j_: join                    _(_: wrap with ( )
_k_: kill        _s_: split                   _{_: wrap with { }
^^               _t_: transpose               _'_: wrap with ' '
^^               _c_: convolute               _\"_: wrap with \" \"
^^               _i_: indent defun"
    ("q" nil)
    ;; Wrapping
    ("(" (lambda (a) (interactive "P") (sp-wrap-with-pair "(")))
    ("{" (lambda (a) (interactive "P") (sp-wrap-with-pair "{")))
    ("'" (lambda (a) (interactive "P") (sp-wrap-with-pair "'")))
    ("\"" (lambda (a) (interactive "P") (sp-wrap-with-pair "\"")))
    ;; Navigation
    ("f" sp-forward-sexp )
    ("b" sp-backward-sexp)
    ("u" sp-backward-up-sexp)
    ("d" sp-down-sexp)
    ("p" sp-backward-down-sexp)
    ("n" sp-up-sexp)
    ;; Kill/copy
    ("w" sp-copy-sexp)
    ("k" sp-kill-sexp)
    ;; Misc
    ("t" sp-transpose-sexp)
    ("j" sp-join-sexp)
    ("s" sp-split-sexp)
    ("c" sp-convolute-sexp)
    ("i" sp-indent-defun)
    ;; Depth changing
    ("R" sp-splice-sexp)
    ("r" sp-splice-sexp-killing-around)
    ("<up>" sp-splice-sexp-killing-backward)
    ("<down>" sp-splice-sexp-killing-forward)
    ;; Barfing/slurping
    ("<right>" sp-forward-slurp-sexp)
    ("<left>" sp-forward-barf-sexp)
    ("C-<left>" sp-backward-barf-sexp)
    ("C-<right>" sp-backward-slurp-sexp)))

Projectile

(use-package projectile
  :init
  (evil-leader/set-key "p" 'helm-projectile)
  :commands (helm-projectile-switch-project helm-projectile)
  :config
  (evil-leader/set-key "p" 'projectile-command-map)
  (projectile-mode)
  (setq projectile-enable-caching t)
  (use-package helm-projectile
    :config
    (require 'helm-projectile)
    (helm-projectile-on))
  (defun projectile-test-suffix (project-type)
      "Find default test files suffix based on PROJECT-TYPE."
      (cond
      ((member project-type '(python-tox)) "_test"))))

Themes and fonts

 (use-package solarized-theme
   :config
   (evil-leader/set-key "tt" 'toggle-theme))
 (load-theme 'solarized-dark t)
 (setq active-theme 'solarized-dark)
 (defun toggle-theme ()
   (interactive)
   (if (eq active-theme 'solarized-light)
	(setq active-theme 'solarized-dark)
     (setq active-theme 'solarized-light))
   (load-theme active-theme))
 (set-face-attribute 'default t :font 
   "-*-Source Code Pro-normal-normal-normal-*-*-*-*-*-m-0-iso10646-1")
 (set-face-attribute 'default nil :height 140)

Completion

Company

(use-package company
  :diminish company-mode
  :config
  (global-company-mode))

Words

Wordnut

(use-package wordnut
  :commands (wordnut-search wordnut-lookup-current-word)
  :load-path "packages/wordnut"
  :config
  (require 'wordnut)
  (setq wordnut-cmd "/usr/local/bin/wn"))

Helm-wordnet

(use-package helm-wordnet
  :commands helm-wordnet
  :load-path "packages/helm-wordnet"
  :config
  (setq helm-wordnet-prog "/usr/local/bin/wn"))
  (evil-leader/set-key
    "wd" 'helm-wordnet)

Google translate

(use-package google-translate
  :commands (google-translate-at-point google-translate-smooth-translate)
  :config
  (setq google-translate-default-source-language "nl")
  (setq google-translate-default-target-language "en")
  (evil-leader/set-key
    "wp" 'google-translate-at-point
    "ww" 'google-translate-smooth-translate))

Display

(use-package linum-relative
    :config
    (linum-relative-global-mode))
(setq column-number-mode t)

Flycheck

(use-package flycheck
  :init
  (add-hook 'after-init-hook 'global-flycheck-mode)
  :config
  (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc))
  (defhydra hydra-flycheck
    (:pre (progn (setq hydra-lv t) (flycheck-list-errors))
    :post (progn (setq hydra-lv nil) (quit-windows-on "*Flycheck errors*"))
    :hint nil)
    "Errors"
    ("f"  flycheck-error-list-set-filter                            "Filter")
    ("n"  flycheck-next-error                                       "Next")
    ("p"  flycheck-previous-error                                   "Previous")
    ("gg" flycheck-first-error                                      "First")
    ("G"  (progn (goto-char (point-max)) (flycheck-previous-error)) "Last")
    ("q"  nil)))

Deft

 (use-package deft
   :commands deft
   :config
   (setq deft-directory "~/org")
   (setq deft-extensions '("txt" "org"))
   (setq deft-default-extension "org")
   (setq deft-recursive t)
   (setq deft-use-filename-as-title t)
   (setq deft-use-filter-string-for-filename t)
   (setq deft-ignore-file-regexp
	(concat "\\(?:"
		"archive\\.org\\'"
		"\\)")))

Elfeed

(use-package elfeed
    :commands elfeed
    :config
    (add-to-list 'evil-emacs-state-modes 'elfeed-search-mode)
    (use-package elfeed-org
      :config
      (require 'elfeed-org)
      (elfeed-org)
      (setq rmh-elfeed-org-files (list "~/org/elfeed.org"))))

Mail

smtp

(setq message-send-mail-function 'smtpmail-send-it
   starttls-use-gnutls t
   smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
   smtpmail-auth-credentials
     '(("smtp.gmail.com" 587 "[email protected]" nil))
   smtpmail-default-smtp-server "smtp.gmail.com"
   smtpmail-smtp-server "smtp.gmail.com"
   smtpmail-smtp-service 587)
(setq message-kill-buffer-on-exit t)

MU4E

(add-to-list 'load-path "/usr/local/Cellar/mu/HEAD-65863e4_1/share/emacs/site-lisp")
(require 'mu4e)
(add-hook 'message-send-hook (lambda () (mu4e-update-mail-and-index t)))
(require 'org-mu4e) ;; store org-mode links to messages
;;store link to message if in header view, not to header query
(setq org-mu4e-link-query-in-headers-mode nil)
(setq mu4e-confirm-quit nil)
(setq mu4e-change-filenames-when-moving t)
(setq mu4e-sent-messages-behavior 'delete)
(setq mu4e-mu-binary "/usr/local/bin/mu")
(setq mu4e-get-mail-command "/usr/local/bin/mbsync -a")
(setq mu4e-maildir (expand-file-name "~/Maildir"))
(setq mu4e-attachment-dir  (expand-file-name "~/Downloads"))
(setq mu4e-drafts-folder "/personal/drafts") 
(setq mu4e-sent-folder "/personal/sent")
(setq mu4e-trash-folder "/personal/trash")
(setq mu4e-refile-folder "/personal/all")
(setq mu4e-maildir-shortcuts
      '(("/personal/INBOX". ?i)
        ("/personal/sent" . ?s)
        ("/personal/trash" . ?t)
        ("/personal/all" . ?a)
        ("/personal/drafts" . ?d)
        ("/work/INBOX"          . ?w)
        ("/work/all"          . ?W)
        ("/work/sent"          . ?S)))
(evil-set-initial-state 'mu4e-view-mode 'motion)
(add-hook 'message-mode-hook 'turn-on-orgstruct++)
(add-hook 'mu4e-compose-mode-hook 'turn-on-flyspell)
(add-hook 'mu4e-compose-mode-hook 'visual-line-mode)
(add-hook 'mu4e-view-mode-hook 'visual-line-mode)

;; (require 'mu4e-multi)

;; (setq mu4e-multi-account-alist
;;       '(("personal"
;;          (user-mail-address . "[email protected]")
;;          (mu4e-drafts-folder . "/personal/drafts")
;;          (mu4e-refile-folder . "/personal/all")
;;          (mu4e-sent-folder . "/personal/sent")
;;          (mu4e-trash-folder . "/personal/trash")
;;          (mu4e-compose-signature .
;;                      (concat
;;                        "--\n"
;;                        "Andrew Sanchez\n")))
;;         ("work"
;;          (user-mail-address . "[email protected]")
;;          (mu4e-drafts-folder . "/work/drafts")
;;          (mu4e-refile-folder . "/work/all")
;;          (mu4e-sent-folder . "/work/sent")
;;          (mu4e-trash-folder . "/work/trash")
;;          (mu4e-compose-signature .
;;                        "--\nAndrew\nThe Fluent Forever Team"))))
;; (global-set-key (kbd "C-x m") 'mu4e-multi-compose-new)
;; (mu4e-multi-enable)

Gnus

(use-package gnus
  :commands gnus
  :config
    (add-to-list 'evil-emacs-state-modes 'gnus-group-mode)
    (setq gnus-select-method
	     '(nnimap "gmail"
		      (nnimap-address "imap.gmail.com")
		      (nnimap-server-port "993")
		      (nnimap-stream ssl)))
    (setq gnus-ignored-newsgroups "^to\\.\\|^[0-9. ]+\\( \\|$\\)\\|^[\"]\"[#'()]"
	     gnus-message-archive-group nil)
	     ;; mml2015-encrypt-to-self 
    ;; Attempt to encrypt all outgoin emails
    ;; (add-hook 'message-setup-hook 'mml-secure-message-encrypt)
    (eval-after-load 'gnus-group
    '(progn
	  (defhydra hydra-gnus-group (:color blue)
	    "Do?"
	    ("l" gnus-group-list-all-groups "List subscribed groups")
	    ("a" gnus-group-list-active "List groups on servers")
	    ("c" gnus-group-catchup-all "Read all")
	    ("G" gnus-group-make-nnir-group "Search server G G")
	    ("g" gnus-group-get-new-news "Refresh g")
	    ("s" gnus-group-enter-server-mode "Servers")
	    ("m" gnus-group-new-mail "Compose m OR C-x m")
	    ("#" gnus-topic-mark-topic "mark #")
	    ("q" nil "cancel"))
	  (define-key gnus-group-mode-map "," 'hydra-gnus-group/body)))

  ;; gnus-summary-mode
  (eval-after-load 'gnus-sum
    '(progn
	  (defhydra hydra-gnus-summary (:color blue)
	    "Do?"
	    ("s" gnus-summary-show-thread "Show thread")
	    ("h" gnus-summary-hide-thread "Hide thread")
	    ("n" gnus-summary-insert-new-articles "Refresh / N")
	    ("f" gnus-summary-mail-forward "Forward C-c C-f")
	    ("!" gnus-summary-tick-article-forward "Mail -> disk !")
	    ("p" gnus-summary-put-mark-as-read "Mail <- disk")
	    ("c" gnus-summary-catchup-and-exit "Read all c")
	    ("e" gnus-summary-resend-message-edit "Resend S D e")
	    ("R" gnus-summary-reply-with-original "Reply with original R")
	    ("r" gnus-summary-reply "Reply r")
	    ("W" gnus-summary-wide-reply-with-original "Reply all with original S W")
	    ("w" gnus-summary-wide-reply "Reply all S w")
	    ("#" gnus-topic-mark-topic "mark #")
	    ("q" nil "cancel"))
	  (define-key gnus-summary-mode-map "," 'hydra-gnus-summary/body)))

  ;; gnus-article-mode
  (eval-after-load 'gnus-art
    '(progn
	  (defhydra hydra-gnus-article (:color blue)
	    "Do?"
	    ("f" gnus-summary-mail-forward "Forward")
	    ("R" gnus-article-reply-with-original "Reply with original R")
	    ("r" gnus-article-reply "Reply r")
	    ("W" gnus-article-wide-reply-with-original "Reply all with original S W")
	    ("o" gnus-mime-save-part "Save attachment at point o")
	    ("w" gnus-article-wide-reply "Reply all S w")
	    ("q" nil "cancel"))
	  (define-key gnus-article-mode-map "," 'hydra-gnus-article/body)))

  (eval-after-load 'message
    '(progn (add-hook 'message-mode-hook 'flyspell-mode)
	  (defhydra hydra-message (:color blue)
	    "Do?"
	    ("ca" mml-attach-file "Attach C-c C-a")
	    ("cc" message-send-and-exit "Send C-c C-c")
	    ("q" nil "cancel"))
	  (global-set-key (kbd "C-c C-y") 'hydra-message/body))))

Hydra

(defhydra hydra-mail (:color blue)
  "Mail"
  ("M" mu4e "mu4e")
  ("m" mu4e~main-menu "mu4e main menu"))

Keyfreq

(use-package keyfreq
  :defer 5
  :config
  (require 'keyfreq)
  (setq keyfreq-excluded-commands
	  '(self-insert-command
	    abort-recursive-edit
	    forward-char
	    backward-char
	    previous-line
	    next-line
	    evil-a-WORD
	    evil-append
	    evil-backward-char
	    evil-backward-word-begin
	    evil-change
	    evil-change-line
	    evil-complete-next
	    evil-complete-previous
	    evil-delete
	    evil-delete-backward-char-and-join
	    evil-delete-char
	    evil-delete-line
	    evil-emacs-state
	    evil-end-of-line
	    evil-escape-emacs-state
	    evil-escape-insert-state
	    evil-escape-isearch
	    evil-escape-minibuffer
	    evil-escape-motion-state
	    evil-escape-visual-state))
  (keyfreq-mode 1)
  (keyfreq-autosave-mode 1))

Convenience

(use-package restart-emacs
  :init
  (evil-leader/set-key "qr" 'restart-emacs)
  :commands restart-emacs)

Neotree

(use-package neotree
  :commands  neotree-toggle
  :config
  (require 'neotree)
  (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
  (evil-define-key 'normal neotree-mode-map (kbd "SPC") 'neotree-quick-look)
  (evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
  (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter))

Debugging

NEXT Figure out how to defer realgud

(use-package realgud
  :commands realgud:pdb
  :config
  (add-hook 'realgud-short-key-mode-hook
      (lambda ()
        (local-set-key "\C-c" realgud:shortkey-mode-map)))
  (setq realgud:pdb-command-name "python -m pdb"
        realgud-safe-mode nil))

Fun

Gnugo

(use-package gnugo
  :commands gnugo
  :config
  (add-to-list 'evil-emacs-state-modes 'gnugo-board-mode)
  (add-hook 'gnugo-start-game-hook 'gnugo-image-display-mode)
  (setq gnugo-xpms 'gnugo-imgen-create-xpms))

Finance

Ledger

(use-package ledger-mode
  :mode "\\.ledger\\'"
  :config
  (use-package flycheck-ledger))

Music

(use-package eieio)
(use-package lyqi
  :load-path "~/.emacs.d/packages/lyqi"
  :mode (("\\.ly$" . lyqi-mode)
         ("\\.ily$" . lyqi-mode))
  :config
  (setq lyqi:prefered-languages '(english)
        lyqi:pdf-command "open"
        lyqi:midi-backend 'osx
        lyqi:pdf-command "open"
        lyqi:midi-command "open"))

Test

Future

Workgroups for Windows (for Emacs) It’s tedious setting Emacs’ window layout just the way you like it – splitting windows, adjusting their size, switching to the right buffers, etc. And even when it is set, it won’t stay that way for long. On top of that, you can’t save your window-configurations to disk, so you have to start over from scratch every time you restart Emacs.

There are solutions out there to parts of the problem – elscreen, revive.el, window-configuration-to-register, etc. – but none provide a complete solution. Workgroups does.

With Workgroups, you can:

Store an unlimited number of window configs

Save window configs to disk, and load them from disk

Kill and yank window configs

It also provides:

Animated window config morphing

Frame reversing and window movement

A concept of “base” and “working” configs, for maximum flexibility

Lots of other stuff

Description

This package provides tagged workspaces in Emacs, similar to workspaces in windows managers such as Awesome and XMonad (and somewhat similar to multiple desktops in Gnome or Spaces in OS X).

perspective.el provides multiple workspaces (or “perspectives”) for each Emacs frame. This makes it easy to work on many separate projects without getting lost in all the buffers.

Each perspective is composed of a window configuration and a set of buffers. Switching to a perspective activates its window configuration, and when in a perspective only its buffers are available by default.

It’s recommended that you install perspective.el from Marmalade using M-x package-install. Alternately, you may put it in your load path and run (require ‘perspective). Users of Debian 9 or later or Ubuntu 16.04 or later may simply apt-get install elpa-perspective.