Permalink
| ;;; 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) |