emacs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. ;; TODO:
  2. ;; Easier undo tree traversal
  3. ;; Replace evil-leader with general
  4. ;; consider removing auto-complete
  5. ;;;; Startup
  6. (setq initial-scratch-message "")
  7. ;;;; Base
  8. ;; Disable beep & flash
  9. (setq ring-bell-function 'ignore)
  10. ;; Disable blinking cursor
  11. (blink-cursor-mode 0)
  12. ;; TODO finish fixing eval-last-s-exp
  13. ;;(defun evil-eval-prev-exp ()
  14. ;;(interactive)
  15. ;;(evil-append 1)
  16. ;;(call-interactively (global-key-binding "\C-x"))
  17. ;;(call-interactively (global-key-binding "\C-e"))
  18. ;;(evil-normal-state))
  19. ;; All yes or no prompts are y or n
  20. (defalias 'yes-or-no-p 'y-or-n-p)
  21. ;; Never follow symlinks
  22. (setq vc-follow-symlinks nil)
  23. ;;; Leave the OS clipboard alone (use evil's "+ and "* instead)
  24. ; Don't copy and paste to the clipboard
  25. (setq select-enable-clipboard nil)
  26. (setq x-select-enable-clipboard nil)
  27. ; Don't save to the clipboard on exit
  28. (setq x-select-enable-clipboard-manager nil)
  29. ;; Text and Notes
  30. (setq sentence-end-double-space nil)
  31. ;; Save minibar history
  32. (savehist-mode 1)
  33. (setq savehist-additional-variables '(kill-ring search-ring regexp-search-ring))
  34. ;; Auto-enable elisp when opening .emacs in dotfiles (without the .)
  35. (add-to-list 'auto-mode-alist '("emacs" . emacs-lisp-mode))
  36. ;; Start in text-mode
  37. (setq initial-major-mode 'text-mode)
  38. ;; Always show matching parens
  39. (show-paren-mode t)
  40. ;; Backups (from https://stackoverflow.com/questions/151945/how-do-i-control-how-emacs-makes-backup-files/20824625#20824625)
  41. (setq version-control t ;; Use version numbers for backups.
  42. kept-new-versions 10 ;; Number of newest versions to keep.
  43. kept-old-versions 0 ;; Number of oldest versions to keep.
  44. delete-old-versions t ;; Don't ask to delete excess backup versions.
  45. backup-by-copying t) ;; Copy all files, don't rename them.
  46. (setq vc-make-backup-files t) ;; Backup versioned files
  47. ;; Default and per-save backups go here:
  48. (setq backup-directory-alist '(("" . "~/.emacs.d/backups/per-save")))
  49. (defun force-backup-of-buffer ()
  50. ;; Make a special "per session" backup at the first save of each
  51. ;; emacs session.
  52. (when (not buffer-backed-up)
  53. ;; Override the default parameters for per-session backups.
  54. (let ((backup-directory-alist '(("" . "~/.emacs.d/backups/per-session")))
  55. (kept-new-versions 3))
  56. (backup-buffer)))
  57. ;; Make a "per save" backup on each save. The first save results in
  58. ;; both a per-session and a per-save backup, to keep the numbering
  59. ;; of per-save backups consistent.
  60. (let ((buffer-backed-up nil))
  61. (backup-buffer)))
  62. (add-hook 'before-save-hook 'force-backup-of-buffer)
  63. ;; Autosave files
  64. (setq auto-save-file-name-transforms
  65. `((".*" , "~/.emacs.d/backups/auto-saves" t)))
  66. ;; Disable toolbar
  67. (when (display-graphic-p)
  68. (tool-bar-mode -1)
  69. )
  70. ;;;; Packages
  71. ;; Package installation
  72. (require 'package)
  73. (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
  74. (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
  75. (add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/"))
  76. (setq package-enable-at-startup nil)
  77. (package-initialize)
  78. ;; Keep track of whether or not we need to refresh package contents
  79. (setq packages-installed-this-session 0)
  80. ;; Function to ensure every package in installed, and ask if it isn't.
  81. (defun ensure-package-installed (&rest packages)
  82. (mapcar
  83. (lambda (package)
  84. (if (package-installed-p package)
  85. nil
  86. (if (y-or-n-p (format "Package %s is missing. Install it? " package))
  87. ;; If this is the 1st install this session, update before install
  88. (cond ((eq packages-installed-this-session 0)
  89. (package-refresh-contents)
  90. (setq packages-installed-this-session 1)
  91. (package-install package))
  92. (t (package-install package))
  93. nil)
  94. package)))
  95. packages))
  96. ;; List of packages to install on all systems
  97. (setq required-packages
  98. '(
  99. iedit
  100. magit
  101. evil-magit
  102. undo-tree
  103. evil
  104. evil-leader
  105. evil-tabs
  106. powerline-evil
  107. monokai-theme
  108. ;auto-complete
  109. linum-relative
  110. multi-term
  111. neotree
  112. evil-numbers
  113. editorconfig
  114. company
  115. ;helm
  116. ivy
  117. ))
  118. ;; List of optional packages
  119. (setq optional-packages
  120. '(
  121. flymd
  122. markdown-mode
  123. latex-preview-pane
  124. tide
  125. web-mode
  126. ;ac-html
  127. racket-mode
  128. fuzzy
  129. general))
  130. ;; Check that all packages are installed
  131. (apply 'ensure-package-installed required-packages)
  132. ;; Declare function for optional packages
  133. (defun optional-packages-install ()
  134. (interactive)
  135. (apply 'ensure-package-installed optional-packages))
  136. ;; Activate installed packages
  137. (package-initialize)
  138. ;;; Evil
  139. ;; No C-i jump
  140. (setq evil-want-C-i-jump nil)
  141. ;; Evil tabs
  142. (global-evil-tabs-mode t)
  143. ;; Default to evil mode
  144. (evil-mode t)
  145. ;; Move all elements of evil-emacs-state-modes to evil-motion-state-modes
  146. (setq evil-motion-state-modes (append evil-emacs-state-modes evil-motion-state-modes))
  147. (setq evil-emacs-state-modes nil)
  148. ;; Delete info bindings for evil to take over
  149. (define-key Info-mode-map "g" nil)
  150. (define-key Info-mode-map "n" nil)
  151. (define-key Info-mode-map "p" nil)
  152. ;; Vim removing of windows
  153. (define-key evil-window-map (kbd "q") 'delete-window)
  154. (define-key evil-window-map (kbd "C-q") 'delete-window)
  155. ; Don't echo evil's states
  156. (setq evil-insert-state-message nil)
  157. (setq evil-visual-state-message nil)
  158. ;; Increment and decrement (evil-numbers)
  159. (define-key evil-insert-state-map (kbd "C-a") 'evil-numbers/inc-at-pt)
  160. (define-key evil-insert-state-map (kbd "C-d") 'evil-numbers/dec-at-pt)
  161. ;;; undo-tree
  162. ;; Save undo history under .emacs.d/undo
  163. (setq undo-tree-auto-save-history t
  164. undo-tree-history-directory-alist
  165. `(("." . ,(concat user-emacs-directory "undo"))))
  166. (unless (file-exists-p (concat user-emacs-directory "undo"))
  167. (make-directory (concat user-emacs-directory "undo")))
  168. ;;; Powerline
  169. (require 'powerline)
  170. (powerline-evil-center-color-theme)
  171. ;;; Recent Files
  172. (require 'recentf)
  173. (recentf-mode 1)
  174. (setq recentf-max-saved-items 200
  175. recentf-max-menu-items 15)
  176. ;;; Web mode
  177. ;; 2 spaces for an indent
  178. (defun my-web-mode-hook ()
  179. "Hooks for Web mode."
  180. (setq web-mode-markup-indent-offset 2)
  181. )
  182. (add-hook 'web-mode-hook 'my-web-mode-hook)
  183. ;; Auto-enable web-mode when opening relevent files
  184. (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))
  185. (add-to-list 'auto-mode-alist '("\\.hbs\\'" . web-mode))
  186. (add-to-list 'auto-mode-alist '("\\.handlebars\\'" . web-mode))
  187. ;;; Autocomplete
  188. ;(require 'auto-complete)
  189. ;
  190. ;;; start auto-complete
  191. ;(eval-and-compile
  192. ; (require 'auto-complete nil 'noerror))
  193. ;(ac-config-default)
  194. ;(setq ac-auto-start t)
  195. ;;
  196. ;(global-set-key (kbd "<backtab>") 'ac-previous)
  197. ;
  198. ;;; ac-html
  199. ;(setq web-mode-ac-sources-alist
  200. ; '(("css" . (ac-source-css-property))
  201. ; ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
  202. ;(ac-linum-workaround)
  203. ;
  204. ;(setq ac-auto-show-menu nil)
  205. ;;; Spelling
  206. ;; map ]s and [s to next and previously wrong word
  207. ;; move point to previous error
  208. ;; based on code by hatschipuh at
  209. ;; http://emacs.stackexchange.com/a/14912/2017
  210. (defun flyspell-goto-previous-error (arg)
  211. "Go to arg previous spelling error."
  212. (interactive "p")
  213. (while (not (= 0 arg))
  214. (let ((pos (point))
  215. (min (point-min)))
  216. (if (and (eq (current-buffer) flyspell-old-buffer-error)
  217. (eq pos flyspell-old-pos-error))
  218. (progn
  219. (if (= flyspell-old-pos-error min)
  220. ;; goto beginning of buffer
  221. (progn
  222. (message "Restarting from end of buffer")
  223. (goto-char (point-max)))
  224. (backward-word 1))
  225. (setq pos (point))))
  226. ;; seek the next error
  227. (while (and (> pos min)
  228. (let ((ovs (overlays-at pos))
  229. (r '()))
  230. (while (and (not r) (consp ovs))
  231. (if (flyspell-overlay-p (car ovs))
  232. (setq r t)
  233. (setq ovs (cdr ovs))))
  234. (not r)))
  235. (backward-word 1)
  236. (setq pos (point)))
  237. ;; save the current location for next invocation
  238. (setq arg (1- arg))
  239. (setq flyspell-old-pos-error pos)
  240. (setq flyspell-old-buffer-error (current-buffer))
  241. (goto-char pos)
  242. (if (= pos min)
  243. (progn
  244. (message "No more miss-spelled word!")
  245. (setq arg 0))
  246. ))))
  247. (define-key evil-normal-state-map (kbd "[s") 'flyspell-goto-previous-error)
  248. (define-key evil-normal-state-map (kbd "]s") 'flyspell-goto-next-error)
  249. ;;; Relative line numbers
  250. (require 'linum-relative)
  251. (setq linum-relative-current-symbol "")
  252. (linum-mode)
  253. (linum-relative-global-mode)
  254. ;;; flymd
  255. ; flymd.md and flymd.html are deleted upon markdown buffer killed
  256. (setq flymd-close-buffer-delete-temp-files t)
  257. ;;; evil-leader
  258. ;; Evil leader is Space
  259. (global-evil-leader-mode)
  260. (evil-leader/set-leader "<SPC>")
  261. ;; Leader keybinds
  262. (evil-leader/set-key
  263. "d" 'diff-buffer-with-file
  264. "b" 'buffer-menu
  265. ;"f" '(lambda () (interactive) (dired '"./"))
  266. "f" 'neotree-toggle
  267. "u" 'undo-tree-visualize
  268. "m" 'recentf-open-files
  269. "l" 'auto-fill-mode
  270. "s" '(lambda () (interactive) (if flyspell-mode (funcall 'flyspell-mode '0) (flyspell-mode) (flyspell-buffer)))
  271. ;"a" 'auto-complete-mode
  272. "a" 'company-mode
  273. "g" 'magit-status
  274. "M-g" 'magit-dispatch-popup
  275. )
  276. ;; Magit
  277. (require 'magit)
  278. (setq evil-magit-state 'normal)
  279. (require 'evil-magit)
  280. (global-magit-file-mode)
  281. ;; Neotree
  282. ; Set vi-like bindings in neotree-mode that don't conflict with evil
  283. (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
  284. (evil-define-key 'normal neotree-mode-map (kbd "SPC") 'neotree-enter)
  285. (evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
  286. (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter)
  287. (evil-define-key 'normal neotree-mode-map (kbd "h") 'neotree-hidden-file-toggle)
  288. ;Every time when the neotree window is opened, let it find current file and jump to node.
  289. (setq neo-smart-open t)
  290. ;; tide/typescript
  291. (setq typescript-indent-level 2)
  292. ;; JavaScript
  293. (setq js-indent-level 2)
  294. ;; geiser
  295. (add-to-list 'auto-mode-alist '("\\.scm\\'" . scheme-mode))
  296. (setq geiser-scheme-implementation 'racket)
  297. ;; editorconfig
  298. (editorconfig-mode 1)
  299. ;;helm
  300. ;; (require 'helm-config)
  301. ;;
  302. ;; (global-set-key (kbd "M-x") #'helm-M-x)
  303. ;; (global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks)
  304. ;; (global-set-key (kbd "C-x C-f") #'helm-find-files)
  305. ;;
  306. ;; (helm-mode 1)
  307. ;; (define-key helm-find-files-map "\t" 'helm-execute-persistent-action) ; make TAB run C-j's command.
  308. ;; ac-helm
  309. ;(require 'ac-helm) ;; Not necessary if using ELPA package
  310. ;;(global-set-key (kbd "C-:") 'ac-complete-with-helm)
  311. ;(define-key ac-complete-mode-map (kbd "<tab>") 'ac-complete-with-helm)
  312. ;; ivy
  313. (require 'ivy)
  314. (ivy-mode)
  315. ;; company
  316. (require 'company)
  317. ;;;; System-specific configs
  318. (defun win-setup ()
  319. (add-to-list 'exec-path "C:/Program Files (x86)/Aspell/bin/")
  320. (setq ispell-program-name "aspell")
  321. (defun cmd ()
  322. (interactive)
  323. (make-comint-in-buffer "cmd" nil "cmd" nil)
  324. (switch-to-buffer "*cmd*")))
  325. (defun linux-setup ())
  326. (cond ((eq system-type 'windows-nt) (win-setup))
  327. ((eq system-type 'gnu/linux) (linux-setup))
  328. (t (message "")))
  329. ;;;; Custom
  330. (defconst custom-file (expand-file-name "custom.el" user-emacs-directory))
  331. ;; if no custom file exists, write a default one
  332. (unless (file-exists-p custom-file)
  333. (write-region "(custom-set-faces
  334. ;; custom-set-faces was added by Custom.
  335. ;; If you edit it by hand, you could mess it up, so be careful.
  336. ;; Your init file should contain only one such instance.
  337. ;; If there is more than one, they won't work right.
  338. '(powerline-evil-normal-face ((t (:background \"#859900\")))))
  339. (custom-set-variables
  340. ;; custom-set-variables was added by Custom.
  341. ;; If you edit it by hand, you could mess it up, so be careful.
  342. ;; Your init file should contain only one such instance.
  343. ;; If there is more than one, they won't work right.
  344. '(custom-enabled-themes (quote (monokai)))
  345. '(custom-safe-themes
  346. (quote
  347. (\"c7a9a68bd07e38620a5508fef62ec079d274475c8f92d75ed0c33c45fbe306bc\" default))))
  348. " nil custom-file))
  349. (load custom-file)