expLog

A literate emacs configuration

Packages

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/")))
(package-initialize)

TODO Use use-package

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

Customization

With some text for comparison

Move the file out of init.el

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

UI

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

(xterm-mouse-mode)

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
          'display-line-numbers-mode)

Fill column

(setq fci-rule-column 80)

Scrolling more naturally

(pixel-scroll-mode)

Compilation window output

(setq compilation-window-height 15)

Truncate lines by in code

(add-hook 'prog-mode
          (lambda ()
            (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 . light))

Evil

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)

Org

Babel

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

(add-to-list 'org-babel-load-languages '(emacs-lisp . t))
(add-to-list 'org-babel-load-languages '(dot . t))
(add-to-list 'org-babel-load-languages '(ditaa . t))
(add-to-list 'org-babel-load-languages '(ipython . t))
(add-to-list 'org-babel-load-languages '(python . t))
(add-to-list 'org-babel-load-languages '(C . t))
(org-babel-do-load-languages 'org-babel-load-languages '())

Prevent confirmation

(setq org-confirm-babel-evaluate nil)

Use Web mode for HTML

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

UI

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)
(add-hook
 'org-babel-after-execute-hook
 (lambda ()
   (when org-inline-image-overlays
     (org-redisplay-inline-images))))

Enable auto-fill mode

(add-hook
 'org-mode-hook
 (lambda ()
   (auto-fill-mode)))

Fontify whole lines

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

Combined with evil

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

Bugfixes

(defun org-font-lock-ensure ()
  (font-lock-fontify-buffer))

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)
                                  t)
             (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)))
    't))

(add-hook 'org-open-at-point-functions
          'open-sparse-view)

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)
  body)

Emamux

Customization

(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)

Compiling

Keyboard shortcut

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

Man Pages

(setq Man-notify-method 'pushy)

Editing

Indentation

(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

Smartparens

(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)

Whitespace

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

Menus

IDO

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

Smex

(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

BUCK

Trigger python mode

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

Scheme

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

Rust

(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 ()
  (interactive)
  (require 'monky)
  (monky-run-hg-async
   "log"
   "--template"
   "\n{rev}) {date|shortdate}/{author|user}\n{desc|fill68}\n↘\n"
   buffer-file-name))

Utilities

Current file name

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

GDB

Show all the windows on start

(setq gdb-many-windows 't)

Neotree

Simple theme

(setq neo-theme 'ascii)

Dired

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)

Browsing

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 ()
  (interactive)
  (mapc 'kill-buffer (buffer-list)))

Reload files

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

Desaturate

(defun desaturate-color (color-hex)
  "Converts a color string to its desaturated equivalent hex string"
  (require 'color)
  (apply
   'color-rgb-to-hex
   (apply
    'color-hsl-to-rgb
    (apply
     'color-desaturate-hsl
     `(,@(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."
  (interactive)
  (mapc
   (lambda (face)
     (mapc
      (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
                    :distant-foreground))
     (mapc
      (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)))
   (face-list)))

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

(defun invert-theme ()
  "Take the complement of all currently active colors."
  (interactive)
  (require 'color)
  (transform-theme-colors
   (lambda (face color)
     (apply
      'color-rgb-to-hex
      (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
              (list
               "%& %b%n"
               " ~ "
               "%m"
               " ~ "
               "%l:%c"))
view source