Gee, what're we gonna do tonight, Brain?

This commit is contained in:
Henrik Lissner 2014-11-29 20:21:03 -05:00
parent 4df3c32a8d
commit 3a79705475
44 changed files with 1806 additions and 1237 deletions

52
Cask
View file

@ -10,30 +10,42 @@
(depends-on "f") (depends-on "f")
(depends-on "deferred") (depends-on "deferred")
(depends-on "exec-path-from-shell") (depends-on "exec-path-from-shell")
(depends-on "fuzzy")
(depends-on "use-package") (depends-on "use-package")
(depends-on "smex")
(depends-on "auto-async-byte-compile")
;; Editing ;; Editing
(depends-on "smooth-scrolling")
(depends-on "smart-mode-line") (depends-on "smart-mode-line")
(depends-on "shut-up") (depends-on "shut-up")
(depends-on "dired+") (depends-on "dired+")
(depends-on "expand-region") (depends-on "expand-region")
(depends-on "flycheck") (depends-on "flycheck")
(depends-on "flyspell") (depends-on "flyspell")
(depends-on "multiple-cursors")
(depends-on "rainbow-delimiters") (depends-on "rainbow-delimiters")
(depends-on "smartparens") (depends-on "smartparens")
(depends-on "anzu") (depends-on "anzu")
(depends-on "key-chord") (depends-on "key-chord")
(depends-on "saveplace")
(depends-on "yasnippet") (depends-on "yasnippet")
(depends-on "git-gutter") (depends-on "git-gutter-fringe+")
(depends-on "popwin") (depends-on "popwin")
(depends-on "dash-at-point") (depends-on "dash-at-point")
(depends-on "auto-complete") (depends-on "auto-complete")
(depends-on "auto-complete-clang") (depends-on "auto-complete-clang")
(depends-on "auto-complete-c-headers") (depends-on "auto-complete-c-headers")
(depends-on "ace-jump-mode")
(depends-on "ac-etags") (depends-on "ac-etags")
(depends-on "xcscope")
(depends-on "ac-ispell")
(depends-on "ace-jump-mode")
(depends-on "ace-window")
(depends-on "smart-forward")
(depends-on "regex-tool")
(depends-on "perspective")
(depends-on "persp-projectile")
;;(depends-on "multiple-cursors")
;;(depends-on "git-gutter")
;;(depends-on "saveplace")
;; Eeeevil ;; Eeeevil
(depends-on "evil") (depends-on "evil")
@ -43,54 +55,64 @@
(depends-on "evil-exchange") (depends-on "evil-exchange")
(depends-on "evil-space") (depends-on "evil-space")
(depends-on "evil-visualstar") (depends-on "evil-visualstar")
;; evil-nerd-commenter chokes if it's installed via cask for some reason...
;;(depends-on "evil-nerd-commenter")
(depends-on "evil-indent-textobject") (depends-on "evil-indent-textobject")
(depends-on "evil-jumper") (depends-on "evil-jumper")
(depends-on "evil-god-state") (depends-on "evil-god-state")
(depends-on "god-mode") (depends-on "god-mode")
;; evil-nerd-commenter chokes if it's installed via cask for some reason...
;;(depends-on "evil-nerd-commenter")
;; Project management ;; Project management
(depends-on "ag")
(depends-on "projectile") (depends-on "projectile")
(depends-on "helm") (depends-on "helm")
(depends-on "smex") (depends-on "helm-ag")
(depends-on "ag") (depends-on "helm-css-scss")
(depends-on "grizzl") (depends-on "helm-projectile")
(depends-on "neotree") (depends-on "neotree")
(depends-on "ido-ubiquitous") (depends-on "ido-ubiquitous")
(depends-on "ido-vertical-mode") (depends-on "ido-vertical-mode")
(depends-on "flx-ido") (depends-on "flx-ido")
;;(depends-on "grizzl")
;; Modes/mode-specific ;; Modes/mode-specific
(depends-on "org-plus-contrib") (depends-on "org-plus-contrib")
(depends-on "org-opml" :git "https://github.com/edavis/org-opml") (depends-on "org-opml" :git "https://github.com/edavis/org-opml")
(depends-on "rainbow-mode") (depends-on "rainbow-mode")
(depends-on "web-mode")
(depends-on "lua-mode") (depends-on "lua-mode")
(depends-on "php-mode") (depends-on "php-mode")
(depends-on "emmet-mode")
(depends-on "haml-mode") (depends-on "haml-mode")
(depends-on "scss-mode") (depends-on "scss-mode")
(depends-on "sass-mode")
(depends-on "sws-mode") (depends-on "sws-mode")
(depends-on "json-mode") (depends-on "json-mode")
(depends-on "yaml-mode") (depends-on "yaml-mode")
(depends-on "markdown-mode") (depends-on "markdown-mode")
(depends-on "glsl-mode") (depends-on "glsl-mode")
(depends-on "haxe-mode") (depends-on "groovy-mode")
(depends-on "go-mode" :git "https://github.com/dominikh/go-mode.el") (depends-on "swift-mode")
;; (depends-on "haxe-mode")
;; (depends-on "go-mode" :git "https://github.com/dominikh/go-mode.el")
(depends-on "web-mode")
(depends-on "emmet-mode")
(depends-on "web-beautify")
(depends-on "js2-mode")
(depends-on "js2-refactor")
(depends-on "tern") (depends-on "tern")
(depends-on "tern-auto-complete") (depends-on "tern-auto-complete")
(depends-on "rspec-mode") (depends-on "rspec-mode")
(depends-on "inf-ruby") (depends-on "inf-ruby")
(depends-on "ac-inf-ruby") ;;(depends-on "ac-inf-ruby")
(depends-on "robe")
(depends-on "jedi") (depends-on "jedi")
;;(depends-on "omnisharp") ;;(depends-on "omnisharp")
(depends-on "csharp-mode") ;;(depends-on "csharp-mode")
(depends-on "emacs-eclim") (depends-on "emacs-eclim")
(depends-on "git-commit-mode") (depends-on "git-commit-mode")

View file

