dotfiles/init.el

384 lines
15 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;; =============================================================================
;; ___ _ __ ___ __ _ ___ ___
;; / _ \ '_ ` _ \ / _` |/ __/ __|
;; | __/ | | | | | (_| | (__\__ \
;; (_)___|_| |_| |_|\__,_|\___|___/
;; =============================================================================
(setq user-full-name
(replace-regexp-in-string "\n$" "" (shell-command-to-string "git config --get user.email")))
(setq user-mail-address
(replace-regexp-in-string "\n$" "" (shell-command-to-string "git config --get user.name")))
;; =============================================================================
;; Load Path Configuration
;; =============================================================================
(if (not (file-exists-p "~/.emacs.d/elpa"))
(make-directory "~/.emacs.d/elpa"))
(let ((default-directory "~/.emacs.d/lisp/"))
(normal-top-level-add-subdirs-to-load-path))
(let ((default-directory "~/.emacs.d/elpa/"))
(normal-top-level-add-subdirs-to-load-path))
(add-to-list 'custom-theme-load-path "~/.emacs.d/elpa/")
(require 'patches)
;; =============================================================================
;; ELPA
;; =============================================================================
(require 'package)
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/") t)
(add-to-list 'package-archives
'("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)
(defvar my-packages '(color-theme cl-lib ctags ctags-update flymake mo-git-blame
multiple-cursors latex-preview-pane
starter-kit-bindings starter-kit-ruby
starter-kit magit ido-ubiquitous
find-file-in-project idle-highlight-mode
paredit inf-ruby undo-tree rainbow-delimiters
smex solarized-theme zenburn-theme
scala-mode2 ensime monokai-theme
gitconfig-mode jedi flymake-cursor pytest
auto-complete project-root popup web-beautify
js2-mode js3-mode sphinx-doc exec-path-from-shell)
"Packages that must be installed at launch.")
(defun ensure-package-installed (packages)
"Assure every package is installed, ask for installation if its not.
Return a list of installed packages or nil for every package not installed."
;; fetch the list of packages available
(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))
(ensure-package-installed my-packages)
;; =============================================================================
;; General Emacs Options
;; =============================================================================
;; Set path from shell.
(exec-path-from-shell-initialize)
;; Disable the creation of backup files.
(setq backup-inhibited t)
(setq make-backup-files nil)
(setq auto-save-default nil)
;; Fuck auto fill mode
(auto-fill-mode -1)
;; This makes it so that emacs --daemon creates server files in ~/.emacs.d/server
;;(setq server-use-tcp t)
;; Set the default font for emacs.
;;(set-face-attribute 'default t :font "Monaco for Powerline")
;;(set-frame-font "Monaco" t t)
;;(set-face-attribute 'default nil :height 80)
;; Enable ido mode.
(require 'ido)
(ido-mode t)
(setq ido-enable-flex-matching t)
;; Give duplicate open buffers better titles.
(require 'uniquify)
(setq uniquify-buffer-name-style 'forward)
(setq visible-bell t)
;; Display line and column numbers in mode line.
(line-number-mode t)
(column-number-mode t)
(global-linum-mode t)
;; Don't disable downcase and upcase region.
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)
;; Change the behavior of M-<arrow> so that it stops on underscores.
(defun change-major-mode-hook () (modify-syntax-entry ?_ "_"))
(setq c-subword-mode t)
;; Disable the menu bar.
(menu-bar-mode -1)
;; find-file-in-project
(setq ffip-limit 9999999999)
(setq js-indent-level 2)
(defun no-auto-fill-hook () (auto-fill-mode -1))
(add-hook 'html-mode-hook 'no-auto-fill-hook)
(add-hook 'text-mode-hook 'no-auto-fill-hook)
(add-hook 'python-mode-hook 'no-auto-fill-hook)
(remove-hook 'text-mode-hook #'turn-on-auto-fill)
(setq flyspell-issue-welcome-flag nil)
(add-hook 'after-init-hook
'(lambda () (setq debug-on-error t)))
(latex-preview-pane-enable)
(require 'project-root)
(setq project-roots
`(("Tox Project"
:root-contains-files ("tox.ini")
:filename-regex (regexify-ext-list '(py)))
("Python Project"
:root-contains-files (".git" "setup.py")
:filename-regex (regexify-ext-list '(py)))
("Git project"
:root-contains-files (".git"))))
;; =============================================================================
;; Misc
;; =============================================================================
(defun ffip-get-buffer-name()
(interactive)
(file-relative-name (buffer-file-name) (expand-file-name (ffip-project-root))))
(defun message-buffer-name()
(interactive)
(message (ffip-get-buffer-name)))
(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)
(let ( (pdf-file (replace-regexp-in-string "\.tex$" ".pdf" buffer-file-name)))
(shell-command (concat "open " pdf-file))))
;; =============================================================================
;; tmux
;; =============================================================================
(defun tmux-copy (&optional b e)
(interactive "r")
(shell-command-on-region b e "cat | tmux loadb -"))
(defun tmux-copy-buffer-name (&optional b e)
(interactive "r")
(shell-command (concat "echo " (shell-quote-argument (ffip-get-buffer-name)) " | tmux loadb -")))
;; =============================================================================
;; Flymake
;; =============================================================================
(require 'flymake)
(require 'flymake-cursor)
(defun flymake-pylint-init ()
(let* ((temp-file (flymake-init-create-temp-buffer-copy
'flymake-create-temp-inplace))
(local-file (file-relative-name
temp-file
(file-name-directory buffer-file-name))))
(list "pyflakes" (list local-file))))
(add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pylint-init))
;; Load flymake on non-temp buffers
(add-hook 'python-mode-hook
(lambda () (unless (or (eq buffer-file-name nil) (eq (file-name-directory buffer-file-name) nil)) (flymake-mode 1))))
;; =============================================================================
;; Python
;; =============================================================================
;; Multi-lining for python.
(require 'multi-line-it)
(require 'pytest)
(add-hook 'python-mode-hook (lambda () (setq show-trailing-whitespace t)))
(defun python-tabs () (setq tab-width 4
indent-tabs-mode t
python-indent-offset 4))
(defvar use-python-tabs nil)
(add-hook 'python-mode-hook (lambda () (if use-python-tabs python-tabs)))
(add-hook 'python-mode-hook (lambda () (subword-mode 1)))
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)
(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 ()
(interactive)
(condition-case ex
(let ((project-root (with-project-root (cdr project-details))))
(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))
(add-hook 'python-mode-hook 'add-virtual-envs-to-jedi-server)
;; Macros
(fset 'ipdb "import ipdb; ipdb.set_trace()")
(fset 'main "if __name__ == '__main__':")
(fset 'sphinx-class ":class:`~")
(global-auto-complete-mode)
;; Macros
(fset 'ipdb "import ipdb; ipdb.set_trace()")
;; =============================================================================
;; JavaScript
;; =============================================================================
(add-hook 'js-mode-common-hook (lambda () (subword-mode 1)))
(add-hook 'js-mode (lambda () (subword-mode 1)))
;; =============================================================================
;; Scala
;; =============================================================================
(require 'ensime)
(add-hook 'scala-mode-hook 'ensime-scala-mode-hook)
(add-hook 'scala-mode-hook (lambda () (subword-mode 1)))
;; =============================================================================
;; Custom Key Bindings
;; =============================================================================
;; Fast cursor movement in vertical direction with Meta.
(global-set-key (kbd "M-n") (lambda () (interactive) (next-line 5)))
(global-set-key (kbd "M-p") (lambda () (interactive) (previous-line 5)))
(global-set-key (kbd "ESC n") (lambda () (interactive) (next-line 5)))
(global-set-key (kbd "ESC p") (lambda () (interactive) (previous-line 5)))
;; Miscellaneous
(global-set-key (kbd "C-x C-b") 'buffer-menu)
(global-unset-key (kbd "C-o"))
(global-set-key (kbd "C-x w") 'whitespace-mode)
(global-set-key (kbd "C-x C-r") (lambda () (interactive) (revert-buffer t t)))
(global-set-key (kbd "M-g") 'goto-line)
(global-set-key (kbd "C-c C-c") 'comment-dwim)
(global-set-key (kbd "C-c t") 'testify-run-test)
(global-set-key (kbd "C-c C-o") 'testify-run-case)
(global-set-key (kbd "C-c e") 'os-copy)
(global-set-key (kbd "C-x O") (lambda () (interactive) (other-window -1)))
(global-set-key (kbd "C-x C-c") 'kill-emacs)
(global-set-key (kbd "C-c +") 'message-buffer-name)
(global-set-key "\C-cg" 'jedi:goto-definition)
(global-unset-key (kbd "C-o"))
;; Multiple Cursors
(global-set-key (kbd "C-x r t") 'mc/edit-lines)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-<") 'mc/mark-previous-like-this)
(global-set-key (kbd "C-c <") 'mc/mark-all-like-this)
(global-set-key (kbd "C->") 'mc/mark-next-like-this)
(global-set-key (kbd "C-_") 'undo)
(global-set-key (kbd "C--") 'undo)
(eval-after-load 'js2-mode
'(define-key js2-mode-map (kbd "C-c b") 'web-beautify-js))
(eval-after-load 'json-mode
'(define-key json-mode-map (kbd "C-c b") 'web-beautify-js))
(eval-after-load 'sgml-mode
'(define-key html-mode-map (kbd "C-c b") 'web-beautify-html))
(eval-after-load 'css-mode
'(define-key css-mode-map (kbd "C-c b") 'web-beautify-css))
;; =============================================================================
;; Appearance
;; =============================================================================
(if (and (eq system-type 'darwin) window-system)
(load-theme 'solarized-dark t) (load-theme 'monokai t))
(require 'color-theme)
(require 'whitespace)
(require 'rainbow-delimiters)
;; make whitespace-mode use just basic coloring
(setq whitespace-style (quote (spaces tabs newline space-mark tab-mark newline-mark)))
(setq whitespace-display-mappings
'((space-mark 32 [183] [46])
(tab-mark 9 [9655 9] [92 9])))
;; (set-face-background 'mode-line "black")
;; (set-face-foreground 'mode-line "white")
;; (set-face-background 'mode-line-inactive "black")
;; Customize font-faces
;; (custom-set-faces
;; ;; custom-set-faces was added by Custom.
;; ;; If you edit it by hand, you could mess it up, so be careful.
;; ;; Your init file should contain only one such instance.
;; ;; If there is more than one, they won't work right.
;; '(flymake-errline ((((class color)) (:background "DarkViolet"))))
;; '(flymake-warnline ((((class color)) (:underline "Orange"))))
;; '(rainbow-delimiters-depth-1-face ((t (:foreground "green"))))
;; '(rainbow-delimiters-depth-2-face ((t (:foreground "blue"))))
;; '(rainbow-delimiters-depth-3-face ((t (:foreground "magenta"))))
;; '(rainbow-delimiters-depth-4-face ((t (:foreground "yellow"))))
;; '(rainbow-delimiters-depth-5-face ((t (:foreground "cyan"))))
;; '(rainbow-delimiters-depth-7-face ((t (:foreground "blue"))))
;; '(rainbow-delimiters-depth-8-face ((t (:foreground "yellow"))))
;; '(rainbow-delimiters-depth-9-face ((t (:foreground "magenta")))))
;; =============================================================================
;; Customize
;; =============================================================================
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(custom-safe-themes (quote ("60f04e478dedc16397353fb9f33f0d895ea3dab4f581307fbf0aa2f07e658a40" default)))
'(reb-re-syntax (quote string))
'(safe-local-variable-values (quote ((use-python-tabs . t) (python-indent . 4) (whitespace-line-column . 80) (lexical-binding . t)))))
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(default ((t (:background nil)))))