emacs 9.4 KB

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