@ -1,3 +1,3 @@
#!/usr/bin/env bash #!/usr/bin/env bash
rm -f init.elc init/*.elc init/defuns/*.elc elisp/*.elc &> /dev/null rm -f init.elc init/*.elc elisp/*.elc &> /dev/null

117
elisp/hl-todo.el Normal file
View file

@ -0,0 +1,117 @@
;;; hl-todo.el --- highlight TODO keywords
;; Copyright (C) 2013-2014 Jonas Bernoulli
;; Author: Jonas Bernoulli <jonas@bernoul.li>
;; Created: 20130310
;; Homepage: http://github.com/tarsius/hl-todo
;; Keywords: convenience
;; This file is not part of GNU Emacs.
;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; For a full copy of the GNU General Public License
;; see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Hightlight TODO keywords. There are many minor modes like it
;; but this one is mine. It also happens to be simpler than the
;; alternatives.
;; For now at least -- I might extend it. Or I might abandon it
;; in favor of one of the following -- so you might be better of
;; going straight for one of these:
;; - [[http://emacswiki.org/fic-ext-mode.el][fic-ext-mode]]
;; - [[https://github.com/lewang/fic-mode][fic-mode]]
;; - [[http://emacswiki.org/FixmeMode][fixme-mode]]
;; - [[https://github.com/rolandwalker/fixmee][fixmee]]
;; - see http://emacswiki.org/FixmeMode for more alternatives
;; If you like this you might also like [[https://github.com/tarsius/orglink][orglink]].
;;; Code:
(defgroup hl-todo nil
"Highlight TODO keywords in comments."
:group 'font-lock-extra-types)
(defface hl-todo
'((t (:bold t :foreground "#cc9393")))
"Face used to highlight TODO keywords."
:group 'hl-todo)
(defcustom hl-todo-activate-in-modes '(emacs-lisp-mode)
"Major modes in which `hl-todo-mode' should be activated.
This is used by `global-hl-todo-mode'."
:group 'hl-todo
:type '(repeat function))
(defvar hl-todo-keywords nil)
(defcustom hl-todo-keyword-faces
'(("HOLD" . "#d0bf8f")
("TODO" . "#cc9393")
("NEXT" . "#dca3a3")
("THEM" . "#dc8cc3")
("PROG" . "#7cb8bb")
("OKAY" . "#7cb8bb")
("DONT" . "#5f7f5f")
("FAIL" . "#8c5353")
("DONE" . "#afd8af")
("FIXME" . "#cc9393")
("XXX" . "#cc9393")
("XXXX" . "#cc9393")
("???" . "#cc9393"))
"Faces used to highlight specific TODO keywords."
:group 'hl-todo
:type '(repeat (cons (string :tag "Keyword")
(choice :tag "Face "
(string :tag "Color")
(sexp :tag "Face"))))
:set (lambda (symbol value)
(set-default symbol value)
(setq hl-todo-keywords
`((,(concat "\\_<\\("
(mapconcat 'car value "\\|")
"\\)\\_>")
(1 (hl-todo-get-face) t))))))
(defun hl-todo-get-face ()
(let ((f (cdr (assoc (match-string 1) hl-todo-keyword-faces))))
(if (stringp f) (list :inherit 'hl-todo :foreground f) f)))
;;;###autoload
(define-minor-mode hl-todo-mode
"Highlight TODO tags in comments."
:lighter ""
:group 'hl-todo
(if hl-todo-mode
(font-lock-add-keywords nil hl-todo-keywords 'append)
(font-lock-remove-keywords nil hl-todo-keywords))
(when (called-interactively-p 'any)
(font-lock-fontify-buffer)))
;;;###autoload
(define-globalized-minor-mode global-hl-todo-mode
hl-todo-mode turn-on-hl-todo-mode-if-desired)
(defun turn-on-hl-todo-mode-if-desired ()
(when (apply 'derived-mode-p hl-todo-activate-in-modes)
(hl-todo-mode 1)))
(provide 'hl-todo)
;; Local Variables:
;; indent-tabs-mode: nil
;; End:
;;; hl-todo.el ends here

45
init.el
View file

@ -10,61 +10,70 @@
;; instead of / ;; instead of /
(cd "~") (cd "~")
;; (setq use-package-verbose t) ; for debug purposes (setq use-package-verbose t) ; for debug purposes
(require 'cask) (require 'cask)
(cask-initialize) (cask-initialize)
(setq user-mail-address "henrik@lissner.net")
(defconst *dir (file-name-directory load-file-name)) (defconst *dir (file-name-directory load-file-name))
(defconst *init-dir (concat *dir "init/")) (defconst *init-dir (concat *dir "init/"))
(defconst *themes-dir (concat *dir "themes/")) (defconst *themes-dir (concat *dir "themes/"))
(defconst *elisp-dir (concat *dir "elisp/")) (defconst *elisp-dir (concat *dir "elisp/"))
(defconst *snippets-dir (concat *dir "snippets/")) (defconst *snippets-dir (concat *dir "snippets/"))
(defconst *ac-dicts-dir (concat *dir "ac-dict")) (defconst *ac-dicts-dir (concat *dir "ac-dict/"))
(defconst *tmp-dir "/tmp/emacs/") (defconst *tmp-dir (concat *dir "tmp/"))
(defconst *theme 'brin) (defconst *theme 'brin)
(defconst *font "Inconsolata-14") (defconst *font
(if (string-equal system-name "ganymede.local")
"Ubuntu Mono-12" ; Use smaller font on my laptop
"Ubuntu Mono-14")) ; And larger font everywhere else
(add-to-list 'load-path *init-dir) (add-to-list 'load-path *init-dir)
;; Just the... bear necessities... ;; Just the... bear necessities...
(mapc 'require (mapc 'require
'(core '(core
my-defuns ; Personal library core-defuns ; Defun library
core-editor ; Global editor behavior (w/ evil)
;; Tailoring emacs
core-editor ; Internal config for global editor behavior
core-ui ; User interface layout & behavior core-ui ; User interface layout & behavior
core-osx ; Mac-specific config core-osx ; Mac-specific config
;; Plugins & modules ;; Essential plugins & modules
init-ido ; Ido setup init-ido ; Ido setup
init-project ; Project navigation tools & settings init-project ; Project nav+search tools (projectile, helm, ag)
init-ac ; Auto-complete engine & settings
init-snippets ; Snippet engine init-snippets ; Snippet engine
init-git ; GIT tools/settings init-git ; GIT tools/settings
init-fly ; Syntax & spell checker init-fly ; Syntax & spell checker
init-etags init-auto-complete ; Auto-complete engine
init-auto-insert ; File auto-insert templates
init-cscope ; Global code indexing
;; Modes & environments ;; Modes & environments
init-text ; Plain text editing (markdown, text) init-text ; Plain text editing (markdown, text)
init-sh ; Shell script editing (sh, zsh)
init-org ; Org-mode: personal gtd/notes init-org ; Org-mode: personal gtd/notes
init-dev ; Generic dev tools & environment for all programming init-dev ; Generic dev tools & environment for all programming
init-ruby init-ruby
init-python init-python
init-webdev ; Environment for webdev (SCSS, PHP, Rails, Jekyll) ;;init-php
init-webdev ; Environment for webdev (SCSS, PHP, Rails, Javascript)
init-love ; Love.app gamedev init-love ; Love.app gamedev
init-cpp ; C++ gamedev init-cpp ; C++ gamedev
init-eclim ; Integration into eclipse (for Java) init-java ; Java-specific settings (including eclim)
;; init-go ; Go-lang
;; init-swift ; iOS/Mac dev environment for swift
;; init-csharp ; Emacs as a Csharp/Unity IDE ;; init-csharp ; Emacs as a Csharp/Unity IDE
;; My homebaked packages
my-commands ; Ex commands & evil operators/commands
my-coderunner ; Code/REPL runners
;; Personal settings (must be last!)
my-settings ; Any other custom settings my-settings ; Any other custom settings
my-commands ; Interactive defuns & evil operators/commands
my-keymaps ; My keybindings my-keymaps ; My keybindings
)) ))
;; (require 'server)
;; (unless (server-running-p) (server-start))
;; I've created a monster! ;; I've created a monster!

View file

237
init/core-defuns.el Normal file
View file

@ -0,0 +1,237 @@
(provide 'core-defuns)
;;;; Convenience ;;;;;;;;;;;;;;;;;;;
(defun associate-mode (match mode)
(add-to-list 'auto-mode-alist (cons match mode)))
(defun associate-minor-mode (match mode)
(add-to-list 'auto-minor-mode-alist (cons match mode)))
(defmacro λ (&rest body)
`(lambda () (interactive) ,@body))
(defmacro λ! (&rest body)
`(lambda () ,@body))
(defmacro add-hook! (hook &rest body)
`(add-hook ,hook (lambda() ,@body)))
;; Backwards compatibility
(unless (fboundp 'with-eval-after-load)
(defmacro with-eval-after-load (file &rest body)
`(eval-after-load ,file
`(funcall (function ,(lambda () ,@body))))))
(defmacro after (feature &rest forms)
`(,(if (or (not (boundp 'byte-compile-current-file))
(not byte-compile-current-file)
(if (symbolp feature)
(require feature nil :no-error)
(load feature :no-message :no-error)))
'progn
(message "after: cannot find %s" feature)
'with-no-warnings)
(with-eval-after-load ',feature ,@forms)))
;; vimmish keymapping shortcuts
(defalias 'defcmd 'evil-ex-define-cmd)
(defmacro ibind (key command)
`(key-chord-define evil-insert-state-map ,key ,command))
(defun bind (state &rest keys)
(let ((state-list state)
(is-global (or (stringp state)
(vectorp state)))
keymap)
(if is-global
(setq keys (-insert-at 0 state keys))
(progn
(if (keymapp (first keys))
(setq keymap (pop keys)))
(if (or (keymapp state)
(not (listp state)))
(setq state-list (list state)))))
(while keys
(let ((-key (pop keys))
(-def (pop keys)))
(if is-global
(global-set-key -key -def)
(dolist (-state state-list)
(cond ((evil-state-p -state)
(define-key
(if keymap
(evil-get-auxiliary-keymap keymap -state t)
(evil-state-property -state :keymap t)) -key -def))
((keymapp -state)
(define-key -state -key -def)))))))))
;; Hooks ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun enable-comment-hard-wrap ()
(set (make-local-variable 'comment-auto-fill-only-comments) t)
(turn-on-auto-fill))
(defun enable-tab-width-2 ()
(setq tab-width 2
evil-shift-width 2))
(defun disable-final-newline ()
(set (make-local-variable 'require-final-newline) nil))
;;; Text Defuns ;;;;;;;;;;;;;;;;;;;;;;;;
(defun my/surrounded-p ()
(and (looking-back "[[{(]\\(\s+\\|\n\\)?\\(\s\\|\t\\)*")
(let* ((whitespace (match-string 1))
(match-str (concat whitespace (match-string 2) "[])}]")))
(looking-at-p match-str))))
(defun my/empty-line-p ()
(zerop (length (s-trim (my/get-line)))))
(defun my/get-line ()
(buffer-substring (line-beginning-position) (line-end-position)))
(defun my.backward-kill-to-bol-and-indent ()
"Kill line to the first non-blank character. If invoked again
afterwards, kill line to column 1."
(interactive)
(let ((empty-line (my/empty-line-p)))
(evil-delete (point-at-bol) (point))
(if (not empty-line)
(indent-according-to-mode))))
(defun my.point-at-first-non-blank()
(save-excursion (evil-first-non-blank) (point)))
(defun my.move-to-bol ()
"Moves cursor to the first non-blank character on the line. If
already there, move it to the true bol."
(interactive)
(evil-save-goal-column
(let ((point-at-bol (my.point-at-first-non-blank))
(point (point)))
(if (= point-at-bol point)
(evil-move-beginning-of-line)
(unless (= (point-at-bol) point)
(evil-first-non-blank))))))
(defun my.move-to-eol ()
(interactive)
(evil-save-goal-column
(let ((old-point (point)))
(when (comment-search-forward (point-at-eol) t)
(goto-char (match-beginning 0))
(skip-syntax-backward " ^<*" (my.point-at-first-non-blank))
(if (eq old-point (point)) ;
(evil-move-end-of-line))))))
;; Mimic expandtab in vim
(defun my.backward-delete-whitespace-to-column ()
"Delete back to the previous column of whitespace, or as much
whitespace as possible, or just one char if that's not possible."
(interactive)
(cond ;; If in a string
((sp-point-in-string)
(call-interactively 'backward-delete-char-untabify))
;; If using tabs (or at bol), just delete normally
((or indent-tabs-mode
(= (point-at-bol) (point)))
(call-interactively 'backward-delete-char))
;; Otherwise, delete up to the nearest tab column
(t (let ((movement (% (current-column) tab-width))
(p (point)))
(when (= movement 0)
(setq movement tab-width))
(save-match-data
(if (string-match "\\w*\\(\\s-+\\)$" (buffer-substring-no-properties (- p movement) p))
(backward-delete-char (- (match-end 1) (match-beginning 1)))
(call-interactively 'backward-delete-char-untabify)))))))
(defun my.dumb-indent ()
"Inserts a tab character (or spaces x tab-width). Checks if the
auto-complete window is open."
(interactive)
(if indent-tabs-mode
(insert "\t")
(let* ((movement (% (current-column) tab-width))
(spaces (if (zerop movement) tab-width (- tab-width movement))))
(insert (s-repeat spaces " ")))))
(defun my.inflate-space-maybe ()
"Checks if point is surrounded by {} [] () delimiters and adds a
space on either side of the point if so."
(interactive)
(if (my/surrounded-p)
(progn (call-interactively 'self-insert-command)
(save-excursion (call-interactively 'self-insert-command)))
(call-interactively 'self-insert-command)))
(defun my.deflate-space-maybe ()
"Checks if point is surrounded by {} [] () delimiters, and deletes
spaces on either side of the point if so. Resorts to
`my.backward-delete-whitespace-to-column' otherwise."
(interactive)
(save-match-data
(if (my/surrounded-p)
(let ((whitespace-match (match-string 1)))
(cond ((not whitespace-match)
(call-interactively 'delete-backward-char))
((string-match "\n" whitespace-match)
(evil-delete (point-at-bol) (point))
(delete-char -1)
(save-excursion (delete-char 1)))
(t
(just-one-space 0))))
(my.backward-delete-whitespace-to-column))))
(defun my.newline-and-indent ()
"Newline and indent; if in a comment, auto-comment and properly
indent the next line."
(interactive)
(cond ((sp-point-in-string)
(evil-ret))
((evil-in-comment-p)
(if (eq major-mode 'js2-mode)
(js2-line-break)
(call-interactively 'indent-new-comment-line)))
(t
(evil-ret-and-indent))))
(defun s-lines? (s) (length (s-lines s)))
;; Utility ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun what-face (pos)
"Tells you the name of the face (point) is on."
(interactive "d")
(let ((face (or (get-char-property (point) 'read-face-name)
(get-char-property (point) 'face))))
(if face (message "Face: %s" face) (message "No face at %d" pos))))
(defun what-col ()
(interactive)
(message "Column %d" (current-column)))
(defun my/append-to-list (list-var elements)
"Append ELEMENTS to the end of LIST."
(unless (consp elements)
(error "ELEMENTS must be a list"))
(let ((list (symbol-value list-var)))
(if list
(setcdr (last list) elements)
(set list-var elements)))
(symbol-value list-var))
(defun my/project-root (&optional force-pwd)
(if (and (not force-pwd)
(projectile-project-p))
(projectile-project-root)
default-directory))
(defmacro f--exists? (file dir)
`(f-exists? (expand-file-name ,file ,dir)))

View file

@ -2,134 +2,112 @@
;;;; Editor behavior ;;;;;;;;;;;;;;;; ;;;; Editor behavior ;;;;;;;;;;;;;;;;
(setq sentence-end-double-space nil) (setq sentence-end-double-space nil)
(setq require-final-newline t) ;; (setq require-final-newline nil)
;; (setq mode-require-final-newline nil)
(setq-default fill-column 80)
(electric-indent-mode -1) ; In case of emacs 24.4
(setq-default tab-width 4
tab-always-indent nil
indent-tabs-mode nil) ; spaces instead of tabs
(setq-default tab-width 4) ;; Show tab characters
(setq-default indent-tabs-mode nil) (global-whitespace-mode 1)
(setq-default tab-always-indent nil) (setq whitespace-style '(face tabs tab-mark) ; needs to be re-set in every buffer
whitespace-display-mappings
;; In case of emacs 24.4 '((tab-mark ?\t [?| ?\t] [?\\ ?\t])
(electric-indent-mode -1) (newline-mark 10 [36 10])))
;; Remember undo history
(setq undo-tree-auto-save-history t)
(setq undo-tree-history-directory-alist `((".*" . ,*tmp-dir-undo)))
;; Save cursor location across sessions
(require 'saveplace)
(setq-default save-place t)
(setq save-place-file (f-expand "saveplace" *tmp-dir))
;; Save history across sessions
(setq savehist-additional-variables
;; search entries
'(search ring regexp-search-ring)
;; keep the home clean
savehist-file (f-expand "savehist" *tmp-dir))
(savehist-mode 1)
;;;; Modes 'n hooks ;;;;;;;;;;;;;;;;; ;;;; Modes 'n hooks ;;;;;;;;;;;;;;;;;
(associate-mode "\\.plist$" nxml-mode) (associate-mode "/LICENSE[^/]*$" 'text-mode)
(associate-mode "zsh\\(env\\|rc\\)?$" shell-script-mode) (associate-mode "zsh\\(env\\|rc\\)?$" 'sh-mode)
(associate-mode "z\\(profile\\|login\\|logout\\)?$" shell-script-mode) (associate-mode "z\\(profile\\|login\\|logout\\)?$" 'sh-mode)
(associate-mode "zsh/" shell-script-mode) (associate-mode "zsh/" 'sh-mode)
(associate-mode "\\.applescript$" applescript-mode) (associate-mode "\\.applescript$" 'applescript-mode)
(associate-mode "Cask$" emacs-lisp-mode) (associate-mode "Cask$" 'emacs-lisp-mode)
(associate-mode "\\.el\\.gz$" emacs-lisp-mode) (associate-mode "\\.el\\.gz$" 'emacs-lisp-mode)
(associate-mode "/Makefile$" 'makefile-gmake-mode)
(associate-mode "\\.plist$" 'nxml-mode)
(add-hook 'text-mode-hook 'enable-hard-wrap)
(add-hook 'prog-mode-hook 'enable-comment-hard-wrap)
(add-hook 'before-save-hook 'delete-trailing-whitespace) (add-hook 'before-save-hook 'delete-trailing-whitespace)
;; Kill special (\\*.+\\*) buffers that are buried
(run-with-idle-timer 10 t 'my:kill-other-buffers)
;;;; Evil-mode ;;;;;;;;;;;;;;;;;;;;;;;
;;;; Evil ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package evil (use-package evil
:diminish undo-tree-mode :pre-load (defvar evil-want-C-u-scroll t)
:config :init
(progn (progn
(evil-mode 1) (evil-mode 1)
(setq evil-want-visual-char-semi-exclusive t
evil-search-module 'evil-search
evil-magic 'very-magic
;; Color-coded state cursors
evil-normal-state-cursor '("white" box)
evil-visual-state-cursor '("cyan" box)
evil-god-state-cursor '("orange" box))
;; Fixes C-i's synonymity with TAB
(keyboard-translate ?\C-i ?\H-i)
(add-hook! 'find-file-hook (setq evil-shift-width tab-width)) (add-hook! 'find-file-hook (setq evil-shift-width tab-width))
(setq evil-search-module 'evil-search) ;; modes to map to different default states
(setq evil-magic 'very-magic) (dolist (mode-map '((cider-repl-mode . emacs)
;; Color-coded state cursors (comint-mode . emacs)
(setq evil-normal-state-cursor '("white" box)) (eshell-mode . emacs)
(setq evil-visual-state-cursor '("cyan" box)) (fundamental-mode . normal)
(setq evil-god-state-cursor '("orange" box)) (git-commit-mode . insert)
(git-rebase-mode . emacs)
(evil-set-initial-state 'comint-mode 'insert) (help-mode . normal)
(term-mode . emacs)))
(evil-set-initial-state `,(car mode-map) `,(cdr mode-map)))
(use-package evil-ex-registers) (use-package evil-ex-registers)
(use-package evil-exchange) (use-package evil-exchange)
(use-package evil-indent-textobject) (use-package evil-indent-textobject) ; vii/vai/vaI
(use-package evil-numbers) (use-package evil-numbers)
(use-package evil-visualstar) (use-package evil-visualstar)
(use-package evil-nerd-commenter :pre-load (setq evilnc-hotkey-comment-operator "g/"))
(use-package evil-nerd-commenter (use-package evil-space :init (evil-space-default-setup))
:pre-load (setq evilnc-hotkey-comment-operator "g/")) (use-package evil-matchit :init (global-evil-matchit-mode 1))
(use-package evil-surround :init (global-evil-surround-mode 1))
(use-package evil-god-state)
(use-package evil-jumper (use-package evil-jumper
:pre-load :pre-load (defvar evil-jumper-file (expand-file-name "jumplist" *tmp-dir))
(defvar evil-jumper-file (expand-file-name "jumplist" *tmp-dir))
:config
(setq evil-jumper-auto-center t
evil-jumper-auto-save-interval 3600))
(use-package evil-space
:init (evil-space-default-setup))
(use-package evil-matchit
:init (global-evil-matchit-mode 1))
(use-package evil-surround
:init (global-evil-surround-mode 1)
:config :config
(progn (progn
;; Adds escaped delimiters to evil-surround (setq evil-jumper-auto-center t
(defun my.evil-surround-escaped-pair () evil-jumper-auto-save-interval 3600)
"Evil-surround function to allow escaped delimiters. e.g. \"...\""
(let* ((input (format "\\%s" (char-to-string (read-char "\\")))))
;; Type \\ to simply surround in single backslashes
(if (= input "\\\\")
(cons "\\" "\\")
(cons input input))))
(setq-default evil-surround-pairs-alist (cons '(?\\ . my.evil-surround-escaped-pair) evil-surround-pairs-alist))))
(use-package god-mode) (define-key evil-motion-state-map (kbd "H-i") 'evil-jumper/forward)))
(use-package evil-god-state :diminish god-local-mode)
(defmap evil-ex-completion-map
(kbd "C-r") #'evil-ex-paste-from-register ; registers in ex-mode
(kbd "C-a") 'move-beginning-of-line
(kbd "<s-left>") 'move-beginning-of-line
(kbd "<s-right>") 'move-beginning-of-line
(kbd "<s-backspace>") 'evil-delete-whole-line)
;;;; ace-jump ;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Enable half-cursor blink when using ace-jump ;; Enable half-cursor blink when using ace-jump
(defadvice evil-ace-jump-char-mode (before evil-ace-jump-char-mode-operator-mode activate) (defadvice evil-ace-jump-char-mode (before evil-ace-jump-char-mode-op activate) (evil-half-cursor))
(evil-half-cursor)) (defadvice evil-ace-jump-word-mode (before evil-ace-jump-word-mode-op activate) (evil-half-cursor))
(defadvice evil-ace-jump-word-mode (before evil-ace-jump-word-mode-operator-mode activate) (setq ace-jump-mode-scope 'global) ; limit ace-jump to current window
(evil-half-cursor)) (setq ace-jump-mode-move-keys ; use a-z, 0-9
(nconc (loop for i from ?a to ?z collect i)
(loop for i from ?A to ?Z collect i)))
;; (setq ace-jump-mode-move-keys ; use a-z
;; (loop for i from ?a to ?z collect i))
;; Exit evil-exchange mode with <Esc> (silently) -- and close ;; Exit evil-exchange mode with <Esc> (silently) -- and close
;; minibuffer remotely if it happens to be left open ;; minibuffer remotely if it happens to be left open
(defadvice evil-force-normal-state (before evil-esc-quit-exchange activate) (defadvice evil-force-normal-state (before evil-esc-quit-exchange activate)
(shut-up (evil-exchange-cancel) (shut-up (evil-exchange-cancel)
(if (minibufferp) (if (minibuffer-window-active-p (minibuffer-window))
(my:minibuffer-quit)))) (my:minibuffer-quit))))
;; Shut up beginning/end of buffer/line messages in minibuffer (defadvice evil-visual-line (before spc-for-line-jump activate)
(defun my.minibuffer-bolp () (define-key evil-motion-state-map (kbd "SPC") #'evil-ace-jump-line-mode))
"Return t if (point) is truly at the beginning of the (defadvice evil-visual-char (before spc-for-char-jump activate)
minibuffer/evil-ex (first character after the prompt), otherwise (define-key evil-motion-state-map (kbd "SPC") #'evil-ace-jump-char-mode))
returns nil." (defadvice evil-visual-block (before spc-for-char-jump activate)
(<= (- (point) (minibuffer-prompt-end)) 0)) (define-key evil-motion-state-map (kbd "SPC") #'evil-ace-jump-char-mode))
(defadvice left-char (around left-char-move-on-edges activate)
(if (minibufferp)
(unless (my.minibuffer-bolp) ad-do-it)
ad-do-it))
(defadvice right-char (around right-char-move-on-edges activate)
(if (minibufferp)
(unless (eolp) ad-do-it)
ad-do-it))
;; Switch to new splits after splitting ;; Switch to new splits after splitting
(defadvice evil-window-split (after evil-window-split-then-switch activate) (defadvice evil-window-split (after evil-window-split-then-switch activate)
@ -174,69 +152,12 @@ returns nil."
"\\1" file-name t))) "\\1" file-name t)))
file-name))) file-name)))
;;;; Keymap Fixes ;;;;;;;;;;;;;;;;;;;;;;
;; This section is dedicated to keymaps that "fix" certain keys to
;; behave to be more like vim (or how I like it).
;; Restores "dumb" indentation to the tab key. This rustles a lot of
;; peoples' jimmies, apparently, but it's how I like it.
(-imap (kbd "TAB") 'my.dumb-indent)
;; Except for lisp
(imap lisp-mode-map [remap my.dumb-indent] 'indent-for-tab-command)
(imap emacs-lisp-mode-map [remap my.dumb-indent] 'indent-for-tab-command)
;; Highjacks backspace and space to:
;; a) expand spaces between delimiters intelligently: (|) -> ( | )
;; b) the reverse of A: ( | ) -> (|)
;; c) allow backspace to delete indented blocks intelligently
;; d) and not do any of this magic when inside a string
(-imap (kbd "SPC") 'my.inflate-space-maybe
[remap backward-delete-char-untabify] 'my.deflate-space-maybe
[remap newline] 'my.newline-and-indent
;; Smarter move-to-beginning-of-line
[remap move-beginning-of-line] 'my.move-to-bol
;; Restore bash-esque keymaps in insert mode; C-w and C-a already exist
"\C-e" 'my.move-to-eol
"\C-u" 'my.backward-kill-to-bol-and-indent
;; Fix osx keymappings
(kbd "<s-left>") 'my.move-to-bol
(kbd "<s-right>") 'my.move-to-eol
(kbd "<s-backspace>") 'my.backward-kill-to-bol-and-indent
;; Fixes delete
(kbd "<kp-delete>") 'delete-char
;; Textmate-esque insert-line before/after
(kbd "<s-return>") 'evil-open-below
(kbd "<S-s-return>") 'evil-open-above)
(add-hook! 'ido-setup-hook
(defmap ido-completion-map
(kbd "<backspace>") 'ido-delete-backward-updir
"\C-w" 'ido-delete-backward-word-updir))
;; Make ESC quit all the things
(global-set-key [escape] 'keyboard-escape-quit)
(mapc (lambda (map)
(defmap map [escape] 'my:minibuffer-quit))
(list minibuffer-local-map
minibuffer-local-ns-map
minibuffer-local-completion-map
minibuffer-local-must-match-map
minibuffer-local-isearch-map))
(defmap isearch-mode-map [escape] 'isearch-abort)
(defmap evil-god-state-map [escape] 'evil-god-state-bail)
(defmap evil-ex-search-keymap [escape] 'evil-ex-search-exit)
;; Close help/compilation windows with escape
(defmap help-mode-map [escape] 'kill-buffer-and-window)
(defmap compilation-mode-map [escape] 'kill-buffer-and-window)
(emap debugger-mode-map [remap evil-exit-emacs-state] 'kill-buffer-and-window)
;;;; Editing plugins ;;;;;;;;;;;;;;;;;;; ;;;; Editing plugins ;;;;;;;;;;;;;;;;;;;
(use-package expand-region) (use-package anzu :init (global-anzu-mode))
(use-package expand-region :commands (er/expand-region er/contract-region))
(use-package rotate-text :commands (rotate-word-at-point rotate-region))
(use-package smart-forward)
(use-package smartparens (use-package smartparens
:config :config
@ -255,49 +176,82 @@ returns nil."
(sp-with-modes '(emacs-lisp-mode lisp-mode) (sp-with-modes '(emacs-lisp-mode lisp-mode)
(sp-local-pair "[" nil :post-handlers '(("|" "RET")))) (sp-local-pair "[" nil :post-handlers '(("|" "RET"))))
(sp-pair "[" nil :unless '(sp-point-before-word-p)) (sp-pair "[" nil :unless '(sp-point-before-word-p sp-point-before-same-p))
(sp-pair "(" nil :unless '(sp-point-before-word-p)) (sp-pair "(" nil :unless '(sp-point-before-word-p sp-point-before-same-p))
(sp-pair "\"" nil :unless '(sp-point-after-word-p sp-point-before-word-p)) (sp-pair "\"" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-before-same-p))
(sp-pair "'" nil :unless '(sp-point-after-word-p sp-point-before-word-p)) (sp-pair "'" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-before-same-p))
(sp-pair "\"" nil :unless '(sp-point-after-word-p sp-point-before-word-p sp-point-before-same-p))
(after yasnippet (after yasnippet
(defadvice yas-expand (before advice-for-yas-expand activate) (defadvice yas-expand (before advice-for-yas-expand activate)
(sp-remove-active-pair-overlay))))) (sp-remove-active-pair-overlay)))))
(use-package anzu
:diminish anzu-mode
:init
(global-anzu-mode))
;;;; Utility plugins ;;;;;;;;;;;;;;;;;; ;;;; Keymap Fixes ;;;;;;;;;;;;;;;;;;;;;;
(use-package key-chord ;; This section is dedicated to keymaps that "fix" certain keys so
:init ;; that they behave more like vim (or how I like it).
(progn (key-chord-mode 1)
(setq key-chord-two-keys-delay 0.5)))
(use-package smex ;; Restores "dumb" indentation to the tab key. This rustles a lot of
:commands (smex smex-major-mode-commands) ;; peoples' jimmies, apparently, but it's how I like it.
:config (bind 'insert (kbd "TAB") 'my.dumb-indent)
(progn (smex-initialize) ;; Except for lisp
;; Hook up smex to auto-update, rather than update on every run (bind 'insert lisp-mode-map [remap my.dumb-indent] 'indent-for-tab-command)
(defun smex-update-after-load (unused) (bind 'insert emacs-lisp-mode-map [remap my.dumb-indent] 'indent-for-tab-command)
(when (boundp 'smex-cache) (smex-update)))
(add-hook 'after-load-functions 'smex-update-after-load)))
(use-package recentf ;; Highjacks backspace and space to:
:init ;; a) expand spaces between delimiters intelligently: (|) -> ( | )
(progn (recentf-mode 1) ;; b) the reverse of A: ( | ) -> (|)
(setq recentf-max-menu-items 0 ;; c) allow backspace to delete indented blocks intelligently
recentf-max-saved-items 100 ;; d) and not do any of this magic when inside a string
recentf-auto-cleanup 'never (bind 'insert
recentf-exclude '("/tmp/" "/ssh:" "\\.ido\\.last\\'" "\\.revive\\'", "TAGS", "GEMTAGS")))) (kbd "SPC") 'my.inflate-space-maybe
[remap backward-delete-char-untabify] 'my.deflate-space-maybe
[remap newline] 'my.newline-and-indent
(use-package re-builder ;; Smarter move-to-beginning-of-line
:defer t [remap move-beginning-of-line] 'my.move-to-bol
:config
(progn (setq reb-re-syntax 'string) ;; Restore bash-esque keymaps in insert mode; C-w and C-a already exist
(defadvice evil-force-normal-state (before evil-esc-quit-reb-mode activate) "\C-e" 'my.move-to-eol
(when (eq 'reb-mode major-mode) "\C-u" 'my.backward-kill-to-bol-and-indent
(if reb-subexp-mode
(reb-quit-subexp-mode) ;; Fixes delete
(reb-quit)))))) (kbd "<kp-delete>") 'delete-char
;; Textmate-esque insert-line before/after
(kbd "<s-return>") 'evil-open-below
(kbd "<S-s-return>") 'evil-open-above)
;; Fix osx keymappings and then some
(bind (kbd "<s-left>") 'my.move-to-bol
(kbd "<s-right>") 'my.move-to-eol
(kbd "<s-up>") 'smart-up
(kbd "<s-down>") 'smart-down
(kbd "<s-backspace>") 'my.backward-kill-to-bol-and-indent)
(add-hook! 'ido-setup-hook
(bind ido-completion-map
(kbd "<backspace>") 'ido-delete-backward-updir
"\C-w" 'ido-delete-backward-word-updir))
;; Make ESC quit all the things
(bind [escape] 'keyboard-escape-quit)
(bind (list minibuffer-local-map
minibuffer-local-ns-map
minibuffer-local-completion-map
minibuffer-local-must-match-map
minibuffer-local-isearch-map) [escape] 'my:minibuffer-quit)
(bind 'god [escape] 'evil-god-state-bail)
(bind 'normal special-mode-map [escape] 'popwin:close-popup-window)
(bind isearch-mode-map "\C-w" 'isearch-abort)
;; Close help/compilation windows with escape
(bind messages-buffer-mode-map [escape] 'kill-this-buffer)
(bind special-mode-map [escape] 'popwin:close-popup-window)
;;(bind 'normal diff-mode-map
;; [escape] 'kill-this-buffer
;; "q" 'kill-this-buffer)
; (bind 'normal c
; scope-minor-mode-keymap
; [escape] 'kill-this-buffer
; "q" 'kill-this-buffer)

View file

@ -11,4 +11,11 @@
;; fix emacs PATH on OSX (GUI only) ;; fix emacs PATH on OSX (GUI only)
(use-package exec-path-from-shell (use-package exec-path-from-shell
:if (memq window-system '(mac ns)) :if (memq window-system '(mac ns))
:init (exec-path-from-shell-initialize))) :init (exec-path-from-shell-initialize))
;; On OSX, stop copying each visual state move to the clipboard:
;; https://bitbucket.org/lyro/evil/issue/336/osx-visual-state-copies-the-region-on
;; Most of this code grokked from:
;; http://stackoverflow.com/questions/15873346/elisp-rename-macro
(defadvice evil-visual-update-x-selection (around clobber-x-select-text activate)
(unless (featurep 'ns) ad-do-it)))

View file

@ -1,30 +1,43 @@
(provide 'core-ui) (provide 'core-ui)
;; (global-linum-mode t) ; line numbers for everybody! ;;;; GUI Settings ;;;;;;;;;;;;;;;;;;;;;;
(blink-cursor-mode -1) (setq ring-bell-function 'ignore)
(global-hl-line-mode 1) (add-to-list 'default-frame-alist `(font . ,*font))
(add-to-list 'default-frame-alist '(alpha . 100)) ; *slightly* transparent window
(when (functionp 'scroll-bar-mode) (scroll-bar-mode -1)) ; no scrollbar
(when (functionp 'tool-bar-mode) (tool-bar-mode -1)) ; no toolbar
(when (functionp 'menu-bar-mode) (menu-bar-mode -1)) ; no menubar
(when (fboundp 'fringe-mode) (fringe-mode '(5 . 10))) ; no nonsense
(defun toggle-transparency ()
(interactive)
(let ((frame (selected-frame)))
(if (= (frame-parameter frame 'alpha) 0)
(set-frame-parameter frame 'alpha 100)
(set-frame-parameter frame 'alpha 0))))
;;;; Other Settings ;;;;;;;;;;;;;;;;;;;;
(blink-cursor-mode 1) ; blink cursor
(global-hl-line-mode -1) ; highlight line
(line-number-mode 1) ; hide line no in modeline
(column-number-mode 1) ; hide col no in modeline
(show-paren-mode -1) ; highlight matching delimiters
(setq show-paren-delay 0) (setq show-paren-delay 0)
(show-paren-mode 1)
;; Multiple cursors across buffers cause a strange redraw delay for (setq linum-format (quote "%4d "))
;; some things, like auto-complete or evil-mode's cursor color ;; (add-hook 'text-mode-hook 'linum-mode)
;; switching. ;; (add-hook 'prog-mode-hook 'linum-mode)
(setq-default cursor-in-non-selected-windows nil)
;; Show line/col-no in mode-line
(line-number-mode t)
(column-number-mode t)
;; make the fringe unintrusive
(when (fboundp 'fringe-mode)
(fringe-mode '(0 . 10)))
;; Show full path in window title ;; Show full path in window title
(setq frame-title-format (setq frame-title-format
'(:eval (if (buffer-file-name) (abbreviate-file-name (buffer-file-name)) "%b"))) '(:eval (if (buffer-file-name) (abbreviate-file-name (buffer-file-name)) "%b")))
;; Whitespaces (activate whitespace-mode to see) ;; Multiple cursors across buffers cause a strange redraw delay for
(setq whitespace-style '(face trailing tab-mark)) ;; some things, like auto-complete or evil-mode's cursor color
;; switching.
(setq-default cursor-in-non-selected-windows nil)
;; do not soft-wrap lines ;; do not soft-wrap lines
(setq-default truncate-lines t) (setq-default truncate-lines t)
@ -32,40 +45,82 @@
(add-hook! 'help-mode-hook (setq truncate-lines nil)) (add-hook! 'help-mode-hook (setq truncate-lines nil))
(setq ediff-window-setup-function 'ediff-setup-windows-plain) (setq ediff-window-setup-function 'ediff-setup-windows-plain)
(setq indicate-buffer-boundaries nil) (setq indicate-buffer-boundaries nil)
(setq indicate-empty-lines nil) (setq indicate-empty-lines nil)
(setq-default visible-bell nil) ; silence of the bells
(setq-default use-dialog-box nil) ; avoid GUI
(setq-default visible-bell nil)
(setq-default use-dialog-box nil)
;;;; GUI Settings ;;;;;;;;;;;;;;;;;;;;;;
(setq ring-bell-function 'ignore)
(add-to-list 'default-frame-alist `(font . ,*font))
(add-to-list 'default-frame-alist '(alpha 98 95)) ; *slightly* transparent window
(when (functionp 'scroll-bar-mode) (scroll-bar-mode -1))
(when (functionp 'tool-bar-mode) (tool-bar-mode -1))
(when (functionp 'menu-bar-mode) (menu-bar-mode -1))
;;;; Modeline ;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Modeline ;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package uniquify
:config (setq uniquify-buffer-name-style 'post-forward
uniquify-separator ":"
uniquify-ignore-buffers-re "^\\*"))
(use-package smart-mode-line (use-package smart-mode-line
:config :config
(mapc (lambda(mode) (add-to-list 'rm-excluded-modes mode)) (setq rm-blacklist
(mapconcat 'identity
'(" SP" '(" SP"
" Fill" " Fill"
" yas" " yas"
" Fly" " Fly"
" EvilOrg" " EvilOrg"
" Abbrev" " Abbrev"
)) " WS"
" GitGutter"
" Anzu"
" Undo-Tree"
" AC"
" Projectile\\[.+\\]"
) "\\|"))
:init :init
(progn (progn
(setq sml/no-confirm-load-theme t (setq sml/no-confirm-load-theme t
sml/mode-width 'full sml/mode-width 'full
sml/extra-filler 2
sml/show-remote nil sml/show-remote nil
sml/modified-char "*"
sml/encoding-format nil) sml/encoding-format nil)
(add-to-list 'sml/replacer-regexp-list '("^:DB:projects/" "PR:") t)
(setq sml/replacer-regexp-list '(("^~/Dropbox/Projects/" "PROJECTS:")
("^~/.emacs.d/" "EMACS.D:")))
(after evil (setq evil-mode-line-format nil))
(setq-default mode-line-misc-info
'((which-func-mode ("" which-func-format ""))
(global-mode-string ("" global-mode-string ""))))
(add-hook! 'after-change-major-mode-hook
(setq mode-line-format
'(" "
"%e"
;; anzu--mode-line-format
mode-line-mule-info
mode-line-client
mode-line-remote
mode-line-frame-identification
mode-line-buffer-identification
mode-line-modified
mode-line-modes
mode-line-misc-info
(vc-mode vc-mode)
" "
mode-line-position
" "
mode-line-front-space
))
(add-to-list 'mode-line-modes
'(sml/buffer-identification-filling
sml/buffer-identification-filling
(:eval (setq sml/buffer-identification-filling
(sml/fill-for-buffer-identification))))))
(let ((-linepo mode-line-position))
(sml/setup) (sml/setup)
(sml/apply-theme 'respectful))) (sml/apply-theme 'respectful)
(setq mode-line-position -linepo)
(sml/filter-mode-line-list 'mode-line-position))))

View file

@ -1,78 +1,91 @@
(provide 'core) (provide 'core)
(require 'f)
(defconst is-mac (eq system-type 'darwin)) (defconst is-mac (eq system-type 'darwin))
(defconst is-linux (eq system-type 'gnu/linux)) (defconst is-linux (eq system-type 'gnu/linux))
;; Setup theme ;;;; Load theme ;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'custom-theme-load-path *themes-dir) (add-to-list 'custom-theme-load-path *themes-dir)
(load-theme *theme t) (load-theme *theme t)
;; Emacs under-the-hood
(global-auto-revert-mode 1) ; revert buffers for changed files
(fset 'yes-or-no-p 'y-or-n-p) ; y/n instead of yes/no
;;;; Emacs under the hood ;;;;;;;;;;;;;;;;
(prefer-coding-system 'utf-8) (prefer-coding-system 'utf-8)
(setq-default load-prefer-newer t ; load newer .el over older .elc (fset 'yes-or-no-p 'y-or-n-p) ; y/n instead of yes/no
(setq-default
load-prefer-newer t ; load newer .el over older .elc
gc-cons-threshold 50000000 ; avoid garbage collection (default is 400k) gc-cons-threshold 50000000 ; avoid garbage collection (default is 400k)
enable-recursive-minibuffers nil enable-recursive-minibuffers nil
redisplay-dont-pause t redisplay-dont-pause t
confirm-kill-emacs nil confirm-kill-emacs nil
compilation-scroll-output t) compilation-scroll-output t)
;; Show keystrokes
(setq echo-keystrokes 0.02)
;; Sane scroll settings ;; Sane scroll settings
(setq scroll-margin 3 (setq scroll-margin 5
scroll-conservatively 100000 scroll-conservatively 100000
scroll-preserve-screen-position 1) scroll-preserve-screen-position 1
echo-keystrokes 0.02 ; Show keystrokes
(setq inhibit-startup-screen t ; don't show EMACs start screen inhibit-startup-screen t ; don't show EMACs start screen
inhibit-splash-screen t inhibit-splash-screen t
inhibit-startup-buffer-menu t inhibit-startup-buffer-menu t
inhibit-startup-echo-area-message t
initial-major-mode 'text-mode initial-major-mode 'text-mode
initial-scratch-message nil initial-scratch-message nil
initial-scratch-buffer nil) ; empty scratch buffer initial-scratch-buffer nil) ; empty scratch buffer
;;; Backups ;; Make sure undo/backup folders exist
(require 'f)
(defconst *tmp-dir-undo (f-expand "undo" *tmp-dir)) (defconst *tmp-dir-undo (f-expand "undo" *tmp-dir))
(defconst *tmp-dir-backup (f-expand "backup" *tmp-dir)) (defconst *tmp-dir-backup (f-expand "backup" *tmp-dir))
(defconst *tmp-dir-autosave (f-expand "autosave" *tmp-dir))
(unless (f-dir? *tmp-dir) (unless (f-dir? *tmp-dir)
(f-mkdir *tmp-dir *tmp-dir-undo *tmp-dir-backup)) (f-mkdir *tmp-dir
*tmp-dir-undo
*tmp-dir-backup
*tmp-dir-autosave))
(setq make-backup-files nil ; Don't want any backup ;; Disable all backups (that's what git/dropbox are for)
auto-save-list-file-name nil ; Don't want any .saves (setq make-backup-files nil
auto-save-default nil ; Don't want any auto saving create-lockfiles nil
create-lockfiles nil) auto-save-default nil
auto-save-list-file-name (concat *tmp-dir-autosave ".auto-save")
;; In case I want to reactivate backup files
backup-directory-alist `((".*" . ,*tmp-dir-backup))
auto-save-file-name-transforms `((".*" ,*tmp-dir-autosave t)))
;; In case I want to reactivate backup files ;; Remember undo history
(setq backup-directory-alist `((".*" . ,*tmp-dir-backup))) (setq-default undo-tree-history-directory-alist `(("." . ,*tmp-dir-undo)))
(setq-default undo-tree-auto-save-history t)
;; window layout undo/redo, keymaps in core-keymaps.el ;;;; Save history across sessions
(when (fboundp 'winner-mode) (winner-mode 1)) ;; search entries
(defvar savehist-additional-variables '(search ring regexp-search-ring))
;; keep the home clean
(defvar savehist-file (f-expand "savehist" *tmp-dir))
(savehist-mode 1)
;;;; Advice ;;;;;;;;;;;;;;;;;;;;;;;;
;;;; My personal global mode ;;;;;;;;;;;;;
(defvar my-mode-map (make-sparse-keymap))
(define-minor-mode my-mode
"My personal global mode."
:global t
:keymap my-mode-map)
;;;; Behavior adjustments ;;;;;;;;;;;;;;;;
;; Make next/previous-buffer skip special buffers ;; Make next/previous-buffer skip special buffers
(defadvice next-buffer (after avoid-messages-buffer-in-next-buffer activate) (defadvice next-buffer (after void-messages-buffer-in-next-buffer activate)
"Advice around `next-buffer' to avoid going into the *Messages* buffer." "Advice around `next-buffer' to avoid going into the *Messages* buffer."
(when (string-match "\\`\\*.+\\*\\'" (buffer-name)) (next-buffer))) (when (string-match "\\`\\*.+\\*\\'" (buffer-name)) (next-buffer)))
(defadvice previous-buffer (after avoid-messages-buffer-in-previous-buffer activate) (defadvice previous-buffer (after avoid-messages-buffer-in-previous-buffer activate)
"Advice around `previous-buffer' to avoid going into the *Messages* buffer." "Advice around `previous-buffer' to avoid going into the *Messages* buffer."
(when (string-match "\\`\\*.+\\*\\'" (buffer-name)) (previous-buffer))) (when (string-match "\\`\\*.+\\*\\'" (buffer-name)) (previous-buffer)))
;;;; My personal minor mode ;;;;;;;;
(defvar my-mode-map (make-sparse-keymap))
(define-minor-mode my-mode :global t :keymap my-mode-map)
;; Automatic minor modes ;;;; Automatic minor modes ;;;;;;;;;;;;;;;
(defvar auto-minor-mode-alist () (defvar auto-minor-mode-alist ()
"Alist of filename patterns vs correpsonding minor mode functions, "Alist of filename patterns vs correpsonding minor mode functions,
see `auto-mode-alist' All elements of this alist are checked, meaning see `auto-mode-alist' All elements of this alist are checked, meaning
you can enable multiple minor modes for the same regexp.") you can enable multiple minor modes for the same regexp.")
(defun enable-minor-mode-based-on-extension () (defun enable-minor-mode-based-on-extension ()
"check file name against auto-minor-mode-alist to enable minor modes "check file name against auto-minor-mode-alist to enable minor modes
the checking happens for all pairs in auto-minor-mode-alist" the checking happens for all pairs in auto-minor-mode-alist"
@ -93,17 +106,54 @@ the checking happens for all pairs in auto-minor-mode-alist"
(add-hook 'find-file-hook 'enable-minor-mode-based-on-extension) (add-hook 'find-file-hook 'enable-minor-mode-based-on-extension)
;;;; Load the rest ;;;;;;;;;;;;;;;;;; (global-auto-revert-mode 1) ; revert buffers for changed files
(require 'shut-up) (require 'shut-up)
(when noninteractive (when noninteractive (shut-up-silence-emacs))
(shut-up-silence-emacs))
;; What we do every night, Pinkie...
(defun my/greeter () (message "What're we gonna do tonight, Brain?"))
(defalias 'display-startup-echo-area-message 'my/greeter)
(when (fboundp 'winner-mode) (winner-mode 1)) ; window layout undo/redo
;;;; Utility plugins ;;;;;;;;;;;;;;;;;;
;; Package management bootstrap ;; Package management bootstrap
(require 'use-package)
(setq package-enable-at-startup nil (setq package-enable-at-startup nil
delete-old-versions t) delete-old-versions t)
;; Add ./elisp/* to load-path
(let ((default-directory *elisp-dir)) (let ((default-directory *elisp-dir))
(normal-top-level-add-to-load-path '(".")) (normal-top-level-add-to-load-path '("."))
(normal-top-level-add-subdirs-to-load-path)) (normal-top-level-add-subdirs-to-load-path))
(require 'use-package) (use-package key-chord
:init (key-chord-mode 1)
:config (setq key-chord-two-keys-delay 0.5))
(use-package recentf
:init
(progn (setq recentf-max-menu-items 0
recentf-max-saved-items 100
recentf-auto-cleanup 'never
recentf-save-file (concat *tmp-dir "recentf")
recentf-exclude '("/tmp/" "/ssh:" "\\.?ido\\.last\\'" "\\.revive\\'", "/TAGS\\'"))
(recentf-mode 1)))
(use-package smex
:commands (smex smex-major-mode-commands)
:config
(progn (smex-initialize)
;; Hook up smex to auto-update, rather than update on every run
(defun smex-update-after-load (unused)
(when (boundp 'smex-cache) (smex-update)))
(add-hook 'after-load-functions 'smex-update-after-load)))
(use-package popwin
:init (popwin-mode 1)
:config
(progn (setq popwin:popup-window-height 0.45)
(push '(diff-mode :position bottom :stick t) popwin:special-display-config)
(push '("*Backtrace*") popwin:special-display-config)
(push '("*Warnings*") popwin:special-display-config)
(push '("*Process List*") popwin:special-display-config)))

View file

@ -1,93 +0,0 @@
;;;; Macros ;;;;;;;;;;;;;;;;;;;;;;;;
(defmacro λ (&rest body)
`(lambda () (interactive) ,@body))
(defmacro associate-mode (match mode)
`(add-to-list 'auto-mode-alist '(,match . ,mode)))
(defmacro associate-minor-mode (match minor-mode)
`(add-to-list 'auto-minor-mode-alist '(,match . ,minor-mode)))
(defmacro add-hook! (hook &rest body)
`(add-hook ,hook (lambda() ,@body)))
;; Backwards compatibility
(unless (fboundp 'with-eval-after-load)
(defmacro with-eval-after-load (file &rest body)
`(eval-after-load ,file
`(funcall (function ,(lambda () ,@body))))))
(defmacro after (feature &rest forms)
`(,(if (or (not (boundp 'byte-compile-current-file))
(not byte-compile-current-file)
(if (symbolp feature)
(require feature nil :no-error)
(load feature :no-message :no-error)))
'progn
(message "after: cannot find %s" feature)
'with-no-warnings)
(with-eval-after-load ',feature ,@forms)))
;; vimmish keymapping shortcuts
(defalias 'exmap 'evil-ex-define-cmd)
(defmacro ichmap (key command)
`(key-chord-define evil-insert-state-map ,key ,command))
(defmacro defmap (map &rest body)
`(evil-define-key nil ,map ,@body))
(defmacro nmap (map &rest body)
`(evil-define-key 'normal ,map ,@body))
(defmacro vmap (map &rest body)
`(evil-define-key 'visual ,map ,@body))
(defmacro imap (map &rest body)
`(evil-define-key 'insert ,map ,@body))
(defmacro emap (map &rest body)
`(evil-define-key 'emacs ,map ,@body))
(defmacro gmap (map &rest body)
`(evil-define-key 'god ,map ,@body))
(defmacro mmap (map &rest body)
`(evil-define-key 'motion ,map ,@body))
(defmacro omap (map &rest body)
`(evil-define-key 'operator ,map ,@body))
(defmacro nvmap (map &rest body)
(macroexpand
`(progn (nmap ,map ,@body)
(vmap ,map ,@body))))
(defmacro nmap! (&rest body)
`(evil-define-key 'normal my-mode-map ,@body))
(defmacro vmap! (&rest body)
`(evil-define-key 'visual my-mode-map ,@body))
(defmacro imap! (&rest body)
`(evil-define-key 'insert my-mode-map ,@body))
(defmacro emap! (&rest body)
`(evil-define-key 'emacs my-mode-map ,@body))
(defmacro gmap! (&rest body)
`(evil-define-key 'god my-mode-map ,@body))
(defmacro mmap! (&rest body)
`(evil-define-key 'motion my-mode-map ,@body))
(defmacro omap! (&rest body)
`(evil-define-key 'operator my-mode-map ,@body))
(defmacro nvmap! (&rest body)
(macroexpand
`(progn (nmap! ,@body)
(vmap! ,@body))))
(defmacro -nmap (&rest body)
`(evil-define-key nil evil-normal-state-map ,@body))
(defmacro -vmap (&rest body)
`(evil-define-key nil evil-visual-state-map ,@body))
(defmacro -imap (&rest body)
`(evil-define-key nil evil-insert-state-map ,@body))
(defmacro -emap (&rest body)
`(evil-define-key nil evil-emacs-state-map ,@body))
(defmacro -gmap (&rest body)
`(evil-define-key nil evil-god-state-map ,@body))
(defmacro -mmap (&rest body)
`(evil-define-key nil evil-motion-state-map ,@body))
(defmacro -omap (&rest body)
`(evil-define-key nil evil-operator-state-map ,@body))
(defmacro -nvmap (&rest body)
(macroexpand
`(progn (-nmap ,@body)
(-vmap ,@body))))

View file

@ -1,9 +0,0 @@
(defun enable-hard-wrap()
(auto-fill-mode 1))
(defun enable-comment-hard-wrap ()
(set (make-local-variable 'comment-auto-fill-only-comments) t)
(auto-fill-mode 1))
(defun enable-tab-width-2 ()
(setq tab-width 2))

View file

@ -1,105 +0,0 @@
;;; Library Defuns ;;;;;;;;;;;;;;;;;;;;;
(defun my/surrounded-p ()
(and (looking-back "[[{(]\\(\s+\\|\n\\)?\\(\s\\|\t\\)*")
(let* ((whitespace (match-string 1))
(match-str (concat whitespace (match-string 2) "[])}]")))
(looking-at-p match-str))))
(defun my/empty-line-p ()
(zerop (length (s-trim (my/get-line)))))
(defun my/get-line ()
(buffer-substring (line-beginning-position) (line-end-position)))
;;; Text Defuns ;;;;;;;;;;;;;;;;;;;;;;;;
(defun my.backward-kill-to-bol-and-indent ()
"Kill line to the first non-blank character. If invoked again
afterwards, kill line to column 1."
(interactive)
(let ((empty-line (my/empty-line-p)))
(evil-delete (point-at-bol) (point))
(if (not empty-line)
(indent-according-to-mode))))
(defun my.move-to-bol ()
"Moves cursor to the first non-blank character on the line. If
already there, move it to the true bol."
(interactive)
(let ((point-at-bol (save-excursion (evil-first-non-blank) (point))))
(if (= point-at-bol (point))
(evil-move-beginning-of-line)
(evil-first-non-blank))))
(defun my.move-to-eol ()
(interactive)
(evil-move-end-of-line))
;; Mimic expandtab in vim
(defun my.backward-delete-whitespace-to-column ()
"Delete back to the previous column of whitespace, or as much
whitespace as possible, or just one char if that's not possible."
(interactive)
(cond ;; If in a string
((sp-point-in-string)
(call-interactively 'backward-delete-char-untabify))
;; If using tabs (or at bol), just delete normally
((or indent-tabs-mode
(= (point-at-bol) (point)))
(call-interactively 'backward-delete-char))
;; Otherwise, delete up to the nearest tab column
(t (let ((movement (% (current-column) tab-width))
(p (point)))
(when (= movement 0)
(setq movement tab-width))
(save-match-data
(if (string-match "\\w*\\(\\s-+\\)$" (buffer-substring-no-properties (- p movement) p))
(backward-delete-char (- (match-end 1) (match-beginning 1)))
(call-interactively 'backward-delete-char-untabify)))))))
(defun my.dumb-indent ()
"Inserts a tab character (or spaces x tab-width). Checks if the
auto-complete window is open."
(interactive)
(if indent-tabs-mode
(insert "\t")
(let* ((movement (% (current-column) tab-width))
(spaces (if (zerop movement) tab-width (- tab-width movement))))
(insert (s-repeat spaces " ")))))
(defun my.inflate-space-maybe ()
"Checks if point is surrounded by {} [] () delimiters and adds a
space on either side of the point if so."
(interactive)
(if (my/surrounded-p)
(progn (insert " ")
(save-excursion (insert " ")))
(insert " ")))
(defun my.deflate-space-maybe ()
"Checks if point is surrounded by {} [] () delimiters, and deletes
spaces on either side of the point if so. Resorts to
`my.backward-delete-whitespace-to-column' otherwise."
(interactive)
(save-match-data
(if (my/surrounded-p)
(let ((whitespace-match (match-string 1)))
(cond ((not whitespace-match)
(call-interactively 'delete-backward-char))
((string-match "\n" whitespace-match)
(evil-delete (point-at-bol) (point))
(delete-char -1)
(save-excursion (delete-char 1)))
(t
(just-one-space 0))))
(my.backward-delete-whitespace-to-column))))
(defun my.newline-and-indent ()
"Newline and indent; if in a comment, auto-comment and properly
indent the next line."
(interactive)
(cond ((sp-point-in-string)
(evil-ret))
((evil-in-comment-p)
(indent-new-comment-line))
(t
(evil-ret-and-indent))))

View file

@ -1,25 +0,0 @@
(defun what-face (pos)
"Tells you the name of the face (point) is on."
(interactive "d")
(let ((face (or (get-char-property (point) 'read-face-name)
(get-char-property (point) 'face))))
(if face (message "Face: %s" face) (message "No face at %d" pos))))
(defun my/append-to-list (list-var elements)
"Append ELEMENTS to the end of LIST."
(unless (consp elements)
(error "ELEMENTS must be a list"))
(let ((list (symbol-value list-var)))
(if list
(setcdr (last list) elements)
(set list-var elements)))
(symbol-value list-var))
(defun my/project-root (&optional force-pwd)
(if (and (not force-pwd)
(projectile-project-p))
(projectile-project-root)
default-directory))
(defmacro f--exists? (file dir)
`(f-exists? (expand-file-name ,file ,dir)))

View file

@ -1,31 +0,0 @@
(provide 'init-ac)
;;
(use-package auto-complete
:diminish auto-complete-mode
:init
(progn
(require 'auto-complete-config)
(setq ac-auto-start nil
ac-auto-show-menu t ; Suggestions box must be invoked manually (see core-keymaps.el)
ac-use-menu-map t ; Enable ac-menu-map map when menu is open
ac-use-quick-help t ; Don't show tooltips unless invoked (see core-keymaps.el)
ac-use-fuzzy nil
ac-candidate-limit 25)
(setq ac-comphist-file (concat *tmp-dir "ac-comphist.dat"))
(setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
(add-hook 'css-mode-hook 'ac-css-mode-setup)
(add-hook 'shell-script-mode-hook 'ac-add-files)
;; (add-hook 'auto-complete-mode-hook 'ac-common-setup)
(global-auto-complete-mode t))
:config
(progn
(add-to-list 'ac-dictionary-files (expand-file-name "global" *ac-dicts-dir))
(add-to-list 'ac-dictionary-directories *ac-dicts-dir)
(add-to-list 'ac-modes 'nxml-mode)
;; Tell ido not to care about case
(setq completion-ignore-case t)))

View file

@ -0,0 +1,68 @@
(provide 'init-auto-complete)
(setq tags-case-fold-search nil)
(use-package auto-complete
:init
(progn
(require 'auto-complete-config)
(setq ac-auto-start nil
ac-auto-show-menu t ; Suggestions box must be invoked manually (see core-keymaps.el)
ac-use-menu-map t ; Enable ac-menu-map map when menu is open
ac-use-quick-help t ; Don't show tooltips unless invoked (see core-keymaps.el)
ac-use-fuzzy t
ac-candidate-limit 25)
(setq ac-comphist-file (concat *tmp-dir "ac-comphist.dat"))
(setq-default ac-sources '(ac-source-yasnippet ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
(add-hook 'css-mode-hook 'ac-css-mode-setup)
(add-hook 'shell-script-mode-hook 'ac-add-files)
;; (add-hook 'auto-complete-mode-hook 'ac-common-setup)
)
:config
(progn
;; Redefine this function so auto-complete is available [almost] everywhere
(defun auto-complete-mode-maybe ()
(unless (minibufferp (current-buffer))
(auto-complete-mode 1)))
(global-auto-complete-mode t)
(add-to-list 'ac-dictionary-files (expand-file-name "global" *ac-dicts-dir))
(add-to-list 'ac-dictionary-directories *ac-dicts-dir)
;; Tell ido not to care about case
(setq completion-ignore-case t)
(bind 'insert ac-mode-map
(kbd "C-x C-k") 'ac-complete-dictionary
(kbd "C-x C-f") 'ac-complete-filename
(kbd "C-x C-]") 'ac-complete-etags
(kbd "C-x s") 'ac-complete-ispell
(kbd "C-x C-s") 'ac-complete-ispell-fuzzy
(kbd "C-x C-y") 'ac-complete-yasnippet
(kbd "C-x C-o") 'auto-complete
(kbd "C-SPC") 'auto-complete)
(bind ac-completing-map
(kbd "<tab>") 'ac-complete
(kbd "C-n") 'ac-next
(kbd "C-p") 'ac-previous
(kbd "<f1>") 'ac-quick-help
(kbd "C-<f1>") 'ac-help
(kbd "ESC") 'ac-stop
(kbd "RET") 'ac-complete)
(use-package ac-etags
:commands (ac-complete-etags)
:config (ac-etags-setup))
(use-package ac-ispell
:commands (ac-complete-ispell ac-complete-ispell-fuzzy)
:config
(progn (ac-ispell-setup)
(setq ac-ispell-requires 1
ac-ispell-fuzzy-limit 25)))))

82
init/init-auto-insert.el Normal file
View file

@ -0,0 +1,82 @@
(provide 'init-auto-insert)
(use-package autoinsert)
;; (setq auto-insert-directory "%/.emacs.d/templates/")
(setq auto-insert-query nil) ; Don't prompt before insertion
(setq auto-insert-alist (list)) ; Don't prompt before insertion
(auto-insert-mode 1)
(after yasnippet
(defun template (file-regexp uuid mode &optional project-only)
(define-auto-insert file-regexp `(lambda () (template-insert ,uuid ',mode ,project-only))))
(defun template-insert (uuid mode &optional project-only)
"Expand snippet template in MODE by its UUID"
(unless (and project-only
(not (projectile-project-p)))
(yas-expand-snippet
(yas--template-content
(yas--get-template-by-uuid mode uuid)) (point-min) (point-max))
(evil-insert-state)))
(template "/\\.gitignore$" "%%" 'gitignore-mode)
;; C/C++
(template "/Makefile$" "%%" 'makefile-gmake-mode)
(template "/main\\.\\([Cc]\\|cc\\|cpp\\)$" "%main.cpp%" 'c++-mode)
(template "/win32_\\.\\([Cc]\\|cc\\|cpp\\)$" "%winmain.cpp%" 'c++-mode)
(template "\\.\\([Hh]\\|hpp\\)$" "%.h%" 'c++-mode)
(template "\\.\\([Cc]\\|cc\\|cpp\\)$" "%.cpp%" 'c++-mode)
;; Shell scripts
(template "\\.z?sh$" "%%" 'sh-mode)
;; ;; ;; Ruby
(template "/spec_helper\\.rb$" "%helper%" 'rspec-mode t)
(template "_spec\\.rb$" "%%" 'rspec-mode t)
(template "/\\.rspec$" "%.rspec%" 'rspec-mode t)
(template "/Rakefile$" "%Rakefile%" 'ruby-mode t)
(template "/Gemfile$" "%Gemfile%" 'ruby-mode t)
;; (template "\\.gemspec$" "%.gemspec%" 'ruby-mode t)
(template "/lib/.+\\.rb$" "%module%" 'ruby-mode t)
(template "\\.rb$" "%%" 'ruby-mode)
;; ;; ;; Python
;; ;; (template "tests?/test_.+\\.py$" "%%" 'nose-mode)
;; ;; (template "/setup\\.py$" "%setup%" 'python-mode)
(template "\\.py$" "%%" 'python-mode)
;; ;; ;; PHP
;; ;; (template "\\.class\\.php$" "%class%" 'php-mode)
;; ;; (template "\\.php$" "%%" 'php-mode)
;; ;; ;; Markdown
;; (template "/README\\.md$" "%README.md%" 'markdown-mode)
;; ;; (template "/_posts/.+\\.md$" "%jekyll-post" 'markdown-mode)
;; ;; (template "/_layouts/.+\\.html$" "%jekyll-layout%" 'web-mode)
;; ;; ;; Javascript
;; ;; (template "\\.lbaction/Contents/Info.plist$" "%lb6%" 'nxml-mode)
;; ;; (template "\\.lbaction/.+/\\(default\\|suggestions\\)\\.js$" "%lb6%" 'js-mode)
;; ;; (template "/package\\.json$" "%package.json%" 'json-mode)
;; ;; (template "\\.\\(json\\|jshintrc\\)$" "%%" 'json-mode)
;; ;; ;; SCSS
;; ;; (template "/master\\.scss$" "%master%" 'scss-mode)
;; ;; (template "/normalize\\.scss$" "%normalize%" 'scss-mode)
;; ;; (template "\\.scss$" "%%" 'scss-mode)
;; ;; ;; HTML
;; ;; (template "\\.html$" "%%" 'web-mode)
;; ;; ;; Lua
;; ;; (template "\\.love/main\\.lua$" "%love.main%" 'lua-mode)
;; ;; (template "\\.love/conf\\.lua$" "%love.conf%" 'lua-mode)
;; ;; (template "\\.lua$" "%%" 'lua-mode)
;; ;; ;; Java
;; ;; (template "/src/.+/.+\\.java$ "%%" 'java-mode)
;; ;; (template "\\.gradle$" "%%" 'groovy-mode)
;; ;; ;; Elisp
(template "\\.emacs\\.d/init/.+\\.el$" "%initfile%" 'emacs-lisp-mode)
(template "\\.emacs\\.d/snippets/.+$" "%%" 'snippet-mode))

View file

@ -38,7 +38,7 @@
(c-toggle-auto-newline -1) (c-toggle-auto-newline -1)
;; DEL mapping interferes with smartparens and my.deflate-maybe ;; DEL mapping interferes with smartparens and my.deflate-maybe
(defmap c-mode-map (kbd "DEL") nil) (bind c-mode-map (kbd "DEL") nil)
(c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open (c-set-offset 'substatement-open '0) ; brackets should be at same indentation level as the statements they open
(c-set-offset 'inline-open '+) (c-set-offset 'inline-open '+)

9
init/init-cscope.el Normal file
View file

@ -0,0 +1,9 @@
(provide 'init-cscope)
(use-package xcscope
:config
(progn
(cscope-setup)
(add-hook 'ruby-mode-hook (function cscope-minor-mode))
(push '("*cscope*" :position bottom) popwin:special-display-config)))

View file

@ -12,7 +12,7 @@
;; (use-package csharp-mode ;; (use-package csharp-mode
;; :mode "\\.cs$" ;; :mode "\\.cs$"
;; :config ;; :config
;; (imap csharp-mode-map (kbd "C-SPC") 'omnisharp-auto-complete)) ;; (bind 'insert csharp-mode-map (kbd "C-SPC") 'omnisharp-auto-complete))
;; :init ;; :init
;; (add-hook! 'csharp-mode-hook (omnisharp-mode t) (flycheck-mode t))) ;; (add-hook! 'csharp-mode-hook (omnisharp-mode t) (flycheck-mode t)))

View file

@ -2,32 +2,24 @@
(use-package dash-at-point (use-package dash-at-point
:commands (dash-at-point dash-at-point-with-docset) :commands (dash-at-point dash-at-point-with-docset)
:if is-mac :if is-mac)
:config
(progn
(add-to-list 'dash-at-point-mode-alist '(ruby-mode . "rb"))
(add-to-list 'dash-at-point-mode-alist '(python-mode . "py3"))))
(use-package rainbow-delimiters (use-package rainbow-delimiters
:commands rainbow-delimiters-mode :commands rainbow-delimiters-mode
:init :init (add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode))
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode))
(use-package rotate-text
:commands (rotate-word-at-point rotate-region))
;;;; Syntax modes
(use-package go-mode
:mode "\\.go\\'"
:interpreter "go"
:init
(require 'go-autocomplete))
;;; Config modes ;;; Config modes
(use-package yaml-mode :defer t (use-package yaml-mode :defer t
:config :config (add-hook 'yaml-mode-hook 'enable-tab-width-2))
(add-hook 'yaml-mode-hook 'enable-tab-width-2))
(use-package json-mode (use-package json-mode
:mode (("\\.json\\'" . json-mode) :mode (("\\.json\\'" . json-mode)
("\\.jshintrc\\'" . json-mode))) ("\\.jshintrc\\'" . json-mode)))
(use-package hl-todo
:init (add-hook 'find-file-hook 'hl-todo-mode))
(use-package regex-tool
:commands regex-tool
:config (setq regex-tool-backend 'perl)
:init (add-hook 'regex-tool-mode-hook 'whitespace-newline-mode))

View file

@ -1,5 +0,0 @@
(provide 'init-etags)
;; (use-package ac-etags :config (ac-etags-setup))
;; Load etags solely for project navigation

View file

@ -6,13 +6,9 @@
(setq-default flycheck-indication-mode 'right-fringe (setq-default flycheck-indication-mode 'right-fringe
;; Removed checks on idle/change for snappiness ;; Removed checks on idle/change for snappiness
flycheck-check-syntax-automatically flycheck-check-syntax-automatically
'(save new-line mode-enabled) '(save mode-enabled)
flycheck-disabled-checkers flycheck-disabled-checkers
'(emacs-lisp emacs-lisp-checkdoc)) '(emacs-lisp-checkdoc make))
(add-hook 'after-init-hook #'global-flycheck-mode))) (add-hook 'after-init-hook #'global-flycheck-mode)))
(use-package flyspell (use-package flyspell :commands flyspell-mode)
:commands flyspell-mode
:config
(setq ispell-program-name "aspell"
ispell-list-command "--list"))

View file

@ -13,15 +13,61 @@
(use-package gitconfig-mode (use-package gitconfig-mode
:mode (("/\\.?git/?config\\'" . gitconfig-mode) :mode (("/\\.?git/?config\\'" . gitconfig-mode)
("/\\.gitmodules\\'" . gitconfig-mode)) ("/\\.gitmodules\\'" . gitconfig-mode))
:config :config (add-hook 'gitconfig-mode-hook 'flyspell-mode))
(add-hook 'gitconfig-mode-hook 'flyspell-mode))
(use-package gitignore-mode (use-package gitignore-mode
:mode (("/\\.gitignore\\'" . gitignore-mode) :mode (("/\\.gitignore\\'" . gitignore-mode)
("/\\.git/info/exclude\\'" . gitignore-mode) ("/\\.git/info/exclude\\'" . gitignore-mode)
("/git/ignore\\'" . gitignore-mode))) ("/git/ignore\\'" . gitignore-mode)))
(use-package git-gutter (use-package git-gutter-fringe+
:diminish git-gutter-mode :init (global-git-gutter+-mode +1)
:init :config
(global-git-gutter-mode 1)) (progn
(fringe-helper-define 'git-gutter-fr+-added nil
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X.......")
(fringe-helper-define 'git-gutter-fr+-deleted nil
"X......."
"XXXXXXXX"
"X......."
"........"
"........"
"........"
"........"
"........"
"........"
"........"
"........"
"........"
"........"
"........")
(fringe-helper-define 'git-gutter-fr+-modified nil
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X......."
"X.......")))

7
init/init-go.el Normal file
View file

@ -0,0 +1,7 @@
(provide 'init-go)
(use-package go-mode
:mode "\\.go\\'"
:interpreter "go"
:init
(require 'go-autocomplete))

View file

@ -23,7 +23,6 @@
(ido-ubiquitous-mode 1) (ido-ubiquitous-mode 1)
(flx-ido-mode 1) (flx-ido-mode 1)
(add-to-list 'ido-ignore-files "\\`.DS_Store\\'")
(setq ido-use-faces nil (setq ido-use-faces nil
ido-confirm-unique-completion t ido-confirm-unique-completion t
ido-case-fold t ido-case-fold t
@ -31,4 +30,11 @@
ido-enable-flex-matching t ido-enable-flex-matching t
ido-create-new-buffer 'always ido-create-new-buffer 'always
ido-enable-tramp-completion t ido-enable-tramp-completion t
ido-enable-last-directory-history t) ido-enable-last-directory-history t
ido-save-directory-list-file (concat *tmp-dir "ido.last"))
(add-to-list 'ido-ignore-files "\\`.DS_Store$")
(setq ido-ignore-buffers
'("\\` " "^\\*ESS\\*" "^\\*Messages\\*" "^\\*Help\\*" "^\\*Buffer"
"^\\*.*Completions\\*$" "^\\*Ediff" "^\\*tramp" "^\\*cvs-"
"_region_" " output\\*$" "^TAGS$" "^\*Ido"))

View file

@ -1,4 +1,4 @@
(provide 'init-eclim) (provide 'init-java)
(use-package eclim (use-package eclim
:commands (eclim-mode global-eclim-mode) :commands (eclim-mode global-eclim-mode)
@ -16,8 +16,15 @@
(use-package eclimd) (use-package eclimd)
(require 'ac-emacs-eclim-source) (require 'ac-emacs-eclim-source)
(add-hook 'java-mode-hook 'ac-emacs-eclim-java-setup) (add-hook! 'java-mode-hook
(setq ac-sources '(ac-source-emacs-eclim ac-source-yasnippet ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers)))
(setq help-at-pt-display-when-idle t) (setq help-at-pt-display-when-idle t)
(setq help-at-pt-timer-delay 0.1) (setq help-at-pt-timer-delay 0.1)
(help-at-pt-set-timer))) (help-at-pt-set-timer)
(bind 'motion java-mode-map "gd" 'eclim-java-find-declaration)))
(use-package groovy-mode :mode "\\.gradle$"
:config
(add-to-list 'ac-modes 'groovy-mode))

View file

@ -4,7 +4,7 @@
(shell-command (format "open -a love.app %s" (my/project-root)))) (shell-command (format "open -a love.app %s" (my/project-root))))
(use-package lua-mode (use-package lua-mode
:mode "\\.lua\\'" :mode "\\.lua$"
:interpreter "lua" :interpreter "lua"
:init :init
(progn (progn
@ -12,8 +12,7 @@
"Buffer local minor mode for Love2D" "Buffer local minor mode for Love2D"
:init-value nil :init-value nil
:lighter " <3" :lighter " <3"
:keymap (make-sparse-keymap) ; defines love-mode-map :keymap (make-sparse-keymap))
:group lua)
(add-hook! 'lua-mode-hook (add-hook! 'lua-mode-hook
(setq my-run-code-interpreter "lua") (setq my-run-code-interpreter "lua")

View file

@ -40,10 +40,10 @@
:keymap (make-sparse-keymap) ; defines evil-org-mode-map :keymap (make-sparse-keymap) ; defines evil-org-mode-map
:group 'evil-org) :group 'evil-org)
;; Reset evil to ensure certain evil keybindings are prioritized
(add-hook 'org-mode-hook 'evil-org-mode) (add-hook 'org-mode-hook 'evil-org-mode)
(add-hook 'org-mode-hook 'flyspell-mode) (add-hook 'org-mode-hook 'turn-on-auto-fill)
(add-hook 'org-mode-hook 'enable-hard-wrap)
;; Reset evil to ensure evil-org-mode's maps work
(add-hook! 'org-mode-hook (evil-mode nil) (evil-mode 1)) (add-hook! 'org-mode-hook (evil-mode nil) (evil-mode 1))
(shut-up (load-library "ox-opml")) (shut-up (load-library "ox-opml"))
@ -114,3 +114,82 @@
("tp" tags "+Projects") ("tp" tags "+Projects")
("tg" tags-todo "+gamedev") ("tg" tags-todo "+gamedev")
("tw" tags-tree "+webdev"))) ("tw" tags-tree "+webdev")))
;; Keymaps
(bind 'insert org-mode-map [remap my.inflate-space-maybe] 'self-insert-command)
(bind org-mode-map (kbd "RET") nil
(kbd "C-j") nil
(kbd "C-k") nil)
(mapc (lambda (state)
(evil-define-key state evil-org-mode-map
(kbd "M-l") 'org-metaright
(kbd "M-h") 'org-metaleft
(kbd "M-k") 'org-metaup
(kbd "M-j") 'org-metadown
(kbd "M-L") 'org-shiftmetaright
(kbd "M-H") 'org-shiftmetaleft
(kbd "M-K") 'org-shiftmetaup
(kbd "M-J") 'org-shiftmetadown
(kbd "M-o") '(lambda () (interactive)
(evil-org-eol-call
'(lambda()
(org-insert-heading)
(org-metaright))))
(kbd "M-t") '(lambda () (interactive)
(evil-org-eol-call
'(lambda()
(org-insert-todo-heading nil)
(org-metaright))))
))
'(normal insert))
;; Formatting shortcuts
(bind 'insert evil-org-mode-map
(kbd "s-b") (λ (my/org-surround "*")) ; bold
(kbd "s-u") (λ (my/org-surround "_")) ; underline
(kbd "s-i") (λ (my/org-surround "/")) ; italics
(kbd "s-`") (λ (my/org-surround "+")) ; strikethrough
(kbd "<S-s-return>") (λ (evil-move-beginning-of-line) (org-insert-heading))
(kbd "<s-return>") (λ (org-insert-heading-after-current)))
(bind '(normal visual) evil-org-mode-map
",l" 'org-insert-link)
(bind 'visual evil-org-mode-map
(kbd "s-b") "s*" ; bold
(kbd "s-i") "s/") ; italics
(bind 'normal evil-org-mode-map
",d" 'org-time-stamp
",D" 'org-time-stamp-inactive
",s" 'org-schedule
",a" 'org-attach
",A" 'org-attach-open
",t" 'org-todo
",T" 'org-show-todo-tree
",/" 'org-sparse-tree
",?" 'org-tags-view
",+" 'org-align-all-tags
",r" 'org-refile
"gh" 'outline-up-heading
"gj" 'org-forward-heading-same-level
"gk" 'org-backward-heading-same-level
"gl" 'outline-next-visible-heading
"go" 'org-open-at-point
"ga" 'org-agenda
"gt" 'org-show-todo-tree
"H" 'org-beginning-of-line
"L" 'org-end-of-line
"$" 'org-end-of-line
"^" 'org-beginning-of-line
"<" 'org-metaleft
">" 'org-metaright
"-" 'org-cycle-list-bullet
(kbd ", SPC") 'org-archive-subtree
(kbd "<S-s-return>") (λ (evil-move-beginning-of-line) (org-insert-heading) (evil-insert-state))
(kbd "<s-return>") (λ (org-insert-heading-after-current) (evil-insert-state))
(kbd "RET") (λ (if (org-entry-is-todo-p) (org-todo 'done)))
(kbd "TAB") 'org-cycle)

View file

@ -1,32 +1,127 @@
(provide 'init-project) (provide 'init-project)
(add-hook! 'dired-load-hook
(use-package dired+)
(setq dired-recursive-deletes 'always
dired-recursive-copies 'always
;; if there is a dired buffer displayed in the next window, use its
;; current subdir, instead of the current subdir of this dired buffer
dired-dwim-target t))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(use-package helm :defer t)
(use-package grizzl :defer t)
(use-package neotree (use-package neotree
:commands (neotree-show neotree-hide neotree-toggle)) :commands (neotree-show neotree-hide neotree-toggle))
(use-package projectile
:diminish projectile-mode
:config
(progn (projectile-global-mode)
(setq projectile-completion-system 'grizzl)))
(use-package ag (use-package ag
:commands (ag ag-search ag-regexp) :commands (ag ag-search ag-regexp)
:config :config
(setq ag-reuse-window t (progn (setq ;ag-reuse-window nil
ag-reuse-buffers t ag-reuse-buffers nil
ag-highlight-search t)) ag-highlight-search t)
(push '(ag-mode :position bottom :height 0.5 :stick t) popwin:special-display-config)
;; Close Ag on ESC
(bind ag-mode-map [escape] "q")))
(use-package dired
:init
(progn (setq dired-recursive-deletes 'always
dired-recursive-copies 'always
dired-auto-revert-buffer t
;; if there is a dired buffer displayed in the next
;; window, use its current subdir, instead of the
;; current subdir of this dired buffer
dired-dwim-target t)
(push '(dired-mode :position bottom :height 0.5 :stick t) popwin:special-display-config)
(add-hook! 'dired-mode-hook
(use-package 'dired+ :config (toggle-diredp-find-file-reuse-dir 1)))))
(use-package projectile
:init
(progn (setq-default projectile-cache-file (concat *tmp-dir "projectile.cache"))
(setq-default projectile-known-projects-file (concat *tmp-dir "projectile.projects"))
(setq-default projectile-enable-caching t)
(add-to-list 'projectile-globally-ignored-files "ido.last")
(add-to-list 'projectile-globally-ignored-directories "assets")
(add-to-list 'projectile-other-file-alist '("scss" "css"))
(add-to-list 'projectile-other-file-alist '("css" "scss"))
(projectile-global-mode +1)
(defvar persp-modestring-dividers '("" " |" ","))
(use-package perspective)
(use-package persp-projectile)
(persp-mode 1)))
(use-package helm
:pre-load (defvar helm-mode-line-string "")
:init
(progn
(use-package helm-ag :commands (helm-do-ag))
(use-package helm-projectile)
(add-hook! 'scss-mode-hook (use-package helm-css-scss))
(push '("^\\*helm.+\\*$" :position bottom :regexp t :height 18) popwin:special-display-config)
(setq helm-quick-update t
helm-idle-delay 0.01
helm-input-idle-delay 0.01)
(bind helm-map (kbd "C-w") 'evil-delete-backward-word)
;; All this for a smaller prompt (it was redundant with helm headers)
(defmacro helm-projectile-command (command source prompt)
`(defun ,(intern (concat "helm-projectile-" command)) (&optional arg)
(interactive "P")
(if (projectile-project-p)
(projectile-maybe-invalidate-cache arg))
(let ((helm-ff-transformer-show-only-basename nil)
;; for consistency, we should just let Projectile take care of ignored files
(helm-boring-file-regexp-list nil))
(helm :sources ,source
:buffer "*helm projectile*"
:prompt ">>> "))))
(helm-projectile-command "switch-project" 'helm-source-projectile-projects ">>> ")
(helm-projectile-command "find-file" helm-source-projectile-files-and-dired-list ">>> ")
(helm-projectile-command "find-file-in-known-projects" 'helm-source-projectile-files-in-all-projects-list ">>> ")
(helm-projectile-command "find-file-dwim" 'helm-source-projectile-files-dwim-list ">>> ")
(helm-projectile-command "find-dir" helm-source-projectile-directories-and-dired-list ">>> ")
(helm-projectile-command "recentf" 'helm-source-projectile-recentf-list ">>> ")
(helm-projectile-command "switch-to-buffer" 'helm-source-projectile-buffers-list ">>> ")
;; Hide the mode-line in helm (<3 minimalism)
(defun helm-display-mode-line (source &optional force)
"Setup mode-line and header-line for `helm-buffer'."
(set (make-local-variable 'helm-mode-line-string)
(helm-interpret-value (or (and (listp source) ; Check if source is empty.
(assoc-default 'mode-line source))
(default-value 'helm-mode-line-string))
source))
(let ((follow (and (eq (cdr (assq 'follow source)) 1) "(HF) ")))
;; Setup mode-line.
(if helm-mode-line-string
(setq mode-line-format nil)
(setq mode-line-format (default-value 'mode-line-format)))
;; Setup header-line.
(let* ((hlstr (helm-interpret-value
(and (listp source)
(assoc-default 'header-line source))
source))
(hlend (make-string (max 0 (- (window-width) (length hlstr))) ? )))
(setq header-line-format
(propertize (concat " " hlstr hlend) 'face 'helm-header))))
(when force (force-mode-line-update)))
;; No persistent header
(defadvice helm-display-mode-line (after undisplay-header activate)
(setq header-line-format nil))))
;; For setting project-specific settings
(defmacro project-settings (name &rest body)
(declare (indent 1))
`(progn
(add-hook 'find-file-hook
(lambda ()
(when (string-match-p ,name (buffer-file-name))
,@body)))
(add-hook 'dired-after-readin-hook
(lambda ()
(when (string-match-p ,name (dired-current-directory))
,@body)))))

View file

@ -3,30 +3,41 @@
(use-package python (use-package python
:mode ("\\.py\\'" . python-mode) :mode ("\\.py\\'" . python-mode)
:interpreter ("python" . python-mode) :interpreter ("python" . python-mode)
:init :init (setq python-indent-offset 4)
(setq python-indent-offset 4)
:config :config
(progn (progn
(use-package jedi) (setq python-environment-directory *tmp-dir)
(unless (file-directory-p "~/.emacs.d/.python-environments/default/")
(jedi:install-server))
(add-hook 'python-mode-hook 'jedi:ac-setup)
(setq python-shell-interpreter "ipython") (setq python-shell-interpreter "ipython")
;; Interferes with smartparens
(defmap python-mode-map (kbd "DEL") nil)
(add-hook! 'python-mode-hook (add-hook! 'python-mode-hook
(setq my-switch-to-repl-func 'python-shell-switch-to-shell (setq my-switch-to-repl-func 'python-shell-switch-to-shell
my-send-region-to-repl-func 'python-shell-send-region my-send-region-to-repl-func 'python-shell-send-region
my-run-code-interpreter "python")) my-run-code-interpreter "python"))
;; Interferes with smartparens
(bind python-mode-map (kbd "DEL") nil)
(bind 'motion python-mode-map "gd" 'jedi:goto-definition)
(use-package jedi
:config
(progn
(unless (file-directory-p python-environment-directory)
(jedi:install-server))
(add-hook 'python-mode-hook 'jedi:ac-setup)))
(use-package nose (use-package nose
:commands (nose-mode) :commands (nose-mode)
:init :init
(progn (progn
;; Reset nose keymap, we'll set new ones in my-keymaps.el ;; Reset nose keymap, we'll set new ones in my-keymaps.el
(defvar nose-mode-map (make-sparse-keymap)) (defvar nose-mode-map (make-sparse-keymap))
(associate-minor-mode "/test_.+\\.py\\'" nose-mode))))) (associate-minor-mode "/test_.+\\.py\\'" nose-mode))
:config
(bind 'normal nose-mode-map
",tr" 'nosetests-again
",ta" 'nosetests-all
",ts" 'nosetests-one
",tv" 'nosetests-module
",tA" 'nosetests-pdb-all
",tO" 'nosetests-pdb-one
",tV" 'nosetests-pdb-module))))

View file

@ -1,8 +1,5 @@
(provide 'init-ruby) (provide 'init-ruby)
(defun ac-add-ruby-rsense ()
(setq ac-sources (append '(ac-source-rsense ac-source-yasnippet) ac-sources)))
;; ;;
(use-package ruby-mode (use-package ruby-mode
:mode (("\\.rb$" . ruby-mode) :mode (("\\.rb$" . ruby-mode)
@ -17,14 +14,18 @@
:interpreter "ruby" :interpreter "ruby"
:config :config
(progn (progn
(define-minor-mode rake-mode
"Buffer local minor mode for rake files"
:lighter " Rake")
(use-package inf-ruby (use-package inf-ruby
:config :config
(progn (progn
(evil-set-initial-state 'inf-ruby-mode 'insert) (evil-set-initial-state 'inf-ruby-mode 'insert)
(use-package ac-inf-ruby) ;; (use-package ac-inf-ruby)
(add-hook 'inf-ruby-mode-hook 'ac-inf-ruby-enable)) ;; (add-hook 'inf-ruby-mode-hook 'ac-inf-ruby-enable)
:init
(add-to-list 'ac-modes 'inf-ruby-mode)) (push '(inf-ruby-mode :position bottom :stick t) popwin:special-display-config)))
(use-package rspec-mode (use-package rspec-mode
:defer t :defer t
@ -38,15 +39,34 @@
(("task" "namespace") () "end") (("task" "namespace") () "end")
)) ))
:init :init
(associate-minor-mode "_spec\\.rb\\'" rspec-mode)) (progn (associate-minor-mode "\\(/spec_helper\\|_spec\\)\\.rb$" rspec-mode)
(associate-minor-mode "/\\.rspec$" rspec-mode)
(associate-minor-mode "/\\.rake$" rake-mode)
(associate-mode "/\\.rspec$" text-mode))
:config
(progn (bind 'normal rspec-mode-verifiable-keymap
",tr" 'rspec-rerun
",ta" 'rspec-verify-all
",ts" 'rspec-verify-single
",tv" 'rspec-verify)
(bind 'normal rspec-dired-mode-keymap
",tv" 'rspec-dired-verify
",ts" 'rspec-dired-verify-single
",ta" 'rspec-verify-all
",tr" 'rspec-rerun)))
;;; Auto-completion (use-package robe
;; Remember to install rsense w/ homebrew! :config
(setq rsense-home "/usr/local/Cellar/rsense/0.3/libexec") (progn
(when (file-directory-p rsense-home) (add-hook! 'after-save-hook
(add-to-list 'load-path (concat rsense-home "/etc")) (when (and (eq major-mode 'ruby-mode)
(require 'rsense) (bound-and-true-p robe-running))
(add-hook 'ruby-mode-hook 'ac-add-ruby-rsense)) (ruby-load-file (buffer-file-name))))
(add-hook! 'ruby-mode-hook
(robe-mode 1)
(ac-robe-setup)
(unless robe-running (robe-start 1))
(ruby-load-file (buffer-file-name)))))
(add-hook! 'ruby-mode-hook (add-hook! 'ruby-mode-hook
(setq my-switch-to-repl-func 'ruby-switch-to-inf (setq my-switch-to-repl-func 'ruby-switch-to-inf
@ -57,11 +77,3 @@
(setq ruby-indent-level 2) (setq ruby-indent-level 2)
(setq ruby-deep-indent-paren t) (setq ruby-deep-indent-paren t)
(add-hook 'ruby-mode-hook 'enable-tab-width-2))) (add-hook 'ruby-mode-hook 'enable-tab-width-2)))
;; (add-hook! 'find-file-hook
;; (let ((rake-path
;; (f--traverse-upwards (f--exists? "Rakefile" it))))
;; (when rake-path
;; (use-package rake-mode)
;; (rake-mode t)
;; (rake-mode/visit-rakefile (expand-file-name "Rakefile" rake-path) t))))

4
init/init-sh.el Normal file
View file

@ -0,0 +1,4 @@
(provide 'init-sh)
;; Make shell scrips executable on save. Good!
(add-hook 'after-save-hook 'executable-make-buffer-file-executable-if-script-p)

View file

@ -1,7 +1,7 @@
(provide 'init-snippets) (provide 'init-snippets)
(use-package yasnippet (use-package yasnippet
:mode (("emacs.+/snippets/" . snippet-mode)) :mode (("emacs\\.d/.+/snippets/" . snippet-mode))
:pre-load :pre-load
(progn (progn
;; Fix yasnippet keymaps so they only work in insert mode (why they ;; Fix yasnippet keymaps so they only work in insert mode (why they
@ -9,8 +9,9 @@
;; BEFORE we include yasnippet. ;; BEFORE we include yasnippet.
(defvar yas-minor-mode-map (defvar yas-minor-mode-map
(let ((map (make-sparse-keymap))) (let ((map (make-sparse-keymap)))
(imap map [(tab)] 'yas-expand) (bind 'insert map [(tab)] 'yas-expand)
(imap map (kbd "TAB") 'yas-expand) (bind 'insert map (kbd "TAB") 'yas-expand)
(bind 'visual map (kbd "<backtab>") 'yas-insert-snippet)
map))) map)))
:config :config
(progn (progn
@ -20,21 +21,24 @@
;; Only load personal snippets ;; Only load personal snippets
(setq yas-snippet-dirs `(,*snippets-dir)) (setq yas-snippet-dirs `(,*snippets-dir))
(setq yas-prompt-functions '(yas-ido-prompt yas-no-prompt)) (setq yas-prompt-functions '(yas-ido-prompt yas-no-prompt))
(setq yas-also-auto-indent-first-line t)
(after auto-complete (after auto-complete
(add-hook! 'yas-before-expand-snippet-hook (auto-complete-mode -1)) ;; (add-hook! 'yas-before-expand-snippet-hook (auto-complete-mode -1))
(add-hook! 'yas-after-exit-snippet-hook (auto-complete-mode t)) ;; (add-hook! 'yas-after-exit-snippet-hook (auto-complete-mode t))
(defadvice ac-expand (before advice-for-ac-expand activate) (defadvice ac-expand (before advice-for-ac-expand activate)
(when (yas-expand) (ac-stop)))) (when (yas-expand) (ac-stop))))
(defmap yas-keymap (kbd "DEL") 'my/yas-clear-field) (bind yas-keymap (kbd "DEL") 'my/yas-clear-field)
(yas-reload-all)) (yas-reload-all))
:init :init
(progn (progn
(add-hook 'snippet-mode-hook 'disable-final-newline)
(add-hook 'text-mode-hook 'yas-minor-mode)
(add-hook 'prog-mode-hook 'yas-minor-mode) (add-hook 'prog-mode-hook 'yas-minor-mode)
(add-hook 'snippet-mode-hook 'yas-minor-mode) (add-hook 'snippet-mode-hook 'yas-minor-mode)
(add-hook 'markdown-mode-hook 'yas-minor-mode) ;; (add-hook 'markdown-mode-hook 'yas-minor-mode)
(add-hook 'org-mode-hook 'yas-minor-mode))) (add-hook 'org-mode-hook 'yas-minor-mode)))
;; Prevents Yas from stepping on my toes when I use backspace ;; Prevents Yas from stepping on my toes when I use backspace
@ -49,3 +53,10 @@
(eq (point) (marker-position (yas--field-start field)))) (eq (point) (marker-position (yas--field-start field))))
(yas--skip-and-clear field)) (yas--skip-and-clear field))
(t (delete-char -1))))) (t (delete-char -1)))))
;; yas snippet helpers
(defvaralias '% 'yas-selected-text)
(defun %! () (if % (s-trim-right %)))
(defun !% () (if % (s-trim-left %)))
(defun !%! () (if % (s-trim %)))
(defun --newline-maybe () (if % "\n"))

5
init/init-swift.el Normal file
View file

@ -0,0 +1,5 @@
(provide 'init-swift)
;; (use-package swift-mode)
;; TODO: Set up emacs task runners for fruitstrap

View file

@ -1,5 +1,8 @@
(provide 'init-text) (provide 'init-text)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'prog-mode-hook 'enable-comment-hard-wrap)
(use-package markdown-mode (use-package markdown-mode
:mode (("\\.md\\'" . markdown-mode) :mode (("\\.md\\'" . markdown-mode)
("/README\\'" . markdown-mode)) ("/README\\'" . markdown-mode))
@ -19,4 +22,28 @@
;; Bold markup removal, bold word at point, or empty markup insertion ;; Bold markup removal, bold word at point, or empty markup insertion
(if (thing-at-point-looking-at markdown-regex-del) (if (thing-at-point-looking-at markdown-regex-del)
(markdown-unwrap-thing-at-point nil 2 4) (markdown-unwrap-thing-at-point nil 2 4)
(markdown-wrap-or-insert delim delim 'word nil nil))))))) (markdown-wrap-or-insert delim delim 'word nil nil))))))
:config
(let ((map markdown-mode-map))
(bind '(normal visual) map
",i" 'markdown-insert-image
",l" 'markdown-insert-link
",L" 'markdown-insert-reference-link-dwim
",b" 'markdown-preview)
(bind 'normal map
"[p" 'markdown-promote
"]p" 'markdown-demote)
(bind 'insert map
(kbd "M--") 'markdown-insert-hr)
(bind map
(kbd "<backspace>") nil
(kbd "<M-left>") nil
(kbd "<M-right>") nil
(kbd "s-*") 'markdown-insert-list-item
(kbd "s-b") 'markdown-insert-bold
(kbd "s-i") 'markdown-insert-italic
(kbd "s-`") 'markdown-insert-del)))

View file

@ -3,53 +3,85 @@
(use-package rainbow-mode (use-package rainbow-mode
:defer t :defer t
:init :init
(add-hook 'scss-mode 'rainbow-mode)) (progn
(add-hook 'scss-mode-hook 'rainbow-mode)
(add-hook 'sass-mode-hook 'rainbow-mode)))
(use-package sass-mode
:mode "\\.sass$"
:init (add-hook 'sass-mode-hook 'enable-tab-width-2)
:config
(progn
(add-hook 'sass-mode-hook 'ac-css-mode-setup)
(add-to-list 'ac-modes 'sass-mode)
(setq-default css-indent-offset 2)))
(use-package scss-mode (use-package scss-mode
:mode "\\.scss\\'" :mode "\\.scss$"
:init (add-hook 'scss-mode-hook 'enable-tab-width-2)
:config :config
(progn (progn
(setq scss-compile-at-save nil) (add-hook 'scss-mode-hook 'ac-css-mode-setup)
(add-hook 'scss-mode-hook 'ac-css-mode-setup)))
(use-package haml-mode :mode "\\.haml\\'") (add-to-list 'ac-modes 'scss-mode)
(setq-default css-indent-offset 2)
(setq scss-compile-at-save nil)
(bind '(normal visual) scss-mode-map "gQ" 'web-beautify-css)))
;;; HTML/Markup ;;; HTML/Markup
(use-package emmet-mode (use-package haml-mode :mode "\\.haml$")
:defer t
:config
(setq emmet-move-cursor-between-quotes t)
:init
(progn
(add-hook 'scss-mode-hook 'emmet-mode)
(add-hook 'web-mode-hook 'emmet-mode)
(add-hook 'html-mode-hook 'emmet-mode)
(add-hook 'haml-mode-hook 'emmet-mode)
(add-hook 'nxml-mode-hook 'emmet-mode)))
(use-package web-mode (use-package web-mode
:mode (("\\.\\(p\\)?htm\\(l\\)?\\'" . web-mode) :mode (("\\.\\(p\\)?htm\\(l\\)?$" . web-mode)
("\\.tpl\\(\\.php\\)?\\'" . web-mode) ("\\.tpl\\(\\.php\\)?$" . web-mode)
("\\.erb\\'" . web-mode) ("\\.erb$" . web-mode)
("wp-content/themes/.+/.+\\.php\\'" . web-mode)) ("wp-content/themes/.+/.+\\.php$" . web-mode))
:config :config
(progn (progn
(setq web-mode-ac-sources-alist (add-hook 'web-mode-hook 'enable-tab-width-2)
'(("css" . (ac-source-css-property))))
(setq web-mode-markup-indent-offset 2 (setq web-mode-ac-sources-alist
'(("css" . (ac-source-css-property)))
web-mode-markup-indent-offset 2
web-mode-code-indent-offset 2 web-mode-code-indent-offset 2
web-mode-css-indent-offset 2 web-mode-css-indent-offset 2
web-mode-style-padding 2 web-mode-style-padding 2
web-mode-script-padding 2 web-mode-script-padding 2
web-mode-block-padding 2) web-mode-block-padding 2)
(add-hook 'web-mode-hook 'enable-tab-width-2))) (bind web-mode-map (kbd "s-/") 'web-mode-comment-or-uncomment)
(bind 'normal web-mode-map
"zf" 'web-mode-fold-or-unfold
",t" 'web-mode-element-rename)
(bind '(normal visual) web-mode-map
"gQ" 'web-beautify-html
"]a" 'web-mode-attribute-next
"]t" 'web-mode-tag-next
"[t" 'web-mode-tag-previous
"]T" 'web-mode-element-child
"[T" 'web-mode-element-parent)))
(use-package emmet-mode
:defer t
:init
(progn
(add-hook 'scss-mode-hook 'emmet-mode)
(add-hook 'web-mode-hook 'emmet-mode)
(add-hook 'html-mode-hook 'emmet-mode)
(add-hook 'haml-mode-hook 'emmet-mode)
(add-hook 'nxml-mode-hook 'emmet-mode))
:config
(progn
(setq emmet-move-cursor-between-quotes t)
(bind 'insert emmet-mode-keymap
(kbd "s-e") 'emmet-expand-yas
(kbd "s-E") 'emmet-expand-line)))
(use-package php-mode (use-package php-mode
:mode (("\\.php\\'" . php-mode) :mode "\\.\\(php\\|inc\\)$"
("\\.inc\\'" . php-mode))
:interpreter "php"
:config :config
(progn (progn
(add-hook! 'php-mode-hook (setq my-run-code-interpreter "php")) (add-hook! 'php-mode-hook (setq my-run-code-interpreter "php"))
@ -60,18 +92,36 @@
:commands tern-mode :commands tern-mode
:config :config
(progn (progn
(use-package tern-auto-complete (require 'tern-auto-complete)
:config (setq tern-ac-on-dot nil)))
:init (setq tern-ac-on-dot nil)))
(use-package js2-mode :mode "\\.js$"
:config
(progn
(use-package js2-refactor
:config
;; TODO Set up keymaps
)
(setq-default js2-show-parse-errors nil)
(setq-default js2-global-externs '("module" "require" "buster" "sinon" "assert" "refute" "setTimeout" "clearTimeout" "setInterval" "clearInterval" "location" "__dirname" "console" "JSON" "jQuery" "$"
;; Launchbar API
"LaunchBar" "File" "Action" "HTTP" "include"))
(bind 'insert js2-mode-map [remap auto-complete] 'tern-ac-complete)
(bind 'motion js2-mode-map "gd" 'tern-find-definition)
(bind '(normal visual) js2-mode-map "gQ" 'web-beautify-js))
;; replace auto-complete with tern-ac-complete only in js-mode ;; replace auto-complete with tern-ac-complete only in js-mode
(add-hook! 'js-mode-hook :init (add-hook! 'js2-mode-hook
(tern-mode t) (tern-mode t)
(tern-ac-setup) (tern-ac-setup)
(setq my-run-code-interpreter "node"))) (setq my-run-code-interpreter "node")))
;; Jekyll support (use-package web-beautify
(define-minor-mode jekyll-mode :commands (web-beautify-js web-beautify-css web-beautify-html)
:init-value nil :config
:lighter " :{") (progn
(add-hook! 'scss-mode-hook (setenv "jsbeautify_indent_size" "2"))
(associate-minor-mode "[.-]jekyll/" jekyll-mode) (add-hook! 'web-mode-hook (setenv "jsbeautify_indent_size" "4"))
(add-hook! 'js2-mode-hook (setenv "jsbeautify_indent_size" "4"))))

View file

@ -1,3 +1,5 @@
(provide 'my-coderunner)
;; Variables ;; Variables
(defvar my-run-code-interpreter nil) (defvar my-run-code-interpreter nil)
(defvar my-run-code-func 'my/run-code-shell) (defvar my-run-code-func 'my/run-code-shell)
@ -27,6 +29,7 @@
(shell-command-on-region beg end my-run-code-interpreter) (shell-command-on-region beg end my-run-code-interpreter)
(message "No interpreter set for %s. See `my-run-code-interpreter'" (symbol-name major-mode)))) (message "No interpreter set for %s. See `my-run-code-interpreter'" (symbol-name major-mode))))
;;
(defun my:switch-to-repl () (defun my:switch-to-repl ()
(interactive) (interactive)
(if (functionp my-switch-to-repl-func) (if (functionp my-switch-to-repl-func)

View file

@ -1,10 +1,6 @@
(provide 'my-commands) (provide 'my-commands)
;;;; Defun Commands ;;;;;;;;;;;;;;;;;;;; ;;;; Defun Commands ;;;;;;;;;;;;;;;;;;;;
(defun my:git-gutter-refresh ()
(interactive)
(git-gutter+-refresh))
(defun my:minibuffer-quit () (defun my:minibuffer-quit ()
"Abort recursive edit. In Delete Selection mode, if the mark is "Abort recursive edit. In Delete Selection mode, if the mark is
active, just deactivate it; then it takes a second \\[keyboard-quit] active, just deactivate it; then it takes a second \\[keyboard-quit]
@ -15,63 +11,33 @@ to abort the minibuffer."
(when (get-buffer "*Completions*") (delete-windows-on "*Completions*")) (when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
(abort-recursive-edit))) (abort-recursive-edit)))
;; File navigation defuns
(defun my:goto-symbol (&optional symbol-list)
"Refresh imenu and jump to a place in the buffer using Ido."
(interactive)
(unless (featurep 'imenu)
(require 'imenu nil t))
(cond
((not symbol-list)
(let ((ido-mode ido-mode)
(ido-enable-flex-matching
(if (boundp 'ido-enable-flex-matching)
ido-enable-flex-matching t))
name-and-pos symbol-names position)
(unless ido-mode
(ido-mode 1)
(setq ido-enable-flex-matching t))
(while (progn
(imenu--cleanup)
(setq imenu--index-alist nil)
(my:goto-symbol (imenu--make-index-alist))
(setq selected-symbol
(ido-completing-read "Symbol? " symbol-names))
(string= (car imenu--rescan-item) selected-symbol)))
(unless (and (boundp 'mark-active) mark-active)
(push-mark nil t nil))
(setq position (cdr (assoc selected-symbol name-and-pos)))
(cond
((overlayp position)
(goto-char (overlay-start position)))
(t
(goto-char position)))))
((listp symbol-list)
(dolist (symbol symbol-list)
(let (name position)
(cond
((and (listp symbol) (imenu--subalist-p symbol))
(my:goto-symbol symbol))
((listp symbol)
(setq name (car symbol))
(setq position (cdr symbol)))
((stringp symbol)
(setq name symbol)
(setq position
(get-text-property 1 'org-imenu-marker symbol))))
(unless (or (null position) (null name)
(string= (car imenu--rescan-item) name))
(add-to-list 'symbol-names name)
(add-to-list 'name-and-pos (cons name position))))))))
;; Buffer defuns ;; Buffer defuns
(defun my:kill-dired-buffers () (defun my:kill-other-buffers ()
"Kill left-over temporary, dired or buried special buffers"
(interactive) (interactive)
(mapc (lambda (buffer) (mapc (lambda (buffer)
(when (eq 'dired-mode (buffer-local-value 'major-mode buffer)) (let ((buffer-name (buffer-name buffer)))
(kill-buffer buffer))) (when (and (not (s-matches? buffer-name "\\*\\(scratch\\|Messages\\)\\*"))
(or (eq 'dired-mode (buffer-local-value 'major-mode buffer))
(s-matches? "^ ?\\*.+\\*$" buffer-name))
(not (get-buffer-window buffer)))
(kill-buffer buffer))))
(buffer-list))) (buffer-list)))
;; Inspired by http://demonastery.org/2013/04/emacs-evil-narrow-region/
(defun my:narrow-to-region-indirect (start end)
"Restrict editing in this buffer to the current region, indirectly."
(interactive "r")
(deactivate-mark)
(let ((buf (clone-indirect-buffer nil nil)))
(with-current-buffer buf
(narrow-to-region start end))
(switch-to-buffer buf)))
(defun my:kill-persp ()
(interactive)
(persp-kill (persp-name persp-curr)))
;;;; Tmux defuns ;;;;;;;;;;;;;;;;; ;;;; Tmux defuns ;;;;;;;;;;;;;;;;;
(defun my:tmux-send (command) (defun my:tmux-send (command)
(interactive "sSend to Tmux: ") (interactive "sSend to Tmux: ")
@ -86,7 +52,7 @@ to abort the minibuffer."
(stringp appName) (stringp appName)
(not (string= "" appName))) (not (string= "" appName)))
(setq appName (concat "-a " appName ".app"))) (setq appName (concat "-a " appName ".app")))
(shell-command (concat "open " appName " " (shell-quote-argument path)))) (async-shell-command (concat "open " appName " " (shell-quote-argument path))))
(defun my:open-with (appName) (defun my:open-with (appName)
(interactive "sApp name: ") (interactive "sApp name: ")
@ -102,58 +68,44 @@ to abort the minibuffer."
;; Ex-commands ;; ;; Ex-commands ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(evil-define-command my:ex:msg-buffer () :repeat nil (evil-define-command ex:kill-buffers (&optional bang) :repeat nil
(interactive)
(view-echo-area-messages)
(switch-to-buffer-other-window "*Messages*")
;; Force text-mode for unfettered evil-mode & my keymappings
(text-mode))
(evil-define-command my:ex:kill-buffers (&optional bang) :repeat nil
(interactive "<!>") (interactive "<!>")
(let ((buffers (if bang (if (and bang (projectile-project-p))
(cdr (buffer-list (current-buffer))) (projectile-kill-buffers)
(buffer-list)))) (mapc 'kill-buffer (buffer-list)))
(delete-other-windows) (delete-other-windows))
(tags-reset-tags-tables)
(mapc 'kill-buffer buffers)))
(evil-define-command my:ex:init-files (&optional bang) :repeat nil (evil-define-command ex:init-files (&optional bang) :repeat nil
(interactive "<!>") (interactive "<!>")
(if bang (if bang
(ido-find-file-in-dir *init-dir) (ido-find-file-in-dir *init-dir)
(ido-find-file-in-dir *dir))) (ido-find-file-in-dir *dir)))
(evil-define-command my:ex:notes () :repeat nil (evil-define-command ex:notes () :repeat nil
(interactive) (interactive)
(ido-find-file-in-dir org-directory)) (ido-find-file-in-dir org-directory))
(evil-define-command my:ex:snippets (&optional bang) :repeat nil
(interactive "<!>")
(if bang
(yas-new-snippet)
(yas-visit-snippet-file)))
;; Projects ;; Projects
(evil-define-command my:ex:ag-search (search &optional bang) :repeat nil (evil-define-command ex:ag-search (search &optional bang regex) :repeat nil
(interactive "<a><!>") (interactive "<a><!>")
(let ((root (my/project-root bang))) (let ((root (my/project-root bang)))
(ag search root))) (if search
(if regex (ag-regexp search root) (ag search root))
(helm-do-ag root))))
(evil-define-command my:ex:ag-regex-search (search &optional bang) :repeat nil (evil-define-command ex:ag-regex-search (search &optional bang) :repeat nil
(interactive "<a><!>") (interactive "<a><!>")
(let ((root (my/project-root bang))) (ex:ag-search search bang t))
(ag-regexp search root)))
;; Run a command. If <bang>, then only type command into tmux ;; Run a command. If <bang>, then only type command into tmux
(evil-define-command my:ex:tmux-send (command &optional bang) :repeat nil (evil-define-command ex:tmux-send (command &optional bang) :repeat nil
(interactive "<sh><!>") (interactive "<sh><!>")
(let ((cmd-format (if bang "%s" "C-u %s Enter"))) (let ((cmd-format (if bang "%s" "C-u %s Enter")))
(my:tmux-send (format cmd-format (shell-quote-argument command))) (my:tmux-send (format cmd-format (shell-quote-argument command)))
(when (evil-ex-p) (when (evil-ex-p)
(message "[Tmux] %s" command)))) (message "[Tmux] %s" command))))
(evil-define-command my:ex:tmux-chdir (&optional path bang) :repeat nil (evil-define-command ex:tmux-chdir (&optional path bang) :repeat nil
(interactive "<f><!>") (interactive "<f><!>")
(let ((dir (shell-quote-argument (let ((dir (shell-quote-argument
(if (and path (if (and path
@ -161,36 +113,65 @@ to abort the minibuffer."
(file-directory-p path)) (file-directory-p path))
(file-truename path) (file-truename path)
(my/project-root bang))))) (my/project-root bang)))))
(my:ex:tmux-run (format "cd %s" dir)) (ex:tmux-send (format "cd %s" dir))
(when (evil-ex-p) (when (evil-ex-p)
(message "[Tmux] cd %s" dir)))) (message "[Tmux] cd %s" dir))))
(evil-define-command my:ex:byte-compile-all (&optional bang) :repeat nil (evil-define-command ex:byte-compile-all (&optional bang) :repeat nil
(interactive "<!>") (interactive "<!>")
(byte-recompile-file (expand-file-name "init.el" *dir) bang 0) (require 'async-bytecomp)
(byte-recompile-directory *init-dir 0 bang) ;; (async-byte-recompile-directory *dir 0 bang)
(byte-recompile-directory *elisp-dir 0 bang)) (byte-recompile-directory *dir 0 bang))
(evil-define-command my:ex:mru () :repeat nil (evil-define-command ex:build (arguments &optional bang) :repeat nil
"Find a recent file using ido."
(interactive)
(let ((file (ido-completing-read "Choose recent file: " recentf-list nil t)))
(when file (find-file file))))
(evil-define-command my:ex:build (arguments &optional bang) :repeat nil
(interactive "<a><!>") (interactive "<a><!>")
(my:build arguments)) (my:build arguments))
(evil-define-command my:ex:cd (dir) :repeat nil (evil-define-command ex:cd (dir) :repeat nil
(interactive "<f>") (interactive "<f>")
(cd (if (zerop (length dir)) "~" dir))) (cd (if (zerop (length dir)) "~" dir)))
(defun --save-exit() (save-buffer) (kill-buffer) (remove-hook 'yas-after-exit-snippet-hook '--save-exit))
(evil-define-command ex:create-file (path &optional bang) :repeat nil
"Deploy files (and their associated templates) quickly. Will prompt
you to fill in each snippet field before buffer closes unless BANG is
provided."
(interactive "<f><!>")
(let ((dir (f-dirname path))
(fullpath (f-full path))
(is-auto t))
(when (and bang (not (f-exists? dir))) (f-mkdir dir))
(if (f-exists? dir)
(if (f-exists? fullpath)
(error "File already exists: %s" path)
(find-file fullpath)
(add-hook 'yas-after-exit-snippet-hook '--save-exit)
(if bang (--save-exit)))
(error "Directory doesn't exist: %s" dir))))
(evil-define-command ex:rename-this-file (new-name &optional bang) :repeat nil
"Renames current buffer and file it is visiting."
(interactive "<f><!>")
(let ((name (buffer-name))
(filename (buffer-file-name)))
(if (not (and filename (file-exists-p filename)))
(error "Buffer '%s' is not visiting a file!" name)
(let ((new-name (if new-name new-name (read-file-name "New name: " filename))))
(if (get-buffer new-name)
(error "A buffer named '%s' already exists!" new-name)
(rename-file filename new-name 1)
(rename-buffer new-name)
(set-visited-file-name new-name)
(set-buffer-modified-p nil)
(when bang
(delete-file filename))
(message "File '%s' successfully renamed to '%s'"
name (file-name-nondirectory new-name)))))))
;;; ;;;
(evil-define-operator my:ex:scratch-buffer (beg end) (evil-define-operator ex:scratch-buffer (beg end)
:motion nil
:move-point nil :move-point nil
:type inclusive :type inclusive
:repeat nil
(interactive "<r>") (interactive "<r>")
(let ((mode major-mode) (let ((mode major-mode)
(text (when (and beg end) (buffer-substring beg end)))) (text (when (and beg end) (buffer-substring beg end))))
@ -198,11 +179,9 @@ to abort the minibuffer."
(if text (insert text)) (if text (insert text))
(funcall mode))) (funcall mode)))
(evil-define-operator my:ex:org-capture (beg end) (evil-define-operator ex:org-capture (beg end)
:motion nil
:move-point nil :move-point nil
:type inclusive :type inclusive
:repeat nil
(interactive "<r>") (interactive "<r>")
(let ((mode major-mode) (let ((mode major-mode)
(text (when (and beg end) (buffer-substring beg end)))) (text (when (and beg end) (buffer-substring beg end))))
@ -210,7 +189,7 @@ to abort the minibuffer."
(org-capture-string text) (org-capture-string text)
(org-capture)))) (org-capture))))
(evil-define-operator my:ex:retab (beg end) (evil-define-operator ex:retab (beg end)
:motion nil :motion nil
:move-point nil :move-point nil
:type line :type line
@ -224,18 +203,15 @@ spaces-to-tabs, depending on `indent-tab-mode'. Untested."
(tabify beg end) (tabify beg end)
(untabify beg end))) (untabify beg end)))
(evil-define-operator my:ex:run-code (beg end) :repeat nil (evil-define-operator ex:run-code (beg end)
:motion nil
:move-point nil :move-point nil
:type exclusive
:repeat nil
(interactive "<r>") (interactive "<r>")
(cond ((and beg end) (cond ((and beg end)
(my:run-code-region beg end)) (my:run-code-region beg end))
(t (t
(my:run-code-buffer)))) (my:run-code-buffer))))
(evil-define-operator my:ex:send-region-to-repl (beg end &optional bang) :repeat nil (evil-define-operator ex:send-region-to-repl (beg end &optional bang)
:motion nil :motion nil
:move-point nil :move-point nil
:type exclusive :type exclusive
@ -245,3 +221,28 @@ spaces-to-tabs, depending on `indent-tab-mode'. Untested."
(my:send-region-to-repl beg end)) (my:send-region-to-repl beg end))
(t (t
(my:switch-to-repl)))) (my:switch-to-repl))))
(evil-define-operator ex:snippets (beg end &optional name)
:motion nil
:move-point nil
:type exclusive
:repeat nil
"Create a new snippet (called `name'), or select from all the
current mode's snippets to edit."
(interactive "<r><a>")
(cond ((and beg end)
(yas-insert-snippet))
(t
(if name
(find-file (concat *snippets-dir (symbol-name major-mode) "/" name))
(yas-visit-snippet-file)))))
(evil-define-operator ex:narrow-indirect (beg end)
:motion nil
:move-point nil
:type exclusive
:repeat nil
"Indirectly narrow the region from BEG to END."
(interactive "<r>")
(evil-normal-state)
(narrow-to-region-indirect beg end))

View file

@ -1,8 +0,0 @@
(provide 'my-defuns)
(shut-up
(load "defuns/utility")
(load "defuns/config")
(load "defuns/text")
(load "defuns/hooks")
(load "defuns/coderunner"))

View file

@ -4,95 +4,93 @@
;; Global keymaps ;; ;; Global keymaps ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key (kbd "M-x") 'smex) (bind (kbd "M-x") 'smex
(global-set-key (kbd "M-X") 'smex-major-mode-commands) (kbd "M-X") 'smex-major-mode-commands
(global-set-key (kbd "C-:") 'eval-expression) (kbd "C-;") 'eval-expression
(global-set-key (kbd "C-j") "5j") (kbd "C-`") 'popwin:popup-last-buffer
(global-set-key (kbd "C-k") "5k")
(when is-mac (kbd "s-=") 'text-scale-increase
(when window-system (kbd "s--") 'text-scale-decrease
(global-set-key (kbd "s-=") 'text-scale-increase) (kbd "s-w") 'evil-window-delete
(global-set-key (kbd "s--") 'text-scale-decrease) (kbd "s-/") 'evilnc-comment-or-uncomment-lines
(global-set-key (kbd "s-w") 'evil-window-delete) (kbd "s-<f12>") 'toggle-frame-fullscreen)
(global-set-key (kbd "s-/") 'evilnc-comment-or-uncomment-lines)
(global-set-key (kbd "s-<f12>") 'toggle-frame-fullscreen)
;; Faster scrolling ;; Faster scrolling
(mapc (lambda(map) (bind '(normal visual)
(evil-define-key map my-mode-map (kbd "s-j") "5j") (kbd "s-j") "7j"
(evil-define-key map my-mode-map (kbd "s-k") "5k")) (kbd "s-k") "7k"
'(emacs normal visual)) (kbd "s-r") 'my:run-code-buffer
(kbd "s-R") 'my:switch-to-repl)
(nmap! (kbd "s-t") 'projectile-find-file (bind 'normal (kbd "s-t") 'projectile-find-file
(kbd "s-T") 'projectile-find-tag
(kbd "s-p") 'projectile-switch-project (kbd "s-p") 'projectile-switch-project
(kbd "s-m") 'my:ex:mru (kbd "s-P") 'persp-switch
(kbd "s-M") 'projectile-recentf (kbd "s-f") 'projectile-ag
(kbd "s-S-f") 'helm-do-ag
(kbd "s-m") ",m"
(kbd "s-M") ",M"
(kbd "s-o") 'ido-find-file (kbd "s-o") 'ido-find-file
(kbd "s-d") 'dash-at-point (kbd "s-d") 'dash-at-point)
(kbd "s-b") 'my:ex:build)
(nvmap! (kbd "s-r") ",r"
(kbd "s-R") ",R")))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Local keymaps ;; ;; Local keymaps ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Remap ; to : - SPC and shift-SPC replace ; and , - have to use (bind 'god
;; define-key instead of n/vmap for this one to register. ;; <localleader>
(-nvmap ";" 'evil-ex) ":" 'linum-mode
(-nvmap "X" 'evil-exchange) "\\" 'neotree-toggle
"=" 'toggle-transparency
;;;; <Leader> ;;;;;;;;;;;;;;;;;;;;;;;;;; "of" 'my:send-dir-to-finder
(nmap! ",r" 'my:run-code-buffer
",R" 'my:switch-to-repl
",b" 'my:build
",a" 'projectile-find-other-file
",e" 'ido-find-file
",E" 'my:ex:init-files
",m" 'my:ex:mru ; recent GLOBAL files
",M" 'projectile-recentf ; recent PROJECT files
",p" 'projectile-switch-project
",g" 'git-gutter+-show-hunk
",;" 'helm-imenu
",:" 'my:goto-symbol
",," 'ido-switch-buffer
",." 'projectile-find-file)
(vmap! ",r" 'my:run-code-region
",R" 'my:send-region-to-repl)
(nvmap! ",=" 'align-regexp)
;;;; <localleader> ;;;;;;;;;;;;;;;;;;;;;
(-nmap "\\" 'evil-execute-in-god-state)
(gmap! ":" 'linum-mode
"\\" 'neotree-show
"|" 'neotree-hide
"oo" 'my:send-dir-to-finder
"ou" 'my:send-to-transmit "ou" 'my:send-to-transmit
"ol" 'my:send-to-launchbar "ol" 'my:send-to-launchbar
"oL" 'my:send-dir-to-launchbar "oL" 'my:send-dir-to-launchbar
;; tmux: cd (default-directory) ;; tmux: cd (default-directory)
"ot" (λ (my:ex:tmux-chdir nil t)) "ot" (λ (ex:tmux-chdir nil t))
;; tmux: cd [project root] ;; tmux: cd [project root]
"oT" 'my:ex:tmux-chdir) "oT" 'ex:tmux-chdir)
;;;; Keybindings ;;;;;;;;;;;;;;;;;;;;;;; (bind '(normal visual)
(nvmap! "gc" 'evil-ace-jump-char-mode ";" 'evil-ex ; Remap ; to : - SPC and shift-SPC replace ; and ,
"\\" 'evil-execute-in-god-state ; localleader
"X" 'evil-exchange
"gc" 'evil-ace-jump-char-mode
"gw" 'evil-ace-jump-word-mode ; overwrites evil-fill "gw" 'evil-ace-jump-word-mode ; overwrites evil-fill
"gl" 'evil-ace-jump-line-mode "gl" 'evil-ace-jump-line-mode
"gt" 'ace-window
"gT" (λ (ace-window 4))
"]e" 'next-error
"[e" 'previous-error
"]g" 'git-gutter+-next-hunk
"[g" 'git-gutter+-previous-hunk
"]\\" 'er/expand-region "]\\" 'er/expand-region
"[\\" 'er/contract-region "[\\" 'er/contract-region)
"]g" 'git-gutter+-stage-hunks (bind 'normal
"[g" 'git-gutter+-revert-hunks) ",r" 'my:run-code-buffer
",R" 'my:switch-to-repl
",a" 'helm-projectile-find-other-file
",e" 'ido-find-file
",E" 'ex:init-files
",m" 'helm-recentf
",M" 'helm-projectile-recentf ; recent PROJECT files
",p" 'helm-projectile-switch-project
",g" 'git-gutter+-show-hunk
",;" 'helm-imenu
",," 'helm-projectile-switch-to-buffer
",<" 'helm-buffers-list
",]" 'helm-etags-select
",/" 'helm-projectile-find-file
",." 'helm-projectile-find-file-dwim
(nmap! ;; Moving rows rather than lines (in case of wrapping) ;; Moving rows rather than lines (in case of wrapping)
"j" 'evil-next-visual-line "j" 'evil-next-visual-line
"k" 'evil-previous-visual-line "k" 'evil-previous-visual-line
@ -104,10 +102,8 @@
"]b" 'next-buffer "]b" 'next-buffer
"[b" 'previous-buffer "[b" 'previous-buffer
"]e" 'next-error "]p" 'persp-next
"[e" 'previous-error "[p" 'persp-prev
"]h" 'git-gutter+-next-hunk
"[h" 'git-gutter+-previous-hunk
;; winner-mode: window layout undo/redo (see init-core.el) ;; winner-mode: window layout undo/redo (see init-core.el)
(kbd "C-w u") 'winner-undo (kbd "C-w u") 'winner-undo
@ -117,7 +113,12 @@
(kbd "C--") 'evil-numbers/inc-at-pt (kbd "C--") 'evil-numbers/inc-at-pt
(kbd "C-+") 'evil-numbers/dec-at-pt) (kbd "C-+") 'evil-numbers/dec-at-pt)
(vmap! ;; vnoremap < <gv (bind 'visual
",=" 'align-regexp
",r" 'my:run-code-region
",R" 'my:send-region-to-repl
;; vnoremap < <gv
"<" (λ (evil-shift-left (region-beginning) (region-end)) "<" (λ (evil-shift-left (region-beginning) (region-end))
(evil-normal-state) (evil-normal-state)
(evil-visual-restore)) (evil-visual-restore))
@ -126,12 +127,13 @@
(evil-normal-state) (evil-normal-state)
(evil-visual-restore))) (evil-visual-restore)))
(imap! ;; Join lines from insert mode (bind 'insert
(kbd "<M-kp-delete>") 'evil-join ;; Join lines from insert mode
(kbd "<M-kp-delete>") (λ (evil-forward-word) (evil-delete-backward-word))
;; Newline magic ;; Newline magic
(kbd "<S-backspace>") 'backward-delete-char
(kbd "<backspace>") 'backward-delete-char-untabify (kbd "<backspace>") 'backward-delete-char-untabify
(kbd "<S-backspace>") 'backward-delete-char
(kbd "<C-return>") 'evil-ret-and-indent (kbd "<C-return>") 'evil-ret-and-indent
(kbd "<M-return>") (kbd "<return> DEL") ; newline and dedent (kbd "<M-return>") (kbd "<return> DEL") ; newline and dedent
@ -140,7 +142,8 @@
(kbd "s-]") (λ (evil-shift-right (point-at-bol) (point-at-eol))) (kbd "s-]") (λ (evil-shift-right (point-at-bol) (point-at-eol)))
(kbd "<backtab>") (kbd "s-[")) (kbd "<backtab>") (kbd "s-["))
(emap! ;; Preserve buffer-movement in emacs mode (bind 'emacs
;; Preserve buffer-movement in emacs mode
"\C-j" 'evil-next-line "\C-j" 'evil-next-line
"\C-k" 'evil-previous-line "\C-k" 'evil-previous-line
@ -150,14 +153,19 @@
(kbd "C-w k") 'evil-window-up) (kbd "C-w k") 'evil-window-up)
;; Rotate-text (see elisp/rotate-text.el) ;; Rotate-text (see elisp/rotate-text.el)
(nmap! "!" 'rotate-word-at-point) (bind 'normal "!" 'rotate-word-at-point)
(vmap! "!" 'rotate-region) (bind 'visual "!" 'rotate-region)
;; Easy escape from insert mode ;; Easy escape from insert mode
(ichmap "jj" 'evil-normal-state) (ibind "jj" 'evil-normal-state)
;; Enable TAB to do matchit ;; Enable TAB to do matchit
(nmap evil-matchit-mode-map (kbd "TAB") 'evilmi-jump-items) (bind '(normal visual) evil-matchit-mode-map [tab] 'evilmi-jump-items)
;; Additional operators
(bind '(normal motion) "gr" 'ex:run-code) ; code eval
(bind '(normal motion) "gR" 'ex:send-region-to-repl) ; eval in repl
(bind '(normal motion) "gx" 'ex:scratch-buffer) ; send to scratch buffer
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -165,217 +173,64 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Real go-to-definition for elisp ;; Real go-to-definition for elisp
(mmap emacs-lisp-mode-map "gd" (bind 'motion emacs-lisp-mode-map "gd"
(λ (let ((func (function-called-at-point))) (λ (let ((func (function-called-at-point)))
(if func (find-function func))))) (if func (find-function func)))))
(bind 'motion emacs-lisp-mode-map "gD"
(λ (let ((func (function-called-at-point)))
(if func (find-function-other-window func)))))
(after ag ;; Peek at file from dired
(defmap ag-mode-map (bind dired-mode-map "o" (λ (popwin:find-file (dired-get-file-for-visit))))
[escape] 'ag-kill-buffers
"h" nil))
(after auto-complete ;; Evil registers ;;;;;;;;;;;;;;;;;;;;;;
(imap ac-mode-map (bind evil-ex-completion-map
(kbd "C-x C-f") 'ac-complete-filename (kbd "C-r") #'evil-ex-paste-from-register ; registers in ex-mode
(kbd "C-SPC") 'auto-complete) (kbd "C-a") 'move-beginning-of-line
(kbd "<s-left>") 'move-beginning-of-line
(kbd "<s-right>") 'move-beginning-of-line
(kbd "<s-backspace>") 'evil-delete-whole-line)
;; Quickly close/kill the command window
(bind 'normal evil-command-window-mode-map
[escape] 'kill-buffer-and-window
"q" 'kill-buffer-and-window)
(defmap ac-completing-map ;; Make C-g work like <esc>
(kbd "<tab>") 'ac-complete (bind '(normal visual insert) (kbd "C-g") 'evil-normal-state)
(kbd "C-n") 'ac-next
(kbd "C-p") 'ac-previous
(kbd "S-C-SPC") 'ac-quick-help
(kbd "ESC") 'ac-stop
(kbd "RET") 'ac-complete))
(after emmet-mode
(imap emmet-mode-keymap
(kbd "s-e") 'emmet-expand-yas
(kbd "s-E") 'emmet-expand-line))
(after js-mode
(imap js-mode-map [remap auto-complete] 'tern-ac-complete))
(after markdown-mode
(let ((map markdown-mode-map))
(nvmap map
(kbd ",i") 'markdown-insert-image
(kbd ",l") 'markdown-insert-link
(kbd ",L") 'markdown-insert-reference-link-dwim)
(nmap map
"[p" 'markdown-promote
"]p" 'markdown-demote)
(imap map (kbd "M--") 'markdown-insert-hr)
(defmap map
(kbd "<backspace>") nil
(kbd "<M-left>") nil
(kbd "<M-right>") nil
(kbd "s-*") 'markdown-insert-list-item
(kbd "s-b") 'markdown-insert-bold
(kbd "s-i") 'markdown-insert-italic
(kbd "s-`") 'markdown-insert-del)))
(after multiple-cursors
(imap mc/keymap
(kbd "s-'") 'mc/mark-next-like-this
(kbd "s-\"") 'mc/mark-previous-like-this
(kbd "C-s-'") 'mc/mark-all-like-this)
(vmap mc/keymap
(kbd "s-'") 'mc/mark-next-like-this
(kbd "s-\"") 'mc/mark-previous-like-this
(kbd "C-s-'") 'mc/mark-all-like-this))
(after nose
(nmap nose-mode-map
",tr" 'nosetests-again
",ta" 'nosetests-all
",ts" 'nosetests-one
",tv" 'nosetests-module
",tA" 'nosetests-pdb-all
",tO" 'nosetests-pdb-one
",tV" 'nosetests-pdb-module))
(after org
(imap org-mode-map [remap my.inflate-space-maybe] 'self-insert-command)
(define-key org-mode-map (kbd "RET") nil)
(define-key org-mode-map (kbd "C-j") nil)
(define-key org-mode-map (kbd "C-k") nil)
(mapc (lambda (state)
(evil-define-key state evil-org-mode-map
(kbd "M-l") 'org-metaright
(kbd "M-h") 'org-metaleft
(kbd "M-k") 'org-metaup
(kbd "M-j") 'org-metadown
(kbd "M-L") 'org-shiftmetaright
(kbd "M-H") 'org-shiftmetaleft
(kbd "M-K") 'org-shiftmetaup
(kbd "M-J") 'org-shiftmetadown
(kbd "M-o") '(lambda () (interactive)
(evil-org-eol-call
'(lambda()
(org-insert-heading)
(org-metaright))))
(kbd "M-t") '(lambda () (interactive)
(evil-org-eol-call
'(lambda()
(org-insert-todo-heading nil)
(org-metaright))))
))
'(normal insert))
;; Formatting shortcuts
(imap evil-org-mode-map
(kbd "s-b") (λ (my/org-surround "*")) ; bold
(kbd "s-u") (λ (my/org-surround "_")) ; underline
(kbd "s-i") (λ (my/org-surround "/")) ; italics
(kbd "s-`") (λ (my/org-surround "+")) ; strikethrough
(kbd "<S-s-return>") (λ (evil-move-beginning-of-line) (org-insert-heading))
(kbd "<s-return>") (λ (org-insert-heading-after-current))
)
(nvmap evil-org-mode-map
",l" 'org-insert-link)
(vmap evil-org-mode-map
(kbd "s-b") "s*" ; bold
(kbd "s-i") "s/") ; italics
(nmap evil-org-mode-map
",d" 'org-time-stamp
",D" 'org-time-stamp-inactive
",s" 'org-schedule
",a" 'org-attach
",A" 'org-attach-open
",t" 'org-todo
",T" 'org-show-todo-tree
",/" 'org-sparse-tree
",?" 'org-tags-view
",+" 'org-align-all-tags
",r" 'org-refile
"gh" 'outline-up-heading
"gj" 'org-forward-heading-same-level
"gk" 'org-backward-heading-same-level
"gl" 'outline-next-visible-heading
"go" 'org-open-at-point
"ga" 'org-agenda
"gt" 'org-show-todo-tree
"H" 'org-beginning-of-line
"L" 'org-end-of-line
"$" 'org-end-of-line
"^" 'org-beginning-of-line
"<" 'org-metaleft
">" 'org-metaright
"-" 'org-cycle-list-bullet
(kbd ", SPC") 'org-archive-subtree
(kbd "<S-s-return>") (λ (evil-move-beginning-of-line) (org-insert-heading) (evil-insert-state))
(kbd "<s-return>") (λ (org-insert-heading-after-current) (evil-insert-state))
(kbd "RET") (λ (if (org-entry-is-todo-p) (org-todo 'done)))
(kbd "TAB") 'org-cycle)
)
(after ruby-mode
(nmap ruby-mode-map "gd" 'rsense-jump-to-definition))
(after rspec-mode
(nmap rspec-mode-verifiable-keymap
",tr" 'rspec-rerun
",ta" 'rspec-verify-all
",ts" 'rspec-verify-single
",tv" 'rspec-verify)
(nmap rspec-dired-mode-keymap
",tv" 'rspec-dired-verify
",ts" 'rspec-dired-verify-single
",ta" 'rspec-verify-all
",tr" 'rspec-rerun))
(after web-mode
(defmap web-mode-map (kbd "s-/") 'web-mode-comment-or-uncomment)
(nvmap web-mode-map
"]a" 'web-mode-attribute-next
"]t" 'web-mode-tag-next
"[t" 'web-mode-tag-previous
"]T" 'web-mode-element-child
"[T" 'web-mode-element-parent)
(nmap web-mode-map
"zf" 'web-mode-fold-or-unfold
",t" 'web-mode-element-rename))
(after re-builder
(nmap reb-mode-map
",r" 'reb-enter-subexp-mode
",b" 'reb-copy
",i" 'reb-change-syntax
"\C-n" 'reb-next-match
"\C-p" 'reb-prev-match))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Ex Commands ;; ;; Ex Commands ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(exmap "msg" 'my:ex:msg-buffer) (defcmd "msg" 'popwin:messages)
(exmap "recompile" 'my:ex:byte-compile-all) (defcmd "recompile" 'ex:byte-compile-all)
(exmap "n[otes]" 'my:ex:notes) (defcmd "n[otes]" 'ex:notes)
(exmap "ini" 'my:ex:init-files) (defcmd "ini" 'ex:init-files)
(exmap "snip[pets]" 'my:ex:snippets) (defcmd "rec[ent]" 'ex:recent-files)
(exmap "mru" 'my:ex:mru) (defcmd "snip[pets]" 'ex:snippets)
(defcmd "retab" 'ex:retab)
(defcmd "ag" 'ex:ag-search)
(defcmd "agr" 'ex:ag-regex-search)
(defcmd "x" 'ex:scratch-buffer)
(defcmd "X" 'ex:org-capture)
(defcmd "a" 'helm-projectile-find-other-file)
(defcmd "cd" 'ex:cd)
(defcmd "tcd" 'ex:tmux-chdir)
(defcmd "t[mux]" 'ex:tmux-send)
(defcmd "r[ege]x" 'regex-tool)
(defcmd "en[ew]" 'ex:create-file)
(defcmd "l[ast]" 'popwin:popup-last-buffer)
(defcmd "run" 'ex:run-code)
(defcmd "build" 'ex:build)
(defcmd "k[ill]" 'kill-this-buffer) ; Kill current buffer
(defcmd "k[ill]all" 'ex:kill-buffers) ; Kill all buffers (bang = project buffers only)
(defcmd "k[ill]persp" 'my:kill-persp) ; Kill current perspective
(defcmd "k[ill]o" 'my:kill-other-buffers) ; Kill current project buffers
(defcmd "sq[uint]" 'ex:narrow-indirect) ; Narrow buffer to selection
(defcmd "ren[ame]" 'ex:rename-this-file) ; Rename file . Bang: Delete old one
(exmap "retab" 'my:ex:retab) (after git-gutter+
(exmap "ag" 'my:ex:ag-search) (defcmd "gstage" 'git-gutter+-stage-hunks)
(exmap "agr" 'my:ex:ag-regex-search) (defcmd "grevert" 'git-gutter+-revert-hunks)
(exmap "x" 'my:ex:scratch-buffer) (defcmd "gdiff" 'git-gutter+-show-hunk))
(exmap "X" 'my:ex:org-capture)
(exmap "a" 'projectile-find-other-file)
(exmap "bx" 'my:ex:kill-buffers)
(exmap "tcd" 'my:ex:tmux-chdir)
(exmap "t[mux]" 'my:ex:tmux-send)
(exmap "build" 'my:ex:build)
(exmap "re[gex]" 're-builder)

View file

@ -6,7 +6,10 @@
;; Your init file should contain only one such instance. ;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right. ;; If there is more than one, they won't work right.
'(git-gutter:lighter " !") '(git-gutter:lighter " !")
) ;; Make brin theme safe
'(custom-safe-themes
(quote
("7fa3f2865322ee4e3fcf061efcf020465d691aed02e6756191fbf1cfb8648ccf" default))))
(set-face-background 'show-paren-match-face "#1f1f1f") (set-face-background 'show-paren-match-face "#1f1f1f")
(set-face-foreground 'show-paren-match-face "orange") (set-face-foreground 'show-paren-match-face "orange")

View file

@ -28,7 +28,7 @@
(custom-theme-set-variables 'brin) (custom-theme-set-variables 'brin)
(let ((background "#1f1f1f") (let ((background "#222222")
;; (gutters "#262E34") ;; (gutters "#262E34")
(gutters "#1f252a") (gutters "#1f252a")
(gutter-fg "#55616A") (gutter-fg "#55616A")
@ -49,12 +49,18 @@
(delimiters "#c0c5ce") (delimiters "#c0c5ce")
(operators "#c0c5ce") (operators "#c0c5ce")
(keywords "#b48ead") (keywords "#b48ead")
(variables "#bf616a") (variables "#CBECFF")
(functions "#8fa1b3") (functions "#8fa1b3")
(methods "#8fa1b3") (methods "#8fa1b3")
(strings "#a3be8c") (strings "#a3be8c")
(constants "#d08770") (constants "#d08770")
(white "#ffffff")) (white "#ffffff")
(git-modified "#B4924E")
(git-added "#91E331")
;; (git-added "#55811D")
(git-deleted "#A12121")
)
(custom-theme-set-faces (custom-theme-set-faces
'brin 'brin
@ -67,7 +73,7 @@
`(region ((t (:background ,selection) ))) `(region ((t (:background ,selection) )))
`(cursor ((t (:background ,white) ))) `(cursor ((t (:background ,white) )))
`(fringe ((t (:background ,background :foreground ,white) ))) `(fringe ((t (:background ,background :foreground ,white) )))
`(linum ((t (:background ,linum :foreground ,gutter-fg) ))) `(linum ((t (:background ,background :foreground ,gutter-fg) )))
`(vertical-border ((t (:foreground ,gutters-active) ))) `(vertical-border ((t (:foreground ,gutters-active) )))
@ -76,14 +82,19 @@
:box (:line-width 3 :color ,gutters-active) )))) :box (:line-width 3 :color ,gutters-active) ))))
`(mode-line-inactive ((t (:foreground ,gutter-fg `(mode-line-inactive ((t (:foreground ,gutter-fg
:background ,gutters :background ,background
:box (:line-width 3 :color ,gutters) )))) :box (:line-width 3 :color ,gutters) ))))
`(highlight-indentation-face ((t (:background ,linum) ))) `(mode-line-modified-face ((t (:foreground ,builtin))))
`(highlight-indentation-current-column-face ((t (:background ,gutters-active) )))
;; `(highlight-indentation-face ((t (:background ,linum) )))
;; `(highlight-indentation-current-column-face ((t (:background ,gutters-active) )))
`(flyspell-incorrect ((t (:underline "#ff5555" :inherit unspecified)))) `(flyspell-incorrect ((t (:underline "#ff5555" :inherit unspecified))))
`(helm-source-header ((t (:background ,gutters-active :foreground ,strings :weight bold :height 1.0))))
`(helm-selection ((t (:background ,selection))))
;; Font lock faces ;; Font lock faces
;; ***************************************************************************************** ;; *****************************************************************************************
@ -96,15 +107,30 @@
`(font-lock-comment-face ((t (:foreground ,comments)))) `(font-lock-comment-face ((t (:foreground ,comments))))
`(font-lock-comment-delimiter-face ((t (:foreground ,comments)))) `(font-lock-comment-delimiter-face ((t (:foreground ,comments))))
`(font-lock-function-name-face ((t (:foreground ,functions)))) `(font-lock-function-name-face ((t (:foreground ,functions))))
`(font-lock-doc-string-face ((t (:foreground ,strings)))) `(font-lock-doc-string-face ((t (:foreground ,comments))))
`(font-lock-doc-face ((t (:foreground ,comments))))
`(trailing-whitespace ((t (:background "#884444"))))
`(whitespace-tab ((t (:foreground "#444444"))))
`(whitespace-newline ((t (:foreground "#444444"))))
`(git-gutter+-modified ((t (:foreground ,git-modified))))
`(git-gutter+-added ((t (:foreground ,git-added))))
`(git-gutter+-deleted ((t (:foreground ,git-deleted))))
;; js2-mode
;; *****************************************************************************************
`(js2-function-param ((t (:foreground ,variables))))
`(js2-jsdoc-tag ((t (:foreground ,comments :weight bold :bold t))))
`(my-carriage-return-face ((t (:foreground "#555555"))))
`(my-tab-face ((t (:foreground "#555555"))))
`(trailing-whitespace ((t (:background "#884444")))))
;; ***************************************************************************************** ;; *****************************************************************************************
) `(persp-selected-face ((t (:foreground ,builtin))))
))
;; ***************************************************************************************** ;; *****************************************************************************************