emacs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. ;; Disable beep & flash
  2. (setq ring-bell-function 'ignore)
  3. ;; All yes or no prompts are y or n
  4. (defalias 'yes-or-no-p 'y-or-n-p)
  5. ;; Never follow symlinks
  6. (setq vc-follow-symlinks nil)
  7. ;; Leave the OS clipboard alone (use evil's "+ and "* instead)
  8. ; Don't copy and paste to the clipboard
  9. (setq select-enable-clipboard nil)
  10. ; Don't save to the clipboard on exit
  11. (setq x-select-enable-clipboard-manager nil)
  12. ;; Text and Notes
  13. (setq sentence-end-double-space nil)
  14. ;; Save minibar history
  15. (savehist-mode 1)
  16. (setq savehist-additional-variables '(kill-ring search-ring regexp-search-ring))
  17. ;; Auto-enable elisp when opening .emacs in dotfiles (without the .)
  18. (add-to-list 'auto-mode-alist '("emacs" . emacs-lisp-mode))
  19. ;; Start in text-mode
  20. (setq initial-major-mode 'text-mode)
  21. ;;;; Packages
  22. ;; Package installation
  23. (require 'package)
  24. (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
  25. (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
  26. (add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/"))
  27. (setq package-enable-at-startup nil)
  28. (package-initialize)
  29. ;; Function to ensure every package in installed, and ask if it isn't.
  30. (defun ensure-package-installed (&rest packages)
  31. (mapcar
  32. (lambda (package)
  33. (if (package-installed-p package)
  34. nil
  35. (if (y-or-n-p (format "Package %s is missing. Install it? " package))
  36. (package-install package)
  37. package)))
  38. packages))
  39. ;; Make sure to have downloaded archive description.
  40. (or (file-exists-p package-user-dir)
  41. (package-refresh-contents))
  42. ;; Activate installed packages
  43. (package-initialize)
  44. ;; Check that all packages are installed
  45. (ensure-package-installed
  46. 'iedit
  47. 'magit
  48. 'evil-magit
  49. 'undo-tree
  50. 'evil
  51. 'evil-leader
  52. 'evil-tabs
  53. 'powerline-evil
  54. 'zenburn-theme
  55. 'auto-complete
  56. 'ac-html
  57. 'fuzzy
  58. 'general
  59. 'linum-relative
  60. 'web-mode
  61. 'multi-term
  62. 'relative-line-numbers
  63. 'flymd
  64. 'markdown-mode
  65. )
  66. ;;;; Evil
  67. (setq evil-want-C-i-jump nil)
  68. ;; Evil tabs
  69. (global-evil-tabs-mode t)
  70. ;; Default to evil mode
  71. (evil-mode t)
  72. ;; Move all elements of evil-emacs-state-modes to evil-motion-state-modes
  73. (setq evil-motion-state-modes (append evil-emacs-state-modes evil-motion-state-modes))
  74. (setq evil-emacs-state-modes nil)
  75. ;; Delete info bindings for evil to take over
  76. (define-key Info-mode-map "g" nil)
  77. (define-key Info-mode-map "n" nil)
  78. (define-key Info-mode-map "p" nil)
  79. (define-key evil-window-map (kbd "q") 'delete-window)
  80. (define-key evil-window-map (kbd "C-q") 'delete-window)
  81. ;;;; Files
  82. ;; move file backups
  83. (setq backup-directory-alist
  84. `((".*" . ,(concat user-emacs-directory "backups"))))
  85. (setq auto-save-file-name-transforms
  86. `((".*" ,(concat user-emacs-directory "backups") t)))
  87. ;; Instead save undo history under .emacs.d/undo
  88. (setq undo-tree-auto-save-history t
  89. undo-tree-history-directory-alist
  90. `(("." . ,(concat user-emacs-directory "undo"))))
  91. (unless (file-exists-p (concat user-emacs-directory "undo"))
  92. (make-directory (concat user-emacs-directory "undo")))
  93. ;; Powerline
  94. (require 'powerline)
  95. (powerline-vim-theme)
  96. ;; Recent Files
  97. (require 'recentf)
  98. (recentf-mode 1)
  99. (setq recentf-max-menu-items 25)
  100. ;; Web mode
  101. (require 'web-mode)
  102. ;; 2 spaces for an indent
  103. (defun my-web-mode-hook ()
  104. "Hooks for Web mode."
  105. (setq web-mode-markup-indent-offset 2)
  106. )
  107. (add-hook 'web-mode-hook 'my-web-mode-hook)
  108. ;; Auto-enable web-mode when opening relevent files
  109. (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))
  110. (add-to-list 'auto-mode-alist '("\\.hbs\\'" . web-mode))
  111. (add-to-list 'auto-mode-alist '("\\.handlebars\\'" . web-mode))
  112. ;; Autocomplete
  113. (require 'auto-complete)
  114. (eval-and-compile
  115. (require 'auto-complete nil 'noerror))
  116. (ac-config-default)
  117. (setq ac-auto-start t)
  118. ;;(define-key ac-mode-map (kbd "TAB") 'auto-complete)
  119. ;;;;;(setq ac-auto-start nil)
  120. (global-set-key (kbd "<backtab>") 'ac-previous)
  121. ;;;;;(ac-set-trigger-key "TAB")
  122. (require 'ac-html)
  123. (setq web-mode-ac-sources-alist
  124. '(("css" . (ac-source-css-property))
  125. ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
  126. (ac-linum-workaround)
  127. ;; Spelling
  128. ;; TODO Mess with how I want spelling to be done. Maybe enable spelling on auto-fill mode?
  129. ;; map ]s and [s to next and previously wrong word
  130. (require 'general)
  131. (general-evil-setup)
  132. (general-nmap "]"
  133. (general-key-dispatch 'evil-change
  134. "s" 'flyspell-goto-next-error
  135. ))
  136. (general-vmap "]" 'evil-change)
  137. ;; move point to previous error
  138. ;; based on code by hatschipuh at
  139. ;; http://emacs.stackexchange.com/a/14912/2017
  140. (defun flyspell-goto-previous-error (arg)
  141. "Go to arg previous spelling error."
  142. (interactive "p")
  143. (while (not (= 0 arg))
  144. (let ((pos (point))
  145. (min (point-min)))
  146. (if (and (eq (current-buffer) flyspell-old-buffer-error)
  147. (eq pos flyspell-old-pos-error))
  148. (progn
  149. (if (= flyspell-old-pos-error min)
  150. ;; goto beginning of buffer
  151. (progn
  152. (message "Restarting from end of buffer")
  153. (goto-char (point-max)))
  154. (backward-word 1))
  155. (setq pos (point))))
  156. ;; seek the next error
  157. (while (and (> pos min)
  158. (let ((ovs (overlays-at pos))
  159. (r '()))
  160. (while (and (not r) (consp ovs))
  161. (if (flyspell-overlay-p (car ovs))
  162. (setq r t)
  163. (setq ovs (cdr ovs))))
  164. (not r)))
  165. (backward-word 1)
  166. (setq pos (point)))
  167. ;; save the current location for next invocation
  168. (setq arg (1- arg))
  169. (setq flyspell-old-pos-error pos)
  170. (setq flyspell-old-buffer-error (current-buffer))
  171. (goto-char pos)
  172. (if (= pos min)
  173. (progn
  174. (message "No more miss-spelled word!")
  175. (setq arg 0))
  176. (forward-word)))))
  177. (general-nmap "["
  178. (general-key-dispatch 'evil-change
  179. "s" 'flyspell-goto-previous-error
  180. ))
  181. (general-vmap "[" 'evil-change)
  182. ;; Relative line numbers
  183. (require 'linum-relative)
  184. (setq linum-relative-current-symbol "")
  185. (linum-mode)
  186. (linum-relative-global-mode)
  187. ;; Evil leader is Space
  188. (global-evil-leader-mode)
  189. (evil-leader/set-leader "<SPC>")
  190. ;; Leader keybinds
  191. (evil-leader/set-key
  192. "d" 'diff-buffer-with-file
  193. "b" 'buffer-menu
  194. "f" '(lambda () (interactive) (dired '"./"))
  195. "u" 'undo-tree-visualize
  196. "m" 'recentf-open-files
  197. "l" 'auto-fill-mode
  198. "s" 'flyspell-mode
  199. "a" 'auto-complete-mode
  200. "g" 'magit-status
  201. "M-g" 'magit-dispatch-popup
  202. )
  203. ;; System-specific configs
  204. (defun win-setup ()
  205. (add-to-list 'exec-path "C:/Program Files (x86)/Aspell/bin/")
  206. (setq ispell-program-name "aspell")
  207. (defun cmd ()
  208. (interactive)
  209. (make-comint-in-buffer "cmd" nil "cmd" nil)
  210. (switch-to-buffer "*cmd*")))
  211. (defun linux-setup ()
  212. ;; Magit
  213. (require 'magit)
  214. (setq evil-magit-state 'normal)
  215. (require 'evil-magit)
  216. (global-magit-file-mode))
  217. (cond ((eq system-type 'windows-nt) (win-setup))
  218. ((eq system-type 'gnu/linux) (linux-setup))
  219. (t (message "")))
  220. ;; TODO:
  221. ;; Go through the tutorials, skim the manuals
  222. ;; learning elisp
  223. ;; Fuzzy
  224. ;; Evil leader mode
  225. ;; Hotkey for undo tree
  226. ;; autocomplete
  227. ;; recent files
  228. ;; magit bindings
  229. (custom-set-variables
  230. ;; custom-set-variables was added by Custom.
  231. ;; If you edit it by hand, you could mess it up, so be careful.
  232. ;; Your init file should contain only one such instance.
  233. ;; If there is more than one, they won't work right.
  234. '(ac-auto-show-menu t)
  235. '(custom-enabled-themes (quote (wombat)))
  236. '(custom-safe-themes
  237. (quote
  238. ("14f0fbf6f7851bfa60bf1f30347003e2348bf7a1005570fd758133c87dafe08f" "4e753673a37c71b07e3026be75dc6af3efbac5ce335f3707b7d6a110ecb636a3" default)))
  239. '(inhibit-default-init t)
  240. '(inhibit-startup-buffer-menu nil)
  241. '(inhibit-startup-echo-area-message "josh")
  242. '(initial-buffer-choice t)
  243. '(initial-scratch-message "")
  244. '(package-selected-packages
  245. (quote
  246. (flymd relative-line-numbers multi-term ac-html web-mode evil-magit linum-relative general fuzzy auto-complete evil-tabs powerline-evil zenburn-theme magit iedit evil-leader))))
  247. (custom-set-faces
  248. ;; custom-set-faces was added by Custom.
  249. ;; If you edit it by hand, you could mess it up, so be careful.
  250. ;; Your init file should contain only one such instance.
  251. ;; If there is more than one, they won't work right.
  252. )