744 lines
26 KiB
EmacsLisp
744 lines
26 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))
|
|
(use-package evil-nerd-commenter
|
|
: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))
|
|
|
|
;; 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" '(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-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")
|
|
"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))
|
|
|
|
(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")
|
|
"gg" '(intero-goto-definition
|
|
:which-key "goto definition or tag")
|
|
"hi" '(intero-info
|
|
:which-key "get info for identifier under cursor")
|
|
"ht" '(intero-type-at
|
|
:which-key "get type of identifier under cursor")
|
|
"rs" '(intero-apply-suggestions)
|
|
"sb" '(intero-repl-load
|
|
:which-key "load/reload current buffer in repl")
|
|
"ic" '(intero-cd
|
|
:which-key "change directory in backend process")
|
|
"id" '(intero-devel-reload
|
|
:which-key "reload module DevelMain")
|
|
"ik" '(intero-destroy
|
|
:which-key "stop current process & kill its associated")
|
|
"il" '(intero-list-buffers
|
|
:which-key "list hidden process buffers created")
|
|
"ir" '(intero-restart
|
|
:which-key "restart process with same config")
|
|
"it" '(intero-targets
|
|
:which-key "set targets to use for stack ghci")
|
|
"sc" nil
|
|
"hT" '(haskell-intero/insert-type)
|
|
"ss" '(haskell-intero/display-repl
|
|
:which-key "show repl without switching")
|
|
"sS" '(haskell-intero/pop-to-repl
|
|
:which-key "show and switch to repl")
|
|
"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 '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 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)))
|
|
|
|
(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 intero
|
|
: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)))
|
|
(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))
|
|
|
|
;; 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
|