;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; use-package setup ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'package) (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) (package-initialize) ;; Setup use-package to manage dependencies. (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (eval-when-compile (require 'use-package)) (use-package diminish :ensure t) (use-package bind-key :ensure t) (require 'diminish) (require 'bind-key) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Customize Variables & Faces ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(bmkp-last-as-first-bookmark-file "~/.emacs.d/bookmarks") '(cider-annotate-completion-candidates t t) '(cider-boot-parameters "cider.tasks/nrepl-server -b localhost wait" t) '(cider-debug-display-locals t t) '(cider-repl-use-pretty-printing t t) '(company-auto-complete-chars (quote (41 46))) '(company-idle-delay 0.2) '(company-minimum-prefix-length 3) '(company-quickhelp-color-background "#404040") '(company-quickhelp-color-foreground "white") '(company-quickhelp-delay 0.2) '(company-quickhelp-mode t) '(company-quickhelp-use-propertized-text t) '(company-selection-wrap-around t) '(company-show-numbers t) '(company-tooltip-align-annotations t) '(company-tooltip-maximum-width 100) '(custom-safe-themes (quote ("dcbe22bc74153257f412183dd14ab9652197f59adf65646e618c2577e7cca34d" "38ba6a938d67a452aeb1dada9d7cdeca4d9f18114e9fc8ed2b972573138d4664" "71ecffba18621354a1be303687f33b84788e13f40141580fa81e7840752d31bf" "561ba4316ba42fe75bc07a907647caa55fc883749ee4f8f280a29516525fc9e8" default))) '(highline-priority 1) '(js-indent-level 2) '(lsp-auto-guess-root t) '(lsp-rust-clippy-preference "on") '(lsp-rust-unstable-features t) '(lsp-ui-doc-border "#404040") '(lsp-ui-doc-header t) '(lsp-ui-doc-use-webkit nil nil nil "Customized with use-package lsp-ui") '(lsp-ui-flycheck-enable t) '(lsp-ui-peek-always-show t) '(lsp-ui-peek-enable t) '(lsp-ui-peek-fontify (quote on-demand)) '(lsp-ui-sideline-delay 0.5) '(lsp-ui-sideline-ignore-duplicates t t) '(markdown-command "marked") '(markdown-preview-style "https://cdn.rawgit.com/joshuafcole/github-markdown-css/0694d90c73626ebf066307d6d58d0359c9cd992f/github-markdown.css" t) '(package-selected-packages (quote (diff-hl diff-hl-mode cyberpunk-2019-theme company-web typescript-mode clojure-mode flycheck rainbow-delimiters company-quickhelp ido-completing-read+ dap-rust dap-mode company-lsp lsp-ui lsp-mode ess ess-R-data-view flycheck-julia julia-repl julia-shell julia-mode yasnippet prettier prettier-js auto-sudoedit ibuffer-tramp tramp-term flycheck-kotlin kotlin-mode cider cider-eval-sexp-fu default-text-scale company-glsl glsl-mode protobuf-mode mocha json-mode json-navigator company-flow flow-minor-mode sws-mode stylus-mode rainbow-mode powershell yaml-mode web-mode flycheck-package package-lint poly-mode polymode use-package pcre2el cargo flycheck-rust rust-mode multiple-cursors ham-mode markdown-mode+ cyberpunk-theme leuven-theme tide smex paredit nixos-options nix-mode magit ido-ubiquitous highline company better-defaults))) '(rainbow-delimiters-max-face-count 4) '(safe-local-variable-values (quote ((org-emphasis-alist ("*" bold) ("/" italic) ("_" underline) ("=" org-verbatim verbatim) ("~" org-code verbatim)) (org-emphasis-alist ("*" bold) ("/" italic) ("_" underline) ("=" org-verbatim verbatim) ("~" org-code verbatim) ("+" (:strike-through nil)))))) '(typescript-indent-level 2)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(border ((t (:background "#202020")))) '(company-preview ((t (:background "black" :foreground "#8899aa" :box (:line-width 1 :color "#88ccff"))))) '(company-preview-common ((t (:background "black" :foreground "#8899aa")))) '(company-scrollbar-bg ((t (:background "black")))) '(company-scrollbar-fg ((t (:background "gray")))) '(company-tooltip ((t (:background "#303030" :foreground "white")))) '(company-tooltip-annotation ((t (:inherit company-tooltip :foreground "#aabbcc")))) '(company-tooltip-annotation-selection ((t (:inherit company-tooltip-annotation :background "#404040")))) '(company-tooltip-common ((t (:inherit company-tooltip :foreground "#66eeff")))) '(company-tooltip-common-selection ((t (:inherit company-tooltip-selection :foreground "#44eeff")))) '(company-tooltip-selection ((t (:inherit company-tooltip :background "#404040" :foreground "white")))) '(flycheck-warning ((t (:underline (:color "orange" :style wave))))) '(flymake-error ((t (:background "#200000" :foreground "#ffdddd" :underline nil :weight normal)))) '(flymake-warning ((t (:background "#202000" :foreground "#fff9bb" :underline nil :weight normal)))) '(fringe ((t (:background "#202020" :foreground "#dcdccc")))) '(highlight-blocks-depth-1-face ((t (:background "#080808")))) '(highlight-blocks-depth-2-face ((t (:background "#121212")))) '(highline-face ((t (:background "#1a1a1a")))) '(line-number ((t (:inherit (shadow default) :background "#292929")))) '(line-number-current-line ((t (:inherit line-number :foreground "#88ccff")))) '(link ((t (:foreground "#00ddee" :underline t :weight bold)))) '(lsp-ui-doc-header ((t (:background "#404040" :foreground "white" :weight semi-bold)))) '(lsp-ui-sideline-code-action ((t (:foreground "#00ddee")))) '(markdown-code-face ((t (:inherit consolas)))) '(rainbow-delimiters-depth-1-face ((t (:foreground "#00b8f1")))) '(rainbow-delimiters-depth-2-face ((t (:foreground "#6b67ad")))) '(rainbow-delimiters-depth-3-face ((t (:foreground "#009ee0")))) '(rainbow-delimiters-depth-4-face ((t (:foreground "#5b59a4")))) '(region ((t (:background "#203039"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Basic configuration ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;(set-face-attribute 'default nil :family "Source Code Pro for Powerline") (set-face-attribute 'default nil :family "Iosevka Term") (set-fontset-font t 'unicode "Ubuntu" nil 'prepend) (prefer-coding-system 'utf-8) (setq coding-system-for-read 'utf-8) (setq coding-system-for-write 'utf-8) (delete-selection-mode) ; Overwrite selection on paste (setq x-select-enable-clipboard t) ; Clipboard integration (setq yank-pop-change-selection t) ; Clipboard integration (xterm-mouse-mode t) ; Enable mouse (setq time-stamp-pattern nil) (setq time-stamp-time-zone "PST") (setq column-number-mode t) (if (fboundp 'global-display-line-numbers-mode) (global-display-line-numbers-mode 1) (global-linum-mode t)) (desktop-save-mode t) ;; OS X Bug Fixes (setq visible-bell nil) (add-hook 'before-save-hook 'whitespace-cleanup) ;; @TODO: Switch to creating a map. (require 'subword) (global-set-key (kbd "M-f") 'subword-forward) (global-set-key (kbd "M-b") 'subword-backward) (global-set-key (kbd "M-") 'subword-left) (global-set-key (kbd "M-") 'subword-right) (global-set-key (kbd "C-S-f") 'forward-word) (global-set-key (kbd "C-S-b") 'backward-word) (global-set-key (kbd "C-S-") 'left-word) (global-set-key (kbd "C-S-") 'right-word) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Theme ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun select-color-scheme (scheme) (let ((chrome-background (if (equal scheme "light") "#ececec" "#2c2c2c")) (theme (if (equal scheme "light") 'leuven 'cyberpunk))) ;; (set-face-background 'highline-face chrome-background) ;; (set-face-background 'linum chrome-background) ;; (set-face-background 'fringe chrome-background) (load-theme theme t))) (add-hook 'after-init-hook (lambda () (select-color-scheme "dark"))) ;; (select-color-scheme "light") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; iBuffer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (eval-after-load "ibuf-ext" '(define-ibuffer-filter filename "Toggle current view to buffers with file or directory name matching QUALIFIER." (:description "filename" :reader (read-from-minibuffer "Filter by file/directory name (regexp): ")) (ibuffer-awhen (or (buffer-local-value 'buffer-file-name buf) (buffer-local-value 'dired-directory buf)) (string-match qualifier it)))) (setq ibuffer-saved-filter-groups '(("default" ("mmi" (filename . ".*/repos/rai/mmi-.*")) ("rai" (filename . ".*/repos/rai/.*")) ("flux" (filename . ".*/repos/personal/flux/.*")) ("external" (filename . ".*/repos/external/.*")) ("emacs" (or (name . "^\\*scratch\\*$") (name . "^\\*Messages\\*$") (name . "^\\*Help\\*$") (name . "^\\.emacs$"))) ("system" (or (filename . "^/home/josh/scripts/.*$") (filename . "^/home/josh/.zshrc$") (filename . "^/home/josh/.config/.*$"))) ("meta" (name . "^\\*.*$"))))) (add-hook 'ibuffer-mode-hook (lambda () (ibuffer-switch-to-saved-filter-groups "default"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; General ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (use-package auto-sudoedit :ensure t) (use-package better-defaults :ensure t) (use-package ido-completing-read+ :ensure t :init (ido-mode 1) (ido-everywhere 1) (ido-ubiquitous-mode 1)) (use-package smex :ensure t :config (smex-initialize) :bind (("M-x" . smex) ("M-X" . smex-major-mode-commands))) (use-package highline :ensure t :init (global-highline-mode t) :custom (highline-priority 1)) (use-package multiple-cursors :ensure t :bind (("C-S-SPC" . mc/edit-lines) ("C-M-." . mc/mark-next-like-this) ([next] . mc/mark-next-like-this) ("C-M-," . mc/mark-previous-like-this) ([prior] . mc/mark-previous-like-this))) (require 'tramp) (setq tramp-default-method "ssh") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Prog Mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (add-hook 'prog-mode-hook (lambda () (setq indent-tabs-mode nil) (rainbow-delimiters-mode +1) (show-paren-mode +1) (eldoc-mode +1) (company-mode +1) (company-quickhelp-mode +1) (diff-hl-mode +1) (diff-hl-flydiff-mode +1))) (use-package company :ensure t :bind (("M-TAB" . company-complete-common-or-cycle)) :custom (company-selection-wrap-around t) (company-show-numbers t) (company-idle-delay 0.2) (company-minimum-prefix-length 2) (company-tooltip-maximum-width 120) (company-tooltip-align-annotations t) (company-auto-complete-chars (quote (41 46)))) (use-package company-quickhelp :ensure t :custom (company-quickhelp-delay 0.2) (company-quickhelp-mode t)) (use-package rainbow-delimiters :ensure t :commands rainbow-delimiters-mode :custom (rainbow-delimiters-max-face-count 4)) (use-package flycheck :ensure t :init (setq flycheck-check-syntax-automatically '(save mode-enabled)) (add-to-list 'display-buffer-alist `(,(rx bos "*Flycheck errors*" eos) (display-buffer-reuse-window display-buffer-in-side-window) (side . bottom) (reusable-frames . visible) (window-height . 0.10)))) (use-package yasnippet :ensure t :init (yas-global-mode +1)) (use-package rainbow-mode :ensure t :hook ((css-mode . rainbow-mode) (stylus-mode . rainbow-mode))) (use-package lsp-mode :ensure t :hook (rust-mode . lsp) :bind (:map lsp-mode-map ("C-c r" . lsp-rename)) :custom (lsp-auto-guess-root t)) (use-package lsp-ui :ensure t :commands lsp-ui-mode :hook (lsp-mode-hook . lsp-ui-mode) :bind (:map lsp-mode-map ("M-?" . lsp-ui-peek-find-references) ("M-." . lsp-ui-peek-find-definitions) ("M->" . lsp-ui-peek-find-implementation) ("C-c m" . lsp-ui-imenu) ("C-c s" . lsp-ui-sideline-mode)) :custom ;; flycheck (lsp-ui-flycheck-enable t) ;; sideline (lsp-ui-sideline-delay 0.5) (lsp-ui-sideline-ignore-duplicates t) ;; doc ; (lsp-ui-doc-header t) ;(lsp-ui-doc-use-webkit nil) ;; peek (lsp-ui-peek-enable t) (lsp-ui-peek-fontify 'on-demand) ; (lsp-ui-doc-use-webkit t) ) (use-package company-lsp :commands company-lsp :ensure t :init (message "setup company-lsp") (push 'company-lsp company-backends)) (use-package dap-mode :ensure t) (use-package diff-hl :ensure t :commands (diff-hl-mode global-diff-hl-mode diff-hl-flydiff-mode)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Languages ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;━━━━━━━┫ C/++ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (setq-default c-basic-offset 4) ;;━━━━━━━┫ Clojure ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package clojure-mode :ensure t :mode ("\\.clj\\'" . clojure-mode)) (use-package cider :ensure t :hook (clojure-mode . cider-mode) :bind (:map cider-mode-map ("C-/" . cider-doc) ("C-?" . cider-grimoire) ("C-." . cider-find-var) ("C-," . cider-pop-back)) :custom (cider-annotate-completion-candidates t) (cider-boot-parameters "cider.tasks/nrepl-server -b localhost wait") (cider-debug-display-locals t) (cider-repl-use-pretty-printing t) :config (setq cider-cljs-lein-repl "(do (require 'figwheel-sidecar.repl-api) (figwheel-sidecar.repl-api/start-figwheel!) (figwheel-sidecar.repl-api/cljs-repl))")) (use-package cider-eval-sexp-fu :ensure t :defer 10) ;;━━━━━━━┫ GLSL ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package glsl-mode :ensure t :mode ("\\.glsl\\'" . glsl-mode)) (use-package company-glsl :ensure t :defer 10) ;;━━━━━━━┫ Javascript / Typescript ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package js :custom (js-indent-level 2)) (use-package typescript-mode :ensure t :mode ("\\.ts\\'" . typescript-mode) :bind (("C-" . indent-relative)) :custom (typescript-indent-level 2)) (use-package tide :ensure t :after (typescript-mode company flycheck) :hook ((typescript-mode . tide-setup) (typescript-mode . tide-hl-identifier-mode) (before-save . tide-format-before-save))) (use-package prettier-js :ensure t :commands 'prettier-js-mode :hook ((typescript-mode . prettier-js-mode) (javascript-mode . prettier-js-mode))) (use-package web-mode :ensure t :mode ("\\.tsx\\'" . web-mode) :init (flycheck-add-mode 'typescript-tslint 'web-mode) (add-hook 'web-mode-hook (lambda () (setq web-mode-markup-indent-offset 2) (setq web-mode-css-indent-offset 2) (setq web-mode-code-indent-offset 2) (when (string-equal "tsx" (file-name-extension buffer-file-name)) (setq web-mode-enable-auto-quoting nil) (flycheck-add-next-checker 'typescript-tide '(t . typescript-tslint) 'append))))) (use-package company-web :ensure t) (use-package json-mode :ensure t :mode ("\\.json\\'" . json-mode)) (use-package json-navigator :ensure t) ;;━━━━━━━┫ Julia ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package julia-mode :ensure t :mode ("\\.jl\'" . julia-mode) :commands julia-mode) (use-package flycheck-julia :ensure t :after (flycheck julia-mode) :hook (flycheck-mode-hook . flycheck-julia-setup)) ;;━━━━━━━┫ Markdown ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package markdown-mode+ :ensure t :hook ((gfm-mode-hook markdown-mode-hook) . setup-md-mode) :custom (markdown-command "marked") (markdown-preview-style "https://cdn.rawgit.com/joshuafcole/github-markdown-css/0694d90c73626ebf066307d6d58d0359c9cd992f/github-markdown.css") :init (defun setup-md-mode () (toggle-word-wrap t) (local-set-key (kbd "M-") 'right-word) (local-set-key (kbd "M-") 'left-word) (set (make-local-variable 'time-stamp-pattern) "-8/^date: %04Y-%02m-%02d %02H:%02M:%02S %:Z$") (add-hook 'before-save-hook 'time-stamp))) ;; (put 'narrow-to-region 'disabled nil) ;;━━━━━━━┫ Nix ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package nix-mode :defer t) (use-package nixos-options :defer t) ;;━━━━━━━┫ Polymode ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package polymode :ensure t :init (setq polymode-buffers-regexp "^.*\\[.*\\]$") (add-to-list 'ido-ignore-buffers polymode-buffers-regexp) (when window-system (setq desktop-restore-forces-onscreen nil) (setq desktop-buffers-not-to-save (concat "\\(?:\\` \\)" "\\|\\(?:" polymode-buffers-regexp "\\)")))) ;;━━━━━━━┫ R ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package ess :ensure t :mode ("\\.R\\'" . r-mode)) ;;━━━━━━━┫ Rust ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package rust-mode :ensure t :mode ("\\.rs\\'" . rust-mode) :commands rust-mode :init ;(setq racer-rust-src-path "/home/josh/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/src") (add-hook 'rust-mode-hook (lambda () (interactive) (setq rust-format-on-save t) (lsp-mode +1) (flycheck-mode +1) ;; (racer-mode +1) ))) (use-package flycheck-rust :ensure t :after (flycheck rust-mode) :hook (flycheck-mode-hook . flycheck-rust-setup)) ;; (use-package racer :ensure t ;; :commands racer-mode ;; :custom ;; (racer-eldoc-timeout 0.25)) ;;━━━━━━━┫ Shell ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (add-hook 'sh-mode-hook (lambda () (setq-local sh-basic-offset 2) (setq-local sh-indentation 2))) ;;━━━━━━━┫ Stylus ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ (use-package stylus-mode :ensure t :mode ("\\.styl\\'" . stylus-mode) :commands stylus-mode) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Convenience Fns ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun what-face (pos) (interactive "d") (let ((face (or (get-char-property (pos) 'read-face-name) (get-char-property (pos) 'face)))) (if face (message "Face: %s" face) (message "No face at %d" pos))))