emacs 8.9 KB

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