;;; init.el --- Initialization file for emacs ;;; Commentary: Emacs startup file --- initialization file for emacs (setq custom-file (concat user-emacs-directory ".emacs-customize.el") require-final-newline t) ;; Track emacs load time (defconst emacs-start-time (current-time)) ;; Other configs (setq make-backup-files nil) (setq auto-save-default nil) ;; Splash Screen (setq inhibit-startup-screen t) (setq initial-scratch-message ";; Happy Hacking") ;; Show matching parens (setq show-paren-delay 0) (show-paren-mode 1) (electric-pair-mode 1) ;; UI configurations (if (display-graphic-p) (progn (tool-bar-mode -1) (scroll-bar-mode -1))) (tooltip-mode -1) (menu-bar-mode -1) (global-linum-mode 1) ;; Font configurations (add-to-list 'default-frame-alist '(font . "Iosevka-14")) (add-to-list 'default-frame-alist '(height . 24)) (add-to-list 'default-frame-alist '(width . 80)) ;;; Package Management (require 'package) (setq package-enable-at-startup nil) (setq package-archives '(("org" . "http://orgmode.org/elpa/") ("gnu" . "http://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/") ("local" . ,(expand-file-name "~/spacelpa/packages/")))) (package-initialize) ;; Bootstrap `use-package` (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) (eval-when-compile (require 'use-package)) ;; always download all packages if not already downloaded (setq use-package-always-ensure t) ;; keep stats about packages (setq use-package-compute-statistics t) ; no longer included with use-package by default (use-package diminish) (use-package auto-package-update :ensure t :config (setq auto-package-update-delete-old-versions t auto-package-update-interval 14) (auto-package-update-maybe)) ;; Restart emacs from within emacs (use-package restart-emacs :ensure t) ;; Theme (use-package doom-themes :ensure t :config (load-theme 'doom-molokai t)) ;; Auto enforced consistence (use-package editorconfig :diminish "↹" :init (setq auto-mode-alist (cl-union auto-mode-alist '(("\\.editorconfig\\'" . editorconfig-conf-mode) ("editorconfig\\'" . editorconfig-conf-mode)))) :config (editorconfig-mode 1)) (use-package smartparens :hook ((prog-mode-hook) . smartparens-mode) :config (require 'smartparens-config)) (use-package aggressive-indent :diminish "⇉" :config (global-aggressive-indent-mode t)) (use-package fzf :ensure t) ;; Vim mode (use-package evil :ensure t :config (evil-mode 1)) (use-package evil-escape :ensure t :init (setq-default evil-escape-key-sequence "jk") :config (evil-escape-mode 1)) ;; Anzu for search matching (use-package anzu :ensure t :config (global-anzu-mode 1) (global-set-key [remap query-replace-regexp] 'anzu-query-replace-regexp) (global-set-key [remap query-replace] 'anzu-query-replace)) ;; Helm (use-package helm :ensure t :init (setq helm-M-x-fuzzy-match t helm-mode-fuzzy-match t helm-buffers-fuzzy-matching t helm-recentf-fuzzy-match t helm-locate-fuzzy-match t helm-semantic-fuzzy-match t helm-imenu-fuzzy-match t helm-completion-in-region-fuzzy-match t helm-candidate-number-list 80 helm-split-window-inside-p t helm-move-to-line-cycle-in-source t helm-echo-input-in-header-line t helm-autoresize-max-height 0 helm-autoresize-min-height 20) :config (helm-mode 1)) ;; RipGrep (use-package helm-rg :ensure t) ;; Projectile (use-package projectile :ensure t :init (setq projectile-require-project-root nil) :config (projectile-mode 1)) ;; Helm Projectile (use-package helm-projectile :ensure t :init (setq helm-projectile-fuzzy-match t) :config (helm-projectile-on)) ;; Helm Gtags (use-package helm-gtags :defer t :ensure t :init (progn (setq helm-gtags-ignore-case t helm-gtags-auto-update t helm-gtags-prefix-key "SPC" helm-gtags-use-input-at-cursor t helm-gtags-pulse-at-cursor t) (add-hook 'c-mode-hook 'helm-gtags-mode))) ;; All The Icons (use-package all-the-icons :ensure t) ;; Which Key (use-package which-key :ensure t :init (setq which-key-separator " ") (setq which-key-prefix-prefix "+") :config (which-key-mode)) ;; Git Support (use-package magit :defer t :ensure t) (use-package evil-magit :defer t :ensure t) (use-package helm-git-grep :defer t :ensure t) (use-package helm-gitignore :defer t :ensure t) (use-package git-commit :defer t :ensure t) (use-package git-messenger :defer t :ensure t :config (define-key git-messenger-map [escape] 'git-messenger:popup-close)) (use-package gitattributes-mode :defer t) (use-package gitconfig-mode :defer t) (use-package gitignore-mode :defer t) ;; Custom keybinding (use-package general :ensure t :init (setq general-override-states '(insert emacs hybrid normal visual motion operator replace)) :config (general-define-key :states '(normal visual insert emacs) :prefix "SPC" :non-normal-prefix "M-SPC" "/" '(helm-projectile-rg :which-key "ripgrep") "TAB" '(switch-to-prev-buffer :which-key "previous buffer") "SPC" '(helm-M-x :which-key "M-x") "ff" '(fzf :which-key "fuzzy file search") "pf" '(helm-projectile-find-file :which-key "find files") "pp" '(helm-projectile-switch-project :which-key "switch project") "pb" '(helm-projectile-switch-to-buffer :which-key "switch buffer") "pr" '(helm-show-kill-ring :which-key "show kill ring") ;; Buffers "bb" '(helm-mini :which-key "buffers list") ;; Window "wl" '(windmove-right :which-key "move right") "wh" '(windmove-left :which-key "move left") "wk" '(windmove-up :which-key "move up") "wj" '(windmove-down :which-key "move bottom") "w/" '(split-window-right :which-key "split right") "w-" '(split-window-below :which-key "split bottom") "wx" '(delete-window :which-key "delete window") "qz" '(delete-frame :which-key "delete frame") "qq" '(kill-emacs :which-key "quit") "qr" '(restart-emacs :which-key "restart emacs") ;; Others "at" '(ansi-term :which-key "open terminal") ;; Gtags "mgc" '(helm-gtags-create-tags :which-key "create tag db") "mgd" '(helm-gtags-find-tag :which-key "find definitions") "mgf" '(helm-gtags-select-path :which-key "jump to a file in tag db") "mgG" '(helm-gtags-dwim-other-window :which-key "jump to location based on context") "mgi" '(helm-gtags-tags-in-this-function :which-key "present tags in current function") "mgl" '(helm-gtags-parse-file :which-key "jump to definitions in file") "mgn" '(helm-gtags-next-history :which-key "jump to next location in context stack") "mgp" '(helm-gtags-previous-history :which-key "jump to previous location in context stack") "mgr" '(helm-gtags-find-rtag :which-key "find references") "mgR" '(helm-gtags-resume :which-key "resume previous helm-gtags session") "mgs" '(helm-gtags-select :which-key "select any tag in project retrieved by gtags") "mgS" '(helm-gtags-show-stack :which-key "show stack of visited locations") "mgu" '(helm-gtags-update-tags :which-key "create tag db") ;; Magit key bindings "gc" '(magit-clone :which-key "magit clone") "gff" '(magit-find-file :which-key "magit find file") "gfl" '(magit-log-buffer-file :which-key "magit log buffer file") "gfd" '(magit-diff-buffer-file-popup :which-key "magit diff buffer file popup") "gi" '(magit-init :which-key "magit initialize") "gL" '(magit-list-repositories :which-key "magit list repositories") "gm" '(magit-dispatch-popup :which-key "magit dispatch popup") "gs" '(magit-status :which-key "open Magit status buffer") "gS" '(magit-stage-file :which-key "magit stage file") "gU" '(magit-unstage-file :which-key "magit unstage file") "g/" '(helm-git-grep :which-key "open helm git grep") "g*" '(helm-git-grep-at-point :which-key "open helm git grep at point") ;; Haskell bindings "mf" '(hindent-reformat-decl :which-key "format declaration using hindent") "mF" '(haskell-mode-stylish-buffer :which-key "format buffer using haskell stylish") "mgg" '(intero-goto-definition :which-key "goto definition or tag") "mhi" '(intero-info :which-key "get info for identifier under cursor") "mht" '(intero-type-at :which-key "get type of identifier under cursor") "mrs" '(intero-apply-suggestions) "msb" '(intero-repl-load :which-key "load/reload current buffer in repl") "mic" '(intero-cd :which-key "change directory in backend process") "mid" '(intero-devel-reload :which-key "reload module DevelMain") "mik" '(intero-destroy :which-key "stop current process & kill its associated") "mil" '(intero-list-buffers :which-key "list hidden process buffers created") "mir" '(intero-restart :which-key "restart process with same config") "mit" '(intero-targets :which-key "set targets to use for stack ghci") "msc" nil "mhT" '(haskell-intero/insert-type) "mss" '(haskell-intero/display-repl :which-key "show repl without switching") "msS" '(haskell-intero/pop-to-repl :which-key "show and switch to repl") "mrb" '(hlint-refactor-refactor-buffer :which-key "apply all hlint suggestions") "mrr" '(hlint-refactor-refactor-at-point :which-key "apply hlint suggestion under cursor"))) ;; custom functions (defun haskell-intero/insert-type () (interactive) (intero-type-at :insert)) (defun haskell-intero/display-repl (&optional prompt-options) (interactive "P") (let ((buffer (intero-repl-buffer prompt-options))) (unless (get-buffer-window buffer 'visible) (display-buffer buffer)))) (defun haskell-intero/pop-to-repl (&optional prompt-options) (interactive "P") (pop-to-buffer (intero-repl-buffer prompt-options))) (defun haskell-intero//preserve-focus (f &rest args) (let ((buffer (current-buffer))) (apply f args) (pop-to-buffer buffer))) (defun helm-gtags-dwim-other-window () ;; Enable helm-gtags-dwim in the other window (interactive) (let ((helm-gtags--use-otherwin t) (split-height-threshold nil) (split-width-threshold 140)) (helm-gtags-dwim))) ;; Fancy titlebar for MacOS (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t)) (add-to-list 'default-frame-alist '(ns-appearance . dark)) (setq ns-use-proxy-icon nil) (setq frame-title-format nil) ;; Flycheck (use-package flycheck :ensure t :init (global-flycheck-mode)) ;; To disable flycheck while working with this file (setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc)) ;; Company mode (use-package company :ensure t :diminish "⇥" :init (add-hook 'after-init-hook 'global-company-mode) (setq company-minimum-prefix-length 3) (setq company-auto-complete nil) (setq company-idle-delay 0) (setq company-require-match 'never) (setq company-frontends '(company-pseudo-tooltip-unless-just-one-frontend company-preview-frontend company-echo-metadata-frontend)) (setq tab-always-indent 'complete) (defvar completion-at-point-functions-saved nil) :config (global-company-mode 1) (define-key company-active-map (kbd "TAB") 'company-complete-common-or-cycle) (define-key company-active-map (kbd "") 'company-complete-common-or-cycle) (define-key company-active-map (kbd "S-TAB") 'company-select-previous) (define-key company-active-map (kbd "") 'company-select-previous) (define-key company-mode-map [remap indent-for-tab-command] 'company-indent-for-tab-command) (defun company-indent-for-tab-command (&optional arg) (interactive "P") (let ((completion-at-point-functions-saved completion-at-point-functions) (completion-at-point-functions '(company-complete-common-wrapper))) (indent-for-tab-command arg))) (defun company-complete-common-wrapper () (let ((completion-at-point-functions completion-at-point-functions-saved)) (company-complete-common)))) (use-package company-quickhelp :init (company-quickhelp-mode 1)) ;; Powerline (use-package spaceline :ensure t :init (setq powerline-default-separator 'slant) :config (spaceline-emacs-theme) (spaceline-toggle-minor-modes-off) (spaceline-toggle-buffer-size-off) (spaceline-toggle-evil-state-on)) ;; Language Support (use-package company-ghci :defer t :config (push 'company-ghci company-backends) :hook ((haskell-mode . company-mode) (haskell-interactive-mode . company-mode))) (use-package haskell-mode :defer t :init (electric-indent-mode 0) :config (push 'company-ghci company-backends) :hook ((haskell-mode . hindent-mode) (haskell-mode . company-mode) (haskell-mode . interactive-haskell-mode)) :custom ((haskell-stylish-on-save t) (haskell-process-suggest-remove-import-lines t))) (use-package intero :defer t :hook (haskell-mode . intero-mode)) (use-package hindent :defer t) (use-package hlint-refactor :defer t) (use-package rainbow-delimiters :ensure t :hook (prog-mode-hook . rainbow-delimiters-mode)) (use-package rust-mode :defer t :ensure t :config (setq rust-format-on-save t)) (use-package racer :ensure t :hook ((rust-mode . racer-mode) (racer-mode . eldoc-mode) (racer-mode . company-mode))) ;;; init.el ends