2019-04-21 19:59:44 -04:00
|
|
|
;;; editor/evil/+everywhere.el -*- lexical-binding: t; -*-
|
2018-06-27 03:05:47 +02:00
|
|
|
|
2018-08-11 21:03:15 +02:00
|
|
|
;; We load evil-collection ourselves for these reasons:
|
2018-06-27 03:05:47 +02:00
|
|
|
;;
|
2019-04-20 22:20:43 -04:00
|
|
|
;; 1. To truly lazy load it. Some of its modules, like
|
|
|
|
;; evil-collection-{elisp-mode,buff-menu} are loaded immediately, because
|
|
|
|
;; Emacs loads their packages immediately, which pulls in all of
|
|
|
|
;; evil-collection (and other packages with it, sometimes).
|
2018-06-27 03:05:47 +02:00
|
|
|
;; 2. This ensures a predictable load order, versus lazy loading using :defer or
|
|
|
|
;; :after-call. This means users can use (after! org ...) and be sure that
|
|
|
|
;; their changes will override evil-collection's.
|
2019-07-26 03:09:59 +02:00
|
|
|
;; 3. Ideally, we'd do away with evil-collection entirely. It changes too often,
|
|
|
|
;; introduces breaking bugs too frequently, and I don't agree with all their
|
|
|
|
;; design choices. Regardless, it does mork than it causes trouble, so it may
|
|
|
|
;; be here to stay.
|
2018-06-27 03:05:47 +02:00
|
|
|
;; 4. Adds `+evil-collection-disabled-list', to make it easier for users to
|
2018-09-16 10:38:12 -04:00
|
|
|
;; disable modules, and to reduce the effort required to maintain our copy of
|
|
|
|
;; `evil-collection-list' (now I can just copy it from time to time).
|
2018-06-27 03:05:47 +02:00
|
|
|
|
2018-09-16 10:38:12 -04:00
|
|
|
(defvar +evil-collection-disabled-list
|
|
|
|
'(anaconda-mode
|
|
|
|
buff-menu
|
|
|
|
comint
|
|
|
|
company
|
|
|
|
custom
|
|
|
|
eldoc
|
|
|
|
elisp-mode
|
|
|
|
ert
|
|
|
|
free-keys
|
|
|
|
help
|
|
|
|
helm
|
|
|
|
image
|
|
|
|
kotlin-mode
|
|
|
|
occur
|
|
|
|
package-menu
|
|
|
|
ruby-mode
|
|
|
|
simple
|
2020-01-07 14:21:07 +07:00
|
|
|
slime
|
|
|
|
lispy)
|
2018-06-27 03:05:47 +02:00
|
|
|
"A list of `evil-collection' modules to ignore. See the definition of this
|
|
|
|
variable for an explanation of the defaults (in comments). See
|
|
|
|
`evil-collection-mode-list' for a list of available options.")
|
|
|
|
|
2019-04-20 22:20:43 -04:00
|
|
|
(defvar evil-collection-setup-minibuffer nil)
|
|
|
|
|
2019-07-22 13:31:56 +02:00
|
|
|
;; We do this ourselves, and better.
|
|
|
|
(defvar evil-collection-want-unimpaired-p nil)
|
|
|
|
|
2019-12-19 14:09:55 -05:00
|
|
|
;; We handle loading evil-collection ourselves
|
|
|
|
(defvar evil-collection--supported-modes nil)
|
|
|
|
|
2018-09-18 18:15:58 -04:00
|
|
|
;; This has to be defined here since evil-collection doesn't autoload its own.
|
2019-07-26 03:09:59 +02:00
|
|
|
;; It must be updated whenever evil-collection updates theirs. Here's an easy
|
|
|
|
;; way to update it:
|
|
|
|
;;
|
|
|
|
;; (with-current-buffer
|
|
|
|
;; (url-retrieve-synchronously "https://raw.githubusercontent.com/emacs-evil/evil-collection/master/evil-collection.el" t t)
|
|
|
|
;; (goto-char (point-min))
|
2019-10-12 00:42:32 -04:00
|
|
|
;; (when (re-search-forward "^(defvar evil-collection--supported-modes\n[^(]+")
|
2019-09-20 01:22:25 -04:00
|
|
|
;; (let ((list (sexp-at-point)))
|
|
|
|
;; ;; Fixes
|
|
|
|
;; (when (assq 'pdf list)
|
|
|
|
;; (setf (alist-get 'pdf list) '(pdf-tools)))
|
|
|
|
;; (kill-new (prin1-to-string list)))))
|
|
|
|
|
2018-09-16 10:38:12 -04:00
|
|
|
(defvar evil-collection-mode-list
|
2019-07-08 13:51:11 +02:00
|
|
|
`(2048-game
|
|
|
|
ag
|
2018-09-16 10:38:12 -04:00
|
|
|
alchemist
|
|
|
|
anaconda-mode
|
2019-10-12 00:42:32 -04:00
|
|
|
apropos
|
2018-09-16 10:38:12 -04:00
|
|
|
arc-mode
|
|
|
|
bookmark
|
|
|
|
(buff-menu "buff-menu")
|
|
|
|
calc
|
|
|
|
calendar
|
|
|
|
cider
|
|
|
|
cmake-mode
|
|
|
|
comint
|
|
|
|
company
|
|
|
|
compile
|
2019-10-12 00:42:32 -04:00
|
|
|
(custom cus-edit)
|
2018-09-16 10:38:12 -04:00
|
|
|
cus-theme
|
|
|
|
daemons
|
|
|
|
deadgrep
|
|
|
|
debbugs
|
|
|
|
debug
|
|
|
|
diff-mode
|
|
|
|
dired
|
2019-12-19 14:09:55 -05:00
|
|
|
dired-sidebar
|
2019-04-20 22:20:43 -04:00
|
|
|
disk-usage
|
2018-09-16 10:38:12 -04:00
|
|
|
doc-view
|
2019-10-12 00:42:32 -04:00
|
|
|
docker
|
2019-02-16 19:04:45 -05:00
|
|
|
ebib
|
|
|
|
edbi
|
2018-09-16 10:38:12 -04:00
|
|
|
edebug
|
|
|
|
ediff
|
|
|
|
eglot
|
|
|
|
elfeed
|
|
|
|
elisp-mode
|
|
|
|
elisp-refs
|
2019-07-08 13:51:11 +02:00
|
|
|
elisp-slime-nav
|
2018-09-16 10:38:12 -04:00
|
|
|
emms
|
|
|
|
epa
|
|
|
|
ert
|
|
|
|
eshell
|
|
|
|
eval-sexp-fu
|
|
|
|
evil-mc
|
|
|
|
eww
|
|
|
|
flycheck
|
|
|
|
flymake
|
|
|
|
free-keys
|
|
|
|
geiser
|
|
|
|
ggtags
|
|
|
|
git-timemachine
|
2019-12-19 14:09:55 -05:00
|
|
|
gnus
|
2018-09-16 10:38:12 -04:00
|
|
|
go-mode
|
|
|
|
grep
|
|
|
|
guix
|
2019-02-16 19:04:45 -05:00
|
|
|
hackernews
|
2018-09-16 10:38:12 -04:00
|
|
|
helm
|
2019-02-16 19:04:45 -05:00
|
|
|
help
|
|
|
|
helpful
|
2019-07-08 13:51:11 +02:00
|
|
|
hg-histedit
|
|
|
|
hungry-delete
|
2018-09-16 10:38:12 -04:00
|
|
|
ibuffer
|
|
|
|
image
|
|
|
|
image-dired
|
|
|
|
image+
|
|
|
|
imenu-list
|
|
|
|
indium
|
|
|
|
info
|
|
|
|
ivy
|
|
|
|
js2-mode
|
2019-07-08 13:51:11 +02:00
|
|
|
leetcode
|
2019-12-19 14:09:55 -05:00
|
|
|
lispy
|
2019-07-08 13:51:11 +02:00
|
|
|
log-edit
|
2018-09-16 10:38:12 -04:00
|
|
|
log-view
|
|
|
|
lsp-ui-imenu
|
|
|
|
lua-mode
|
|
|
|
kotlin-mode
|
|
|
|
macrostep
|
|
|
|
man
|
|
|
|
magit
|
|
|
|
magit-todos
|
2019-10-12 00:42:32 -04:00
|
|
|
,@(if evil-collection-setup-minibuffer '(minibuffer))
|
2019-07-08 13:51:11 +02:00
|
|
|
monky
|
2018-09-16 10:38:12 -04:00
|
|
|
mu4e
|
|
|
|
mu4e-conversation
|
|
|
|
neotree
|
|
|
|
notmuch
|
|
|
|
nov
|
2019-10-12 00:42:32 -04:00
|
|
|
(occur replace)
|
2019-04-20 22:20:43 -04:00
|
|
|
omnisharp
|
2018-09-16 10:38:12 -04:00
|
|
|
outline
|
|
|
|
p4
|
|
|
|
(package-menu package)
|
|
|
|
pass
|
2019-09-20 01:22:25 -04:00
|
|
|
(pdf pdf-tools)
|
2018-09-16 10:38:12 -04:00
|
|
|
popup
|
|
|
|
proced
|
2019-04-20 22:20:43 -04:00
|
|
|
process-menu
|
2018-09-16 10:38:12 -04:00
|
|
|
prodigy
|
|
|
|
profiler
|
|
|
|
python
|
|
|
|
quickrun
|
|
|
|
racer
|
|
|
|
realgud
|
|
|
|
reftex
|
2018-10-16 18:27:34 -04:00
|
|
|
restclient
|
2018-09-16 10:38:12 -04:00
|
|
|
rjsx-mode
|
|
|
|
robe
|
|
|
|
rtags
|
2019-10-12 00:42:32 -04:00
|
|
|
ruby-mode
|
2018-09-16 10:38:12 -04:00
|
|
|
simple
|
|
|
|
slime
|
2019-10-12 00:41:46 -04:00
|
|
|
sly
|
2019-10-12 00:42:32 -04:00
|
|
|
tablist
|
2019-12-19 14:09:55 -05:00
|
|
|
tar-mode
|
2019-07-26 03:09:59 +02:00
|
|
|
(term term ansi-term multi-term)
|
2019-02-16 19:04:45 -05:00
|
|
|
tetris
|
2018-09-16 10:38:12 -04:00
|
|
|
tide
|
|
|
|
transmission
|
|
|
|
typescript-mode
|
|
|
|
vc-annotate
|
|
|
|
vc-dir
|
|
|
|
vc-git
|
|
|
|
vdiff
|
|
|
|
view
|
|
|
|
vlf
|
2019-07-08 13:51:11 +02:00
|
|
|
vterm
|
2019-02-16 19:04:45 -05:00
|
|
|
w3m
|
2018-09-16 10:38:12 -04:00
|
|
|
wdired
|
|
|
|
wgrep
|
2019-02-16 19:04:45 -05:00
|
|
|
which-key
|
2018-09-16 10:38:12 -04:00
|
|
|
woman
|
|
|
|
xref
|
|
|
|
youtube-dl
|
|
|
|
(ztree ztree-diff)))
|
|
|
|
|
2019-07-26 03:09:59 +02:00
|
|
|
(defun +evil-collection-init (module &optional disabled-list)
|
2019-05-17 20:23:52 -04:00
|
|
|
"Initialize evil-collection-MODULE.
|
|
|
|
|
|
|
|
Unlike `evil-collection-init', this respects `+evil-collection-disabled-list',
|
|
|
|
and complains if a module is loaded too early (during startup)."
|
2019-07-26 03:09:59 +02:00
|
|
|
(unless (memq (or (car-safe module) module) disabled-list)
|
|
|
|
(doom-log "Initialized evil-collection-%s %s"
|
|
|
|
(or (car-safe module) module)
|
|
|
|
(if doom-init-time "" "(too early!)"))
|
2018-09-18 18:15:58 -04:00
|
|
|
(with-demoted-errors "evil-collection error: %s"
|
|
|
|
(evil-collection-init (list module)))))
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
2019-05-17 20:23:52 -04:00
|
|
|
;;; Bootstrap
|
2018-09-18 18:15:58 -04:00
|
|
|
|
|
|
|
;; These modes belong to packages that Emacs always loads at startup, causing
|
|
|
|
;; evil-collection to load immediately. We avoid this by loading them after
|
|
|
|
;; evil-collection has first loaded...
|
2019-07-26 03:09:59 +02:00
|
|
|
(with-eval-after-load 'evil-collection
|
|
|
|
(mapc #'+evil-collection-init '(comint custom help)))
|
2018-09-18 18:15:58 -04:00
|
|
|
|
|
|
|
;; ...or on first invokation of their associated major/minor modes.
|
|
|
|
(add-transient-hook! 'Buffer-menu-mode
|
|
|
|
(+evil-collection-init '(buff-menu "buff-menu")))
|
|
|
|
(add-transient-hook! 'image-mode
|
|
|
|
(+evil-collection-init 'image))
|
|
|
|
(add-transient-hook! 'emacs-lisp-mode
|
|
|
|
(+evil-collection-init 'elisp-mode))
|
|
|
|
(add-transient-hook! 'occur-mode
|
2020-01-20 20:17:28 -05:00
|
|
|
(+evil-collection-init 'occur))
|
2018-09-18 18:15:58 -04:00
|
|
|
|
2019-02-26 21:30:51 -05:00
|
|
|
(evil-define-key* 'normal process-menu-mode-map
|
2019-05-30 18:54:58 -07:00
|
|
|
"q" #'kill-current-buffer
|
2019-02-26 21:30:51 -05:00
|
|
|
"d" #'process-menu-delete-process)
|
|
|
|
|
2019-10-21 06:16:43 -04:00
|
|
|
;; Don't overwrite the leader keys
|
|
|
|
(setq evil-collection-key-blacklist
|
|
|
|
(list doom-leader-key doom-localleader-key
|
|
|
|
doom-leader-alt-key doom-localleader-alt-key))
|
|
|
|
|
2019-12-31 19:17:55 -05:00
|
|
|
;; HACK Do this ourselves because evil-collection break's `eval-after-load' load
|
|
|
|
;; order by loading their target plugin before applying keys. It'd be too
|
|
|
|
;; much work to accommodate this eveywhere we want to bind our own evil
|
|
|
|
;; keybinds.
|
2018-06-27 03:05:47 +02:00
|
|
|
(dolist (mode evil-collection-mode-list)
|
|
|
|
(dolist (req (or (cdr-safe mode) (list mode)))
|
|
|
|
(with-eval-after-load req
|
2019-09-20 01:22:25 -04:00
|
|
|
(+evil-collection-init mode +evil-collection-disabled-list))))
|