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

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

And a font such that variable-pitch is neutralized

(mapc
 (lambda (face)
   (set-face-attribute
    face
    nil
    :family "DejaVu Sans Mono"
    :height 120
    :width 'normal
    :weight 'normal))
 '(default variable-pitch))

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)

Large mode-lines (stolen from Jazz, etc.)

(defun apply-box-attributes (face)
  (set-face-attribute face nil
   :box `(:line-width 5
          :color ,(face-attribute face :background))))
(mapc #'apply-box-attributes
      '(mode-line mode-line-inactive mode-line-highlight
        header-line))

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)

Enable additional 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))
; (org-babel-do-load-languages 'org-babel-load-language '())

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

(add-hook 'org-mode-hook
          (lambda ()
            (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)))

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)

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)

Reload files

(defun revert-all-buffers ()
  (interactive)
  (dolist (buf (buffer-list))
    (with-current-buffer buf
      (when (buffer-file-name)
        (revert-buffer t t 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)

Flycheck

(global-flycheck-mode)

Linum mode

(setq linum-format "%d ")
view source