dotfiles/init.el
Sanchayan Maity 8938e61a52 init.el: Update emacs config
1. Change update interval to 4 days as it seems for
a longer interval somehow finding packages on melpa
runs into some issue.
2. Remove intero. It cannot even resolve a symbol in
the same project.
3. Add support for dumb-jump. Seems to have better
specific search focus than just git grep with helm.
4. Add key bindings for xref. We can use emacs tags
which is especially helpful since LSP or intero does
not work for Haskell nor does gtags.

Signed-off-by: Sanchayan Maity <maitysanchayan@gmail.com>
2019-03-12 23:13:11 +05:30

877 lines
30 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))
(add-to-list 'default-frame-alist '(fullscreen . maximized))
;;; 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/")))
(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 4)
(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)
;; 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))
(use-package avy
:defer t
:init
(progn
(setq avy-all-windows 'all-frames)
(setq avy-background t)))
(use-package dumb-jump
: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))
(use-package evil-nerd-commenter
:ensure t)
(use-package evil-surround
:ensure t
:config
(global-evil-surround-mode 1))
(use-package disable-mouse
:ensure t
:config
(global-disable-mouse-mode))
;; 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)
;; enable gtags only for C
(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)
(use-package evil-magit
:defer t)
(use-package magit-gitflow
:defer t)
(use-package helm-git-grep
:defer t)
(use-package helm-gitignore
:defer t)
(use-package git-commit
:defer t)
(use-package git-messenger
:defer 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)
(use-package git-link
:defer t
:config
(setq git-link-open-in-browser t))
(use-package git-gutter
:defer t
:config
(global-git-gutter-mode +1))
(use-package gitignore-templates
: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"
"TAB" '(switch-to-prev-buffer
:which-key "previous buffer")
"SPC" '(helm-M-x :which-key "M-x")
;; fuzzy search
"ff" '(fzf :which-key "fuzzy file search")
;; Projectile
"/" '(helm-projectile-rg
:which-key "ripgrep")
"pf" '(helm-projectile-find-file
:which-key "find files")
"pF" '(helm-projectile-find-file-dwim
:which-key "find files dwim")
"pp" '(helm-projectile-switch-project
:which-key "switch project")
"pb" '(helm-projectile-switch-to-buffer
:which-key "switch buffer")
"pr" '(helm-projectile-recent
:which-key "show recent")
"pd" '(helm-projectile-find-dir
:which-key "find dir")
"ph" '(helm-projectile
:which-key "helm projectile")
;; 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" '(eshell :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
: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")
"gI" '(helm-gitignore
:which-key "helm gitignore")
"%" 'magit-gitflow-popup
"gti" 'gitignore-templates-insert
"gtn" 'gitignore-templates-new-file
"gM" 'git-messenger:popup-message
"gll" 'spacemacs/git-link
"glL" 'spacemacs/git-link-copy-url-only
"glc" 'spacemacs/git-link-commit
"glC" 'spacemacs/git-link-commit-copy-url-only
;; evil nerd commenter
"ci" 'evilnc-comment-or-uncomment-lines
"cl" 'evilnc-quick-comment-or-uncomment-to-the-line
"ll" 'evilnc-quick-comment-or-uncomment-to-the-line
"cc" 'evilnc-copy-and-comment-lines
"cp" 'evilnc-comment-or-uncomment-paragraphs
"cr" 'comment-or-uncomment-region
"cv" 'evilnc-toggle-invert-comment-line-by-line
"." 'evilnc-copy-and-comment-operator
"\\" 'evilnc-comment-operator
"jb" 'avy-pop-mark
"jj" 'evil-avy-goto-char-timer
"jl" 'evil-avy-goto-line
"jw" 'evil-avy-goto-word-or-subword-1
;; dumb jump
"dg" 'dumb-jump-go
"dp" 'dump-jump-back
"dq" 'dump-jump-quick-look
"dw" 'dumb-jump-go-other-window
"de" 'dumb-jump-go-prefer-external
"do" 'dumb-jump-go-prefer-external-other-window
"dp" 'dumb-jump-go-prompt
;; xref
"xv" 'visit-tags-table
"xd" 'xref-find-definition
"xr" 'xref-find-references
"xa" 'xref-find-appropos
"xf" 'xref-find-definitions-other-frame
"xp" 'xref-pop-marker-stack
"xq" 'xref-query-replace-in-results
"xs" 'tags-search))
(general-define-key
:states '(normal visual emacs)
:prefix "SPC m"
:keymaps 'haskell-mode-map
;; Haskell bindings
"f" '(hindent-reformat-decl
:which-key "format declaration using hindent")
"F" '(haskell-mode-stylish-buffer
:which-key "format buffer using haskell stylish")
"rb" '(hlint-refactor-refactor-buffer
:which-key "apply all hlint suggestions")
"rr" '(hlint-refactor-refactor-at-point
:which-key "apply hlint suggestion under cursor"))
(general-define-key
:states '(normal visual emacs)
:prefix "SPC m"
:keymaps 'rust-mode-map
"c." '(cargo-process-repeat
:which-key "repeat the last cargo command")
"cC" '(cargo-process-clean
:which-key "remove build artifacts with cargo")
"cX" '(cargo-process-run-example
:which-key "execute project example with cargo")
"cc" '(cargo-process-build
:which-key "compile project with cargo")
"cd" '(cargo-process-doc
:which-key "generate documentation with cargo")
"cD" '(cargo-process-doc-open
:which-key "open cargo docs")
"ce" '(cargo-process-bench
:which-key "run benchmarks with cargo")
"cf" '(cargo-process-fmt
:which-key "format all project files with rustfmt")
"ci" '(cargo-process-init
:which-key "create a new project with cargo")
"cl" '(cargo-process-clippy
:which-key "run linter with cargo")
"cn" '(cargo-process-new
:which-key "create new project with cargo")
"co" '(cargo-process-current-file-tests
:which-key "run all tests in current file with cargo")
"cs" '(cargo-process-search
:which-key "search for packages on crates.io")
"ct" '(cargo-process-current-test
:which-key "run the current test with cargo")
"cu" '(cargo-process-update
:which-key "update dependencies with cargo")
"cx" '(cargo-process-run
:which-key "execute a process with cargo")
"cv" '(cargo-process-check
:which-key "verify a project with cargo")
"t" '(cargo-process-test
:which-key "run test with cargo")
"==" '(rust-format-buffer
:which-key "rust reformat the buffer"))
(general-define-key
:states '(normal visual emacs)
:prefix "SPC m"
:keymaps 'lisp-mode-map
"cc" '(slime-compile-file
:which-key "compile file")
"cC" '(slime-compile-and-load-file
:which-key "compile file and load")
"cl" '(slime-load-file
:which-key "load file")
"cf" '(slime-compile-defun
:which-key "compile function")
"cr" '(slime-compile-region
:which-key "compile region")
"cn" '(slime-remove-notes
:which-key "remove compilation notes")
"eb" '(slime-eval-buffer
:which-key "evaluate buffer")
"ef" '(slime-eval-defun
:which-key "evaluate top level sexpr")
"eF" '(slime-undefine-function
:which-key "undefine the fn at point")
"ee" '(slime-eval-last-expression
:which-key "evaluate last sexpr")
"er" '(slime-eval-region
:which-key "evaluate region")
"gb" '(slime-pop-find-definition-stack
:which-key "go back")
"gn" '(slime-next-note
:which-key "next note")
"gN" '(slime-previous-note
:which-key "previous note")
"ha" '(slime-apropos
:which-key "SLIME appropos")
"hA" '(slime-apropos-all
:which-key "SLIME appropos all")
"hd" '(slime-disassemble-symbol
:which-key "disassemble symbol at point")
"hh" '(slime-describe-symbol
:which-key "describe symbol at point")
"hH" '(slime-hyperspec-lookup
:which-key "hyperspec lookup symbol at point")
"hi" '(slime-inspect-definition
:which-key "inspect defintion")
"hp" '(slime-apropos-package
:which-key "browse appropos results for package's exported symbols")
"ht" '(slime-toggle-trace-definition
:which-key "toggle tracing of function at point")
"hT" '(slime-untrace-all
:which-key "untrace all functions")
"h<" '(slime-who-calls
:which-key "show all known callers")
"h>" '(slime-calls-who
:which-key "show all known callees")
"hr" '(slime-who-references
:which-key "show references to global variable")
"hm" '(slime-who-macroexpands
:which-key "show all usages of a macro")
"hs" '(slime-who-specializes
:which-key "show all methods specialized on a class")
"ma" '(slime-macroexpand-all
:which-key "macroexpand the expr at point completely")
"mo" '(slime-macroexpand-1
:which-key "macroexpand the expr at point once")
"se" '(slime-eval-last-expression-in-repl
:which-key "evaluate last sexpr in repl")
"si" '(slime
:which-key "start an inferior process")
"sq" '(slime-quit-lisp
:which-key "quit")
"tf" '(slime-toggle-fancy-trace))
(general-define-key
:states '(normal visual emacs)
:prefix "SPC m"
:keymaps 'scheme-mode-map
"'" '(geiser-mode-switch-to-repl)
"," '(lisp-state-toggle-lisp-state)
"cc" '(geiser-compile-current-buffer
:which-key "compile current buffer")
"cp" '(geiser-add-to-load-path
:which-key "add directory to load path")
"eb" '(geiser-eval-buffer
:which-key "evaluate the whole buffer")
"ee" '(geiser-eval-last-sexp
:which-key "evaluate last sexp")
"ef" '(geiser-eval-definition
:which-key "evaluate current function")
"el" '(lisp-state-eval-sexp-end-of-line
:which-key "evaluate line")
"er" '(geiser-eval-region
:which-key "evaluate region")
"gb" '(geiser-pop-symbol-stack
:which-key "go back")
"gm" '(geiser-edit-module
:which-key "goto module")
"gn" '(next-error
:which-key "next error")
"gN" '(previous-error
:which-key "previous error")
"hh" '(geiser-doc-symbol-at-point
:which-key "docs for symbol at point")
"hd" '(geiser-doc-look-up-manual
:which-key "look up manual entry for symbol at point")
"hm" '(geiser-doc-module
:which-key "display exports for module")
"h<" '(geiser-xref-callers
:which-key "display callers")
"h>" '(geiser-xref-callees
:which-key "display callees")
"il" '(geiser-insert-lambda
:which-key "insert lambda")
"me" '(geiser-expand-last-sexp
:which-key "macroexpand last sexp")
"mf" '(geiser-expand-definition
:which-key "macroexpand surrounding sexp")
"mx" '(geiser-expand-region
:which-key "macroexpand region")
"si" '(geiser-mode-switch-to-repl
:which-key "start or switch to repl")
"sb" '(geiser-eval-buffer
:which-key "send buffer to repl")
"sB" '(geiser-eval-buffer-and-go
:which-key "send buffer to repl and focus it")
"sf" '(geiser-eval-definition
:which-key "send definition to repl")
"sF" '(geiser-eval-definition-and-go
:which-key "send definition to repl and focus it")
"se" '(geiser-eval-last-sexp
:which-key "send last sexp to repl")
"sr" '(geiser-eval-region
:which-key "send region to repl")
"sR" '(geiser-eval-region-and-go
:which-key "send region to repl and focus it")
"ss" '(geiser-set-scheme
:which-key "select scheme implementation"))
(general-define-key
:states '(normal visual emacs)
:prefix "SPC m"
:keymaps 'go-mode-map
"hh" '(godoc-at-point
:which-key "godoc at point")
"ig" '(go-goto-imports
:which-key "goto imports")
"ia" '(go-import-add
:which-key "add imports")
"ir" '(go-remove-unused-imports
:which-key "remove unused imports")
"eb" '(go-play-buffer
:which-key "go-play buffer")
"er" '(go-play-region
:which-key "go-play region")
"ed" '(go-download-play
:which-key "download go-play snippet")
"xx" '(go-run-main
:which-key "run go run for current main package")
"ga" '(ff-find-other-file
:which-key "jump to matching test file or back")
"gc" '(go-coverage
:which-key "open a clone of buffer with coverage info")
"rn" '(go-rename
:which-key "go rename")
"fd" '(go-guru-describe
:which-key "go-guru describe symbol at point")
"ff" '(go-guru-freevars
:which-key "go-guru show free variables")
"fi" '(go-guru-implements
:which-key "go-guru show implements relation")
"fc" '(go-guru-peers
:which-key "go-guru show channel sends/receives")
"fr" '(go-guru-referrers
:which-key "go-guru show referrers")
"fj" '(go-guru-definition
:which-key "go-guru jump to symbol definition")
"fp" '(go-guru-pointsto
:which-key "go-guru show what select expr points to")
"fs" '(go-guru-callstack
:which-key "go-guru show call stack")
"fe" '(go-guru-whicherrs
:which-key "go-guru show possible constants/types for error value")
"f<" '(go-guru-callers
:which-key "go-guru show possible callers")
"f>" '(go-guru-callees
:which-key "go-guru show call targets")
"fo" '(go-guru-set-scope
:which-key "go-guru set analysis scope"))
;; custom functions
(defun spacemacs/git-link-copy-url-only ()
"Only copy the generated link to the kill ring."
(interactive)
(let (git-link-open-in-browser)
(call-interactively 'spacemacs/git-link)))
(defun spacemacs/git-link-commit-copy-url-only ()
"Only copy the generated link to the kill ring."
(interactive)
(let (git-link-open-in-browser)
(call-interactively 'spacemacs/git-link-commit)))
(defun spacemacs/git-link ()
"Allow the user to run git-link in a git-timemachine buffer."
(interactive)
(require 'git-link)
(if (and (boundp 'git-timemachine-revision)
git-timemachine-revision)
(cl-letf (((symbol-function 'git-link--branch)
(lambda ()
(car git-timemachine-revision))))
(call-interactively 'git-link))
(call-interactively 'git-link)))
(defun spacemacs/git-link-commit ()
"Allow the user to run git-link-commit in a git-timemachine buffer."
(interactive)
(require 'git-link)
(if (and (boundp 'git-timemachine-revision)
git-timemachine-revision)
(cl-letf (((symbol-function 'word-at-point)
(lambda ()
(car git-timemachine-revision))))
(call-interactively 'git-link-commit))
(call-interactively 'git-link-commit)))
(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)))
(defun go-run-main ()
(interactive)
(shell-command
(format "go run %s"
(shell-quote-argument (buffer-file-name)))))
;; 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
;; Haskell 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)
(haskell-mode . #'flycheck-haskell-setup))
:custom
((haskell-stylish-on-save t)
(haskell-process-suggest-remove-import-lines t)))
(use-package flycheck-haskell
:defer t)
(use-package hindent
:defer t)
(use-package hlint-refactor
:defer t)
(use-package rainbow-delimiters
:ensure t
:hook
(prog-mode-hook . rainbow-delimiters-mode))
;; Rust support
(use-package rust-mode
:defer t
:ensure t
:config
(setq rust-format-on-save t))
(use-package racer
:defer t
:hook
((rust-mode . racer-mode)
(racer-mode . eldoc-mode)
(racer-mode . company-mode)))
(use-package cargo
:defer t)
;; LISP support
(use-package evil-cleverparens
:ensure t)
(use-package parinfer
:ensure t
:init
(progn
(setq parinfer-extensions '(defaults
pretty-parens
evil
paredit
smart-tab
smart-yank)))
:hook
((emacs-lisp-mode . parinfer-mode)
(common-lisp-mode . parinfer-mode)
(lisp-mode . parinfer-mode)
(scheme-mode . parinfer-mode)))
(use-package slime
:commands slime-mode
:init
(progn
(setq slime-contribs '(slime-asdf
slime-fancy
slime-indentation
slime-sbcl-exts
slime-scratch)
inferior-lisp-program "sbcl")
(setq slime-complete-symbol*-fancy t)
(setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
(defun slime/disable-smartparens ()
(smartparens-strict-mode -1)
(turn-off-smartparens-mode))
(add-hook 'slime-repl-mode-hook #'slime/disable-smartparens))
:config
(slime-setup))
;; scheme support
(use-package geiser
:defer t
:commands run-geiser
:hook
(scheme-mode . company-mode))
;; go support
(use-package company-go
:defer t
:init
(progn
(setq company-go-show-annotation t)
(push 'company-go company-backends)))
(use-package go-impl
:defer t)
(use-package go-guru
:defer t)
(use-package go-mode
:defer t
:init
(setq-local tab-width 8)
:config
(add-hook 'before-save-hook 'gofmt-before-save)
:hook
(go-mode . company-mode))
;;; init.el ends