init.el 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. ;; Requires:
  2. ;; aspell
  3. ;; Optional:
  4. ;; clang
  5. ;; ----------- Default Variables -----------
  6. ;; Global variables
  7. (defvar backup-directory (concat user-emacs-directory "backups"))
  8. (unless (file-exists-p backup-directory)
  9. (make-directory backup-directory))
  10. (setq-default inhibit-startup-screen t
  11. column-number-mode t
  12. scroll-error-top-bottom t
  13. show-paren-delay 0.25
  14. tab-width 4
  15. indent-tabs-mode nil
  16. ;x-select-enable-clipboard t
  17. ;interprogram-paste-function 'x-cut-buffer-or-selection-value
  18. backup-directory-alist `(("." . ,backup-directory))
  19. delete-old-versions t)
  20. ;; (global-linum-mode)
  21. ;; Delete selected text when typing (normal editor behavior)
  22. (delete-selection-mode t)
  23. ;; ------------- Keybindings -------------
  24. (defun smart-beginning-of-line ()
  25. "Move point to first non-whitespace character or beginning-of-line.
  26. Move point to the first non-whitespace character on this line.
  27. If point was already at that position, move point to beginning of line."
  28. (interactive "^")
  29. ;(if (version< "22" emacs-version) (interactive "^") (interactive))
  30. (let ((oldpos (point)))
  31. (beginning-of-line-text); goes to first significant character
  32. ;(back-to-indentation); goes to first non-whitespace
  33. (and (= oldpos (point))
  34. (beginning-of-line))))
  35. (global-set-key [home] 'smart-beginning-of-line)
  36. (global-set-key (kbd "C-c /") 'comment-or-uncomment-region)
  37. (global-set-key (kbd "C-c C-k") 'compile)
  38. (global-set-key (kbd "M-<left>") 'backward-list)
  39. (global-set-key (kbd "M-<right>") 'forward-list)
  40. ;; TODO: See if can get working without smartparen lib.
  41. ;; Otherwise, switch to smartparen
  42. ;;(global-set-key (kbd "M-<up>") 'sp-up-sexp)
  43. ;;(global-set-key (kbd "M-<down>") 'sp-down-sexp)
  44. (global-set-key (kbd "M-<delete>") 'kill-sexp)
  45. ;; ----------- Package Managing -----------
  46. ;; The package manager
  47. (require 'package)
  48. ;; Add package sources
  49. (setq package-archives
  50. '(("gnu" . "https://elpa.gnu.org/packages/")
  51. ("org" . "https://orgmode.org/elpa/")
  52. ("melpa" . "https://melpa.org/packages/")
  53. ("melpa-stable" . "https://stable.melpa.org/packages/"))
  54. package-archive-priorities '(("melpa" . 1)))
  55. (package-initialize)
  56. (unless (package-installed-p 'use-package)
  57. (package-refresh-contents)
  58. (package-install 'use-package))
  59. (require 'use-package)
  60. (setq use-package-always-ensure t)
  61. ;; ---------- Color Themes ----------
  62. ;; TODO: Fix warning underline to always be orange/yellow
  63. (use-package color-theme
  64. :init
  65. ;; TODO: Fixes error about missing directory. Don't know why.
  66. ;(unless (file-exists-p "~/.emacs.d/elpa/color-theme-20070910.1007/themes")
  67. ; (make-directory "~/.emacs.d/elpa/color-theme-20070910.1007/themes"))
  68. :config
  69. (color-theme-initialize)
  70. (load-theme 'Thomas-Experiement t))
  71. ;; ---------- Use X11 clipboard -----------
  72. ;; TODO: Bug. Copy to xclip doesn't work. Paste from does.
  73. (use-package xclip
  74. :if (executable-find "xclip")
  75. ;;:config (xclip-mode 1)
  76. )
  77. ;; --------- Parentheses Matching ---------
  78. (show-paren-mode)
  79. (use-package highlight-parentheses
  80. :config
  81. (define-globalized-minor-mode global-highlight-parentheses-mode
  82. highlight-parentheses-mode
  83. (lambda ()
  84. (highlight-parentheses-mode t)))
  85. (global-highlight-parentheses-mode t))
  86. (use-package autopair
  87. :config
  88. (autopair-global-mode))
  89. ;; ------------ xTerm Mouse ------------
  90. ;; Disable because it became annoying, sounds cool though.
  91. (use-package mouse
  92. :disabled
  93. :config
  94. (xterm-mouse-mode t))
  95. ;; ----------- Ensime -----------
  96. ;; Java/Scala featues. Includes:
  97. ;; * Inferred types
  98. ;; * Autocomplete
  99. ;; * Syntax highlighting
  100. ;; * Jump to source/docs
  101. ;; * Refactoring
  102. ;; * Error detection
  103. (use-package scala-mode
  104. ;; TODO: Disabled. Forgot why (Maybe redundant?). Figure out later.
  105. :disabled
  106. :commands (scala-mode))
  107. (use-package company)
  108. (when (version<= "24.4" emacs-version)
  109. (use-package ensime
  110. :requires company
  111. :hook (scala-mode java-mode)
  112. :pin melpa-stable
  113. :config
  114. (setq ensime-startup-notification nil)
  115. (eval-after-load 'ensime-mode
  116. '(define-key ensime-mode-map (kbd "C-c i")
  117. (lambda () "Generate ensime.sbt file"
  118. (interactive)
  119. (write-region "ensimeScalaVersion in ThisBuild := \"2.11.8\""
  120. nil (concat (read-directory-name "SBT Root:") "ensime.sbt")))))))
  121. ;; --------- C Syntax checker ---------
  122. ;; TODO: C autocomplete. Both with clang integration and backup naive method
  123. ;; (use-package irony
  124. ;; ;;:hook (c-mode c++-mode objc-mode)
  125. ;; :init
  126. ;; (add-hook 'c++-mode-hook 'irony-mode)
  127. ;; (add-hook 'c-mode-hook 'irony-mode)
  128. ;; (add-hook 'objc-mode-hook 'irony-mode)
  129. ;; :commands (irony-mode irony-version)
  130. ;; :config
  131. ;; (defun my-irony-mode-hook ()
  132. ;; (define-key irony-mode-map [remap completion-at-point]
  133. ;; 'irony-completion-at-point-async)
  134. ;; (define-key irony-mode-map [remap complete-symbol]
  135. ;; 'irony-completion-at-point-async))
  136. ;; (add-hook 'irony-mode-hook 'my-irony-mode-hook)
  137. ;; (add-hook 'irony-mode-hook irony-cdb-autosetup-compile-options)
  138. ;; )
  139. ;; (use-package company
  140. ;; :init (add-hook 'after-init-hook 'global-company-mode)
  141. ;; :config
  142. ;; (setq company-idle-delay nil
  143. ;; company-minimum-prefix-length 2
  144. ;; company-show-numbers t
  145. ;; company-tooltip-limit 20
  146. ;; company-dabbrev-downcase nil
  147. ;; company-backends '((company-irony company-gtags))
  148. ;; )
  149. ;; :bind ("C-;" . company-complete-common)
  150. ;; )
  151. ;; (use-package company-irony
  152. ;; :requires company)
  153. ;; (use-package flycheck-irony
  154. ;; :hook c-mode)
  155. ;; ; :mode ("\\.c\\'" "\\.h\\'")
  156. ;; ------------ Web Mode ------------
  157. ;; TODO: Automatic closing tag would be nice
  158. (defun my-sgml-insert-gt ()
  159. "Inserts a `>' character and calls
  160. `my-sgml-close-tag-if-necessary', leaving point where it is."
  161. (interactive)
  162. (insert ">")
  163. (save-excursion (my-sgml-close-tag-if-necessary)))
  164. (defun my-sgml-close-tag-if-necessary ()
  165. "Calls sgml-close-tag if the tag immediately before point is
  166. an opening tag that is not followed by a matching closing tag."
  167. (when (looking-back "<\\s-*\\([^</> \t\r\n]+\\)[^</>]*>")
  168. (let ((tag (match-string 1)))
  169. (unless (and (not (sgml-unclosed-tag-p tag))
  170. (looking-at (concat "\\s-*<\\s-*/\\s-*" tag "\\s-*>")))
  171. (sgml-close-tag)))))
  172. (use-package multi-web-mode
  173. :init
  174. (setq mweb-default-major-mode 'html-mode
  175. mweb-tags '((php-mode "<\\?php\\|<\\? \\|<\\?=" "\\?>")
  176. (js-mode "<script[^>]*>" "</script>")
  177. (css-mode "<style[^>]*>" "</style>"))
  178. mweb-filename-extensions '("php" "htm" "html" "ctp" "phtml" "php4" "php5"))
  179. :config
  180. (multi-web-global-mode 1)
  181. (eval-after-load "sgml-mode"
  182. '(define-key sgml-mode-map ">" 'my-sgml-insert-gt)))
  183. ;; ------------ Git Mode ------------
  184. ;; TODO: make resolving merge conflicts hotkeys not use "^"
  185. ;; TODO: Conflict resolution theme is unreadable
  186. (when (version<= "24.4" emacs-version)
  187. (use-package magit
  188. :bind ("C-x g" . magit-status)))
  189. ;; ----------- Rust Mode ------------
  190. (use-package rust-mode)
  191. (use-package rust-playground
  192. :requires rust-mode)
  193. (use-package cargo
  194. :after rust-mode)
  195. (use-package flycheck-rust
  196. :after rust-mode)
  197. ;; ----------- i3 Support ----------
  198. (use-package i3wm
  199. :disabled
  200. :if (equal (getenv "DESKTOP_SESSION") "i3"))
  201. ;; --------- Racket Mode ----------
  202. (use-package racket-mode)
  203. ;; ---------- C# Mode -------------
  204. (use-package csharp-mode
  205. :disabled ;; TODO: Disabled because compiler warnings with newest version
  206. :if (version<= "24.4" emacs-version))
  207. ;; ------- Markdown Mode ----------
  208. (when (version<= "24.4" emacs-version)
  209. (use-package markdown-mode))
  210. ;; ---- StackOverflow Client ------
  211. (use-package sx
  212. ;; TODO: I don't even know if this works. Doesn't seem well maintained
  213. :disabled)
  214. ;; -------- Spellcheck ------------
  215. (defun flyspell-detect-ispell-args (&optional run-together)
  216. (cond ((string-match "aspell$" ispell-program-name)
  217. (append (list "--sug-mode=ultra" "--lang=en_US")
  218. (if run-together '("--run-together" "--run-together-limit=5" "--run-together-min=2"))))
  219. ((string-match "hunspell$" ispell-program-name)
  220. "-d en_US")))
  221. (use-package flyspell-correct-popup
  222. :bind ("M-s" . ispell-word)
  223. :hook ((text-mode . flyspell-mode)
  224. (prog-mode . flyspell-prog-mode)
  225. ((flyspell-mode flyspell-prog-mode) . flyspell-buffer))
  226. :config
  227. (cond
  228. ((executable-find "aspell")
  229. (setq ispell-program-name "aspell"))
  230. ((executable-find "hunspell")
  231. (setq ispell-program-name "hunspell")
  232. (setq ispell-local-dictionary "en_US")
  233. (setq ispell-local-dictionary-alist
  234. '(("en_US" "[[:alpha:]]" "[^[:alpha:]]" "[']" nil ("-d" "en_US") nil utf-8))))
  235. (t
  236. (setq ispell-program-name nil)))
  237. (setq-default ispell-extra-args (flyspell-detect-ispell-args t))
  238. (setq-default flyspell-issue-message-flag nil))
  239. ;; -------- REST Client ---------
  240. (use-package restclient
  241. :commands (restclient-copy-curl-command
  242. restclient-http-send-current
  243. restclient-http-send-current-raw
  244. restclient-http-send-current-stay-in-window
  245. restclient-jump-next
  246. restclient-jump-prev
  247. restclient-mark-current
  248. restclient-mode
  249. restclient-narrow-to-current
  250. restclient-outline-mode
  251. restclient-toggle-body-visibility
  252. restclient-toggle-body-visibility-or-indent))
  253. ;; ------- Highlight TODO -------
  254. (use-package hl-todo
  255. :commands (hl-todo-mode
  256. hl-todo-next
  257. hl-todo-occur
  258. hl-todo-previous)
  259. :hook (prog-mode . hl-todo-mode))
  260. ;; ---- Printer Integration -----
  261. (use-package printing
  262. :bind ("M-p" . print-buffer)
  263. :commands (print-buffer
  264. print-region
  265. lpr-buffer
  266. lpr-customize
  267. lpr-region)
  268. :config
  269. (pr-update-menus t))