2014-11-18 17:38:56 -07:00
;; -*- lexical-binding: t; -*-
2013-03-16 17:34:21 -06:00
;; =============================================================================
2013-03-15 11:35:58 -06:00
;; ___ _ __ ___ __ _ ___ ___
;; / _ \ '_ ` _ \ / _` |/ __/ __|
;; | __/ | | | | | (_| | (__\__ \
;; (_)___|_| |_| |_|\__,_|\___|___/
2013-03-16 17:34:21 -06:00
;; =============================================================================
2013-03-15 11:35:58 -06:00
2014-11-21 09:41:01 -07:00
2014-05-10 15:28:27 -06:00
( setq user-full-name
2014-10-22 20:33:47 -06:00
( replace-regexp-in-string " \n $ " " " ( shell-command-to-string
2014-12-14 03:39:02 -07:00
" git config --get user.name " ) ) )
2014-05-10 15:28:27 -06:00
( setq user-mail-address
2014-10-22 20:33:47 -06:00
( replace-regexp-in-string " \n $ " " " ( shell-command-to-string
2014-12-14 03:39:02 -07:00
" git config --get user.email " ) ) )
2013-03-15 11:35:58 -06:00
2014-11-19 18:39:21 -07:00
( defun emacs24_4-p ( )
( or ( and ( >= emacs-major-version 24 )
( >= emacs-minor-version 4 ) )
( >= emacs-major-version 25 ) ) )
2014-11-11 16:41:18 -07:00
;; =============================================================================
;; GUI Disables
;; =============================================================================
2014-12-06 22:46:36 -07:00
;; Turn off mouse interface early in startup to avoid momentary display
2014-11-11 16:41:18 -07:00
( when ( fboundp 'menu-bar-mode ) ( menu-bar-mode -1 ) )
( when ( fboundp 'tool-bar-mode ) ( tool-bar-mode -1 ) )
( when ( fboundp 'scroll-bar-mode ) ( scroll-bar-mode -1 ) )
2014-11-21 09:41:01 -07:00
;; These silence the byte compiler.
( defvar ido-cur-item nil )
( defvar ido-default-item nil )
( defvar ido-context-switch-command nil )
( defvar ido-cur-list nil )
( defvar predicate nil )
( defvar inherit-input-method nil )
2014-04-14 01:39:33 -06:00
;; =============================================================================
2014-11-18 17:38:56 -07:00
;; ELPA/package.el/MELPA
2014-04-14 01:39:33 -06:00
;; =============================================================================
( require 'package )
2014-11-12 00:36:24 -07:00
( add-to-list 'package-archives
' ( " marmalade " . " http://marmalade-repo.org/packages/ " ) t )
2014-11-11 17:31:59 -07:00
( add-to-list 'package-archives ' ( " elpa " . " http://tromey.com/elpa/ " ) t )
( add-to-list 'package-archives ' ( " org " . " http://orgmode.org/elpa/ " ) t )
( add-to-list 'package-archives ' ( " melpa " . " http://melpa.org/packages/ " ) t )
2014-10-29 09:45:30 -06:00
( defun ensure-packages-installed ( packages )
2014-11-12 00:36:24 -07:00
( unless package-archive-contents
( package-refresh-contents ) )
( mapcar
( lambda ( package )
( if ( package-installed-p package )
package
( progn ( message ( format " Installing package %s. " package ) )
( package-install package ) ) ) )
packages ) )
( package-initialize )
( ensure-packages-installed ' ( epl use-package ) )
( require 'use-package )
2014-11-21 21:33:31 -07:00
( use-package benchmark-init
:ensure t
;; Set do-benchmark in custom.el
:if ( and ( boundp 'do-benchmark ) do-benchmark ) )
2014-10-08 05:02:27 -06:00
2014-11-21 17:39:31 -07:00
;; =============================================================================
;; Config Free Packages
;; =============================================================================
( defun use-packages ( packages )
( mapcar
( lambda ( package )
( use-package package :ensure t ) ) packages ) )
( defvar packages-eager
2014-12-06 13:48:22 -07:00
' ( popup auto-complete yasnippet cl-lib paradox slime
2014-11-21 17:39:31 -07:00
xclip dired+ ctags ctags-update aggressive-indent imenu+ neotree diminish
2014-11-22 05:10:02 -07:00
gist ) )
2014-11-21 17:39:31 -07:00
( use-packages packages-eager )
2014-11-18 17:38:56 -07:00
;; =============================================================================
2014-10-29 09:45:30 -06:00
;; Disables
;; =============================================================================
2014-10-24 06:04:21 -06:00
2014-11-21 03:32:19 -07:00
( setq visible-bell nil )
( setq sentence-end-double-space nil )
2014-10-29 09:45:30 -06:00
;; Disable the creation of backup files.
( setq backup-inhibited t )
( setq make-backup-files nil )
( setq auto-save-default nil )
2014-10-24 06:04:21 -06:00
2014-11-12 00:36:24 -07:00
( defconst emacs-tmp-dir
( format " %s/%s%s/ " temporary-file-directory " emacs " ( user-uid ) ) )
( setq backup-directory-alist ` ( ( " .* " . , emacs-tmp-dir ) ) )
( setq auto-save-file-name-transforms ` ( ( " .* " , emacs-tmp-dir t ) ) )
( setq auto-save-list-file-prefix emacs-tmp-dir )
2014-11-08 16:27:28 -07:00
2014-10-29 09:45:30 -06:00
( put 'set-goal-column 'disabled nil )
( auto-fill-mode -1 )
2014-11-13 22:53:57 -07:00
( setq indent-tabs-mode nil )
2014-11-19 16:24:14 -07:00
( setq flyspell-issue-welcome-flag nil )
2014-11-12 00:36:24 -07:00
;; No hsplits. EVER.
( defun split-horizontally-for-temp-buffers ( ) ( split-window-horizontally ) )
( add-hook 'temp-buffer-setup-hook 'split-horizontally-for-temp-buffers )
( setq split-height-threshold nil )
2014-11-13 22:04:25 -07:00
( setq split-width-threshold 160 )
2014-11-12 00:36:24 -07:00
2014-11-23 03:12:58 -07:00
;; No popup frames.
( setq ns-pop-up-frames nil )
( setq pop-up-frames nil )
2014-12-04 23:20:49 -07:00
( setq confirm-nonexistent-file-or-buffer nil )
;; No prompt for killing a buffer with processes attached.
( setq kill-buffer-query-functions
( remq 'process-kill-buffer-query-function
kill-buffer-query-functions ) )
( setq inhibit-startup-message t
inhibit-startup-echo-area-message t )
2014-12-06 03:18:28 -07:00
( when ( fboundp 'tooltip-mode ) ( tooltip-mode -1 ) )
2014-12-04 23:20:49 -07:00
( setq tooltip-use-echo-area t )
( setq use-dialog-box nil )
( defadvice yes-or-no-p ( around prevent-dialog activate )
" Prevent yes-or-no-p from activating a dialog "
( let ( ( use-dialog-box nil ) )
ad-do-it ) )
( defadvice y-or-n-p ( around prevent-dialog-yorn activate )
" Prevent y-or-n-p from activating a dialog "
( let ( ( use-dialog-box nil ) )
ad-do-it ) )
2014-11-23 03:12:58 -07:00
2014-11-20 19:51:26 -07:00
;; =============================================================================
;; functions
;; =============================================================================
2014-12-15 17:50:03 -07:00
( defmacro defvar-setq ( name value )
( if ( boundp name )
` ( setq , name , value )
` ( defvar , name , value ) ) )
2014-12-24 02:17:38 -07:00
( defun eval-region-or-last-sexp ( )
( interactive )
( if ( region-active-p ) ( call-interactively 'eval-region ) ( call-interactively 'eval-last-sexp ) ) )
2014-11-29 12:08:48 -07:00
( defun undo-redo ( &optional arg )
( interactive " P " )
( if arg ( undo-tree-redo ) ( undo-tree-undo ) ) )
2014-11-25 09:27:11 -07:00
( defun up-list-region ( )
( interactive )
( up-list ) ( set-mark-command nil ) ( backward-sexp ) )
( defun up-list-back ( )
( interactive )
( up-list ) ( backward-sexp ) )
2014-11-25 01:54:37 -07:00
2014-11-21 09:41:01 -07:00
( defun unfill-paragraph ( &optional region )
" Takes a multi-line paragraph and makes it into a single line of text. "
( interactive ( progn
( barf-if-buffer-read-only )
( list t ) ) )
( let ( ( fill-column ( point-max ) ) )
( fill-paragraph nil region ) ) )
( defun fill-or-unfill-paragraph ( &optional unfill region )
2014-11-29 12:08:48 -07:00
" Fill paragraph (or REGION). With the prefix argument UNFILL,
unfill it instead. "
2014-11-21 09:41:01 -07:00
( interactive ( progn
( barf-if-buffer-read-only )
( list ( if current-prefix-arg 'unfill ) t ) ) )
( let ( ( fill-column ( if unfill ( point-max ) fill-column ) ) )
( fill-paragraph nil region ) ) )
2014-11-20 19:51:26 -07:00
( defun sudo-edit ( &optional arg )
" Edit currently visited file as root.
With a prefix ARG prompt for a file to visit.
Will also prompt for a file to visit if current
buffer is not visiting a file. "
( interactive " P " )
( if ( or arg ( not buffer-file-name ) )
( find-file ( concat " /sudo:root@localhost: "
( ido-read-file-name " Find file (as root): " ) ) )
( find-alternate-file ( concat " /sudo:root@localhost: " buffer-file-name ) ) ) )
( defun frame-exists ( )
2014-11-21 07:28:04 -07:00
( cl-find-if
( lambda ( frame )
( assoc 'display ( frame-parameters frame ) ) ) ( frame-list ) ) )
2014-11-20 19:51:26 -07:00
( defun make-frame-if-none-exists ( )
( let* ( ( existing-frame ( frame-exists ) ) )
( if existing-frame
existing-frame
( make-frame-on-display ( getenv " DISPLAY " ) ) ) ) )
( defun make-frame-if-none-exists-and-focus ( )
( make-frame-visible ( select-frame ( make-frame-if-none-exists ) ) ) )
( defun os-copy ( &optional b e )
( interactive " r " )
( shell-command-on-region b e " source ~/.zshrc; cat | smart_copy " ) )
( defun os-paste ( )
( interactive )
( insert ( shell-command-to-string " source ~/.zshrc; ospaste " ) ) )
( defun all-copy ( &optional b e )
( interactive " r " )
( os-copy b e )
( tmux-copy b e )
( kill-ring-save b e ) )
( defun open-pdf ( )
( interactive )
2014-11-21 07:25:11 -07:00
( let ( ( pdf-file ( replace-regexp-in-string
" \. tex$ " " .pdf " buffer-file-name ) ) )
2014-11-20 19:51:26 -07:00
( shell-command ( concat " open " pdf-file ) ) ) )
( defun tmux-copy ( &optional b e )
( interactive " r " )
( shell-command-on-region b e " cat | tmux loadb - " ) )
( defun eval-and-replace ( )
( interactive )
( backward-kill-sexp )
( condition-case nil
( prin1 ( eval ( read ( current-kill 0 ) ) )
( current-buffer ) )
( error ( message " Invalid expression " )
( insert ( current-kill 0 ) ) ) ) )
( defun flatten-imenu-index ( index )
2014-11-21 07:25:11 -07:00
( cl-mapcan
( lambda ( x )
( if ( listp ( cdr x ) )
( cl-mapcar ( lambda ( item )
` ( , ( concat ( car x ) " / " ( car item ) ) . , ( cdr item ) ) )
( flatten-imenu-index ( cdr x ) ) )
( list x ) ) ) index ) )
2014-11-20 19:51:26 -07:00
( defun flatten-imenu-index-function ( function )
( lambda ( ) ( flatten-imenu-index ( funcall function ) ) ) )
( defun flatten-current-imenu-index-function ( )
2014-11-21 07:25:11 -07:00
( setq imenu-create-index-function
( flatten-imenu-index-function imenu-create-index-function ) ) )
2014-11-23 03:12:58 -07:00
( defun notification-center ( title message )
( flet ( ( encfn ( s ) ( encode-coding-string s ( keyboard-coding-system ) ) ) )
( shell-command
( format " osascript -e 'display notification \" %s \" with title \" %s \" ' "
( encfn message ) ( encfn title ) ) ) ) )
( defun growl-notify ( title message )
( shell-command ( format " grownotify -t %s -m %s " title message ) ) )
2014-12-09 20:31:59 -07:00
( defun notify-send ( title message )
( shell-command ( format " notify-send -u critical %s %s " title message ) ) )
( defvar notify-function
( cond ( ( eq system-type 'darwin ) 'notification-center )
( ( eq system-type 'gnu/linux ) 'notify-send ) ) )
2014-12-02 08:05:35 -07:00
( defun project-root-of-file ( filename )
" Retrieves the root directory of a project if available.
The current directory is assumed to be the project 's root otherwise. "
( file-truename
( let ( ( dir ( file-truename filename ) ) )
( or ( --reduce-from
( or acc
( let* ( ( cache-key ( format " %s-%s " it dir ) )
2014-12-08 05:34:31 -07:00
( cache-value ( gethash cache-key
projectile-project-root-cache ) ) )
2014-12-02 08:05:35 -07:00
( if cache-value
( if ( eq cache-value 'no-project-root )
nil
cache-value )
( let ( ( value ( funcall it dir ) ) )
2014-12-08 05:34:31 -07:00
( puthash cache-key ( or value 'no-project-root )
projectile-project-root-cache )
2014-12-02 08:05:35 -07:00
value ) ) ) )
nil
projectile-project-root-files-functions )
( if projectile-require-project-root
( error " You're not in a project " )
default-directory ) ) ) ) )
2014-12-15 17:50:03 -07:00
;; =============================================================================
;; Load Path Configuration
;; =============================================================================
( defvar machine-custom " ~/.emacs.d/this-machine.el " )
( setq custom-file " ~/.emacs.d/custom.el " )
( when ( file-exists-p custom-file ) ( load custom-file ) )
( when ( file-exists-p machine-custom ) ( load machine-custom ) )
2014-10-29 09:45:30 -06:00
;; =============================================================================
;; General Emacs Options
;; =============================================================================
2014-10-17 20:11:48 -06:00
2014-10-29 09:45:30 -06:00
;; This makes it so that emacs --daemon puts its files in ~/.emacs.d/server
( setq server-use-tcp t )
2013-03-15 11:35:58 -06:00
;; Display line and column numbers in mode line.
( line-number-mode t )
( column-number-mode t )
2014-10-25 18:49:54 -06:00
( global-linum-mode t )
2014-11-23 03:12:58 -07:00
( setq visible-bell t )
2014-11-22 05:10:02 -07:00
( show-paren-mode 1 )
2014-11-18 17:38:56 -07:00
;; Make buffer names unique.
2014-11-12 00:36:24 -07:00
( setq uniquify-buffer-name-style 'forward )
2013-03-15 11:35:58 -06:00
2014-12-04 23:20:49 -07:00
;; We want closures.nil
2014-11-18 17:38:56 -07:00
( setq lexical-binding t )
2013-03-16 17:34:21 -06:00
;; Don't disable downcase and upcase region.
( put 'upcase-region 'disabled nil )
( put 'downcase-region 'disabled nil )
2014-11-19 16:24:14 -07:00
;; Make forward word understand camel and snake case.
2013-03-16 17:34:21 -06:00
( setq c-subword-mode t )
2014-12-04 23:20:49 -07:00
;; Preserve pastes. Why wouldn't this be enabled by default.
( setq save-interprogram-paste-before-kill t )
2014-11-24 18:01:54 -07:00
( setq-default cursor-type 'box )
( setq-default cursor-in-non-selected-windows 'bar )
2014-10-29 09:45:30 -06:00
( add-hook 'after-init-hook ' ( lambda ( ) ( setq debug-on-error t ) ) )
2014-11-12 00:36:24 -07:00
2014-11-19 23:54:53 -07:00
;; Make mouse scrolling less jumpy.
( setq mouse-wheel-scroll-amount ' ( 1 ( ( shift ) . 1 ) ) )
2014-12-08 02:02:57 -07:00
( eval-after-load 'subword ' ( diminish 'subword-mode ) )
2014-12-12 21:35:00 -07:00
( eval-after-load 'simple ' ( diminish 'visual-line-mode ) )
2014-12-08 02:02:57 -07:00
2014-12-08 05:34:31 -07:00
( display-time-mode 1 )
2014-12-11 16:30:18 -07:00
( setq reb-re-syntax 'string )
( setq ediff-split-window-function 'split-window-horizontally )
2014-12-08 05:34:31 -07:00
;; =============================================================================
;; use-package
;; =============================================================================
2014-11-23 03:12:58 -07:00
2014-12-06 13:48:22 -07:00
;; Set path from shell.
( use-package exec-path-from-shell
:ensure t
:config ( exec-path-from-shell-initialize ) )
2014-12-11 17:14:58 -07:00
( use-package yasnippet
:ensure t
:config
( progn
( yas-global-mode )
( diminish 'yas-minor-mode )
2014-12-18 10:29:50 -07:00
( setq yas-prompt-functions
( cons 'yas-ido-prompt
( cl-delete 'yas-ido-prompt yas-prompt-functions ) ) ) ) )
2014-12-11 17:14:58 -07:00
2014-11-21 12:03:00 -07:00
( use-package tramp
:commands tramp
:config
( setq tramp-default-method " ssh " ) )
2014-11-13 16:21:24 -07:00
2014-11-21 09:41:01 -07:00
;; text mode stuff:
( remove-hook 'text-mode-hook #' turn-on-auto-fill )
( add-hook 'text-mode-hook 'turn-on-visual-line-mode )
( setq sentence-end-double-space nil )
;; y and n instead of yes and no
( defalias 'yes-or-no-p 'y-or-n-p )
2014-11-24 18:01:54 -07:00
( use-package discover-my-major :ensure t )
2014-11-21 03:32:19 -07:00
( use-package guide-key
:ensure t
:config
( progn
2014-11-25 01:54:37 -07:00
( setq guide-key/guide-key-sequence
2014-12-10 09:16:21 -07:00
' ( " C-c " " C-c p " " C-x C-k " " C-x r " " C-h " " C-x c " " C-x x " ) )
2014-11-21 03:32:19 -07:00
( guide-key-mode 1 )
2014-11-23 03:12:58 -07:00
( diminish 'guide-key-mode )
2014-11-21 03:32:19 -07:00
( setq guide-key/idle-delay 0.25 )
( setq guide-key/recursive-key-sequence-flag t )
( setq guide-key/popup-window-position 'bottom ) ) )
2014-12-22 11:09:03 -07:00
( use-package jump-char
:bind ( ( " C-; " . jump-char-forward ) )
:ensure t )
2014-12-10 01:39:41 -07:00
2014-11-12 00:36:24 -07:00
( use-package ace-jump-mode
:ensure t
2014-12-12 21:35:00 -07:00
:commands ( ace-jump-mode imalison:ace-jump-mode )
:bind ( ( " C-j " . imalison:ace-jump-mode ) )
2014-11-19 16:24:14 -07:00
:init
( progn
( use-package ace-window
:ensure t
2014-12-04 23:37:56 -07:00
:config ( setq aw-keys ' ( ?a ?s ?d ?f ?g ?h ?j ?k ?l ) )
2014-11-19 16:24:14 -07:00
:bind ( " C-c w " . ace-select-window ) ) )
2014-11-12 00:36:24 -07:00
:config
2014-11-19 16:24:14 -07:00
( progn
2014-12-12 21:35:00 -07:00
( setq ace-jump-mode-scope 'window )
( defun imalison:ace-jump-mode ( &optional prefix )
( interactive " P " )
( let ( ( ace-jump-mode-scope ( if prefix 'global 'window ) ) )
( ace-jump-mode 0 ) ) ) ) )
2014-11-12 00:36:24 -07:00
2014-12-03 13:55:23 -07:00
( use-package ace-isearch
:ensure t
2014-12-12 05:34:07 -07:00
:disabled t ;; I just don't really use this much
2014-12-03 13:55:23 -07:00
:config
( progn
( global-ace-isearch-mode +1 )
2014-12-06 04:16:13 -07:00
( setq ace-isearch-use-function-from-isearch nil )
2014-12-12 05:34:07 -07:00
( setq ace-isearch-input-idle-delay 1 ) ) )
2014-12-03 13:55:23 -07:00
2014-12-18 10:29:50 -07:00
( use-package flycheck
:ensure t
:config
( progn
( setq flycheck-checkers ( delq 'emacs-lisp-checkdoc flycheck-checkers ) )
( diminish 'flycheck-mode ) ) )
2014-11-21 07:25:11 -07:00
2014-11-12 00:36:24 -07:00
( use-package haskell-mode
:ensure t
:commands haskell-mode
:config
( progn
( add-hook 'haskell-mode-hook 'turn-on-haskell-indent ) ) )
( use-package rainbow-delimiters
:ensure t
:commands rainbow-delimiters-mode
:init
( progn
( add-hook 'prog-mode-hook ( lambda ( ) ( rainbow-delimiters-mode t ) ) ) ) )
2014-10-29 03:24:33 -06:00
2014-12-12 05:34:07 -07:00
( use-package diff-hl :ensure t )
2014-11-13 16:21:24 -07:00
( use-package magit
:ensure t
:commands magit-status
2014-11-14 17:48:45 -07:00
:bind ( ( " C-x g " . magit-status ) )
:config
2014-11-21 09:41:01 -07:00
( progn
( diminish 'magit-auto-revert-mode )
2014-11-22 05:10:02 -07:00
( use-package magit-filenotify
2014-12-09 20:31:59 -07:00
;; Seems like OSX does not support filenotify.
2014-11-21 17:39:31 -07:00
:disabled t
2014-11-21 09:41:01 -07:00
:ensure t
:if ( emacs24_4-p )
:config
:init ( add-hook 'magit-status-mode-hook 'magit-filenotify-mode ) ) ) )
2014-11-13 16:21:24 -07:00
2014-11-14 07:53:57 -07:00
( use-package auto-complete
:ensure t
:commands auto-complete-mode
:config
( diminish 'auto-complete-mode )
:init
( add-hook 'prog-mode-hook ( lambda ( ) ( auto-complete-mode t ) ) ) )
2014-11-30 19:47:56 -07:00
( use-package company
:ensure t
:commands company-mode
2014-12-12 05:34:07 -07:00
:bind ( ( " C- \\ " . company-complete ) )
:config
( progn
( setq company-idle-delay .25 )
( global-company-mode )
( add-to-list 'company-backends 'mu4e-contacts-company )
( diminish 'company-mode ) )
2014-11-30 19:47:56 -07:00
:init
( add-hook 'prog-mode-hook ( lambda ( ) ( company-mode t ) ) ) )
2014-11-14 08:04:55 -07:00
( use-package expand-region
:ensure t
:commands er/expand-region
2014-11-19 18:36:45 -07:00
:config ( setq expand-region-contract-fast-key " j " )
:bind ( ( " C-c k " . er/expand-region ) ) )
2014-11-14 08:04:55 -07:00
2014-11-21 11:43:09 -07:00
( use-package multiple-cursors
2014-11-21 12:03:00 -07:00
:config
( progn
( use-package phi-search-mc
:ensure t
:config
( phi-search-mc/setup-keys ) )
( use-package mc-extras
:ensure t
:config
( define-key mc/keymap ( kbd " C-. = " ) 'mc/compare-chars ) ) )
2014-11-21 11:43:09 -07:00
:bind
( ( " C-c m a " . mc/mark-all-like-this )
( " C-c m m " . mc/mark-all-like-this-dwim )
( " C-c m l " . mc/edit-lines )
( " C-c m n " . mc/mark-next-like-this )
( " C-c m p " . mc/mark-previous-like-this )
( " C-c m s " . mc/mark-sgml-tag-pair )
( " C-c m d " . mc/mark-all-like-this-in-defun ) ) )
2014-11-19 16:24:14 -07:00
( use-package undo-tree
:ensure t
2014-11-29 12:08:48 -07:00
:bind ( ( " C-- " . undo-redo )
( " C-c u " . undo-tree-visualize )
( " C-c r " . undo-tree-redo ) )
2014-11-20 00:12:13 -07:00
:config
( diminish 'undo-tree-mode )
2014-11-19 16:24:14 -07:00
:init
( progn
2014-11-23 03:12:58 -07:00
;;(setq undo-tree-visualizer-diff t) ;; This causes performance problems
2014-11-19 16:24:14 -07:00
( global-undo-tree-mode )
2014-11-23 03:12:58 -07:00
( setq undo-tree-visualizer-timestamps t ) ) )
2014-11-19 16:24:14 -07:00
( use-package smooth-scrolling
:ensure t
:init ( require 'smooth-scrolling ) )
( use-package smooth-scroll
:ensure t
:init
( progn
( smooth-scroll-mode )
2014-11-20 00:12:13 -07:00
( setq smooth-scroll/vscroll-step-size 8 ) )
:config
( diminish 'smooth-scroll-mode ) )
2014-11-19 16:24:14 -07:00
2014-11-20 03:26:12 -07:00
( use-package string-inflection
:ensure t
:commands string-inflection-toggle
:bind ( " C-c l " . string-inflection-toggle ) )
2014-12-08 05:34:31 -07:00
( use-package load-dir
:ensure t
:config
( progn
( add-to-list 'load-dirs " ~/.emacs.d/load.d " )
( defvar site-lisp " /usr/share/emacs24/site-lisp/ " )
( when ( file-exists-p site-lisp ) ( add-to-list 'load-dirs site-lisp ) ) ) )
2014-12-08 17:32:57 -07:00
( use-package recentf
;; binding is in helm.
:config
( progn
( recentf-mode 1 )
( setq recentf-max-menu-items 500 ) ) )
2014-11-21 11:43:09 -07:00
;; =============================================================================
;; Non-Programming Stuff
;; =============================================================================
2014-12-04 23:37:56 -07:00
( use-package helm-spotify
:ensure t
:commands helm-spotify )
( use-package edit-server
:ensure t
:commands edit-server-start
2014-12-20 02:20:54 -07:00
:idle ( edit-server-start )
:config
( progn
( setq edit-server-new-frame nil ) ) )
2014-12-04 23:37:56 -07:00
2014-11-25 01:54:37 -07:00
( use-package jabber
:ensure t
2014-11-25 09:24:44 -07:00
:commands jabber-connect
:config
( progn
2014-12-18 11:46:27 -07:00
( setq jabber-alert-presence-hooks nil )
2014-11-25 09:24:44 -07:00
( defun jabber-message-content-message ( from buffer text )
( when ( or jabber-message-alert-same-buffer
( not ( memq ( selected-window ) ( get-buffer-window-list buffer ) ) ) )
( if ( jabber-muc-sender-p from )
( format " %s: %s " ( jabber-jid-resource from ) text )
( format " %s: %s " ( jabber-jid-displayname from ) text ) ) ) )
( setq jabber-alert-message-function 'jabber-message-content-message ) ) )
2014-11-25 01:54:37 -07:00
2014-12-20 02:21:21 -07:00
( use-package htmlize :ensure t )
2014-11-20 18:39:42 -07:00
( use-package org
:ensure t
2014-11-25 01:54:37 -07:00
:commands ( org-mode org org-mobile-push org-mobile-pull org-agenda )
2014-11-23 03:12:58 -07:00
:mode ( " \\ .org \\ ' " . org-mode )
2014-11-28 13:54:07 -07:00
:bind ( ( " C-c a " . org-agenda )
2014-12-01 00:55:21 -07:00
( " C-c c " . org-capture )
2014-11-28 13:54:07 -07:00
( " C-c n t " . org-insert-todo-heading )
2014-12-02 08:05:35 -07:00
( " C-c n s " . org-insert-todo-subheading )
( " C-c n h " . org-insert-habit )
( " C-c n m " . org-make-habit )
2014-12-17 18:18:58 -07:00
( " C-c n l " . org-store-link )
( " C-c n i " . org-insert-link )
2014-12-04 23:20:49 -07:00
( " C-c C-t " . org-todo )
2014-12-10 01:39:41 -07:00
( " C-c C-S-t " . org-todo-force-notes ) )
2014-11-24 18:01:54 -07:00
:config
( progn
2014-12-10 01:39:41 -07:00
;; org-mode add-ons
2014-12-08 23:48:19 -07:00
( use-package org-present :ensure t )
2014-12-10 01:39:41 -07:00
( use-package org-projectile
:ensure t
:demand t
:bind ( ( " C-c n p " . imalison:org-projectile:project-todo ) )
:config
( progn
( defun imalison:org-projectile:project-todo ( &optional arg )
( interactive " P " )
( org-projectile:project-todo-completing-read
( if arg " * TODO %? %A \n " nil ) ) ) ) )
;; variable configuration
2014-12-10 09:16:21 -07:00
( add-to-list 'org-modules 'org-habit )
2014-12-10 01:39:41 -07:00
( setq org-src-fontify-natively t )
2014-12-04 23:37:56 -07:00
( setq org-habit-graph-column 50 )
2014-12-05 16:05:18 -07:00
( setq org-habit-show-habits-only-for-today t )
2014-12-10 01:39:41 -07:00
( setq org-lowest-priority 69 ) ;; The character E
( setq org-completion-use-ido t )
( setq org-enforce-todo-dependencies t )
;; Agenda setup.
2014-12-02 08:05:35 -07:00
( unless ( boundp 'org-gtd-file )
( defvar org-gtd-file " ~/org/gtd.org " ) )
( unless ( boundp 'org-habits-file )
( defvar org-habits-file " ~/org/habits.org " ) )
2014-12-14 02:49:14 -07:00
( unless ( boundp 'org-calendar-file )
( defvar org-calendar-file " ~/org/calendar.org " ) )
2014-12-15 17:50:03 -07:00
( unless ( boundp 'org-capture-templates )
( defvar org-capture-templates nil ) )
2014-12-08 16:13:53 -07:00
( setq org-agenda-files
( --filter ( file-exists-p it )
2014-12-14 02:49:14 -07:00
( list org-gtd-file org-habits-file org-projectile:projects-file
org-calendar-file ) ) )
2014-12-15 17:50:03 -07:00
2014-12-18 10:29:50 -07:00
( add-to-list 'org-capture-templates
` ( " c " " Calendar entry " entry
2014-12-24 02:16:52 -07:00
( file+headline , org-calendar-file " Personal " )
" * %? " ) )
2014-12-10 01:39:41 -07:00
2014-12-02 08:05:35 -07:00
( add-to-list 'org-capture-templates
` ( " h " " Habit " entry ( file+headline , org-habits-file " Habits " )
" * TODO
SCHEDULED: %t
:PROPERTIES:
:STYLE: habit
:END: " ))
2014-12-08 02:02:57 -07:00
( defun org-todo-force-notes ( )
( interactive )
( let ( ( org-todo-log-states
( mapcar ( lambda ( state )
( list state 'note 'time ) )
( apply 'append org-todo-sets ) ) ) )
( cond ( ( eq major-mode 'org-mode ) ( org-todo ) )
( ( eq major-mode 'org-agenda-mode ) ( org-agenda-todo ) ) ) ) )
( defun org-make-habit ( )
( interactive )
( org-set-property " STYLE " " habit " ) )
2014-12-08 14:00:48 -07:00
( add-to-list 'org-capture-templates
` ( " g " " GTD Todo " entry ( file+headline , org-gtd-file " Tasks " )
" * TODO %? \n " ) )
2014-12-09 20:31:59 -07:00
2014-12-08 02:02:57 -07:00
( defun org-insert-habit ( )
( interactive )
( org-insert-todo-heading nil )
( org-make-habit ) )
2014-12-02 15:14:34 -07:00
2014-12-13 22:29:48 -07:00
( defun org-todo-at-date ( date )
( interactive ( list ( org-time-string-to-time ( org-read-date ) ) ) )
2014-12-13 23:00:14 -07:00
( flet ( ( org-current-effective-time ( &rest r ) date )
( org-today ( &rest r ) ( time-to-days date ) ) )
2014-12-24 02:18:13 -07:00
( cond ( ( eq major-mode 'org-mode ) ( org-todo ) )
( ( eq major-mode 'org-agenda-mode ) ( org-agenda-todo ) ) ) ) )
2014-12-13 22:29:48 -07:00
2014-12-09 20:31:59 -07:00
( add-to-list 'org-capture-templates ( org-projectile:project-todo-entry " p " ) )
( add-to-list 'org-capture-templates ( org-projectile:project-todo-entry " l " " * TODO %? %a \n " ) )
2014-12-08 02:02:57 -07:00
2014-11-25 01:54:37 -07:00
( let ( ( this-week-high-priority
2014-12-02 15:14:34 -07:00
' ( tags-todo " +PRIORITY= \" A \" +DEADLINE< \" <+1w> \" DEADLINE> \" <+0d> \" "
2014-11-25 01:54:37 -07:00
( ( org-agenda-overriding-header
" Upcoming high priority tasks: " ) ) ) )
2014-12-02 15:14:34 -07:00
( due-today ' ( tags-todo
" +DEADLINE=< \" <+0d> \" "
2014-11-25 01:54:37 -07:00
( ( org-agenda-overriding-header
2014-12-02 15:14:34 -07:00
" Due today: " ) ) ) )
2014-11-25 01:54:37 -07:00
( missing-deadline
' ( tags-todo " -DEADLINE={.}/! "
( ( org-agenda-overriding-header
" These don't have deadlines: " ) ) ) )
( missing-priority
' ( tags-todo " -PRIORITY={.}/! "
( ( org-agenda-overriding-header
2014-11-25 03:45:20 -07:00
" These don't have priorities: " ) ) ) ) )
2014-11-25 01:54:37 -07:00
( setq org-agenda-custom-commands
` ( ( " M " " Main agenda view "
2014-12-02 15:14:34 -07:00
( , due-today
2014-11-25 01:54:37 -07:00
, this-week-high-priority
( agenda " "
( ( org-agenda-overriding-header " Agenda: " )
( org-agenda-ndays 5 )
( org-deadline-warning-days 0 ) ) )
, missing-deadline
, missing-priority )
nil nil )
, ( cons " A " ( cons " High priority upcoming " this-week-high-priority ) )
2014-12-02 15:14:34 -07:00
, ( cons " od " ( cons " Overdue tasks and due today " due-today ) ) ) ) )
2014-11-24 18:01:54 -07:00
;; Record changes to todo states
( setq org-log-into-drawer t )
( setq org-todo-keywords
2014-12-05 02:00:03 -07:00
' ( ( sequence " TODO(t!) " " STARTED(s!) " " WAIT(w!) " " | "
" DONE(d!) " " CANCELED(c!) " ) ) )
2014-11-24 18:01:54 -07:00
;; Stop starting agenda from deleting frame setup!
( setq org-agenda-window-setup 'other-window )
2014-11-25 01:54:37 -07:00
( define-key mode-specific-map [ ?a ] 'org-agenda )
2014-11-24 18:01:54 -07:00
( unbind-key " C-j " org-mode-map ) )
2014-11-20 18:39:42 -07:00
:init
2014-11-21 07:25:11 -07:00
( progn
2014-11-25 01:54:37 -07:00
;; Automatically sync with mobile
( defvar my-org-mobile-sync-timer nil )
2014-12-02 15:14:34 -07:00
( defvar my-org-mobile-sync-secs 120 )
2014-11-25 01:54:37 -07:00
( defun my-org-mobile-sync-pull-and-push ( )
( org-mobile-pull )
( org-mobile-push )
( when ( fboundp 'sauron-add-event )
( sauron-add-event 'me 1 " Called org-mobile-pull and org-mobile-push " ) ) )
( defun my-org-mobile-sync-start ( )
" Start automated `org-mobile-push' "
( interactive )
( setq my-org-mobile-sync-timer
( run-with-idle-timer my-org-mobile-sync-secs t
'my-org-mobile-sync-pull-and-push ) ) )
( defun my-org-mobile-sync-stop ( )
" Stop automated `org-mobile-push' "
( interactive )
( cancel-timer my-org-mobile-sync-timer ) )
2014-11-23 04:10:43 -07:00
( if ( and ( boundp 'file-notify--library ) file-notify--library )
2014-11-25 01:54:37 -07:00
( use-package org-mobile-sync :ensure t :config ( org-mobile-sync-mode 1 ) )
( my-org-mobile-sync-start ) )
2014-11-23 03:12:58 -07:00
( setq org-directory " ~/Dropbox/org " )
( setq org-mobile-inbox-for-pull " ~/Dropbox/org/flagged.org " )
( setq org-mobile-directory " ~/Dropbox/Apps/MobileOrg " )
2014-11-21 07:25:11 -07:00
( defun guide-key/my-hook-function-for-org-mode ( )
( guide-key/add-local-guide-key-sequence " C-c " )
( guide-key/add-local-guide-key-sequence " C-c C-x " )
( guide-key/add-local-highlight-command-regexp " org- " ) )
( add-hook 'org-mode-hook 'guide-key/my-hook-function-for-org-mode )
2014-12-01 16:11:29 -07:00
( defun disable-linum-mode ( ) ( linum-mode 0 ) )
( add-hook 'org-mode-hook 'disable-linum-mode )
( add-hook 'org-agenda-mode-hook 'disable-linum-mode ) ) )
2014-11-20 18:39:42 -07:00
2014-11-20 19:40:51 -07:00
( use-package epg
:ensure t
:config
( epa-file-enable ) )
2014-11-30 19:47:56 -07:00
( use-package twittering-mode
:ensure t
:commands twittering-mode )
2014-11-25 09:24:44 -07:00
2014-11-21 11:43:09 -07:00
( use-package erc
:ensure t
2014-11-21 12:03:00 -07:00
:commands erc
2014-11-23 03:12:58 -07:00
:config
( progn
2014-12-10 01:39:41 -07:00
( add-to-list 'erc-modules 'notifications )
2014-11-25 09:24:44 -07:00
( use-package erc-colorize :ensure t ) ( erc-colorize-mode 1 ) ) )
2014-11-23 03:12:58 -07:00
2014-12-09 02:47:39 -07:00
( use-package s :ensure t )
( add-to-list 'load-path ( s-trim ( shell-command-to-string " mu4e_directory " ) ) )
( use-package mu4e
2014-12-20 02:22:26 -07:00
:commands ( mu4e mu4e-view-message-with-msgid mu4e-update-index )
2014-12-17 18:18:58 -07:00
:bind ( " C-c 0 " . mu4e~headers-jump-to-maildir )
2014-12-09 02:47:39 -07:00
:config
( progn
2014-12-11 16:30:18 -07:00
;; enable inline images
( setq mu4e-view-show-images t )
;; show images
( setq mu4e-show-images t )
2014-12-15 18:23:00 -07:00
;; Try to display html as text
2014-12-22 11:09:03 -07:00
( setq mu4e-view-prefer-html nil )
( setq mu4e-html2text-command " html2text -width 80 -nobs -utf8 " )
2014-12-11 16:30:18 -07:00
;; use imagemagick, if available
( when ( fboundp 'imagemagick-register-types )
( imagemagick-register-types ) )
( setq mail-user-agent 'mu4e-user-agent )
2014-12-10 01:39:41 -07:00
( require 'org-mu4e )
2014-12-09 02:47:39 -07:00
( setq mu4e-compose-complete-only-after nil )
( setq mu4e-maildir " ~/Mail " )
2014-12-18 10:29:50 -07:00
( setq mu4e-drafts-folder " /[Gmail].Drafts " )
( setq mu4e-sent-folder " /[Gmail].Sent Mail " )
( setq mu4e-trash-folder " /[Gmail].Trash " )
2014-12-17 18:18:58 -07:00
( setq mu4e-sent-messages-behavior 'delete )
2014-12-11 16:30:18 -07:00
( setq mu4e-update-interval ( * 60 20 ) )
( setq message-kill-buffer-on-exit t )
2014-12-09 02:47:39 -07:00
;; don't save message to Sent Messages, Gmail/IMAP takes care of this
( setq mu4e-sent-messages-behavior 'delete )
;; allow for updating mail using 'U' in the main view:
( setq mu4e-get-mail-command " offlineimap " )
2014-12-11 16:30:18 -07:00
2014-12-09 02:47:39 -07:00
( add-hook 'mu4e-compose-mode-hook
( defun my-do-compose-stuff ( ) ( flyspell-mode ) ) )
2014-12-24 02:19:14 -07:00
( add-to-list 'mu4e-headers-actions ' ( " view in browser " . mu4e-action-view-in-browser ) )
( add-to-list 'mu4e-view-actions ' ( " view in browser " . mu4e-action-view-in-browser ) )
2014-12-20 02:22:26 -07:00
( defun mu4e-view ( msg headersbuf )
" Display the message MSG in a new buffer, and keep in sync with HDRSBUF.
'In sync ' here means that moving to the next/previous message in
the the message view affects HDRSBUF, as does marking etc.
As a side-effect, a message that is being viewed loses its 'unread '
marking if it still had that. "
( let* ( ( embedded ;; is it as an embedded msg (ie. message/rfc822 att)?
( when ( gethash ( mu4e-message-field msg :path )
mu4e~path-parent-docid-map ) t ) )
( buf
( if embedded
( mu4e~view-embedded-winbuf )
( get-buffer-create mu4e~view-buffer-name ) ) ) )
;; note: mu4e~view-mark-as-read will pseudo-recursively call mu4e-view again
;; by triggering mu4e~view again as it marks the message as read
( with-current-buffer buf
( switch-to-buffer buf )
( setq mu4e~view-msg msg )
( when t ;;(or embedded (not (mu4e~view-mark-as-read msg)))
( let ( ( inhibit-read-only t ) )
( erase-buffer )
( mu4e~delete-all-overlays )
( insert ( mu4e-view-message-text msg ) )
( goto-char ( point-min ) )
( mu4e~fontify-cited )
( mu4e~fontify-signature )
( mu4e~view-make-urls-clickable )
( mu4e~view-show-images-maybe msg )
( setq
mu4e~view-buffer buf
mu4e~view-headers-buffer headersbuf )
( when embedded ( local-set-key " q " 'kill-buffer-and-window ) )
( mu4e-view-mode ) ) ) ) ) )
2014-12-09 02:47:39 -07:00
( require 'smtpmail )
2014-12-11 16:30:18 -07:00
2014-12-09 02:47:39 -07:00
;; alternatively, for emacs-24 you can use:
( setq message-send-mail-function 'smtpmail-send-it
smtpmail-stream-type 'starttls
smtpmail-default-smtp-server " smtp.gmail.com "
smtpmail-smtp-server " smtp.gmail.com "
2014-12-11 16:30:18 -07:00
smtpmail-smtp-service 587 ) ) )
2014-12-09 02:47:39 -07:00
2014-12-19 16:23:42 -07:00
( use-package gmail-message-mode :ensure t )
2014-12-18 10:29:50 -07:00
( use-package alert
:ensure t
:config
( progn
( defun alert-notifier-notify ( info )
( if alert-notifier-command
( let ( ( args
( list " -title " ( alert-encode-string ( plist-get info :title ) )
2014-12-19 05:08:29 -07:00
" -activate " " org.gnu.Emacs "
2014-12-18 10:29:50 -07:00
" -message " ( alert-encode-string ( plist-get info :message ) )
2014-12-19 05:08:29 -07:00
" -execute " ( format " \" %s \" " ( switch-to-buffer-command ( plist-get info :buffer ) ) ) ) ) )
2014-12-18 10:29:50 -07:00
( apply #' call-process alert-notifier-command nil nil nil args ) )
( alert-message-notify info ) ) )
( defun switch-to-buffer-command ( buffer-name )
( emacsclient-command ( format " (switch-to-buffer \\ \" %s \\ \" ) " buffer-name ) ) )
( defun emacsclient-command ( command )
2014-12-19 05:08:29 -07:00
( format " emacsclient --server-file='%s' -e '%s' " server-name command ) )
2014-12-18 10:29:50 -07:00
( setq alert-default-style 'notifier ) ) )
2014-11-23 03:12:58 -07:00
( use-package sauron
:ensure t
:commands ( sauron-start sauron-start-hidden )
2014-11-25 09:24:44 -07:00
:config
( progn
2014-12-24 02:19:14 -07:00
( setq sauron-prio-sauron-started 2 )
2014-11-25 09:24:44 -07:00
( setq sauron-min-priority 3 )
2014-12-19 16:23:42 -07:00
( setq sauron-dbus-cookie t )
2014-11-25 09:24:44 -07:00
( setq sauron-separate-frame nil )
( setq sauron-nick-insensitivity 1 )
( defun sauron:jabber-notify ( origin priority message &optional properties )
( funcall notify-function " gtalk " message ) )
( defun sauron:erc-notify ( origin priority message &optional properties )
( let ( ( event ( plist-get properties :event ) ) )
2014-12-11 16:30:18 -07:00
( funcall notify-function " IRC " message ) ) )
2014-11-25 09:24:44 -07:00
( defun sauron:mu4e-notify ( origin priority message &optional properties )
nil )
2014-12-11 16:30:18 -07:00
( defun sauron:dbus-notify ( origin priority message &optional properties )
( funcall notify-function " GMail " message ) )
2014-11-25 09:24:44 -07:00
( defun sauron:dispatch-notify ( origin priority message &optional properties )
( let ( ( handler ( cond ( ( string= origin " erc " ) 'sauron:erc-notify )
( ( string= origin " jabber " ) 'sauron:jabber-notify )
( ( string= origin " mu4e " ) 'sauron:mu4e-notify )
2014-12-11 16:30:18 -07:00
( ( string= origin " dbus " ) 'sauron:dbus-notify )
2014-11-25 09:24:44 -07:00
( t ( lambda ( &rest r ) nil ) ) ) ) )
( funcall handler origin priority message properties ) ) )
2014-12-18 10:29:50 -07:00
;; Prefering alert.el for now ;; (add-hook 'sauron-event-added-functions 'sauron:dispatch-notify)
( add-hook 'sauron-event-added-functions 'sauron-alert-el-adapter ) )
2014-11-23 03:12:58 -07:00
:idle ( sauron-start-hidden )
:idle-priority 3 )
2014-12-14 00:44:27 -07:00
( use-package screenshot :ensure t )
2014-11-23 03:12:58 -07:00
( use-package flyspell
:ensure t
:config
( progn
2014-12-02 08:05:35 -07:00
( diminish 'flyspell-mode )
2014-11-23 03:12:58 -07:00
( bind-key " M-s " 'flyspell-correct-word-before-point flyspell-mode-map )
( unbind-key " C-; " flyspell-mode-map )
( defun flyspell-emacs-popup-textual ( event poss word )
" A textual flyspell popup menu. "
( let* ( ( corrects ( if flyspell-sort-corrections
( sort ( car ( cdr ( cdr poss ) ) ) 'string< )
( car ( cdr ( cdr poss ) ) ) ) )
( cor-menu ( if ( consp corrects )
( mapcar ( lambda ( correct )
( list correct correct ) )
corrects )
' ( ) ) )
( affix ( car ( cdr ( cdr ( cdr poss ) ) ) ) )
show-affix-info
( base-menu ( let ( ( save ( if ( and ( consp affix ) show-affix-info )
( list
2014-11-24 18:01:54 -07:00
( list ( concat " Save affix: "
( car affix ) )
2014-11-23 03:12:58 -07:00
'save )
' ( " Accept (session) " session )
' ( " Accept (buffer) " buffer ) )
' ( ( " Save word " save )
( " Accept (session) " session )
( " Accept (buffer) " buffer ) ) ) ) )
( if ( consp cor-menu )
( append cor-menu ( cons " " save ) )
save ) ) )
( menu ( mapcar
( lambda ( arg ) ( if ( consp arg ) ( car arg ) arg ) )
base-menu ) ) )
( cadr ( assoc ( popup-menu* menu :scroll-bar t ) base-menu ) ) ) )
( fset 'flyspell-emacs-popup 'flyspell-emacs-popup-textual ) ) )
2014-11-21 09:41:01 -07:00
2014-10-29 09:45:30 -06:00
;; =============================================================================
2014-11-12 00:36:24 -07:00
;; Programming Mode Hooks
2014-10-29 09:45:30 -06:00
;; =============================================================================
2014-10-29 02:34:11 -06:00
2014-10-31 05:19:11 -06:00
( add-hook 'prog-mode-hook ( lambda ( ) ( auto-fill-mode -1 ) ) )
2014-12-06 22:46:36 -07:00
( add-hook 'prog-mode-hook ( lambda ( ) ( subword-mode t ) ( diminish 'subword-mode ) ) )
2014-11-23 03:12:58 -07:00
( add-hook 'prog-mode-hook 'flyspell-prog-mode )
2014-10-27 00:31:26 -06:00
;; (add-hook 'prog-mode-hook (lambda () (highlight-lines-matching-regexp
;; ".\\{81\\}" 'hi-blue)))
2013-07-08 12:06:11 -06:00
2014-10-29 09:45:30 -06:00
;; =============================================================================
2014-11-21 03:32:19 -07:00
;; File Navigation: helm/projectile/ido
2014-10-29 09:45:30 -06:00
;; =============================================================================
2014-10-21 17:38:07 -06:00
2014-12-05 16:37:10 -07:00
( use-package helm-config
:ensure helm
2014-11-21 21:33:31 -07:00
:bind ( ( " M-y " . helm-show-kill-ring )
2014-11-23 03:12:58 -07:00
( " M-x " . helm-M-x )
2014-11-23 04:28:57 -07:00
( " C-x C-i " . helm-imenu )
2014-12-06 02:45:28 -07:00
( " C-h a " . helm-apropos )
2014-12-08 17:32:57 -07:00
( " C-c C-h " . helm-org-agenda-files-headings )
( " C-c ; " . helm-recentf ) )
2014-11-21 09:41:01 -07:00
:init
( progn
2014-12-05 16:37:10 -07:00
( require 'helm )
( helm-mode 1 )
2014-12-11 16:30:18 -07:00
( use-package helm-ag :ensure t ) )
2014-11-12 00:36:24 -07:00
:config
( progn
2014-12-12 21:52:19 -07:00
( cl-defun helm-org-headings-in-buffer ( )
2014-12-12 21:38:40 -07:00
( interactive )
( helm :sources ( helm-source-org-headings-for-files
( list ( projectile-completing-read
" File to look at headings from: "
( projectile-all-project-files ) ) ) )
:candidate-number-limit 99999
:buffer " *helm org inbuffer* " ) )
2014-12-10 01:39:41 -07:00
;; helm zsh source history
( defvar helm-c-source-zsh-history
' ( ( name . " Zsh History " )
( candidates . helm-c-zsh-history-set-candidates )
( action . ( ( " Execute Command " . helm-c-zsh-history-action ) ) )
( volatile )
( requires-pattern . 3 )
( delayed ) ) )
( defun helm-c-zsh-history-set-candidates ( &optional request-prefix )
( let ( ( pattern ( replace-regexp-in-string
" " " .* "
( or ( and request-prefix
( concat request-prefix
" " helm-pattern ) )
helm-pattern ) ) ) )
( with-current-buffer ( find-file-noselect " ~/.zsh_history " t t )
( auto-revert-mode -1 )
( goto-char ( point-max ) )
( loop for pos = ( re-search-backward pattern nil t )
while pos
collect ( replace-regexp-in-string
" \\ ` :.+?; " " "
( buffer-substring ( line-beginning-position )
( line-end-position ) ) ) ) ) ) )
( defun helm-c-zsh-history-action ( candidate )
( async-shell-command candidate ) )
( defun helm-command-from-zsh ( )
( interactive )
( require 'helm )
( helm-other-buffer 'helm-c-source-zsh-history " *helm zsh history* " ) )
( use-package helm-descbinds
:demand t
2014-12-11 16:30:18 -07:00
:config ( helm-descbinds-mode 1 )
2014-12-10 01:39:41 -07:00
:ensure t )
2014-11-14 07:53:57 -07:00
( helm-mode 1 )
( diminish 'helm-mode ) ) )
2014-11-12 00:36:24 -07:00
2014-12-14 00:44:27 -07:00
( use-package helm-swoop
:ensure t
:bind ( " C-S-s " . helm-swoop )
:commands helm-swoop )
2014-11-23 04:28:57 -07:00
2014-12-10 09:16:21 -07:00
( use-package perspective
:ensure t
2014-12-24 02:18:45 -07:00
:demand t
:config
( progn
( persp-mode )
( defun persp-get-perspectives-for-buffer ( buffer )
" Get the names of all of the perspectives of which ` buffer ` is a member. "
( cl-loop for perspective being the hash-value of perspectives-hash
if ( member buffer ( persp-buffers perspective ) )
collect ( persp-name perspective ) ) )
( defun persp-pick-perspective-by-buffer ( buffer )
" Select a buffer and go to the perspective to which that buffer belongs. If the buffer belongs to more than one perspective completion will be used to pick the perspective to switch to. Switch the focus to the window in which said buffer is displayed if such a window exists. Otherwise display the buffer in whatever window is active in the perspective. "
( interactive ( list ( funcall persp-interactive-completion-function
" Buffer: " ( mapcar 'buffer-name ( buffer-list ) ) ) ) )
( let* ( ( perspectives ( persp-get-perspectives-for-buffer ( get-buffer buffer ) ) )
( perspective ( if ( > ( length perspectives ) 1 )
( funcall persp-interactive-completion-function perspectives )
( car perspectives ) ) ) )
( persp-switch perspective )
( if ( get-buffer-window buffer )
( set-frame-selected-window nil ( get-buffer-window buffer ) )
( switch-to-buffer buffer ) ) ) )
( defun persp-mode-switch-buffers ( arg )
( interactive " P " )
( if arg ( call-interactively 'ido-switch-buffer )
( call-interactively 'persp-pick-perspective-by-buffer ) ) )
( define-key persp-mode-map ( kbd " C-x b " ) 'persp-mode-switch-buffers ) )
:bind ( " C-c 9 " . persp-switch ) )
2014-12-10 09:16:21 -07:00
2014-11-12 00:36:24 -07:00
( use-package projectile
:ensure t
2014-12-11 16:30:18 -07:00
:demand t
2014-11-12 00:36:24 -07:00
:config
( progn
2014-12-11 16:30:18 -07:00
( defun do-ag ( &optional arg )
( interactive " P " )
( if arg ( helm-do-ag ) ( helm-projectile-ag ) ) )
2014-11-12 00:36:24 -07:00
( projectile-global-mode )
2014-11-21 21:33:31 -07:00
( setq projectile-enable-caching t )
2014-11-20 00:12:13 -07:00
( setq projectile-completion-system 'helm )
2014-11-14 07:53:57 -07:00
( helm-projectile-on )
2014-12-13 22:29:48 -07:00
( diminish 'projectile-mode )
( unbind-key " C-c p s a " projectile-command-map )
( unbind-key " C-c p s g " projectile-command-map )
( unbind-key " C-c p s s " projectile-command-map )
( unbind-key " C-c p s " projectile-command-map )
( bind-key* " C-c p s " 'do-ag ) )
2014-11-21 09:41:01 -07:00
:bind ( ( " C-x f " . projectile-find-file-in-known-projects ) )
2014-11-12 00:36:24 -07:00
:init
( progn
2014-11-21 03:32:19 -07:00
( use-package persp-projectile
:ensure t
2014-12-08 02:02:57 -07:00
:commands projectile-persp-switch-project )
2014-11-12 00:36:24 -07:00
( use-package helm-projectile
:ensure t
2014-11-21 09:41:01 -07:00
:commands ( helm-projectile-on )
:defer t ) ) )
2014-11-12 00:36:24 -07:00
2014-11-21 11:43:09 -07:00
( use-package smex
:ensure t
2014-12-05 16:37:10 -07:00
;; Using helm-M-x instead
2014-12-04 23:37:56 -07:00
:disabled t
2014-11-21 21:33:31 -07:00
:commands smex
;; This is here because smex feels like part of ido
2014-11-21 11:43:09 -07:00
:bind ( " M-x " . smex ) )
2014-11-21 17:39:31 -07:00
( use-package ido
:ensure t
2014-11-21 21:33:31 -07:00
:commands ido-mode
2014-11-21 17:39:31 -07:00
:config
( progn
2014-12-12 05:34:07 -07:00
( setq ido-create-new-buffer 'always )
2014-11-21 21:33:31 -07:00
( ido-everywhere 1 )
( setq ido-enable-flex-matching t )
( use-package flx :ensure t )
( use-package flx-ido
:commands flx-ido-mode
:ensure t
:init ( flx-ido-mode 1 )
:config
( progn
;; disable ido faces to see flx highlights.
;; This makes flx-ido much faster.
( setq gc-cons-threshold 20000000 )
( setq ido-use-faces nil ) ) )
2014-11-21 17:39:31 -07:00
( use-package ido-ubiquitous
:ensure t
2014-12-12 01:51:23 -07:00
:disabled t
2014-11-21 21:33:31 -07:00
:commands ( ido-ubiquitous-mode ) )
( use-package ido-vertical-mode
:ensure t
:config ( ido-vertical-mode 1 ) )
2014-12-12 05:34:07 -07:00
( use-package flx-ido :ensure t ) ) )
2014-11-21 21:33:31 -07:00
( if ( and ( boundp 'use-ido ) use-ido ) ( ido-mode ) )
2014-10-23 02:13:33 -06:00
2014-11-14 16:47:06 -07:00
;; =============================================================================
2014-11-18 17:38:56 -07:00
;; elisp
2014-11-14 16:47:06 -07:00
;; =============================================================================
2014-11-21 09:41:01 -07:00
( setq edebug-trace t )
2014-12-12 05:34:07 -07:00
( use-package macrostep :ensure t )
2014-12-09 02:47:39 -07:00
( use-package paredit
:ensure t )
2014-11-14 18:18:09 -07:00
( use-package elisp-slime-nav
:ensure t
:commands elisp-slime-nav-mode
:config
( diminish 'elisp-slime-nav-mode )
:init
( add-hook 'emacs-lisp-mode-hook ( lambda ( ) ( elisp-slime-nav-mode t ) ) ) )
2014-11-18 03:50:16 -07:00
( defun imenu-elisp-sections ( )
( setq imenu-prev-index-position-function nil )
( setq imenu-space-replacement nil )
2014-11-18 17:38:56 -07:00
( add-to-list 'imenu-generic-expression
2014-11-21 07:25:11 -07:00
` ( " Package "
, " (use-package \\ (.+ \\ )$ " 1 ) )
( add-to-list 'imenu-generic-expression
` ( " Section "
2014-11-18 17:38:56 -07:00
, ( concat " ; \\ {1,4 \\ } = \\ {10,80 \\ } \n ; \\ {1,4 \\ } \\ {10,80 \\ } "
" \\ (.+ \\ )$ " ) 1 ) t ) )
2014-11-18 03:50:16 -07:00
2014-11-21 09:41:01 -07:00
( put 'use-package 'lisp-indent-function 1 ) ;; reduce indentation for use-package
2014-11-18 03:50:16 -07:00
( add-hook 'emacs-lisp-mode-hook 'imenu-elisp-sections )
2014-11-18 17:38:56 -07:00
( add-hook 'emacs-lisp-mode-hook 'flatten-current-imenu-index-function )
2014-11-14 16:47:06 -07:00
( add-hook 'emacs-lisp-mode-hook ( lambda ( ) ( setq indent-tabs-mode nil ) ) )
2014-11-25 01:54:37 -07:00
( bind-key " C-c C-f " 'find-function )
( bind-key " C-c C-v " 'find-variable )
2014-11-14 16:47:06 -07:00
( define-key lisp-mode-shared-map ( kbd " C-c C-c " ) 'eval-defun )
( define-key lisp-mode-shared-map ( kbd " C-c C-r " ) 'eval-and-replace )
2014-12-08 02:02:57 -07:00
( define-key lisp-mode-shared-map ( kbd " C-c o r " ) 'up-list-region )
2014-11-25 09:27:11 -07:00
( define-key lisp-mode-shared-map ( kbd " C-c o o " ) 'up-list-back )
2014-12-24 02:17:38 -07:00
( define-key lisp-mode-shared-map ( kbd " C-x C-e " ) 'eval-region-or-last-sexp )
2014-10-23 03:39:08 -06:00
2013-03-16 17:34:21 -06:00
;; =============================================================================
;; Python
;; =============================================================================
2014-11-13 22:53:57 -07:00
( defvar use-python-tabs nil )
2014-11-18 04:09:17 -07:00
( defun python-tabs ( )
( setq tab-width 4 indent-tabs-mode t python-indent-offset 4 ) )
2014-11-13 22:53:57 -07:00
( defun add-virtual-envs-to-jedi-server ( )
( let ( ( virtual-envs ( get-virtual-envs ) ) )
( when virtual-envs ( set ( make-local-variable 'jedi:server-args )
( make-virtualenv-args virtual-envs ) ) ) ) )
( defun make-virtualenv-args ( virtual-envs )
( apply #' append ( mapcar ( lambda ( env ) ` ( " -v " , env ) ) virtual-envs ) ) )
( defun get-virtual-envs ( )
2014-11-18 20:31:52 -07:00
( if ( projectile-project-p )
( condition-case ex
( let ( ( project-root ( projectile-project-root ) ) )
( cl-remove-if-not 'file-exists-p
( mapcar ( lambda ( env-suffix )
( concat project-root env-suffix ) )
' ( " .tox/py27/ " " env " " .tox/venv/ " ) ) ) )
( 'error
( message ( format " Caught exception: [%s] " ex ) )
( setq retval ( cons 'exception ( list ex ) ) ) )
nil ) ) )
2014-11-13 22:53:57 -07:00
( defun message-virtual-envs ( )
( interactive )
2014-11-21 17:39:31 -07:00
( message " %s " ( get-virtual-envs ) ) )
2014-11-13 22:53:57 -07:00
2014-11-12 00:36:24 -07:00
( use-package python
:commands python-mode
:mode ( " \\ .py \\ ' " . python-mode )
:config
( progn
;; macros
( fset 'ipdb " import ipdb; ipdb.set_trace() " )
( fset 'main " if __name__ == '__main__': " )
( fset 'sphinx-class " :class: ` ~ " )
:init
( progn
( use-package jedi
:commands jedi:goto-definition
2014-11-18 17:38:56 -07:00
:config
( progn
( setq jedi:complete-on-dot t )
2014-11-18 18:34:56 -07:00
( setq jedi:install-imenu t )
( setq jedi:imenu-create-index-function 'jedi:create-flat-imenu-index ) )
2014-11-14 16:47:06 -07:00
:ensure t
2014-12-06 04:16:13 -07:00
:bind ( " M-. " . jedi:goto-definition ) )
2014-11-14 16:47:06 -07:00
( use-package pytest
:ensure t
:bind ( " C-c t " . pytest-one ) )
2014-11-12 00:36:24 -07:00
( use-package pymacs :ensure t )
( use-package sphinx-doc :ensure t )
2014-12-15 18:23:00 -07:00
( defun imalison:python-mode ( )
( setq show-trailing-whitespace t )
( if use-python-tabs ( python-tabs ) )
( subword-mode t )
( jedi:setup )
( add-virtual-envs-to-jedi-server )
( remove-hook 'completion-at-point-functions
'python-completion-complete-at-point 'local ) )
( add-hook 'python-mode-hook #' imalison:python-mode ) ) ) )
2013-03-28 14:09:12 -06:00
2014-05-01 19:10:40 -06:00
;; =============================================================================
;; Scala
;; =============================================================================
2014-11-12 00:36:24 -07:00
( use-package scala-mode2
:init
( progn ( add-hook 'scala-mode-hook
2014-11-13 22:53:57 -07:00
( lambda ( )
( require 'whitespace )
( make-local-variable 'before-save-hook )
( add-hook 'before-save-hook 'whitespace-cleanup )
( whitespace-mode ) ) ) )
2014-11-12 00:36:24 -07:00
:config
( progn
( use-package ensime
2014-12-03 15:31:31 -07:00
:ensure t
2014-11-21 03:32:19 -07:00
:config
( progn
( add-hook 'scala-mode-hook 'ensime-scala-mode-hook )
( defun guide-key/scala-mode-hook ( )
2014-11-23 03:12:58 -07:00
( guide-key/add-local-guide-key-sequence " C-c C-v " ) )
2014-12-03 15:31:31 -07:00
( add-hook 'scala-mode-hook 'guide-key/scala-mode-hook ) ) )
2014-11-12 00:36:24 -07:00
( setq scala-indent:align-parameters t ) )
:mode ( ( " \\ .scala \\ ' " . scala-mode )
( " \\ .sc \\ ' " . scala-mode ) )
:ensure t )
2014-10-29 04:52:35 -06:00
;; =============================================================================
;; JavaScript
;; =============================================================================
2014-11-12 00:36:24 -07:00
( use-package js2-mode
:ensure t
2014-11-21 10:14:58 -07:00
:commands ( js-mode )
2014-12-10 09:16:21 -07:00
:mode " \\ .js \\ ' "
2014-11-12 00:36:24 -07:00
:bind
2014-11-21 11:43:09 -07:00
( ( " C-c b " . web-beautify-js ) )
2014-11-12 00:36:24 -07:00
:init
( progn
2014-12-10 09:16:21 -07:00
( setq js2-bounce-indent-p t )
( setq js2-basic-offset 2 )
2014-11-14 08:45:42 -07:00
( use-package skewer-mode
:ensure t
:commands skewer-mode )
2014-11-20 18:39:42 -07:00
( add-hook 'js-mode-hook 'js2-minor-mode )
2014-11-12 00:36:24 -07:00
( add-hook 'js2-mode-hook ( lambda ( ) ( tern-mode t ) ) )
( add-hook 'js2-mode-hook 'skewer-mode )
2014-11-20 18:39:42 -07:00
( add-hook 'js2-mode-hook ( lambda ( ) ( setq js-indent-level 1 ) ) )
2014-11-12 00:36:24 -07:00
( use-package tern
2014-11-21 12:03:00 -07:00
:commands tern-mode
2014-11-12 00:36:24 -07:00
:ensure t
:config
( progn ( tern-ac-setup ) )
:init
( progn
( use-package tern-auto-complete :ensure t
:commands tern-ac-setup ) ) ) ) )
2014-11-04 07:20:30 -07:00
2014-11-20 18:39:42 -07:00
( use-package json-mode
:ensure t
2014-11-21 10:14:58 -07:00
:mode " \\ .json \\ ' "
2014-11-20 18:39:42 -07:00
:init
( add-hook 'json-mode-hook
( lambda ( )
( setq js-indent-level 2 ) ) ) )
2014-10-29 04:52:35 -06:00
2014-11-12 00:36:24 -07:00
( add-hook 'css-mode-hook #' skewer-css-mode )
( add-hook 'html-mode-hook #' skewer-html-mode )
2014-11-08 16:27:28 -07:00
2014-11-12 00:36:24 -07:00
( eval-after-load 'css-mode
' ( define-key css-mode-map ( kbd " C-c b " ) 'web-beautify-css ) )
2014-11-21 09:41:01 -07:00
;; =============================================================================
;; Ruby
;; =============================================================================
( use-package robe
:ensure t
2014-11-21 11:43:09 -07:00
:commands robe-mode
2014-11-21 09:41:01 -07:00
:init
( progn ( add-hook 'ruby-mode-hook 'robe-mode )
( add-hook 'robe-mode-hook 'ac-robe-setup )
( add-hook 'ruby-mode-hook 'auto-complete-mode ) ) )
2014-10-31 05:19:11 -06:00
;; =============================================================================
;; C/C++
;; =============================================================================
2014-11-12 00:36:24 -07:00
( use-package helm-gtags
:ensure t
:config ( custom-set-variables
' ( helm-gtags-path-style 'relative )
' ( helm-gtags-ignore-case t )
' ( helm-gtags-auto-update t ) )
:bind
( ( " M-t " . helm-gtags-find-tag )
( " M-r " . helm-gtags-find-rtag )
( " M-s " . helm-gtags-find-symbol )
( " M-g M-p " . helm-gtags-parse-file )
( " C-c < " . helm-gtags-previous-history )
( " C-c > " . helm-gtags-next-history )
( " M-, " . helm-gtags-pop-stack ) )
:init
( progn
;;; Enable helm-gtags-mode
( add-hook 'c-mode-hook 'helm-gtags-mode )
( add-hook 'c++-mode-hook 'helm-gtags-mode )
( add-hook 'asm-mode-hook 'helm-gtags-mode ) ) )
2014-10-31 05:19:11 -06:00
2013-03-15 11:35:58 -06:00
;; =============================================================================
2014-10-30 06:34:26 -06:00
;; TeX
2013-03-15 11:35:58 -06:00
;; =============================================================================
2014-11-12 00:36:24 -07:00
( use-package tex-site
:ensure auctex
2014-11-21 12:03:00 -07:00
:commands TeX-mode
2014-11-12 00:36:24 -07:00
:config
( progn
( setq TeX-auto-save t )
( setq TeX-parse-self t )
( setq TeX-save-query nil )
( setq-default TeX-master nil ) ) )
2014-10-29 09:45:30 -06:00
2014-11-21 09:41:01 -07:00
;; =============================================================================
;; other modes
;; =============================================================================
( use-package rust-mode :ensure t
:mode ( ( " \\ .rs \\ ' " . rust-mode ) ) )
( use-package yaml-mode :ensure t
:mode ( ( " \\ .yaml \\ ' " . yaml-mode )
( " \\ .yml \\ ' " . yaml-mode ) ) )
2014-11-21 12:03:00 -07:00
( use-package sgml-mode
:ensure t
:commands sgml-mode
:bind ( " C-c b " . web-beautify-html ) )
2014-11-29 12:08:48 -07:00
( use-package gitconfig-mode
:ensure t
:mode " \\ .?gitconfig \\ ' " )
2014-11-21 09:41:01 -07:00
( use-package evil :ensure t :commands ( evil-mode ) )
2014-10-30 06:34:26 -06:00
;; =============================================================================
;; Custom Key Bindings
;; =============================================================================
2014-11-14 16:47:06 -07:00
2013-03-15 11:35:58 -06:00
;; Miscellaneous
2014-10-28 16:37:19 -06:00
( global-unset-key ( kbd " C-o " ) ) ;; Avoid collision with tmux binding.
2014-11-21 09:41:01 -07:00
( bind-key " M-q " 'fill-or-unfill-paragraph )
( bind-key " C-c C-s " 'sudo-edit )
( bind-key " C-c SPC "
( lambda ( ) ( interactive )
( if current-prefix-arg ( helm-global-mark-ring ) ( helm-mark-ring ) ) ) )
( bind-key " C-c e " 'os-copy )
( bind-key " C-x p " 'pop-to-mark-command )
( setq set-mark-command-repeat-pop t )
( bind-key " C-x C-b " 'buffer-menu )
( bind-key " C-x C-c " 'kill-emacs )
( bind-key " C-x C-i " 'imenu )
( bind-key " C-x C-r " ( lambda ( ) ( interactive ) ( revert-buffer t t ) ) )
( bind-key " C-x O " ( lambda ( ) ( interactive ) ( other-window -1 ) ) )
( bind-key " C-x w " 'whitespace-mode )
( bind-key " M-g " 'goto-line )
( bind-key " M-n " 'forward-paragraph )
( bind-key " M-p " 'backward-paragraph )
( bind-key " M-z " 'zap-to-char )
2014-12-08 02:02:57 -07:00
( bind-key " C-M-<backspace> " 'backward-kill-sexp )
2014-11-14 16:47:06 -07:00
( fset 'global-set-key-to-use-package
( lambda ( &optional arg ) " Keyboard macro. " ( interactive " p " )
2014-11-18 03:50:16 -07:00
( kmacro-exec-ring-item
( quote ( [ 1 67108896 19 100 6 23 40 19 41 return
backspace 32 46 6 4 ] 0 " %d " ) ) arg ) ) )
2014-06-11 18:15:56 -06:00
2014-11-21 09:41:01 -07:00
;; =============================================================================
;; toys
;; =============================================================================
( use-package hackernews :ensure t :commands hackernews )
2013-03-16 21:09:42 -06:00
;; =============================================================================
;; Appearance
;; =============================================================================
2014-11-21 09:41:01 -07:00
( defvar packages-appearance
' ( monokai-theme solarized-theme zenburn-theme base16-theme molokai-theme
2014-12-03 15:31:31 -07:00
tango-2-theme gotham-theme sublime-themes ansi-color rainbow-delimiters
ample-theme ) )
2014-11-21 09:41:01 -07:00
2014-12-19 03:14:52 -07:00
( ensure-packages-installed packages-appearance )
2014-12-06 22:46:36 -07:00
2014-11-21 09:41:01 -07:00
2014-11-23 03:12:58 -07:00
( use-package smart-mode-line
:ensure t
2014-12-02 08:05:35 -07:00
:config
( progn
( setq sml/theme 'respectful )
( sml/setup ) ) )
2014-11-23 03:12:58 -07:00
2014-11-11 17:31:59 -07:00
( setq inhibit-startup-screen t )
2014-11-12 00:36:24 -07:00
( blink-cursor-mode -1 )
2014-11-11 17:31:59 -07:00
2014-10-29 09:45:30 -06:00
;; make whitespace-mode use just basic coloring
2014-12-22 11:09:03 -07:00
( setq whitespace-style ( quote ( spaces tabs newline space-mark
2014-10-29 09:45:30 -06:00
tab-mark newline-mark ) ) )
( setq whitespace-display-mappings
' ( ( space-mark 32 [ 183 ] [ 46 ] )
( tab-mark 9 [ 9655 9 ] [ 92 9 ] ) ) )
( defun colorize-compilation-buffer ( )
2014-11-08 16:27:28 -07:00
( read-only-mode )
2014-10-29 09:45:30 -06:00
( ansi-color-apply-on-region ( point-min ) ( point-max ) )
2014-11-08 16:27:28 -07:00
( read-only-mode ) )
2014-10-29 09:45:30 -06:00
( add-hook 'compilation-filter-hook 'colorize-compilation-buffer )
;; =============================================================================
;; Themes
;; =============================================================================
2014-11-18 18:34:56 -07:00
( unless ( boundp 'dark-themes )
( defvar dark-themes ' ( solarized-dark ) ) )
( unless ( boundp 'light-themes )
( defvar light-themes ' ( solarized-light ) ) )
2014-11-19 23:54:53 -07:00
( unless ( boundp 'terminal-themes )
( defvar terminal-themes ' ( solarized-light monokai ) ) )
2014-11-20 18:52:06 -07:00
( unless ( boundp 'fonts )
( defvar fonts ' ( monaco-9 ) ) )
2014-10-29 02:34:11 -06:00
( defun random-choice ( choices )
( nth ( random ( length choices ) ) choices ) )
2014-10-28 05:53:13 -06:00
2014-10-29 02:34:11 -06:00
( defun get-appropriate-theme ( )
2014-11-19 23:54:53 -07:00
( if t ;; (display-graphic-p) why doesn't this work at frame startup?
( let ( ( hour
( string-to-number ( format-time-string " %H " ) ) ) )
2014-11-20 18:39:42 -07:00
( if ( or ( < hour 8 ) ( > hour 16 ) )
2014-11-19 23:54:53 -07:00
( random-choice dark-themes ) ( random-choice light-themes ) ) )
( random-choice terminal-themes ) ) )
2014-10-28 16:12:59 -06:00
( setq current-theme nil )
2014-10-29 02:34:11 -06:00
( defun set-theme ( )
2014-10-28 16:12:59 -06:00
( interactive )
2014-10-29 02:34:11 -06:00
( let ( ( appropriate-theme ( get-appropriate-theme ) ) )
2014-10-28 16:12:59 -06:00
( if ( eq appropriate-theme current-theme )
nil
2014-11-18 18:34:56 -07:00
( progn
2014-12-06 02:45:28 -07:00
( disable-and-load-theme appropriate-theme t )
( setq current-theme appropriate-theme ) ) ) ) )
2014-10-28 16:12:59 -06:00
2014-11-20 18:39:42 -07:00
( defun disable-all-themes ( )
2014-11-18 18:34:56 -07:00
( interactive )
2014-12-08 02:02:57 -07:00
( mapcar
( lambda ( theme ) ( unless ( s-contains? " smart-mode " ( symbol-name theme ) )
( disable-theme theme ) ) ) custom-enabled-themes ) )
2014-11-19 23:54:53 -07:00
2014-11-20 18:39:42 -07:00
( defun disable-and-load-theme ( theme &optional no-confirm no-enable )
( interactive
( list
( intern ( completing-read " Load custom theme: "
( mapcar 'symbol-name
( custom-available-themes ) ) ) )
nil nil ) )
( disable-all-themes )
( load-theme theme no-confirm no-enable ) )
2014-11-18 18:34:56 -07:00
2014-11-10 05:51:35 -07:00
( defun set-my-font-for-frame ( frame )
2014-12-24 02:19:14 -07:00
( interactive ( list nil ) )
2014-11-10 05:51:35 -07:00
( condition-case exp
2014-11-18 04:09:17 -07:00
( set-frame-font ( random-choice fonts ) nil t )
2014-11-10 05:51:35 -07:00
( 'error ( package-refresh-contents )
2014-12-06 22:46:36 -07:00
( set-frame-font " Monaco for Powerline-12 " nil t ) nil ) ) )
2014-11-10 05:51:35 -07:00
2014-11-06 03:57:35 -07:00
( defun remove-fringe-and-hl-line-mode ( &rest stuff )
2014-11-21 00:31:14 -07:00
( if ( fboundp 'scroll-bar-mode ) ( scroll-bar-mode -1 ) )
( if ( fboundp 'tool-bar-mode ) ( tool-bar-mode -1 ) )
( if ( fboundp 'menu-bar-mode ) ( menu-bar-mode -1 ) )
2014-11-09 23:53:10 -07:00
( set-fringe-mode 0 )
2014-11-19 23:54:53 -07:00
( setq linum-format 'dynamic )
2014-12-24 02:19:14 -07:00
( set-my-font-for-frame nil )
2014-11-19 23:54:53 -07:00
( setq left-margin-width 0 )
2014-10-29 02:34:11 -06:00
( setq hl-line-mode nil ) )
2014-11-19 18:08:36 -07:00
( if ( emacs24_4-p )
2014-11-13 22:10:41 -07:00
( advice-add 'load-theme :after #' remove-fringe-and-hl-line-mode )
( defadvice load-theme ( after name activate )
( remove-fringe-and-hl-line-mode ) ) )
2014-10-28 19:39:40 -06:00
;; enable to set theme based on time of day.
2014-11-06 03:57:35 -07:00
( run-at-time " 00:00 " 3600 'set-theme )
2014-11-10 05:37:48 -07:00
2014-12-27 03:54:21 -07:00
;; This is needed because you can't set the font at daemon start-up.
2014-11-10 05:51:35 -07:00
( add-hook 'after-make-frame-functions 'set-my-font-for-frame )
2014-11-19 23:54:53 -07:00
( add-hook 'after-make-frame-functions ( lambda ( frame ) ( set-theme ) ) )