A literate emacs configuration


Set up package archives: live on the bleeding edge.

(require 'package)
(setq package-archives '(("melpa" . "http://melpa.milkbox.net/packages/")
                         ("elpa" . "http://elpa.gnu.org/packages/")
                         ("org" . "http://orgmode.org/elpa/")))

TODO Use use-package

List out all packages and install them if they're available.


With some text for comparison

Move the file out of init.el

(setq custom-file "~/.emacs.d/custom.el")
(load custom-file 'noerror)


Minimal UI

Do this first to try to get the flicker in the gui out of the way quickly

(tool-bar-mode -1)
(menu-bar-mode -1)
(if (boundp 'fringe-mode)
(fringe-mode -1))
(if (boundp 'scroll-bar-mode)
    (scroll-bar-mode -1))

Mouse support


Improve theme loading; from reddit

(defadvice load-theme (before clear-previous-themes activate)
  "Clear existing theme settings instead of layering them"
  (mapc #'disable-theme custom-enabled-themes))

Set up fonts

(set-face-attribute 'default nil :family "Iosevka" :height 130)
(set-face-attribute 'fixed-pitch nil :family "Iosevka" :height 130)
(set-face-attribute 'variable-pitch nil :family "Baskerville")

And a minimal startup

(setq inhibit-startup-message t)
(setq inhibit-splash-screen t)
(setq initial-scratch-message nil)

Disable the bell

(setq ring-bell-function 'ignore)

Buffer Switching

(winner-mode t)

Display line numbers mode

Activate on programming modes

(add-hook 'prog-mode-hook

Fill column

(setq fci-rule-column 80)

Scrolling more naturally


Compilation window output

(setq compilation-window-height 15)

Truncate lines

(setq-default truncate-lines t)

Sweet Title Bar

(add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
(add-to-list 'default-frame-alist '(ns-appearance . dark))


I can't type without vim bindings anymore.

(evil-mode t)

Allow some common typos

(evil-ex-define-cmd "W[rite]" 'save-buffer)
(evil-ex-define-cmd "V[split]" 'evil-window-vsplit)



Better source code window editing

(setq org-src-window-setup 'other-window)

Highlight and indent source code blocks

(setq org-src-fontify-natively t)
(setq org-src-tab-acts-natively t)
(setq org-edit-src-content-indentation 0)

Highlight quotes

(setq org-fontify-quote-and-verse-blocks t)

Enable languages

 '((emacs-lisp . t)
   (dot . t)
   (ditaa . t)
   (python . t)
   (C . t)
   (rust . t)))

Prevent confirmation

(setq org-confirm-babel-evaluate nil)

Use Web mode for HTML

(add-to-list 'org-src-lang-modes
             '("html" . web))


Hide markers

(setq org-hide-emphasis-markers t)

Clean bullets

(setq org-bullets-bullet-list
      '("◉" "○"))
(add-hook 'org-mode-hook
          (lambda ()
            (org-bullets-mode 1)
            (org-indent-mode t)))

Display images

(setq org-startup-with-inline-images t)
 (lambda ()
   (when org-inline-image-overlays

Enable auto-fill mode

 (lambda ()

Fontify whole lines

(setq org-fontify-whole-heading-line t)

Combined with evil

(evil-define-key 'normal org-mode-map (kbd "TAB") 'org-cycle)


(defun org-font-lock-ensure ()

Expert tagging

(Doesn't show the tag window till an extra C-c.)

(setq org-fast-tag-selection-single-key 'expert)

Tag clicks show sparse tree instead of agenda view

(defun tag-at-point-in-heading ()
  "Returns the tag at the current point in the string"
  (let ((str (buffer-string))
        (begin (point))
        (end (point)))
    (while (not (equal (aref str begin) ?:))
      (setq begin (- begin 1)))
    (while (not (equal (aref str end) ?:))
      (setq end (+ end 1)))
    (substring str (+ 1 begin) end)))

(defun open-sparse-view ()
  "Shows a sparse tree on clicking a tag instead of org-tags-view"
  ;; From org-open-at-point, sanity checking that we're on a headline with tags
  (when (and (org-element-lineage (org-element-context)
                                  '(headline inlinetask)
             (progn (save-excursion (beginning-of-line)
                                    (looking-at org-complex-heading-regexp))
                    (and (match-beginning 5)
                         (> (point) (match-beginning 5)))))
    (org-match-sparse-tree nil (concat "+" (tag-at-point-in-heading)))

(add-hook 'org-open-at-point-functions

Add support for not exporting headlines

(require 'ox-extra) ; from org-plus-contrib
(ox-extras-activate '(ignore-headlines))

Add support for publishing 'web' src as is

(defun org-babel-execute:web (body params)



(setq emamux:use-nearest-pane t)

Some useful shortcuts

(define-key evil-normal-state-map (kbd "C-c r") 'emamux:run-last-command)
(define-key evil-normal-state-map (kbd "C-c x") 'emamux:run-command)
(define-key evil-normal-state-map (kbd "C-c i") 'emamux:inspect-runner)


Keyboard shortcut

(define-key evil-normal-state-map (kbd "C-c c") 'recompile)

Man Pages

(setq Man-notify-method 'pushy)



(setq c-basic-offset 2)
(setq tab-width 2)
(setq-default indent-tabs-mode nil)

Backups & autosaves

(setq auto-save-default nil)
(setq backup-directory-alist
      `((".*" . ,temporary-file-directory)))
(setq auto-save-file-name-transforms
      `((".*" ,temporary-file-directory t)))

Better braces


(require 'smartparens-config)
(add-hook 'prog-mode-hook 'turn-on-smartparens-mode)
(define-key smartparens-mode-map (kbd "M-f") 'sp-forward-slurp-sexp)
(define-key smartparens-mode-map (kbd "M-b") 'sp-backward-slurp-sexp)
(define-key smartparens-mode-map (kbd "M-F") 'sp-forward-barf-sexp)
(define-key smartparens-mode-map (kbd "M-B") 'sp-backward-barf-sexp)
(define-key smartparens-mode-map (kbd "M-s") 'sp-splice-sexp)
(define-key smartparens-mode-map (kbd "C-k") 'sp-kill-sexp)

Highlight parenthesis

(show-paren-mode t)


(add-hook 'before-save-hook 'whitespace-cleanup)
(setq require-final-newline t)



(require 'helm-config)
(global-set-key (kbd "M-x") #'helm-M-x)
(global-set-key (kbd "C-x C-f") #'helm-find-files)
(setq helm-M-x-fuzzy-match 't)
(setq helm-mode-fuzzy-match 't)
(setq helm-completion-in-region-fuzzy-match 't)
(helm-mode 1)

IDO: disabled, experimenting with Helm

(setq ido-enable-flex-matching t)
(setq ido-everywhere t)
(ido-mode t)

Smex: disabled, experimenting with Helm for a bit

(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "M-X") 'smex-major-mode-commands)
(global-set-key (kbd "C-c M-x") 'execute-extended-command)

Language/Project specific


Trigger python mode

(add-to-list 'auto-mode-alist '(".*/BUCK$" . python-mode))


Set up chicken scheme

(setq scheme-program-name "/usr/local/bin/csi -:c")

Web Mode

(setq web-mode-markup-indent-offset 2)
(setq web-mode-css-indent-offset 2)
(setq web-mode-code-indent-offset 2)

(setq web-mode-style-padding 2)
(setq web-mode-script-padding 2)

(setq web-mode-auto-quote-style 2) ; use single quotes


(add-hook 'rust-mode-hook #'racer-mode)
(add-hook 'rust-mode-hook
          (lambda ()
           (define-key rust-mode-map (kbd "TAB") #'company-indent-or-complete-common)))
(add-hook 'racer-mode-hook #'eldoc-mode)
(add-hook 'flycheck-mode-hook #'flycheck-rust-setup)

Version Control

Disable by default

(setq vc-handled-backends ())

Customize Monky, for when it's loaded

Use command server for speed

(setq monky-process-type 'cmdserver)

And add support for a nicer log file

(defun hg-file-history ()
  (require 'monky)
   "\n{rev}) {date|shortdate}/{author|user}\n{desc|fill68}\n↘\n"


Current file name

(defun path ()
  (message (buffer-file-name)))


Show all the windows on start

(setq gdb-many-windows 't)


Simple theme

(setq neo-theme 'ascii)


Hide permissions and owners to make file lists less noisy (from Xah Lee's blog)

(add-hook 'dired-mode-hook
          (lambda ()
            (dired-hide-details-mode 1)))

Disable ls by default in dired

(setq dired-use-ls-dired nil)


Default to mac

(setq browse-url-browser-function 'browse-url-default-macosx-browser)

Enable cookies

(setq w3m-use-cookies t)

Auto completion

(add-hook 'prog-mode-hook 'company-mode)
(setq company-tooltip-align-annotations t)

Buffer Management

Close buffers

From StackOverflow

(defun close-all-buffers ()
  (mapc 'kill-buffer (buffer-list)))

Reload files

(defun revert-all-buffers ()
  (dolist (buf (buffer-list))
    (with-current-buffer buf
      (when (buffer-file-name)
        (revert-buffer t t t)))))


(defun desaturate-color (color-hex)
  "Converts a color string to its desaturated equivalent hex string"
  (require 'color)
   (append (apply
             `(,@(apply 'color-rgb-to-hsl (color-name-to-rgb color-hex)) 100)))

(defun transform-theme-colors (fn)
  "Apply FN to the colors on every active face.

   FN should accept the face symbol and the current color,
   and return the new color to be applied."
   (lambda (face)
      (lambda (attr)
        (let ((current (face-attribute face attr)))
          (unless (or (not current)
                      (listp current)
                      (string= current "unspecified")
                      (string= current "t"))
            (set-face-attribute face nil attr (funcall fn face current)))))
      '(:foreground :background :underline :overline :box :strike-through
      (lambda (complex-attr)
        (let* ((full (copy-tree (face-attribute face complex-attr)))
               (current (if (listp full) (member :color full))))
          (unless (or (not current)
                      (not (listp full)))
            (setcar (cdr current) (funcall fn face (cadr current)))
            (set-face-attribute face nil complex-attr full))))
      '(:underline :overline :box)))

(defun desaturate-theme ()
  "As title: desaturate all currently active face colorsj."
   (lambda (face color)
     (desaturate-color color))))

(defun invert-theme ()
  "Take the complement of all currently active colors."
  (require 'color)
   (lambda (face color)
      (color-complement color))))
  (let ((current-ns-appearance (assoc 'ns-appearance default-frame-alist)))
    (cond ((eq (cdr current-ns-appearance) 'light)
           (setf (cdr current-ns-appearance) 'dark))
          ((eq (cdr current-ns-appearance) 'dark)
           (setf (cdr current-ns-appearance) 'light)))))

Mode Line

(setq mode-line-format
               "%& %b%n"
               " ~ "
               " ~ "
view source