dotfiles/init.el
Sanchayan Maity 61abe49789 init.el: Update emacs configuration
Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
2019-02-21 13:10:57 +05:30

486 lines
18 KiB
EmacsLisp

;;; 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 "<tab>")
'company-complete-common-or-cycle)
(define-key company-active-map (kbd "S-TAB")
'company-select-previous)
(define-key company-active-map (kbd "<backtab>")
'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