Permalink
Switch branches/tags
Nothing to show
Find file
670d590 Oct 10, 2017
@jakexl @applede
480 lines (411 sloc) 12.5 KB
;;; init --- emacs configuration
;;; Commentary:
;;; My Emacs configuration
;;; Code:
(add-to-list 'load-path (concat user-emacs-directory "elisp"))
;;
;; Font & frame size
;;
(require 'font-and-frame)
(my-set-font "Source Code Pro" 14 'regular)
;;
;; Miscellaneous
;;
(tool-bar-mode -1)
(scroll-bar-mode -1)
(global-hl-line-mode -1)
(global-auto-revert-mode 1)
(save-place-mode 1)
(setq make-backup-files nil)
(setq auto-save-default nil)
(setq blink-cursor-blinks 0)
(setq column-number-mode t)
(setq ring-bell-function 'ignore)
(setq scroll-conservatively 10000)
(setq scroll-margin 3)
(setq mac-command-modifier 'super
mac-option-modifier 'meta
mac-pass-command-to-system nil)
(setq-default fringe-indicator-alist '((continuation . (nil right-curly-arrow))
(truncation . (nil right-arrow))))
(fset 'yes-or-no-p 'y-or-n-p)
(define-key minibuffer-local-map (kbd "<escape>") #'abort-recursive-edit)
;;
;; Package management
;;
(require 'package)
(setq package-enable-at-startup nil)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
(setq use-package-always-ensure t)
;;
;; Auto save
;;
(defun my-save ()
"Save all buffers."
(interactive)
(save-some-buffers t))
(add-hook 'focus-out-hook #'my-save)
;;
;; Helper functions
;;
(defun my-edit-init ()
"Edit init.el."
(interactive)
(find-file "~/.emacs.d/init.el"))
(defun my-projectile-rg ()
"Search word in project."
(interactive)
(setq counsel-projectile-rg-initial-input nil)
(counsel-projectile-rg))
(defun my-projectile-rg-at-point ()
"Search word under cursor."
(interactive)
(setq counsel-projectile-rg-initial-input '(projectile-symbol-or-selection-at-point))
(counsel-projectile-rg))
(defun my-swiper ()
"Swiper word under cursor."
(interactive)
(swiper (projectile-symbol-or-selection-at-point)))
;;
;; Evil
;;
(use-package evil
:config
(evil-mode 1)
(setq evil-want-C-i-jump t)
(evil-select-search-module 'evil-search-module 'evil-search))
(use-package evil-leader
:defer t
:init
(evil-define-key 'normal evil-normal-state-map "<SPC>" #'global-evil-leader-mode)
:config
(global-evil-leader-mode)
(evil-leader/set-leader "<SPC>")
(evil-leader/set-key "<SPC>" #'counsel-M-x)
(evil-leader/set-key "0" #'treemacs-select-window)
(evil-leader/set-key "1" #'winum-select-window-1)
(evil-leader/set-key "2" #'winum-select-window-2)
(evil-leader/set-key "3" #'winum-select-window-3)
(evil-leader/set-key "/" #'my-projectile-rg)
(evil-leader/set-key "*" #'my-projectile-rg-at-point)
(evil-leader/set-key "bb" #'ivy-switch-buffer)
(evil-leader/set-key "bd" #'kill-buffer)
(evil-leader/set-key "d" #'my-duplicate-buffer)
(evil-leader/set-key "fed" #'my-edit-init)
(evil-leader/set-key "ff" #'counsel-find-file)
(evil-leader/set-key "fr" #'counsel-recentf)
(evil-leader/set-key "ft" #'treemacs-projectile)
(evil-leader/set-key "gs" #'magit-status)
(evil-leader/set-key "gb" #'magit-blame)
(evil-leader/set-key "hf" #'counsel-describe-function)
(evil-leader/set-key "hk" #'describe-key)
(evil-leader/set-key "hv" #'counsel-describe-variable)
(evil-leader/set-key "hm" #'describe-mode)
(evil-leader/set-key "L" #'my-layout)
(evil-leader/set-key "l" #'list-packages)
(evil-leader/set-key "p" #'counsel-projectile)
(evil-leader/set-key "qq" #'save-buffers-kill-terminal)
(evil-leader/set-key "rl" #'ivy-resume)
(evil-leader/set-key "ra" #'align-regexp)
(evil-leader/set-key "ss" #'swiper)
(evil-leader/set-key "sS" #'my-swiper)
(evil-leader/set-key "tc" #'global-subword-mode)
(evil-leader/set-key "tl" #'toggle-truncate-lines)
(evil-leader/set-key "w1" #'delete-other-windows)
(evil-leader/set-key "wd" #'delete-window)
(evil-leader/set-key "wv" #'split-window-right)
(evil-leader/set-key "ws" #'split-window-below)
(evil-leader/set-key "xe" #'eval-last-sexp)
)
(use-package evil-commentary
:diminish ""
:config
(evil-commentary-mode))
(use-package evil-escape
:diminish ""
:config
(evil-escape-mode)
(setq-default evil-escape-key-sequence "bb")
(setq-default evil-escape-delay 0.4))
(use-package undo-tree
:defer t
:diminish "")
(use-package expand-region
:defer t
:init
(evil-leader/set-key "v" #'er/expand-region))
;;
;; Theme
;;
(require 'themes)
(my-load-theme 'monokai)
;; (my-load-theme 'moe-dark)
;;
;; Line number
;;
(use-package nlinum
:commands (nlinum-mode)
:init
(add-hook 'prog-mode-hook #'nlinum-mode)
:config
(setq nlinum-format "%5d "
nlinum-highlight-current-line t)
(set-face-attribute 'linum nil :height 110 :weight 'light :background (face-attribute 'default :background))
(set-face-attribute 'nlinum-current-line nil :background (face-attribute 'mode-line :background)))
;;
;; Treemacs
;;
(use-package treemacs
:commands (treemacs-toggle)
:config
(setq treemacs-follow-after-init t
treemacs-width 35
treemacs-indentation 2
treemacs-git-integration t
treemacs-collapse-dirs 3
treemacs-silent-refresh nil
treemacs-change-root-without-asking nil
treemacs-sorting 'alphabetic-desc
treemacs-show-hidden-files t
treemacs-never-persist nil
treemacs-is-never-other-window nil
treemacs-goto-tag-strategy 'refetch-index)
(treemacs-follow-mode 0)
(treemacs-filewatch-mode 0))
(use-package treemacs-evil
:after treemacs)
(use-package treemacs-projectile
:commands (treemacs-projectile)
:config
(setq treemacs-header-function #'treemacs-projectile-create-header))
;;
;; Window layout
;;
(use-package window-purpose
:diminish purpose-mode
:commands (purpose-set-window-layout)
:config
(add-to-list 'purpose-user-mode-purposes '(neotree-mode . Neotree))
(add-to-list 'purpose-user-mode-purposes '(treemacs-mode . treemacs))
(add-to-list 'purpose-user-mode-purposes '("*Treemacs*" . treemacs))
(add-to-list 'purpose-user-mode-purposes '(text-mode . edit))
(add-to-list 'purpose-user-mode-purposes '(compilation-mode . general))
(add-to-list 'purpose-user-mode-purposes '(hmm-mode . general))
(add-to-list 'purpose-user-mode-purposes '(helm-ag-mode . general))
(add-to-list 'purpose-user-mode-purposes '(dired-mode . general))
(add-to-list 'purpose-user-mode-purposes '(magit-diff-mode . general))
(add-to-list 'purpose-user-mode-purposes '(package-menu-mode . general))
(add-to-list 'purpose-user-mode-purposes '("*LV*" . general))
(add-to-list 'purpose-user-mode-purposes '("*helm ag results*" . general))
(purpose-compile-user-configuration)
(purpose-mode 1))
(defun my-layout ()
"Set window layout."
(interactive)
(treemacs-toggle)
(purpose-set-window-layout '(nil (0 0 256 75) (:purpose treemacs :purpose-dedicated t :width 0.14566929133858267 :height 0.9868421052631579 :edges (0.0 0.0 0.14566929133858267 0.9868421052631579)) (:purpose edit :purpose-dedicated t :width 0.42913385826771655 :height 0.9868421052631579 :edges (0.14566929133858267 0.0 0.5748031496062992 0.9868421052631579)) (t (146 0 256 75) (:purpose edit :purpose-dedicated t :width 0.4330708661417323 :height 0.4868421052631579 :edges (0.5748031496062992 0.0 1.0078740157480315 0.4868421052631579)) (:purpose general :purpose-dedicated t :width 0.4330708661417323 :height 0.5 :edges (0.5748031496062992 0.4868421052631579 1.0078740157480315 0.9868421052631579))))
)
(winum-select-window-1))
;;
;; Window number
;;
(use-package winum
:config
(setq winum-auto-setup-mode-line nil)
(winum-mode 1))
(defun my-duplicate-buffer ()
"Duplicate current buffer in other window."
(interactive)
(let ((buf (current-buffer))
(win (winum-get-number)))
(if (eq win 1)
(winum-select-window-2)
(if (eq win 2)
(winum-select-window-1)))
(switch-to-buffer buf nil t)))
;;
;; Which key
;;
(use-package which-key
:diminish ""
:config
(which-key-mode 1)
(setq which-key-popup-type 'side-window)
(which-key-add-key-based-replacements
"<SPC> <SPC>" "M-x"
"<SPC> 0" "select treemacs"
"<SPC> 1" "select window 1"
"<SPC> 2" "select window 2"
"<SPC> 3" "select window 3"
"<SPC> *" "search current word"
"<SPC> /" "search in proj"
"<SPC> L" "layout windows"
"<SPC> b" "buffer"
"<SPC> b b" "switch buffer"
"<SPC> b d" "kill buffer"
"<SPC> d" "duplicate buffer"
"<SPC> f" "file"
"<SPC> f e" "edit"
"<SPC> f f" "find file"
"<SPC> f e d" "edit init.el"
"<SPC> f r" "recent files"
"<SPC> f t" "project tree view"
"<SPC> g" "git"
"<SPC> g b" "git blame"
"<SPC> g s" "git status"
"<SPC> h" "help"
"<SPC> h f" "describe function"
"<SPC> h k" "describe key"
"<SPC> h m" "describe mode"
"<SPC> h v" "describe variable"
"<SPC> l" "list packages"
"<SPC> p" "find file in proj"
"<SPC> q" "quit"
"<SPC> q q" "quit"
"<SPC> r" "align/resume"
"<SPC> r a" "align regexp"
"<SPC> r l" "resume last ivy"
"<SPC> s" "swiper"
"<SPC> s s" "swiper"
"<SPC> s S" "swiper current word"
"<SPC> t" "toggle"
"<SPC> t c" "toggle subword"
"<SPC> t l" "toggle truncate line"
"<SPC> v" "expand region"
"<SPC> w" "window"
"<SPC> w 1" "delete other windows"
"<SPC> w d" "delete window"
"<SPC> w s" "split below"
"<SPC> w v" "split right"
"<SPC> x" "execute"
"<SPC> x e" "eval last sexp"
))
;;
;; Ivy, Counsel
;;
(use-package ivy
:diminish ""
:bind
("<f4>" . next-error)
:config
(ivy-mode 1)
(setq ivy-use-virtual-buffers t)
(setq enable-recursive-minibuffers t)
(define-key ivy-minibuffer-map (kbd "<escape>") #'minibuffer-keyboard-quit)
(define-key ivy-minibuffer-map (kbd "<f3>") #'ivy-occur))
(use-package smex
:commands (counsel-M-x)
:config
(smex-initialize))
(use-package counsel
:diminish ""
:commands (counsel-projectile counsel-recentf counsel-find-file counsel-M-x)
:config
(counsel-mode 1))
(use-package projectile
:diminish ""
;; can't defer because modeline uses it
:config
(projectile-mode 1)
(push "recentf" projectile-globally-ignored-files)
(push ".meta" projectile-globally-ignored-file-suffixes)
(push ".cache" projectile-globally-ignored-directories))
(use-package counsel-projectile
:commands (counsel-projectile)
:config
(counsel-projectile-on))
;;
;; Auto completion
;;
(use-package company
:diminish ""
:defer t
:init
(add-hook 'prog-mode-hook #'company-mode)
:config
(global-company-mode)
(use-package company-statistics
:config
(company-statistics-mode))
(setq company-minimum-prefix-length 2))
;;
;; Git
;;
(use-package magit
:commands (magit-status magit-blame)
:config
(use-package evil-magit)
(use-package git-commit)
(global-git-commit-mode t))
;;
;; Smartparens
;;
(use-package smartparens
:diminish ""
:defer t
:init
(add-hook 'prog-mode-hook #'smartparens-mode)
:config
(require 'smartparens-config)
(sp-pair "(" nil :unless '(sp-point-before-word-p))
(sp-pair "{" nil :unless '(sp-point-before-word-p))
(sp-pair "[" nil :unless '(sp-point-before-word-p)))
(use-package highlight-parentheses
:diminish ""
:defer t
:init
(add-hook 'prog-mode-hook #'highlight-parentheses-mode)
:config
(setq hl-paren-delay 0.2)
(setq hl-paren-colors '("Springgreen3"
"IndianRed1"
"IndianRed3"
"IndianRed4"))
(set-face-attribute 'hl-paren-face nil :weight 'ultra-bold))
;;
;; Tab, space, indentation, whitespace
;;
(setq indent-tabs-mode nil
tab-width 8
whitespace-line-column 100
;; whitespace-style '(face trailing lines-tail empty indentation space-after-tab
;; space-before-tab))
whitespace-style '(face trailing lines-tail empty))
(global-whitespace-mode 1)
(diminish 'global-whitespace-mode)
(use-package editorconfig
:diminish ""
:defer t
:init
(add-hook 'prog-mode-hook #'editorconfig-mode))
(use-package flycheck
:diminish ""
;; can't defer because modeline uses it
:config
(global-flycheck-mode))
(use-package subword
:diminish ""
:commands (global-subword-mode))
(require 'doom-modeline)
(require 'paste-indent)
;;
;; Ligatures
;; Install Fira Code Symbol from
;; https://github.com/tonsky/FiraCode/files/412440/FiraCode-Regular-Symbol.zip
;;
;; (if (fboundp 'mac-auto-operator-composition-mode)
;; (mac-auto-operator-composition-mode))
(require 'pretty-fonts)
(pretty-fonts-set-kwds
'((pretty-fonts-fira-font prog-mode-hook org-mode-hook)))
(require 'lang-csharp)
(require 'lang-elixir)
;;
;; Custom file
;;
(setq custom-file "~/.emacs.d/custom.el")
(load custom-file)