emacs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. ;; TODO:
  2. ;; Easier undo tree traversal
  3. ;; Replace evil-leader with general
  4. ;;;; Startup
  5. (setq initial-scratch-message "")
  6. ;;;; Base
  7. ;; Disable beep & flash
  8. (setq ring-bell-function 'ignore)
  9. ;; Disable blinking cursor
  10. (blink-cursor-mode 0)
  11. ;; All yes or no prompts are y or n
  12. (defalias 'yes-or-no-p 'y-or-n-p)
  13. ;; Never follow symlinks
  14. (setq vc-follow-symlinks nil)
  15. ;;; Leave the OS clipboard alone (use evil's "+ and "* instead)
  16. ; Don't copy and paste to the clipboard
  17. (setq select-enable-clipboard nil)
  18. (setq x-select-enable-clipboard nil)
  19. ; Don't save to the clipboard on exit
  20. (setq x-select-enable-clipboard-manager nil)
  21. ;; Text and Notes
  22. (setq sentence-end-double-space nil)
  23. ;; Save minibar history
  24. (savehist-mode 1)
  25. (setq savehist-additional-variables '(kill-ring search-ring regexp-search-ring))
  26. ;; Auto-enable elisp when opening .emacs in dotfiles (without the .)
  27. (add-to-list 'auto-mode-alist '("emacs" . emacs-lisp-mode))
  28. ;; Start in text-mode
  29. (setq initial-major-mode 'text-mode)
  30. ;; Always show matching parens
  31. (show-paren-mode t)
  32. ;; Backups (from https://stackoverflow.com/questions/151945/how-do-i-control-how-emacs-makes-backup-files/20824625#20824625)
  33. (setq version-control t ;; Use version numbers for backups.
  34. kept-new-versions 10 ;; Number of newest versions to keep.
  35. kept-old-versions 0 ;; Number of oldest versions to keep.
  36. delete-old-versions t ;; Don't ask to delete excess backup versions.
  37. backup-by-copying t) ;; Copy all files, don't rename them.
  38. (setq vc-make-backup-files t) ;; Backup versioned files
  39. ;; Default and per-save backups go here:
  40. (setq backup-directory-alist '(("" . "~/.emacs.d/backups/per-save")))
  41. (defun force-backup-of-buffer ()
  42. ;; Make a special "per session" backup at the first save of each
  43. ;; emacs session.
  44. (when (not buffer-backed-up)
  45. ;; Override the default parameters for per-session backups.
  46. (let ((backup-directory-alist '(("" . "~/.emacs.d/backups/per-session")))
  47. (kept-new-versions 3))
  48. (backup-buffer)))
  49. ;; Make a "per save" backup on each save. The first save results in
  50. ;; both a per-session and a per-save backup, to keep the numbering
  51. ;; of per-save backups consistent.
  52. (let ((buffer-backed-up nil))
  53. (backup-buffer)))
  54. (add-hook 'before-save-hook 'force-backup-of-buffer)
  55. ;; Autosave files
  56. (setq auto-save-file-name-transforms
  57. `((".*" , "~/.emacs.d/backups/auto-saves" t)))
  58. ;; Disable toolbar
  59. (when (display-graphic-p)
  60. (tool-bar-mode -1)
  61. )
  62. ;; Save session including tabs
  63. ;; http://stackoverflow.com/questions/22445670/save-and-restore-elscreen-tabs-and-split-frames
  64. (defun session-save ()
  65. "Store the elscreen tab configuration."
  66. (interactive)
  67. (if (desktop-save user-emacs-directory)
  68. (with-temp-file (concat user-emacs-directory ".elscreen")
  69. (insert (prin1-to-string (elscreen-get-screen-to-name-alist))))))
  70. ;; Load session including tabs
  71. (defun session-load ()
  72. "Restore the elscreen tab configuration."
  73. (interactive)
  74. (if (desktop-read)
  75. (let ((screens (reverse
  76. (read
  77. (with-temp-buffer
  78. (insert-file-contents (concat user-emacs-directory ".elscreen"))
  79. (buffer-string))))))
  80. (while screens
  81. (setq screen (car (car screens)))
  82. (setq buffers (split-string (cdr (car screens)) ":"))
  83. (if (eq screen 0)
  84. (switch-to-buffer (car buffers))
  85. (elscreen-find-and-goto-by-buffer (car buffers) t t))
  86. (while (cdr buffers)
  87. (switch-to-buffer-other-window (car (cdr buffers)))
  88. (setq buffers (cdr buffers)))
  89. (setq screens (cdr screens))))))
  90. ;; smoother scrolling
  91. (setq scroll-margin 0
  92. scroll-conservatively 9999
  93. scroll-step 1)
  94. ;; remember cursor position
  95. (toggle-save-place-globally)
  96. ;;;; Packages
  97. ;; Package installation
  98. (require 'package)
  99. (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/"))
  100. (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/"))
  101. (add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/"))
  102. (setq package-enable-at-startup nil)
  103. (package-initialize)
  104. ;; Keep track of whether or not we need to refresh package contents
  105. (setq packages-installed-this-session 0)
  106. ;; Function to ensure every package in installed, and ask if it isn't.
  107. (defun ensure-package-installed (&rest packages)
  108. (mapcar
  109. (lambda (package)
  110. (if (package-installed-p package)
  111. nil
  112. (if (y-or-n-p (format "Package %s is missing. Install it? " package))
  113. ;; If this is the 1st install this session, update before install
  114. (cond ((eq packages-installed-this-session 0)
  115. (package-refresh-contents)
  116. (setq packages-installed-this-session 1)
  117. (package-install package))
  118. (t (package-install package))
  119. nil)
  120. package)))
  121. packages))
  122. ;; List of packages to install on all systems
  123. (setq required-packages
  124. '(
  125. iedit
  126. magit
  127. evil-magit
  128. magithub
  129. ;undo-tree
  130. evil
  131. evil-leader
  132. evil-tabs
  133. powerline-evil
  134. monokai-theme
  135. challenger-deep-theme
  136. ;auto-complete
  137. linum-relative
  138. multi-term
  139. neotree
  140. evil-numbers
  141. editorconfig
  142. company
  143. ;helm
  144. ivy
  145. flx
  146. flycheck
  147. flycheck-pos-tip
  148. evil-surround
  149. diminish
  150. dtrt-indent
  151. undohist
  152. ))
  153. ;; List of optional packages
  154. (setq optional-packages
  155. '(
  156. flymd
  157. markdown-mode
  158. latex-preview-pane
  159. tide
  160. web-mode
  161. ;ac-html
  162. racket-mode
  163. fuzzy
  164. general))
  165. ;; Check that all packages are installed
  166. (apply 'ensure-package-installed required-packages)
  167. ;; Declare function for optional packages
  168. (defun optional-packages-install ()
  169. (interactive)
  170. (apply 'ensure-package-installed optional-packages))
  171. ;; Activate installed packages
  172. (package-initialize)
  173. ;;; Evil
  174. ;; No C-i jump
  175. (setq evil-want-C-i-jump nil)
  176. ;; Evil tabs
  177. (global-evil-tabs-mode t)
  178. ;; Default to evil mode
  179. (evil-mode t)
  180. ;; Move all elements of evil-emacs-state-modes to evil-motion-state-modes
  181. (setq evil-motion-state-modes (append evil-emacs-state-modes evil-motion-state-modes))
  182. (setq evil-emacs-state-modes (list 'magit-popup-mode))
  183. (delete 'magit-popup-mode evil-motion-state-modes)
  184. ;; Delete info bindings for evil to take over
  185. (define-key Info-mode-map "g" nil)
  186. (define-key Info-mode-map "n" nil)
  187. (define-key Info-mode-map "p" nil)
  188. ;; Vim removing of windows
  189. (define-key evil-window-map (kbd "q") 'delete-window)
  190. (define-key evil-window-map (kbd "C-q") 'delete-window)
  191. ; Don't echo evil's states
  192. (setq evil-insert-state-message nil)
  193. (setq evil-visual-state-message nil)
  194. ;; Increment and decrement (evil-numbers)
  195. (define-key evil-insert-state-map (kbd "C-a") 'evil-numbers/inc-at-pt)
  196. (define-key evil-insert-state-map (kbd "C-d") 'evil-numbers/dec-at-pt)
  197. ;; scroll left and right with zs and ze
  198. (defun hscroll-cursor-left ()
  199. (interactive "@")
  200. (set-window-hscroll (selected-window) (current-column)))
  201. (defun hscroll-cursor-right ()
  202. (interactive "@")
  203. (set-window-hscroll (selected-window) (- (current-column) (window-width) -1)))
  204. (define-key evil-normal-state-map "zs" 'hscroll-cursor-left)
  205. (define-key evil-normal-state-map "ze" 'hscroll-cursor-right)
  206. ;; eval the last sexp while in normal mode (include the character the cursor is currently on)
  207. (defun evil-eval-last-sexp ()
  208. (interactive)
  209. (evil-append 1)
  210. (eval-last-sexp nil)
  211. (evil-normal-state))
  212. (define-key evil-normal-state-map "\C-x \C-e" 'evil-eval-last-sexp)
  213. (setq auto-hscroll-mode 't)
  214. (setq hscroll-margin 0
  215. hscroll-step 1)
  216. ;;; undo-tree
  217. ;; ;; Save undo history under .emacs.d/undo
  218. ;; (setq undo-tree-auto-save-history t
  219. ;; undo-tree-history-directory-alist
  220. ;; `(("." . ,(concat user-emacs-directory "undo"))))
  221. ;; (unless (file-exists-p (concat user-emacs-directory "undo"))
  222. ;; (make-directory (concat user-emacs-directory "undo")))
  223. ;; undohist
  224. (require 'undohist)
  225. ;; ;; Save undo history under .emacs.d/undohist
  226. (setq undohist-directory "~/.emacs.d/undohist")
  227. (unless (file-exists-p "~/.emacs.d/undohist")
  228. (make-directory "~/.emacs.d/undohist"))
  229. (undohist-initialize)
  230. ;;; Powerline
  231. (require 'powerline)
  232. (powerline-evil-vim-color-theme)
  233. ;;; Recent Files
  234. (require 'recentf)
  235. (recentf-mode 1)
  236. (setq recentf-max-saved-items 200
  237. recentf-max-menu-items 15)
  238. ;;; Web mode
  239. ;; 2 spaces for an indent
  240. (defun my-web-mode-hook ()
  241. "Hooks for Web mode."
  242. (setq web-mode-markup-indent-offset 2)
  243. )
  244. (add-hook 'web-mode-hook 'my-web-mode-hook)
  245. ;; Auto-enable web-mode when opening relevent files
  246. (add-to-list 'auto-mode-alist '("\\.html\\'" . web-mode))
  247. (add-to-list 'auto-mode-alist '("\\.hbs\\'" . web-mode))
  248. (add-to-list 'auto-mode-alist '("\\.handlebars\\'" . web-mode))
  249. ;;; Autocomplete
  250. ;(require 'auto-complete)
  251. ;
  252. ;;; start auto-complete
  253. ;(eval-and-compile
  254. ; (require 'auto-complete nil 'noerror))
  255. ;(ac-config-default)
  256. ;(setq ac-auto-start t)
  257. ;;
  258. ;(global-set-key (kbd "<backtab>") 'ac-previous)
  259. ;
  260. ;;; ac-html
  261. ;(setq web-mode-ac-sources-alist
  262. ; '(("css" . (ac-source-css-property))
  263. ; ("html" . (ac-source-words-in-buffer ac-source-abbrev))))
  264. ;(ac-linum-workaround)
  265. ;
  266. ;(setq ac-auto-show-menu nil)
  267. ;;; Spelling
  268. ;; map ]s and [s to next and previously wrong word
  269. ;; move point to previous error
  270. ;; based on code by hatschipuh at
  271. ;; http://emacs.stackexchange.com/a/14912/2017
  272. (defun flyspell-goto-previous-error (arg)
  273. "Go to arg previous spelling error."
  274. (interactive "p")
  275. (while (not (= 0 arg))
  276. (let ((pos (point))
  277. (min (point-min)))
  278. (if (and (eq (current-buffer) flyspell-old-buffer-error)
  279. (eq pos flyspell-old-pos-error))
  280. (progn
  281. (if (= flyspell-old-pos-error min)
  282. ;; goto beginning of buffer
  283. (progn
  284. (message "Restarting from end of buffer")
  285. (goto-char (point-max)))
  286. (backward-word 1))
  287. (setq pos (point))))
  288. ;; seek the next error
  289. (while (and (> pos min)
  290. (let ((ovs (overlays-at pos))
  291. (r '()))
  292. (while (and (not r) (consp ovs))
  293. (if (flyspell-overlay-p (car ovs))
  294. (setq r t)
  295. (setq ovs (cdr ovs))))
  296. (not r)))
  297. (backward-word 1)
  298. (setq pos (point)))
  299. ;; save the current location for next invocation
  300. (setq arg (1- arg))
  301. (setq flyspell-old-pos-error pos)
  302. (setq flyspell-old-buffer-error (current-buffer))
  303. (goto-char pos)
  304. (if (= pos min)
  305. (progn
  306. (message "No more miss-spelled word!")
  307. (setq arg 0))
  308. ))))
  309. (define-key evil-normal-state-map (kbd "[s") 'flyspell-goto-previous-error)
  310. (define-key evil-normal-state-map (kbd "]s") 'flyspell-goto-next-error)
  311. ;;; Relative line numbers
  312. (require 'linum-relative)
  313. (setq linum-relative-current-symbol "")
  314. (linum-mode)
  315. (linum-relative-global-mode)
  316. ;;; flymd
  317. ; flymd.md and flymd.html are deleted upon markdown buffer killed
  318. (setq flymd-close-buffer-delete-temp-files t)
  319. ;;; evil-leader
  320. ;; Evil leader is Space
  321. (global-evil-leader-mode)
  322. (evil-leader/set-leader "<SPC>")
  323. ;; Leader keybinds
  324. (evil-leader/set-key
  325. "d" 'diff-buffer-with-file
  326. "b" 'buffer-menu
  327. ;"f" '(lambda () (interactive) (dired '"./"))
  328. "f" 'neotree-toggle
  329. "u" 'undo-tree-visualize
  330. "m" 'recentf-open-files
  331. "l" 'auto-fill-mode
  332. "s" '(lambda ()
  333. (interactive)
  334. ;; use flyspell-mode when in text buffers, otherwise use flyspell-prog-mode
  335. (let* ((current-mode
  336. (buffer-local-value 'major-mode (current-buffer)))
  337. (flyspell-mode-to-call
  338. (if (or (string= current-mode "text-mode") (string= current-mode "markdown-mode"))
  339. 'flyspell-mode
  340. 'flyspell-prog-mode)))
  341. ;; toggle the current flyspell mode, and eval the buffer if we turned it on
  342. (if flyspell-mode
  343. (funcall 'flyspell-mode '0)
  344. (funcall flyspell-mode-to-call)
  345. (flyspell-buffer))))
  346. ;"a" 'auto-complete-mode
  347. "a" 'company-mode
  348. "g" 'magit-status
  349. "M-g" 'magit-dispatch-popup
  350. "c" 'flycheck-mode
  351. )
  352. ;; Magit
  353. (require 'magit)
  354. (require 'evil-magit)
  355. (setq evil-magit-state 'normal)
  356. (evil-magit-init)
  357. (global-magit-file-mode)
  358. (require 'magithub)
  359. (magithub-feature-autoinject t)
  360. ;; Neotree
  361. ; Set vi-like bindings in neotree-mode that don't conflict with evil
  362. (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
  363. (evil-define-key 'normal neotree-mode-map (kbd "SPC") 'neotree-enter)
  364. (evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
  365. (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter)
  366. (evil-define-key 'normal neotree-mode-map (kbd "h") 'neotree-hidden-file-toggle)
  367. (evil-define-key 'normal neotree-mode-map (kbd "r") 'neotree-refresh)
  368. ;Every time when the neotree window is opened, let it find current file and jump to node.
  369. (setq neo-smart-open t)
  370. ; List of files to hide
  371. (setq neo-hidden-regexp-list '("^\\." "\\.pyc$" "~$" "^#.*#$" "\\.elc$" "\\.class"))
  372. ;; tide/typescript
  373. (setq typescript-indent-level 2)
  374. ;; JavaScript
  375. (setq js-indent-level 2)
  376. ;; racket-mode
  377. (add-to-list 'auto-mode-alist '("\\.scm\\'" . racket-mode))
  378. ; C-w prefix in racket-REPL
  379. (add-hook 'racket-repl-mode-hook 'racket-repl-evil-hook)
  380. (defun racket-repl-evil-hook ()
  381. (define-key racket-repl-mode-map "\C-w" 'evil-window-map)
  382. (global-set-key (kbd "C-w") 'racket-repl-mode-map))
  383. ;; editorconfig
  384. (editorconfig-mode 1)
  385. ;;helm
  386. ;; (require 'helm-config)
  387. ;;
  388. ;; (global-set-key (kbd "M-x") #'helm-M-x)
  389. ;; (global-set-key (kbd "C-x r b") #'helm-filtered-bookmarks)
  390. ;; (global-set-key (kbd "C-x C-f") #'helm-find-files)
  391. ;;
  392. ;; (helm-mode 1)
  393. ;; (define-key helm-find-files-map "\t" 'helm-execute-persistent-action) ; make TAB run C-j's command.
  394. ;; ac-helm
  395. ;(require 'ac-helm) ;; Not necessary if using ELPA package
  396. ;;(global-set-key (kbd "C-:") 'ac-complete-with-helm)
  397. ;(define-key ac-complete-mode-map (kbd "<tab>") 'ac-complete-with-helm)
  398. ;; ivy
  399. (require 'ivy)
  400. (ivy-mode)
  401. ; fuzzy
  402. (setq ivy-re-builders-alist '((t . ivy--regex-fuzzy)))
  403. ;; company
  404. (require 'company)
  405. ;; flycheck
  406. (require 'flycheck)
  407. (add-hook 'after-init-hook #'global-flycheck-mode)
  408. (setq flycheck-check-syntax-automatically '(save mode-enabled))
  409. (setq flycheck-checkers (delq 'emacs-lisp-checkdoc flycheck-checkers))
  410. (setq flycheck-checkers (delq 'html-tidy flycheck-checkers))
  411. (setq flycheck-standard-error-navigation nil)
  412. (global-flycheck-mode t)
  413. ;; flycheck-pos-tip: flycheck errors on a tooltip
  414. (require 'flycheck-pos-tip)
  415. (with-eval-after-load 'flycheck
  416. (flycheck-pos-tip-mode))
  417. ;; evil-surround
  418. (require 'evil-surround)
  419. (global-evil-surround-mode 1)
  420. ;; auto-adjust to indentation
  421. (require 'dtrt-indent)
  422. (dtrt-indent-mode 1)
  423. ;; remove mode clutter from powerline
  424. ;; "after" macro definition
  425. (if (fboundp 'with-eval-after-load)
  426. (defmacro after (feature &rest body)
  427. "After FEATURE is loaded, evaluate BODY."
  428. (declare (indent defun))
  429. `(with-eval-after-load ,feature ,@body))
  430. (defmacro after (feature &rest body)
  431. "After FEATURE is loaded, evaluate BODY."
  432. (declare (indent defun))
  433. `(eval-after-load ,feature
  434. '(progn ,@body))))
  435. ;;;;org-mode configuration
  436. ;; Enable transient mark mode
  437. (transient-mark-mode 1)
  438. ;; Enable org-mode
  439. (require 'org)
  440. ;; auto-adjust to indentation
  441. (require 'dtrt-indent)
  442. (dtrt-indent-mode 1)
  443. (require 'diminish)
  444. (diminish 'visual-line-mode)
  445. (after 'undo-tree (diminish 'undo-tree-mode))
  446. (after 'company (diminish 'company-mode))
  447. (after 'magit (diminish 'magit-auto-revert-mode))
  448. (diminish 'ivy-mode)
  449. (diminish 'editorconfig-mode)
  450. (diminish 'linum-relative-mode)
  451. (diminish 'auto-revert-mode)
  452. (diminish 'flycheck-mode)
  453. (diminish 'abbrev-mode)
  454. (diminish 'dtrt-indent-mode)
  455. ;;;; System-specific configs
  456. (defun win-setup ()
  457. (add-to-list 'exec-path "C:/Program Files (x86)/Aspell/bin/")
  458. (setq ispell-program-name "aspell")
  459. (defun cmd ()
  460. (interactive)
  461. (make-comint-in-buffer "cmd" nil "cmd" nil)
  462. (switch-to-buffer "*cmd*")))
  463. (defun linux-setup ())
  464. (cond ((eq system-type 'windows-nt) (win-setup))
  465. ((eq system-type 'gnu/linux) (linux-setup))
  466. (t (message "")))
  467. ;;;; Custom
  468. (defconst custom-file (expand-file-name "custom.el" user-emacs-directory))
  469. ;; if no custom file exists, write a default one
  470. (unless (file-exists-p custom-file)
  471. (write-region "(custom-set-faces
  472. ;; custom-set-faces was added by Custom.
  473. ;; If you edit it by hand, you could mess it up, so be careful.
  474. ;; Your init file should contain only one such instance.
  475. ;; If there is more than one, they won't work right.
  476. '(powerline-evil-normal-face ((t (:background \"#859900\")))))
  477. (custom-set-variables
  478. ;; custom-set-variables was added by Custom.
  479. ;; If you edit it by hand, you could mess it up, so be careful.
  480. ;; Your init file should contain only one such instance.
  481. ;; If there is more than one, they won't work right.
  482. '(custom-enabled-themes (quote (monokai)))
  483. '(custom-safe-themes
  484. (quote
  485. (\"c7a9a68bd07e38620a5508fef62ec079d274475c8f92d75ed0c33c45fbe306bc\" default))))
  486. " nil custom-file))
  487. (load custom-file)