aboutsummaryrefslogtreecommitdiff
path: root/.config/emacs/lisp/evil-collection
diff options
context:
space:
mode:
Diffstat (limited to '.config/emacs/lisp/evil-collection')
-rw-r--r--.config/emacs/lisp/evil-collection/.github/PULL_REQUEST_TEMPLATE.md21
-rw-r--r--.config/emacs/lisp/evil-collection/.github/workflows/build.yaml51
-rw-r--r--.config/emacs/lisp/evil-collection/.gitignore4
-rw-r--r--.config/emacs/lisp/evil-collection/Cask12
-rw-r--r--.config/emacs/lisp/evil-collection/Eask47
-rw-r--r--.config/emacs/lisp/evil-collection/LICENSE674
-rwxr-xr-x.config/emacs/lisp/evil-collection/Makefile22
-rw-r--r--.config/emacs/lisp/evil-collection/README.org821
-rw-r--r--.config/emacs/lisp/evil-collection/evil-collection.el1129
-rw-r--r--.config/emacs/lisp/evil-collection/modes/.nosearch0
-rw-r--r--.config/emacs/lisp/evil-collection/modes/2048-game/evil-collection-2048-game.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ag/README.org22
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ag/evil-collection-ag.el63
-rw-r--r--.config/emacs/lisp/evil-collection/modes/agent-shell/README.org137
-rw-r--r--.config/emacs/lisp/evil-collection/modes/agent-shell/evil-collection-agent-shell.el254
-rw-r--r--.config/emacs/lisp/evil-collection/modes/alchemist/evil-collection-alchemist.el114
-rw-r--r--.config/emacs/lisp/evil-collection/modes/anaconda-mode/evil-collection-anaconda-mode.el66
-rw-r--r--.config/emacs/lisp/evil-collection/modes/apropos/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/apropos/evil-collection-apropos.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/arc-mode/README.org30
-rw-r--r--.config/emacs/lisp/evil-collection/modes/arc-mode/evil-collection-arc-mode.el78
-rw-r--r--.config/emacs/lisp/evil-collection/modes/atomic-chrome/evil-collection-atomic-chrome.el42
-rw-r--r--.config/emacs/lisp/evil-collection/modes/auto-package-update/evil-collection-auto-package-update.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/beginend/evil-collection-beginend.el125
-rw-r--r--.config/emacs/lisp/evil-collection/modes/bluetooth/evil-collection-bluetooth.el59
-rw-r--r--.config/emacs/lisp/evil-collection/modes/bm/evil-collection-bm.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/bookmark/README.org36
-rw-r--r--.config/emacs/lisp/evil-collection/modes/bookmark/evil-collection-bookmark.el78
-rw-r--r--.config/emacs/lisp/evil-collection/modes/buff-menu/README.org35
-rw-r--r--.config/emacs/lisp/evil-collection/modes/buff-menu/evil-collection-buff-menu.el78
-rw-r--r--.config/emacs/lisp/evil-collection/modes/bufler/evil-collection-bufler.el57
-rw-r--r--.config/emacs/lisp/evil-collection/modes/calc/README.org52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/calc/evil-collection-calc.el172
-rw-r--r--.config/emacs/lisp/evil-collection/modes/calendar/README.org63
-rw-r--r--.config/emacs/lisp/evil-collection/modes/calendar/evil-collection-calendar.el146
-rw-r--r--.config/emacs/lisp/evil-collection/modes/cider/README.org164
-rw-r--r--.config/emacs/lisp/evil-collection/modes/cider/evil-collection-cider.el253
-rw-r--r--.config/emacs/lisp/evil-collection/modes/citre/evil-collection-citre.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/cmake-mode/README.org13
-rw-r--r--.config/emacs/lisp/evil-collection/modes/cmake-mode/evil-collection-cmake-mode.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/color-rg/evil-collection-color-rg.el71
-rw-r--r--.config/emacs/lisp/evil-collection/modes/comint/README.org29
-rw-r--r--.config/emacs/lisp/evil-collection/modes/comint/evil-collection-comint.el74
-rw-r--r--.config/emacs/lisp/evil-collection/modes/company/README.org51
-rw-r--r--.config/emacs/lisp/evil-collection/modes/company/evil-collection-company.el138
-rw-r--r--.config/emacs/lisp/evil-collection/modes/compile/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/compile/evil-collection-compile.el67
-rw-r--r--.config/emacs/lisp/evil-collection/modes/consult/README.org26
-rw-r--r--.config/emacs/lisp/evil-collection/modes/consult/evil-collection-consult.el123
-rw-r--r--.config/emacs/lisp/evil-collection/modes/corfu/README.org54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/corfu/evil-collection-corfu.el180
-rw-r--r--.config/emacs/lisp/evil-collection/modes/crdt/evil-collection-crdt.el57
-rw-r--r--.config/emacs/lisp/evil-collection/modes/csv/evil-collection-csv.el43
-rw-r--r--.config/emacs/lisp/evil-collection/modes/cus-theme/README.org30
-rw-r--r--.config/emacs/lisp/evil-collection/modes/cus-theme/evil-collection-cus-theme.el65
-rw-r--r--.config/emacs/lisp/evil-collection/modes/custom/README.org16
-rw-r--r--.config/emacs/lisp/evil-collection/modes/custom/evil-collection-custom.el68
-rw-r--r--.config/emacs/lisp/evil-collection/modes/daemons/evil-collection-daemons.el68
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dape/README.org29
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dape/evil-collection-dape.el74
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dashboard/evil-collection-dashboard.el91
-rw-r--r--.config/emacs/lisp/evil-collection/modes/deadgrep/README.org24
-rw-r--r--.config/emacs/lisp/evil-collection/modes/deadgrep/evil-collection-deadgrep.el64
-rw-r--r--.config/emacs/lisp/evil-collection/modes/debbugs/evil-collection-debbugs.el81
-rw-r--r--.config/emacs/lisp/evil-collection/modes/debug/README.org26
-rw-r--r--.config/emacs/lisp/evil-collection/modes/debug/evil-collection-debug.el79
-rw-r--r--.config/emacs/lisp/evil-collection/modes/devdocs/evil-collection-devdocs.el66
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dictionary/evil-collection-dictionary.el51
-rw-r--r--.config/emacs/lisp/evil-collection/modes/diff-hl/README.org29
-rw-r--r--.config/emacs/lisp/evil-collection/modes/diff-hl/evil-collection-diff-hl.el75
-rw-r--r--.config/emacs/lisp/evil-collection/modes/diff-mode/README.org66
-rw-r--r--.config/emacs/lisp/evil-collection/modes/diff-mode/evil-collection-diff-mode.el222
-rw-r--r--.config/emacs/lisp/evil-collection/modes/difftastic/README.org20
-rw-r--r--.config/emacs/lisp/evil-collection/modes/difftastic/evil-collection-difftastic.el57
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dired-sidebar/evil-collection-dired-sidebar.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dired/README.org40
-rw-r--r--.config/emacs/lisp/evil-collection/modes/dired/evil-collection-dired.el224
-rw-r--r--.config/emacs/lisp/evil-collection/modes/disk-usage/evil-collection-disk-usage.el89
-rw-r--r--.config/emacs/lisp/evil-collection/modes/distel/evil-collection-distel.el81
-rw-r--r--.config/emacs/lisp/evil-collection/modes/doc-view/README.org42
-rw-r--r--.config/emacs/lisp/evil-collection/modes/doc-view/evil-collection-doc-view.el89
-rw-r--r--.config/emacs/lisp/evil-collection/modes/docker/evil-collection-docker.el89
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eat/README.org37
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eat/evil-collection-eat.el124
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ebib/evil-collection-ebib.el77
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ebuku/evil-collection-ebuku.el63
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eca/evil-collection-eca.el56
-rw-r--r--.config/emacs/lisp/evil-collection/modes/edbi/evil-collection-edbi.el108
-rw-r--r--.config/emacs/lisp/evil-collection/modes/edebug/README.org53
-rw-r--r--.config/emacs/lisp/evil-collection/modes/edebug/evil-collection-edebug.el126
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ediff/README.org21
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ediff/evil-collection-ediff.el205
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eglot/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eglot/evil-collection-eglot.el50
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eldoc/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eldoc/evil-collection-eldoc.el67
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elfeed/README.org64
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elfeed/evil-collection-elfeed.el139
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elisp-mode/README.org23
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elisp-mode/evil-collection-elisp-mode.el99
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elisp-refs/README.org12
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elisp-refs/evil-collection-elisp-refs.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/README.org11
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/evil-collection-elisp-slime-nav.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/elpaca/evil-collection-elpaca.el118
-rw-r--r--.config/emacs/lisp/evil-collection/modes/embark/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/embark/evil-collection-embark.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ement/evil-collection-ement.el138
-rw-r--r--.config/emacs/lisp/evil-collection/modes/emms/README.org131
-rw-r--r--.config/emacs/lisp/evil-collection/modes/emms/evil-collection-emms.el266
-rw-r--r--.config/emacs/lisp/evil-collection/modes/emoji/README.org13
-rw-r--r--.config/emacs/lisp/evil-collection/modes/emoji/evil-collection-emoji.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/epa/README.org34
-rw-r--r--.config/emacs/lisp/evil-collection/modes/epa/evil-collection-epa.el71
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ert/README.org24
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ert/evil-collection-ert.el71
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eshell/README.org36
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eshell/evil-collection-eshell.el168
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/README.org16
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/evil-collection-eval-sexp-fu.el61
-rw-r--r--.config/emacs/lisp/evil-collection/modes/evil-mc/README.org49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/evil-mc/evil-collection-evil-mc.el79
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eww/README.org61
-rw-r--r--.config/emacs/lisp/evil-collection/modes/eww/evil-collection-eww.el128
-rw-r--r--.config/emacs/lisp/evil-collection/modes/explain-pause-mode/evil-collection-explain-pause-mode.el50
-rw-r--r--.config/emacs/lisp/evil-collection/modes/fanyi/evil-collection-fanyi.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/finder/README.org13
-rw-r--r--.config/emacs/lisp/evil-collection/modes/finder/evil-collection-finder.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/flycheck/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/flycheck/evil-collection-flycheck.el56
-rw-r--r--.config/emacs/lisp/evil-collection/modes/flymake/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/flymake/evil-collection-flymake.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/forge/README.org44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/forge/evil-collection-forge.el113
-rw-r--r--.config/emacs/lisp/evil-collection/modes/free-keys/evil-collection-free-keys.el53
-rw-r--r--.config/emacs/lisp/evil-collection/modes/fzfa/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/fzfa/evil-collection-fzfa.el111
-rw-r--r--.config/emacs/lisp/evil-collection/modes/geiser/README.org62
-rw-r--r--.config/emacs/lisp/evil-collection/modes/geiser/evil-collection-geiser.el115
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ggtags/evil-collection-ggtags.el104
-rw-r--r--.config/emacs/lisp/evil-collection/modes/git-timemachine/README.org20
-rw-r--r--.config/emacs/lisp/evil-collection/modes/git-timemachine/evil-collection-git-timemachine.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/gited/evil-collection-gited.el157
-rw-r--r--.config/emacs/lisp/evil-collection/modes/gnus/README.org274
-rw-r--r--.config/emacs/lisp/evil-collection/modes/gnus/evil-collection-gnus.el491
-rw-r--r--.config/emacs/lisp/evil-collection/modes/go-mode/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/go-mode/evil-collection-go-mode.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/gptel/README.org47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/gptel/evil-collection-gptel.el82
-rw-r--r--.config/emacs/lisp/evil-collection/modes/grep/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/grep/evil-collection-grep.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/guix/evil-collection-guix.el217
-rw-r--r--.config/emacs/lisp/evil-collection/modes/hackernews/evil-collection-hackernews.el63
-rw-r--r--.config/emacs/lisp/evil-collection/modes/helm/README.org107
-rw-r--r--.config/emacs/lisp/evil-collection/modes/helm/evil-collection-helm.el238
-rw-r--r--.config/emacs/lisp/evil-collection/modes/help/README.org23
-rw-r--r--.config/emacs/lisp/evil-collection/modes/help/evil-collection-help.el80
-rw-r--r--.config/emacs/lisp/evil-collection/modes/helpful/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/helpful/evil-collection-helpful.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/hg-histedit/evil-collection-hg-histedit.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/hideshow/README.org11
-rw-r--r--.config/emacs/lisp/evil-collection/modes/hideshow/evil-collection-hideshow.el45
-rw-r--r--.config/emacs/lisp/evil-collection/modes/hungry-delete/evil-collection-hungry-delete.el60
-rw-r--r--.config/emacs/lisp/evil-collection/modes/hyrolo/evil-collection-hyrolo.el32
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ibuffer/README.org60
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ibuffer/evil-collection-ibuffer.el197
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ielm/README.org22
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ielm/evil-collection-ielm.el60
-rw-r--r--.config/emacs/lisp/evil-collection/modes/image+/evil-collection-image+.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/image-dired/README.org31
-rw-r--r--.config/emacs/lisp/evil-collection/modes/image-dired/evil-collection-image-dired.el74
-rw-r--r--.config/emacs/lisp/evil-collection/modes/image/README.org36
-rw-r--r--.config/emacs/lisp/evil-collection/modes/image/evil-collection-image.el93
-rw-r--r--.config/emacs/lisp/evil-collection/modes/imenu-list/evil-collection-imenu-list.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/imenu/README.org11
-rw-r--r--.config/emacs/lisp/evil-collection/modes/imenu/evil-collection-imenu.el39
-rw-r--r--.config/emacs/lisp/evil-collection/modes/indent/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/indent/evil-collection-indent.el48
-rw-r--r--.config/emacs/lisp/evil-collection/modes/indium/evil-collection-indium.el110
-rw-r--r--.config/emacs/lisp/evil-collection/modes/info/README.org40
-rw-r--r--.config/emacs/lisp/evil-collection/modes/info/evil-collection-info.el110
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ivy/README.org51
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ivy/evil-collection-ivy.el111
-rw-r--r--.config/emacs/lisp/evil-collection/modes/js2-mode/README.org12
-rw-r--r--.config/emacs/lisp/evil-collection/modes/js2-mode/evil-collection-js2-mode.el46
-rw-r--r--.config/emacs/lisp/evil-collection/modes/kmacro/README.org22
-rw-r--r--.config/emacs/lisp/evil-collection/modes/kmacro/evil-collection-kmacro.el58
-rw-r--r--.config/emacs/lisp/evil-collection/modes/kotlin-mode/evil-collection-kotlin-mode.el42
-rw-r--r--.config/emacs/lisp/evil-collection/modes/leetcode/evil-collection-leetcode.el46
-rw-r--r--.config/emacs/lisp/evil-collection/modes/lispy/README.org140
-rw-r--r--.config/emacs/lisp/evil-collection/modes/lispy/evil-collection-lispy.el659
-rw-r--r--.config/emacs/lisp/evil-collection/modes/lms/evil-collection-lms.el404
-rw-r--r--.config/emacs/lisp/evil-collection/modes/log-edit/README.org17
-rw-r--r--.config/emacs/lisp/evil-collection/modes/log-edit/evil-collection-log-edit.el57
-rw-r--r--.config/emacs/lisp/evil-collection/modes/log-view/README.org20
-rw-r--r--.config/emacs/lisp/evil-collection/modes/log-view/evil-collection-log-view.el63
-rw-r--r--.config/emacs/lisp/evil-collection/modes/lsp-ui-imenu/evil-collection-lsp-ui-imenu.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/lua-mode/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/lua-mode/evil-collection-lua-mode.el50
-rw-r--r--.config/emacs/lisp/evil-collection/modes/macrostep/README.org13
-rw-r--r--.config/emacs/lisp/evil-collection/modes/macrostep/evil-collection-macrostep.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit-repos/README.org17
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit-repos/evil-collection-magit-repos.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit-section/README.org47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit-section/evil-collection-magit-section.el91
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit-todos/README.org32
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit-todos/evil-collection-magit-todos.el62
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit/README.org212
-rw-r--r--.config/emacs/lisp/evil-collection/modes/magit/evil-collection-magit.el747
-rw-r--r--.config/emacs/lisp/evil-collection/modes/man/README.org22
-rw-r--r--.config/emacs/lisp/evil-collection/modes/man/evil-collection-man.el68
-rw-r--r--.config/emacs/lisp/evil-collection/modes/markdown-mode/README.org14
-rw-r--r--.config/emacs/lisp/evil-collection/modes/markdown-mode/evil-collection-markdown-mode.el50
-rw-r--r--.config/emacs/lisp/evil-collection/modes/message/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/message/evil-collection-message.el46
-rw-r--r--.config/emacs/lisp/evil-collection/modes/minesweeper/evil-collection-minesweeper.el53
-rw-r--r--.config/emacs/lisp/evil-collection/modes/minibuffer/README.org47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/minibuffer/evil-collection-minibuffer.el85
-rw-r--r--.config/emacs/lisp/evil-collection/modes/monky/evil-collection-monky.el129
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mpc/README.org44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mpc/evil-collection-mpc.el80
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mpdel/evil-collection-mpdel.el96
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mpdired/evil-collection-mpdired.el85
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mu4e-conversation/evil-collection-mu4e-conversation.el75
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e-1.8.el435
-rw-r--r--.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e.el344
-rw-r--r--.config/emacs/lisp/evil-collection/modes/neotree/evil-collection-neotree.el101
-rw-r--r--.config/emacs/lisp/evil-collection/modes/newsticker/README.org56
-rw-r--r--.config/emacs/lisp/evil-collection/modes/newsticker/evil-collection-newsticker.el116
-rw-r--r--.config/emacs/lisp/evil-collection/modes/notmuch/README.org142
-rw-r--r--.config/emacs/lisp/evil-collection/modes/notmuch/evil-collection-notmuch.el256
-rw-r--r--.config/emacs/lisp/evil-collection/modes/nov/evil-collection-nov.el67
-rw-r--r--.config/emacs/lisp/evil-collection/modes/omnisharp/evil-collection-omnisharp.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/org-agenda/evil-collection-org-agenda.el147
-rw-r--r--.config/emacs/lisp/evil-collection/modes/org-present/evil-collection-org-present.el65
-rw-r--r--.config/emacs/lisp/evil-collection/modes/org-roam/evil-collection-org-roam.el56
-rw-r--r--.config/emacs/lisp/evil-collection/modes/org/README.org46
-rw-r--r--.config/emacs/lisp/evil-collection/modes/org/evil-collection-org.el87
-rw-r--r--.config/emacs/lisp/evil-collection/modes/osx-dictionary/evil-collection-osx-dictionary.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/outline/README.org39
-rw-r--r--.config/emacs/lisp/evil-collection/modes/outline/evil-collection-outline.el116
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ovpn-mode/evil-collection-ovpn-mode.el56
-rw-r--r--.config/emacs/lisp/evil-collection/modes/p-search/evil-collection-p-search.el85
-rw-r--r--.config/emacs/lisp/evil-collection/modes/p4/evil-collection-p4.el123
-rw-r--r--.config/emacs/lisp/evil-collection/modes/package-menu/README.org22
-rw-r--r--.config/emacs/lisp/evil-collection/modes/package-menu/evil-collection-package-menu.el60
-rw-r--r--.config/emacs/lisp/evil-collection/modes/pass/evil-collection-pass.el102
-rw-r--r--.config/emacs/lisp/evil-collection/modes/pdf/evil-collection-pdf.el320
-rw-r--r--.config/emacs/lisp/evil-collection/modes/popup/README.org12
-rw-r--r--.config/emacs/lisp/evil-collection/modes/popup/evil-collection-popup.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/proced/README.org33
-rw-r--r--.config/emacs/lisp/evil-collection/modes/proced/evil-collection-proced.el88
-rw-r--r--.config/emacs/lisp/evil-collection/modes/process-menu/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/process-menu/evil-collection-process-menu.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/prodigy/evil-collection-prodigy.el86
-rw-r--r--.config/emacs/lisp/evil-collection/modes/profiler/README.org25
-rw-r--r--.config/emacs/lisp/evil-collection/modes/profiler/evil-collection-profiler.el71
-rw-r--r--.config/emacs/lisp/evil-collection/modes/python/README.org17
-rw-r--r--.config/emacs/lisp/evil-collection/modes/python/evil-collection-python.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/quickrun/evil-collection-quickrun.el42
-rw-r--r--.config/emacs/lisp/evil-collection/modes/racer/evil-collection-racer.el48
-rw-r--r--.config/emacs/lisp/evil-collection/modes/racket-describe/evil-collection-racket-describe.el45
-rw-r--r--.config/emacs/lisp/evil-collection/modes/reader/evil-collection-reader.el162
-rw-r--r--.config/emacs/lisp/evil-collection/modes/realgud/evil-collection-realgud.el103
-rw-r--r--.config/emacs/lisp/evil-collection/modes/reftex/README.org75
-rw-r--r--.config/emacs/lisp/evil-collection/modes/reftex/evil-collection-reftex.el174
-rw-r--r--.config/emacs/lisp/evil-collection/modes/replace/README.org34
-rw-r--r--.config/emacs/lisp/evil-collection/modes/replace/evil-collection-replace.el79
-rw-r--r--.config/emacs/lisp/evil-collection/modes/restclient/evil-collection-restclient.el66
-rw-r--r--.config/emacs/lisp/evil-collection/modes/rg/README.org47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/rg/evil-collection-rg.el91
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ripgrep/README.org14
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ripgrep/evil-collection-ripgrep.el48
-rw-r--r--.config/emacs/lisp/evil-collection/modes/rjsx-mode/evil-collection-rjsx-mode.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/robe/evil-collection-robe.el45
-rw-r--r--.config/emacs/lisp/evil-collection/modes/rtags/evil-collection-rtags.el141
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ruby-mode/README.org9
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ruby-mode/evil-collection-ruby-mode.el45
-rw-r--r--.config/emacs/lisp/evil-collection/modes/scheme/README.org17
-rw-r--r--.config/emacs/lisp/evil-collection/modes/scheme/evil-collection-scheme.el47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/scroll-lock/README.org24
-rw-r--r--.config/emacs/lisp/evil-collection/modes/scroll-lock/evil-collection-scroll-lock.el87
-rw-r--r--.config/emacs/lisp/evil-collection/modes/selectrum/README.org43
-rw-r--r--.config/emacs/lisp/evil-collection/modes/selectrum/evil-collection-selectrum.el72
-rw-r--r--.config/emacs/lisp/evil-collection/modes/sh-script/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/sh-script/evil-collection-sh-script.el48
-rw-r--r--.config/emacs/lisp/evil-collection/modes/shell-maker/evil-collection-shell-maker.el65
-rw-r--r--.config/emacs/lisp/evil-collection/modes/shortdoc/README.org20
-rw-r--r--.config/emacs/lisp/evil-collection/modes/shortdoc/evil-collection-shortdoc.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/simple-mpc/evil-collection-simple-mpc.el122
-rw-r--r--.config/emacs/lisp/evil-collection/modes/simple/README.org23
-rw-r--r--.config/emacs/lisp/evil-collection/modes/simple/evil-collection-simple.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/slime/evil-collection-slime.el222
-rw-r--r--.config/emacs/lisp/evil-collection/modes/sly/evil-collection-sly.el276
-rw-r--r--.config/emacs/lisp/evil-collection/modes/smerge-mode/README.org16
-rw-r--r--.config/emacs/lisp/evil-collection/modes/smerge-mode/evil-collection-smerge-mode.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/snake/README.org16
-rw-r--r--.config/emacs/lisp/evil-collection/modes/snake/evil-collection-snake.el50
-rw-r--r--.config/emacs/lisp/evil-collection/modes/so-long/README.org22
-rw-r--r--.config/emacs/lisp/evil-collection/modes/so-long/evil-collection-so-long.el51
-rw-r--r--.config/emacs/lisp/evil-collection/modes/speedbar/README.org61
-rw-r--r--.config/emacs/lisp/evil-collection/modes/speedbar/evil-collection-speedbar.el110
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tab-bar/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tab-bar/evil-collection-tab-bar.el59
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tablist/evil-collection-tablist.el64
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tabulated-list/README.org20
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tabulated-list/evil-collection-tabulated-list.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tar-mode/README.org27
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tar-mode/evil-collection-tar-mode.el81
-rw-r--r--.config/emacs/lisp/evil-collection/modes/telega/evil-collection-telega.el218
-rw-r--r--.config/emacs/lisp/evil-collection/modes/term/README.org55
-rw-r--r--.config/emacs/lisp/evil-collection/modes/term/evil-collection-term.el170
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tetris/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tetris/evil-collection-tetris.el55
-rw-r--r--.config/emacs/lisp/evil-collection/modes/thread/README.org14
-rw-r--r--.config/emacs/lisp/evil-collection/modes/thread/evil-collection-thread.el45
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tide/evil-collection-tide.el64
-rw-r--r--.config/emacs/lisp/evil-collection/modes/timer-list/README.org12
-rw-r--r--.config/emacs/lisp/evil-collection/modes/timer-list/evil-collection-timer-list.el43
-rw-r--r--.config/emacs/lisp/evil-collection/modes/transmission/evil-collection-transmission.el163
-rw-r--r--.config/emacs/lisp/evil-collection/modes/trashed/evil-collection-trashed.el87
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tuareg/README.org9
-rw-r--r--.config/emacs/lisp/evil-collection/modes/tuareg/evil-collection-tuareg.el44
-rw-r--r--.config/emacs/lisp/evil-collection/modes/typescript-mode/README.org13
-rw-r--r--.config/emacs/lisp/evil-collection/modes/typescript-mode/evil-collection-typescript-mode.el46
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ultra-scroll/evil-collection-ultra-scroll.el58
-rw-r--r--.config/emacs/lisp/evil-collection/modes/unimpaired/evil-collection-unimpaired.el313
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vc-annotate/README.org23
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vc-annotate/evil-collection-vc-annotate.el59
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vc-dir/README.org47
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vc-dir/evil-collection-vc-dir.el113
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vc-git/README.org16
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vc-git/evil-collection-vc-git.el48
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vdiff/README.org18
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vdiff/evil-collection-vdiff.el54
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vertico/README.org40
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vertico/evil-collection-vertico.el68
-rw-r--r--.config/emacs/lisp/evil-collection/modes/view/README.org14
-rw-r--r--.config/emacs/lisp/evil-collection/modes/view/evil-collection-view.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vlf/README.org46
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vlf/evil-collection-vlf.el86
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vterm/README.org55
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vterm/evil-collection-vterm.el308
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vundo/README.org31
-rw-r--r--.config/emacs/lisp/evil-collection/modes/vundo/evil-collection-vundo.el93
-rw-r--r--.config/emacs/lisp/evil-collection/modes/w3m/evil-collection-w3m.el87
-rw-r--r--.config/emacs/lisp/evil-collection/modes/wdired/README.org14
-rw-r--r--.config/emacs/lisp/evil-collection/modes/wdired/evil-collection-wdired.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/wgrep/README.org19
-rw-r--r--.config/emacs/lisp/evil-collection/modes/wgrep/evil-collection-wgrep.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/which-key/README.org17
-rw-r--r--.config/emacs/lisp/evil-collection/modes/which-key/evil-collection-which-key.el52
-rw-r--r--.config/emacs/lisp/evil-collection/modes/with-editor/README.org17
-rw-r--r--.config/emacs/lisp/evil-collection/modes/with-editor/evil-collection-with-editor.el45
-rw-r--r--.config/emacs/lisp/evil-collection/modes/woman/README.org13
-rw-r--r--.config/emacs/lisp/evil-collection/modes/woman/evil-collection-woman.el51
-rw-r--r--.config/emacs/lisp/evil-collection/modes/xref/README.org26
-rw-r--r--.config/emacs/lisp/evil-collection/modes/xref/evil-collection-xref.el76
-rw-r--r--.config/emacs/lisp/evil-collection/modes/xwidget/README.org43
-rw-r--r--.config/emacs/lisp/evil-collection/modes/xwidget/evil-collection-xwidget.el184
-rw-r--r--.config/emacs/lisp/evil-collection/modes/yaml-mode/README.org15
-rw-r--r--.config/emacs/lisp/evil-collection/modes/yaml-mode/evil-collection-yaml-mode.el42
-rw-r--r--.config/emacs/lisp/evil-collection/modes/youtube-dl/evil-collection-youtube-dl.el67
-rw-r--r--.config/emacs/lisp/evil-collection/modes/zmusic/evil-collection-zmusic.el49
-rw-r--r--.config/emacs/lisp/evil-collection/modes/ztree/evil-collection-ztree.el68
-rw-r--r--.config/emacs/lisp/evil-collection/test/evil-collection-magit-tests.el112
-rw-r--r--.config/emacs/lisp/evil-collection/test/evil-collection-test.el41
-rw-r--r--.config/emacs/lisp/evil-collection/test/test-helper.el9
-rw-r--r--.config/emacs/lisp/evil-collection/yasnippet_evil-collection45
369 files changed, 29938 insertions, 0 deletions
diff --git a/.config/emacs/lisp/evil-collection/.github/PULL_REQUEST_TEMPLATE.md b/.config/emacs/lisp/evil-collection/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..748fcae
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,21 @@
+### Brief summary of what the package does
+
+[Please write a quick summary of the package.]
+
+### Direct link to the package repository
+
+https://github.com/your/awesome_package
+
+### Checklist
+
+<!-- Please confirm with `x`: -->
+
+Assume you're working on `mpc` mode:
+
+- [ ] byte-compiles cleanly
+- [ ] `M-x checkdoc` is happy. Don't manually write `(provide 'evil-collection-mpc)`, `M-x checkdoc` can do it automatically for you
+- [ ] define `evil-collection-mpc-setup` with `defun`
+- [ ] define `evil-collection-mpc-mode-maps` with `defconst`
+- [ ] All functions should start with `evil-collection-mpc-`
+
+<!-- After submitting, please fix any problems the CI reports. -->
diff --git a/.config/emacs/lisp/evil-collection/.github/workflows/build.yaml b/.config/emacs/lisp/evil-collection/.github/workflows/build.yaml
new file mode 100644
index 0000000..37d6e78
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/.github/workflows/build.yaml
@@ -0,0 +1,51 @@
+name: evil-collection builds
+
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches:
+ - master
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check:
+ runs-on: ${{ matrix.os }}
+ continue-on-error: ${{ matrix.experimental }}
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ emacs-version:
+ - 28.2
+ - 29.4
+ - 30.1
+ experimental: [false]
+ include:
+ - os: ubuntu-latest
+ emacs-version: snapshot
+ experimental: true
+ - os: macos-latest
+ emacs-version: snapshot
+ experimental: true
+ steps:
+ - uses: jcs090218/setup-emacs@master
+ with:
+ version: ${{ matrix.emacs-version }}
+
+ - uses: actions/checkout@v4
+
+ - name: Print emacs version
+ run: emacs --version
+
+ - uses: emacs-eask/setup-eask@master
+ with:
+ version: snapshot
+
+ - run: make install
+ - run: make compile
+ - run: make lint
+ - run: make test
diff --git a/.config/emacs/lisp/evil-collection/.gitignore b/.config/emacs/lisp/evil-collection/.gitignore
new file mode 100644
index 0000000..5824339
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/.gitignore
@@ -0,0 +1,4 @@
+/.cask
+/.eask
+/dist
+*.elc
diff --git a/.config/emacs/lisp/evil-collection/Cask b/.config/emacs/lisp/evil-collection/Cask
new file mode 100644
index 0000000..c9db627
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/Cask
@@ -0,0 +1,12 @@
+(source gnu)
+(source melpa)
+
+(package-file "evil-collection.el")
+
+(development
+ (depends-on "evil")
+ (depends-on "f")
+ (depends-on "ert-runner")
+ (depends-on "package-lint")
+ (depends-on "annalist")
+ (depends-on "magit"))
diff --git a/.config/emacs/lisp/evil-collection/Eask b/.config/emacs/lisp/evil-collection/Eask
new file mode 100644
index 0000000..8f4de82
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/Eask
@@ -0,0 +1,47 @@
+;; -*- mode: eask; lexical-binding: t -*-
+
+(package "evil-collection"
+ "0.0.2"
+ "A set of keybindings for Evil mode")
+
+(website-url "https://github.com/emacs-evil/evil-collection")
+(keywords "evil" "tools")
+
+(package-file "evil-collection.el")
+(files "modes/*/*.el" '(:exclude "modes/magit/*.el" "modes/magit-repos/*.el"))
+
+(script "test" "echo \"Error: no test specified\" && exit 1")
+
+(source 'gnu)
+(source 'melpa)
+
+(depends-on "emacs" "27.2")
+(depends-on "evil")
+
+(development
+ (depends-on "f")
+ (depends-on "ert-runner")
+ (depends-on "package-lint")
+ (depends-on "annalist")
+ (depends-on "magit"))
+
+(setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432
+
+;; Workaround for https://github.com/magit/magit/issues/5489
+(setq magit-credential-cache-daemon-socket nil)
+
+(add-hook 'eask-before-compile-hook
+ (lambda (&rest _)
+ (setq evil-want-integration nil)
+ (setq evil-want-keybinding nil)
+ (setq byte-compile-docstring-max-column 200)
+ (setq byte-compile-error-on-warn t)))
+
+(add-hook 'eask-before-lint/package-hook
+ (lambda (&rest _)
+ (advice-add 'package-lint--error-at-bol :around 'ignore) ; ignore headers
+ (advice-add 'package-lint--check-eval-after-load :around 'ignore)
+ (advice-add 'package-lint--check-version-regexp-list :around 'ignore)
+ (advice-add 'package-lint--check-symbol-separators :around 'ignore)
+ (advice-add 'package-lint--check-defs-prefix :around 'ignore)
+ (advice-add 'package-lint--check-provide-form :around 'ignore)))
diff --git a/.config/emacs/lisp/evil-collection/LICENSE b/.config/emacs/lisp/evil-collection/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/.config/emacs/lisp/evil-collection/Makefile b/.config/emacs/lisp/evil-collection/Makefile
new file mode 100755
index 0000000..46a80d6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/Makefile
@@ -0,0 +1,22 @@
+EASK ?= eask
+
+compile:
+ $(EASK) compile
+
+install:
+ $(EASK) install-deps --dev
+
+lint:
+ $(EASK) lint package
+
+test: install
+ $(EASK) test ert ./test/evil-collection-test.el
+
+magit-test: install
+ $(EASK) test ert ./test/evil-collection-magit-tests.el
+
+.PHONY: compile lint test
+
+# Local Variables:
+# tab-width: 8
+# End:
diff --git a/.config/emacs/lisp/evil-collection/README.org b/.config/emacs/lisp/evil-collection/README.org
new file mode 100644
index 0000000..a2b5aca
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/README.org
@@ -0,0 +1,821 @@
+#+TITLE: Evil Collection
+#+STARTUP: noindent
+
+[[https://github.com/emacs-evil/evil-collection/actions][file:https://github.com/emacs-evil/evil-collection/actions/workflows/build.yaml/badge.svg?branch=master]]
+[[https://melpa.org/#/evil-collection][file:https://melpa.org/packages/evil-collection-badge.svg]]
+[[https://stable.melpa.org/#/evil-collection][file:https://stable.melpa.org/packages/evil-collection-badge.svg]]
+
+This is a collection of [[https://github.com/emacs-evil/evil][Evil]] bindings for /the parts of Emacs/ that Evil does
+not cover properly by default, such as ~help-mode~, ~M-x calendar~, Eshell and
+more.
+
+*Warning:* Expect some default bindings to change in the future.
+
+** Preliminaries
+
+1. ~evil-overriding-maps~ is assumed as ~nil~ to reduce redundant ~w/W/l/f/t~
+ etc evil bindings. See [[https://github.com/emacs-evil/evil-collection/pull/501][Fixup Info-mode]] for example.
+
+** Goals
+
+1. Reduce context switching: As soon as "moving around" gets hardwired
+ to ~<hjkl>~, it becomes frustratingly inefficient not to have it everywhere.
+
+2. Community work: setting up bindings is tremendous work and joining force can
+ only save hours for all of Evil users out there. While not everyone may agree
+ on the chosen bindings, it helps to have something to start with rather than
+ nothing at all. In the end, users are free to override a subset of the proposed
+ bindings to best fit their needs.
+
+3. Consistency: Having all bindings defined in one place allows for enforcing
+ consistency across special modes and coordinating the community work to define a
+ reference implementation.
+
+** Installation
+
+- Get the package, either from MELPA:
+
+ : M-x package-install RET evil-collection RET
+
+ Or clone / download this repository and modify your ~load-path~:
+
+ : (add-to-list 'load-path (expand-file-name "/path/to/evil-collection/" user-emacs-directory))
+
+- Register the bindings, either all at once with
+
+ : (evil-collection-init)
+
+ or mode-by-mode, for instance:
+
+ : (with-eval-after-load 'calendar (evil-collection-calendar-setup))
+
+ or by providing an argument to ~evil-collection-init~:
+
+ : (evil-collection-init 'calendar)
+
+ a list can also be provided to ~evil-collection-init~:
+
+ : (evil-collection-init '(calendar dired calc ediff))
+
+ The list of supported modes is configured by ~evil-collection-mode-list~.
+
+~evil-collection~ assumes ~evil-want-keybinding~ is set to ~nil~ and
+~evil-want-integration~ is set to ~t~ before loading ~evil~ and
+~evil-collection~. Note some other packages may load evil (e.g. evil-leader) so
+bear that in mind when determining when to set the variables.
+
+See https://github.com/emacs-evil/evil-collection/issues/60 and https://github.com/emacs-evil/evil/pull/1087
+for more details.
+
+For example:
+
+#+begin_src emacs-lisp :tangle yes
+(setq evil-want-integration t) ;; This is optional since it's already set to t by default.
+(setq evil-want-keybinding nil)
+(require 'evil)
+(when (require 'evil-collection nil t)
+ (evil-collection-init))
+#+end_src
+
+Here's another full TLDR ~use-package~ example.
+
+#+begin_src emacs-lisp :tangle yes
+(use-package evil
+ :ensure t
+ :init
+ (setq evil-want-integration t) ;; This is optional since it's already set to t by default.
+ (setq evil-want-keybinding nil)
+ :config
+ (evil-mode 1))
+
+(use-package evil-collection
+ :after evil
+ :ensure t
+ :config
+ (evil-collection-init))
+#+end_src
+
+NOTE: If you don't like surprises but still want to use ~evil-collection-init~, setting ~evil-collection-mode-list~ to nil
+and adding each mode manually might be a better option.
+
+** Configuration
+Modify ~evil-collection-mode-list~ to disable or add any modes that should be
+evilified by ~evil-collection~.
+
+| Variable | Default | Description |
+|--------------------------------------------+---------+-------------------------------------------------------------------|
+| evil-collection-calendar-want-org-bindings | nil | Set up Org functions in calendar keymap. |
+| evil-collection-outline-bind-tab-p | nil | Enable <tab>-based bindings in Outline mode. |
+| evil-collection-term-sync-state-and-mode-p | t | Synchronize insert/normal state with char/line-mode in term-mode. |
+| evil-collection-setup-minibuffer | nil | Set up Vim style bindings in the minibuffer. |
+| evil-collection-setup-debugger-keys | t | Set up debugger keys for certain modes. |
+| evil-collection-want-unimpaired-p | t | Set up unimpaired bindings globally. |
+| evil-collection-want-find-usages-bindings | t | Bind -find references-, etc to various modes. |
+| evil-collection-config | * | List of mode specific configurations. |
+| evil-collection-key-whitelist | nil | List of keys Evil Collection is allowed to bind to. |
+| evil-collection-key-blacklist | nil | List of keys Evil Collection is not allowed to bind to. |
+| evil-collection-state-passlist | nil | List of Evil States Evil Collection is allowed to bind to. |
+| evil-collection-state-denylist | nil | List of Evil States Evil Collection is not allowed to bind to. |
+
+For example, if you want to enable Evil in the minibuffer, you'll have to turn
+it on explicitly by customizing ~evil-collection-setup-minibuffer~ to ~t~. Some
+minibuffer-related packages such as Helm rely on this option.
+
+~use-package~ example:
+
+#+begin_src emacs-lisp :tangle yes
+(use-package evil-collection
+ :custom (evil-collection-setup-minibuffer t)
+ :init (evil-collection-init))
+#+end_src
+
+~evil-collection-config~ can also be modified to configure specific modes.
+At the moment, it can be used to defer binding keys to those specific modes
+in order to improve startup time.
+
+** Guidelines
+
+The following rules serve as guiding principles to define the set of standard
+Evil bindings for various modes. Since special modes are by definition
+structurally incomparable, those rules cannot be expected to be applied
+universally.
+
+The rules are more-or-less sorted by priority.
+
+1. Don't bind anything to ~:~ nor ~<escape>~.
+
+2. Keep the movement keys when possible and sensible.
+
+ - ~h~, ~j~, ~k~, ~l~
+ - ~w~, ~W~, ~b~, ~B~, ~e~, ~E~, ~ge~, ~gE~
+ - ~f~, ~F~, ~t~, ~T~, ~;~, =,=
+ - ~gg~, ~G~
+ - ~|~
+ - ~(~, ~)~
+ - ~{~, ~}~
+ - ~%~
+ - ~+~, ~-~, ~0~, ~^~, ~$~
+ - ~C-i~, ~C-o~
+
+3. Keep the yanking and register keys when possible and sensible.
+
+ - ~y~, ~Y~
+ - ="=
+
+4. Keep the search keys when possible and sensible.
+
+ - ~/~, ~?~
+ - ~#~, ~*~
+
+5. Keep the mark keys when possible and sensible.
+
+ - ~m~
+ - ='=, =~=
+
+6. Keep the windowing keys when possible and sensible.
+
+ - ~H~, ~L~, ~M~
+ - ~C-e~, ~C-y~
+ - ~C-f~, ~C-b~
+ - ~C-d~, ~C-u~
+ - ~C-w~-prefixed bindings.
+ - Some ~z~-prefixed bindings (see below).
+
+7. The following keys are free when insert state does not make sense in the
+ current mode:
+
+ - ~a~, ~A~, ~i~, ~I~
+ - ~c~, ~C~, ~r~, ~R~, ~s~, ~S~
+ - ~d~, ~D~, ~x~, ~X~
+ - ~o~, ~O~
+ - ~p~, ~P~
+ - ~=~, ~<~, ~>~
+ - ~J~
+ - =~=
+
+ Any of those keys can be set to be a prefix key.
+
+8. Prefix keys: ~g~ and ~z~ are the ubiquitous prefix keys.
+
+ - ~g~ generally stands for "go" and is best used for movements.
+ - ~z~ is used for scrolling, folding, spell-checking and more.
+
+9. Macro and action keys
+
+ - ~@~, ~q~
+ - ~.~
+
+10. Ensure terminal compatibility without sacrificing GUI key bindings.
+ - Tab key
+ - Tab key is recognized as ~<tab>~ in GUI and ~TAB~ in terminal.
+ ~TAB~ equals ~C-i~.
+ - ~C-i~ is bound to jumping forward for vim compatibility.
+ If Shift+Tab is not relevant, just bind ~g TAB~ to the function
+ that Tab is bound to. If Shift+Tab is relevant, bind ~g]~ and
+ ~g TAB~ to the function that Tab is bound to, and bind ~g[~ to
+ the function that Shift+Tab is bound to for terminal compatibility.
+ - Enter key
+ - Enter key is recognized as ~<return>~ in GUI and ~RET~ in terminal.
+ ~RET~ equals ~Ctrl+m~.
+ - Bind only ~RET~ and ~M-RET~. Or, bind ~RET~ and ~M-RET~ to the same
+ functions ~<return>~ and ~<M-return>~ are bound to.
+ - ~S-RET~ is impossible on terminal. Bind ~<S-return>~ and a vacant key
+ to the same function for terminal compatibility.
+
+** Rationale
+
+Many special modes share the same set of similar actions. Those actions should
+share the same bindings across all modes whenever feasible.
+
+*** Motion (~[~, ~]~, ~{~, ~}~, ~(~, ~)~, ~gj~, ~gk~, ~C-j~, ~C-k~)
+
+- ~[~ and ~]~: Use ~[-~ and ~]-~ prefixed keys for navigation between sections.
+
+ If the mode makes no difference between the end of a section and the beginning
+ of the next, use ~[~ and ~]~.
+
+- ~gj~ and ~gk~: synonym for ~[~ and ~]~. That's what [[evilmagit][evil-magit]] does.
+
+ *Question:* Should ~gj~ / ~gk~ rather be synonyms for ~C-j~ / ~C-k~? They cannot
+ emulate the behaviour of ~[]~ or ~][~.
+
+ - ~C-j~, ~C-k~: If there is granularity, i.e. subsections, use ~C-j~ and ~C-k~
+ to browse them. This reflects [[evilmagit][evil-magit]] and [[evilmu4e][evil-mu4e]] default
+ bindings.
+
+ - ~{~, ~}~: If there is no paragraph structure, ~{~ and ~}~ can be used for sub-sectioning.
+
+ - ~(~, ~)~: If there is no sentence structure, ~(~ and ~)~ can be used for sub-sectioning.
+
+ - ~HJKL~: ~hjkl~ can be used for atomic movements, but ~HJKL~ can usually not be used
+ because ~H~, ~K~ and ~L~ are all universal (~J~ is ~evil-join~ and usually
+ does not make sense in special modes).
+
+ - ~C-h~ should not be remapped: Since we have ~C-j~ and ~C-k~ for vertical motion, it would
+ make sense to use ~C-h~ and ~C-l~ for horizontal motion. There are some
+ shortcomings though:
+
+ - In Vim, ~C-h~ works as backspace, but Evil does not follow that behaviour.
+
+ - In Emacs, it is a prefix key for all help-related commands, and so is ~<f1>~.
+
+ - Most importantly, ~C-h~ is too widespread and ubiquitous to be replaced.
+ So we don't.
+
+ - ~C-l~: As a consequence of the former point, ~C-l~ is available.
+
+ - ~M-<hjkl>~: Those keys are usually free in Evil but still bound to their Emacs
+ default (e.g. ~M-l~ is ~downcase-word~). Besides, if ~C-j~ and ~C-k~ are
+ already used, having ~M-j~ and ~M-k~ might add up to the confusion.
+
+*** Quitting (~q~, ~ZQ~, ~ZZ~)
+
+In Vim, ~q~ is for recording macros. Vim quits with ~ZZ~ or ~ZQ~. In most
+Emacs special modes, it stands for quitting while macros are recorded/played
+with ~<f3>~ and ~<f4>~.
+
+A good rule of thumb would be:
+
+- Always bind ~q~, ~ZZ~ and ~ZQ~ to the mode specific quitting functions. If there is none,
+- Bind ~q~ and ~ZZ~ to ~quit-window~
+- Bind ~ZQ~ to ~evil-quit~
+- If macros don't make sense in current mode, then ~@~ is available.
+
+*** Refreshing / Reverting (~gr~)
+
+- ~gr~ is used for refreshing in [[evilmagit][evil-magit]], [[evilmu4e][evil-mu4e]], and some Spacemacs
+ configurations (org-agenda and neotree among others).
+
+- ~C-l~ is traditionally used to refresh the terminal screen. Since there does
+ not seem to be any existing use of it, we leave the binding free for other
+ uses.
+
+*** Marking
+
+~m~ defaults to ~evil-set-marker~ which might not be very useful in special
+modes.
+='= can still be used as it can jump to other buffers.
+
+- ~m~: Mark or toggle mark, depending on what the mode offers. In visual mode,
+ always mark. With a numeric argument, toggle mark on that many following
+ lines.
+
+- ~u~: Unmark current selection.
+
+- ~U~: Unmark all.
+
+- =~=: Toggle all marks. This mirrors the "invert-char" Vim command bound to =~=
+ by default.
+
+- ~M~: Mark all, if available. Otherwise use =U~=.
+
+- ~*~: Mark-prefix or mark all if current mode has no prefix. ~*~ is traditionally a wildcard.
+
+- ~%~: Mark regexp.
+
+- ~x~: Execute action on marks. This mirrors Dired's binding of ~x~.
+
+If ~*~ is used for marking, then ~#~ is free.
+
+Also note that Emacs inconsistently uses ~u~ and ~U~ to unmark.
+
+*** Selecting / Filtering / Narrowing / Searching
+
+- ~s~ and ~S~ seem to be used in some places like [[mu4e][mu4e]].
+
+ - ~s~: [s]elect/[s]earch/filter candidates according to a pattern.
+ - ~S~: Remove filter and select all.
+
+- ~=~ is usually free and its significance is obvious. It's taken for zooming though.
+
+- ~|~ is not free but the pipe symbolic is very tantalizing.
+
+*** Sorting
+
+- ~o~: Change the sort [o]rder.
+- ~O~: Sort in reverse order.
+
+ There is no real consensus around which key to bind to sorting. What others
+ do by default:
+
+ - ~package-menu~ uses ~S~.
+
+ - ~M-x proced~ and Dired use ~s~.
+
+ - ~profiler~ uses ~A~ and ~D~.
+
+ - [[mu4e][mu4e]] uses ~O~.
+
+ - [[http://www.nongnu.org/ranger/][ranger]] uses ~o~, inspired from [[http://mutt.org][Mutt]].
+
+*** Go to definition (~gd~, ~gD~)
+
+- ~gd~: [g]o to [d]efinition. This is mostly for programming modes.
+ If there's a corresponding 'pop' action, use ~C-t~.
+
+*** Go to references, etc (~gr~, ~gA~)
+When ~evil-collection-want-find-usages-bindings~ is set to t:
+
+- ~gr~: [g] to [r]eferences. This binding is also used for refresh/reverting
+ modes in non programming modes but is usually empty for programming modes.
+
+- ~gA~: [g]o to [A]ssignments.
+
+- Additional bindings:
+ There may be additional binds under this category. Please file a Pull Request if so.
+
+*** Go to current entity
+
+- ~.~: go to current entity (day for calendar, playing track for [[EMMS][EMMS]]).
+ Bind only if more relevant than ~evil-repeat~.
+
+*** Open thing at point (~RET~, ~S-RET~, ~M-RET~, ~go~, ~gO~)
+
+- ~RET~, ~S-RET~, ~M-RET~: Open thing at point in current window, open in other
+ window and display in other window respectively. The latter is like the
+ former with the focus remaining on the current window.
+
+- ~go~, ~gO~: When available, same as ~S-RET~ and ~M-RET~ respectively. This is
+ useful in terminals where ~S-RET~ and ~M-RET~ might not work.
+
+*** Emacs-style jumping (~J~)
+
+- ~J~: [[mu4e][mu4e]] has ~j~ and [[evil-mu4e][evil-mu4e]] uses ~J~, so we use ~J~ too.
+
+ Some special modes like [[mu4e][mu4e]] and ibuffer offer to "jump" to a
+ different buffer. This sometimes depends on the thing at point.
+
+ This is not related to Evil jumps like ~C-i~ and ~C-o~, nor to "go to
+ definition".
+
+*** Browse URL (~gx~)
+
+~gx~: go to URL. This is a default Vim binding.
+
+*** Help (~?~)
+
+- ~g?~ : is the standard key for help related commands.
+- ~?~ in places where backward search is not very useful.
+
+*** History browsing (~C-n~, ~C-p~)
+
+~C-n~ and ~C-p~ are standard bindings to browse the history elements.
+
+*** Bookmarking
+
+?
+
+*** REPL (~gz~)
+
+If the mode has a Go To REPL-type command, set it to ~gz~.
+
+*** Zooming (~+~, ~-~, ~=~, ~0~)
+
+- ~+~ and ~-~ have obvious meanings.
+- ~0~ has a somewhat intuitive meaning, plus it is next to ~+~ and ~-~ on QWERTY.
+- ~=~ is useful as a synonym for ~+~ because it is the unshifted key of ~+~ on QWERTY.
+
+*** Debugging
+
+When debugging is on, debugger keys takes the most precedence.
+
+These keys will be set when there's an available command for them.
+
+- ~n~ : Step Over
+- ~i~ : Step Into
+- ~o~ : Step Out
+- ~c~ : Continue/Resume Execution
+- ~L~ : Locals
+- ~t~ : Tracing
+- ~q~ : Quit Debugging
+- ~H~ : Continue until Point
+- ~e~ : Evaluate Expression
+- ~b~ : Set Breakpoint
+- ~u~ : Unset Breakpoint
+- ~>~ : Navigate to Next Frame
+- ~<~ : Navigate to Previous Frame
+- ~g?~ : Help
+- ~J~ : Jump to debugger location
+- ~R~ : Restart
+
+For debugging outside of debugger being on (e.g. setting initial breakpoints),
+we use similar keys to [[https://github.com/realgud/realgud][realgud]].
+
+- ~f5~ Start/Continue/Resume Execution
+- ~S-f5~ Continue Execution
+- ~Mouse-1~ Toggle Breakpoint
+- ~f9~ Toggle Breakpoint
+- ~f10~ Step Over
+- ~f11~ Step Into
+- ~S-f11~ Step Out
+
+*** Editable Buffers
+
+For buffers where insert-state doesn't make sense but buffer can be edited,
+(e.g. wdired or wgrep), pressing ~i~ will change into editable state.
+
+When this editable state is turned on,
+
+~ZQ~ will abort and clear any changes.
+~ZZ~ will finish and save any changes.
+~ESC~ will exit editable state.
+
+*** :q/:wq/etc
+
+Modes with commands that can be bound to :q/:wq/etc will have those keys remapped.
+
+** Key Translation
+
+~evil-collection-translate-key~ allows binding a key to the definition of
+another key in the same keymap (comparable to how Vim's keybindings work). Its
+arguments are the ~states~ and ~keymaps~ to bind/look up the key(s) in followed
+optionally by keyword arguments (currently only ~:destructive~) and
+key/replacement pairs. ~states~ should be nil for non-evil keymaps, and both
+~states~ and ~keymaps~ can be a single symbol or a list of symbols.
+
+This function can be useful for making key swaps/cycles en masse. For example,
+someone who uses an alternate keyboard layout may want to retain the ~hjkl~
+positions for directional movement in dired, the calendar, etc.
+
+Here's an example for Colemak of making swaps in a single keymap:
+
+#+begin_src emacs-lisp
+(evil-collection-translate-key nil 'evil-motion-state-map
+ ;; colemak hnei is qwerty hjkl
+ "n" "j"
+ "e" "k"
+ "i" "l"
+ ;; add back nei
+ "j" "e"
+ "k" "n"
+ "l" "i")
+#+end_src
+
+Here's an example of using ~evil-collection-setup-hook~ to cycle the keys for
+all modes in ~evil-collection-mode-list~:
+
+#+begin_src emacs-lisp
+(defun my-hjkl-rotation (_mode mode-keymaps &rest _rest)
+ (evil-collection-translate-key 'normal mode-keymaps
+ "n" "j"
+ "e" "k"
+ "i" "l"
+ "j" "e"
+ "k" "n"
+ "l" "i"))
+
+;; called after evil-collection makes its keybindings
+(add-hook 'evil-collection-setup-hook #'my-hjkl-rotation)
+
+(evil-collection-init)
+#+end_src
+
+A more common use case of ~evil-collection-translate-key~ would be for keeping
+the functionality of some keys that users may bind globally. For example, ~SPC~,
+~[~, and ~]~ are bound in some modes. If you use these keys as global prefix
+keys that you never want to be overridden, you'll want to give them higher
+priority than other evil keybindings (e.g. those made by ~(evil-define-key
+'normal some-map ...)~). To do this, you can create an "intercept" map and bind
+your prefix keys in it instead of in ~evil-normal-state-map~:
+
+#+begin_src emacs-lisp
+(defvar my-intercept-mode-map (make-sparse-keymap)
+ "High precedence keymap.")
+
+(define-minor-mode my-intercept-mode
+ "Global minor mode for higher precedence evil keybindings."
+ :global t)
+
+(my-intercept-mode)
+
+(dolist (state '(normal visual insert))
+ (evil-make-intercept-map
+ ;; NOTE: This requires an evil version from 2018-03-20 or later
+ (evil-get-auxiliary-keymap my-intercept-mode-map state t t)
+ state))
+
+(evil-define-key 'normal my-intercept-mode-map
+ (kbd "SPC f") 'find-file)
+;; ...
+#+end_src
+
+You can then define replacement keys:
+
+#+begin_src emacs-lisp
+(defun my-prefix-translations (_mode mode-keymaps &rest _rest)
+ (evil-collection-translate-key 'normal mode-keymaps
+ "C-SPC" "SPC"
+ ;; these need to be unbound first; this needs to be in same statement
+ "[" nil
+ "]" nil
+ "[[" "["
+ "]]" "]"))
+
+(add-hook 'evil-collection-setup-hook #'my-prefix-translations)
+
+(evil-collection-init)
+#+end_src
+
+By default, the first invocation of ~evil-collection-translate-key~ will make a
+backup of the keymap. Each subsequent invocation will look up keys in the backup
+instead of the original. This means that a call to
+~evil-collection-translate-key~ will always have the same behavior even if
+evaluated multiple times. When ~:destructive t~ is specified, keys are looked up
+in the keymap as it is currently. This means that a call to
+~evil-collection-translate-key~ that swapped two keys would continue to
+swap/unswap them with each call. Therefore when ~:destructive t~ is used, all
+cycles/swaps must be done within a single call to
+~evil-collection-translate-key~. To make a comparison to Vim keybindings,
+~:destructive t~ is comparable to Vim's ~map~, and ~:destructive nil~ is
+comparable to Vim's ~noremap~ (where the "original" keybindings are those that
+existed in the keymap when ~evil-collection-translate-key~ was first called).
+You'll almost always want to use the default behavior (especially in your init
+file). The limitation of ~:destructive nil~ is that you can't translate a key to
+another key that was defined after the first ~evil-collection-translate-key~, so
+~:destructive t~ may be useful for interactive experimentation.
+
+~evil-collection-swap-key~ is also provided as a wrapper around
+~evil-collection-translate-key~ that allows swapping keys:
+
+#+begin_src emacs-lisp
+(evil-collection-swap-key nil 'evil-motion-state-map
+ ";" ":")
+;; is equivalent to
+(evil-collection-translate-key nil 'evil-motion-state-map
+ ";" ":"
+ ":" ";")
+#+end_src
+
+In some cases, keys are bound through `evil-define-minor-mode-key` and may
+need to be translated using ~evil-collection-translate-minor-mode-key~ and/or
+~evil-collection-swap-minor-mode-key~.
+
+#+begin_src emacs-lisp
+(evil-collection-swap-minor-mode-key '(normal motion)
+ '(evil-snipe-local-mode evil-snipe-override-local-mode)
+ "k" "s"
+ ;; Set this to t to make this swap the keys everytime
+ ;; this expression is evaluated.
+ :destructive nil)
+
+(evil-collection-translate-minor-mode-key
+ '(normal motion)
+ '(evil-snipe-local-mode evil-snipe-override-local-mode)
+ "k" "s"
+ "s" "k"
+ ;; Set this to t to make this swap the keys everytime
+ ;; this expression is evaluated.
+ :destructive nil)
+#+end_src
+
+** Third-party packages
+
+Third-party packages are provided by several parties:
+
+| Major mode | Evil bindings |
+|------------+--------------------------|
+| ledger | [[https://github.com/atheriel/evil-ledger][evil-ledger]] |
+| lispy | [[https://github.com/noctuid/lispyville][lispyville]] or [[https://github.com/sp3ctum/evil-lispy][evil-lispy]] |
+| org | [[https://github.com/GuiltyDolphin/org-evil][org-evil]] or [[https://github.com/Somelauw/evil-org-mode][evil-org]] |
+| markdown | [[https://github.com/Somelauw/evil-markdown][evil-markdown]] |
+
+Also ~evil-collection~ has minimal support (~TAB~, ~S-TAB~ and
+sentence/paragraph forwarding) for ~markdown~ and ~org~ if you prefer less
+packages installed.
+
+Should you know any suitable package not mentioned in this list, let us know and
+file an issue.
+
+Other references:
+
+- [[https://github.com/syl20bnr/spacemacs/blob/master/doc/CONVENTIONS.org#key-bindings-conventions][Spacemacs]]
+- [[https://github.com/doomemacs/doomemacs/tree/master/modules/editor/evil][Doom Emacs]]
+
+** FAQ
+
+*** Making SPC work similarly to [[https://github.com/syl20bnr/spacemacs][spacemacs]].
+
+~evil-collection~ binds over SPC in many packages. To use SPC as a leader key
+with the [[https://github.com/noctuid/general.el][general]] library:
+
+#+begin_src emacs-lisp :tangle yes
+(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 motion)
+ :keymaps 'override
+ "SPC" 'hydra-space/body))
+;; Replace 'hydra-space/body with your leader function.
+#+end_src
+
+See [[https://github.com/noctuid/evil-guide][noctuid's evil guide]] for other approaches.
+
+- Unintialized mode maps in ~evil-collection-setup-hook~.
+ ~evil-collection-setup-hook~ is ran with a list of keymaps passed into it.
+ Some misconfigured modes may not have yet initialized their keymap at this
+ time so the value of the variable may be nil. In that case, an alternative is
+ to use a mode-hook to do any custom settings.
+
+#+begin_src emacs-lisp :tangle yes
+(add-hook 'evil-collection-setup-hook
+ (lambda (_mode keymaps)
+ (add-hook 'ediff-mode-hook
+ (lambda ()
+ (... keymaps ...)))))
+#+end_src
+
+View [[https://github.com/emacs-evil/evil-collection/issues/196][196]] for more info.
+*** Don't allow Evil-Collection to bind some keys.
+Look into ~evil-collection-key-whitelist~ and ~evil-collection-key-blacklist~.
+
+For example:
+
+#+begin_src emacs-lisp :tangle yes
+;; Don't allow Evil Collection to bind to gfu and gfp.
+(setq evil-collection-key-blacklist '("gfu" "gfp"))
+#+end_src
+*** Modes left behind
+
+Some modes might still remain unsupported by this package. Should you be missing
+your ~<hjkl>~, please feel free to do a pull request.
+
+*** Writing a new binding
+
+This [[template][yasnippet template]] can be used to bootstrap a new binding.
+
+For example, if we were to want to add ~evil-collection~ support to ~eldoc~.
+(e.g.) There is a package that contains:
+
+#+begin_src emacs-lisp :tangle yes
+(provide 'eldoc)
+#+end_src
+
+Create a directory named eldoc under [[modes-directory][modes/]]. Create a file
+named evil-collection-eldoc.el under the newly created eldoc directory. Then use
+the above template as an example or, using [[yasnippet][yasnippet]],
+~yas-expand~ the above template which will result in something like below:
+
+#+begin_src emacs-lisp :tangle yes
+;;; evil-collection-eldoc.el --- Bindings for `eldoc' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for eldoc.
+
+;;; Code:
+(require 'evil-collection)
+(require 'eldoc nil t)
+
+(defvar eldoc-mode-map)
+(defconst evil-collection-eldoc-maps '(eldoc-mode-map))
+
+(defun evil-collection-eldoc-setup ()
+ "Set up `evil' bindings for eldoc."
+ (evil-collection-define-key 'normal 'eldoc-mode-map
+ ))
+
+(provide 'evil-collection-eldoc)
+;;; evil-collection-eldoc.el ends here
+#+end_src
+
+Finally, add ~eldoc~ to ~evil-collection--supported-modes~.
+
+#+begin_src emacs-lisp :tangle yes
+(defvar evil-collection--supported-modes
+ `(
+ ;; ...
+ eldoc
+ ;; ...
+ )
+ "List of modes supported by evil-collection. Elements are
+either target mode symbols or lists which `car' is the mode
+symbol and `cdr' the packages to register.")
+#+end_src
+** Submitting Issues
+
+When reproducing issues, you can use this emacs -Q recipe.
+
+#+begin_src emacs-lisp :tangle yes
+(setq user-emacs-directory "~/.emacs.1.d")
+(setq package-user-dir
+ (format "%s/elpa/%s/" user-emacs-directory emacs-major-version))
+
+(setq package-enable-at-startup nil
+ package-archives
+ '(("melpa" . "https://melpa.org/packages/")
+ ("gnu" . "http://elpa.gnu.org/packages/")))
+
+(require 'package)
+(package-initialize)
+(unless (package-installed-p 'use-package)
+ (package-refresh-contents)
+ (package-install 'use-package))
+(require 'use-package)
+(setq use-package-always-ensure t)
+
+(use-package evil
+ :ensure t
+ :init
+ (setq evil-want-keybinding nil)
+ :config
+ (evil-mode 1))
+
+(use-package evil-collection
+ :after evil
+ :ensure t
+ :config
+ (evil-collection-init))
+#+end_src
+
+** Contributing
+We welcome any additional modes that are not already supported.
+
+All bindings in ~evil-collection~ are open to change so if there's a better or
+more consistent binding, please
+[[https://github.com/emacs-evil/evil-collection/issues][open an issue]] or
+[[https://github.com/emacs-evil/evil-collection/pulls][submit a pull request]].
+
+Follow [[https://github.com/bbatsov/emacs-lisp-style-guide/][The Emacs Lisp
+Style Guide]] for coding conventions.
+
+[[https://github.com/erlang/otp/wiki/writing-good-commit-messages][Erlang/OTP]]
+has a good read for helpful commit messages.
+
+#+LINK: EMMS https://www.gnu.org/software/emms/
+#+LINK: evilmagit https://github.com/emacs-evil/evil-magit
+#+LINK: evilmu4e https://github.com/JorisE/evil-mu4e
+#+LINK: mu4e https://www.djcbsoftware.nl/code/mu/mu4e.html
+#+LINK: yasnippet https://github.com/joaotavora/yasnippet
+#+LINK: template https://github.com/emacs-evil/evil-collection/blob/master/yasnippet_evil-collection
+#+LINK: modes-directory https://github.com/emacs-evil/evil-collection/tree/master/modes
diff --git a/.config/emacs/lisp/evil-collection/evil-collection.el b/.config/emacs/lisp/evil-collection/evil-collection.el
new file mode 100644
index 0000000..a7e149a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/evil-collection.el
@@ -0,0 +1,1129 @@
+;;; evil-collection.el --- A set of keybindings for Evil mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2023 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "26.3") (evil "1.2.13"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; A set of keybindings for Evil mode.
+;;
+;; If you want to use Evil in the minibuffer, you'll have to enable it by
+;; setting `evil-collection-setup-minibuffer' to t before loading this package.
+;; This is so because many users find it confusing.
+;; Some minibuffer-related packages such as Helm rely on this option.
+
+;;; Code:
+
+;; `evil' requires `seq-into'?
+;; This require on `seq' before loading `evil 'prevents `evil' from erroring
+;; out with the below message on Emacs 29.
+;; Symbol's function definition is void: seq-into
+;; Looks like this error can be traced through evil ->
+;; Look at the commit that moved this line above `evil' to see the error message.
+;; evil -> evil-vars -> read-kbd-macro -> seq-into -> error.
+;; https://github.com/emacs-evil/evil/issues/1627
+(require 'seq)
+(require 'cl-lib)
+(require 'evil)
+;; `annalist' is optional; only used to record and describe bindings via
+;; `evil-collection-describe-bindings'. Install it to enable that feature.
+(require 'annalist nil t)
+
+(declare-function annalist-record "annalist")
+(declare-function annalist-describe "annalist")
+(declare-function annalist-define-view "annalist")
+(declare-function annalist-string-< "annalist")
+
+(defvar evil-collection-base-dir (file-name-directory load-file-name)
+ "Store the directory evil-collection.el was loaded from.")
+
+(defvar evil-want-integration)
+(defvar evil-want-keybinding)
+
+(defvar evil-collection--startup-warning-flag nil)
+
+(defun evil-collection-maybe-display-startup-warning ()
+ "Warn if `evil-want-keybinding' was not set before loading Evil.
+Runs at most once."
+ (unless evil-collection--startup-warning-flag
+ (setq evil-collection--startup-warning-flag t)
+ (when (featurep 'evil-keybindings)
+ (if evil-want-keybinding
+ (display-warning
+ '(evil-collection)
+ "Make sure to set `evil-want-keybinding' to nil before loading evil \
+or evil-collection.\
+\n
+See https://github.com/emacs-evil/evil-collection/issues/60 for more details.")
+ (display-warning
+ '(evil-collection)
+ "`evil-want-keybinding' was set to nil but not before loading evil.\
+\n
+Make sure to set `evil-want-keybinding' to nil before loading evil \
+or evil-collection.\
+\n
+See https://github.com/emacs-evil/evil-collection/issues/60 for more details.")))))
+
+(unless (featurep 'evil-integration)
+ (message "Requiring evil-integration. Set evil-want-integration to t to\
+ remove this message.\
+\n
+See https://github.com/emacs-evil/evil-collection/issues/60 for more details.")
+ (require 'evil-integration))
+
+(defgroup evil-collection nil
+ "A set of keybindings for Evil mode."
+ :group 'evil)
+
+(defcustom evil-collection-setup-minibuffer nil
+ "Whether to setup Evil bindings in the minibuffer."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defcustom evil-collection-calendar-want-org-bindings nil
+ "Whether to bind Org functions in calendar keymap."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defcustom evil-collection-setup-debugger-keys t
+ "Whether to bind debugger keys when debugger is active.
+
+Debugger in this case is dependent on mode.
+
+This is only relevant for debug modes that are part of another mode,
+
+e.g. `indium'. Modes like `edebug' or `realgud' needs to be explicitly disabled
+
+through removing their entry from `evil-collection-mode-list'."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defcustom evil-collection-want-unimpaired-p t
+ "Whether to enable unimpaired style bindings globally."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defcustom evil-collection-want-find-usages-bindings t
+ "Whether to bind `xref-find-references'-like bindings.
+
+This will bind additional find-* type commands, e.g. usages, assignments, etc.."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defcustom evil-collection-want-g-bindings t
+ "Whether to bind g* bindings."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defvar evil-collection--modes-with-delayed-setup
+ `(emms
+ eshell)
+ "List of modes whose keybinds aren't completely set up after the mode is
+loaded. This can be a problem for cases where we're doing key translations
+using `evil-collection-setup-hook' which would result in an empty keymap.
+
+Normally we run `evil-collection-setup-hook' right away after the mode
+is loaded in `with-eval-after-load' (see `evil-collection-init') but for these
+modes, we skip running that hook and let the corresponding `evil-collection'
+package handle running `evil-collection-setup-hook'.
+
+Elements in this list either match a target mode symbol or the car of a list in
+`evil-collection--supported-modes'.
+
+If `evil-collection-always-run-setup-hook-after-load' is t, this list isn't
+read and `evil-collection-setup-hook' will be ran in the
+`with-eval-after-load' block in `evil-collection-init'.")
+
+(defcustom evil-collection-always-run-setup-hook-after-load nil
+ "Whether to always run `evil-collection-setup-hook' after mode is loaded.
+
+See `evil-collection-init' and `evil-collection--modes-with-delayed-setup'."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defcustom evil-collection-defer-delay 3
+ "Default idle delay in seconds used when deferring mode initialization.
+
+Used as a fallback when no explicit delay is specified for a mode in
+`evil-collection-defer'."
+ :type 'number
+ :group 'evil-collection)
+
+(defvar evil-collection--supported-modes
+ `(2048-game
+ ag
+ agent-shell
+ alchemist
+ anaconda-mode
+ apropos
+ arc-mode
+ atomic-chrome
+ auto-package-update
+ beginend
+ bluetooth
+ bm
+ bookmark
+ (buff-menu "buff-menu")
+ bufler
+ calc
+ calendar
+ cider
+ citre
+ cmake-mode
+ color-rg
+ comint
+ company
+ compile
+ consult
+ corfu
+ crdt
+ (csv "csv-mode")
+ (custom cus-edit)
+ cus-theme
+ dape
+ dashboard
+ daemons
+ deadgrep
+ debbugs
+ debug
+ devdocs
+ dictionary
+ diff-hl
+ diff-mode
+ difftastic
+ dired
+ dired-sidebar
+ disk-usage
+ distel
+ doc-view
+ docker
+ eat
+ ebib
+ ebuku
+ eca
+ edbi
+ edebug
+ ediff
+ eglot
+ elpaca
+ ement
+ explain-pause-mode
+ eldoc
+ elfeed
+ elisp-mode
+ elisp-refs
+ elisp-slime-nav
+ embark
+ emms
+ ,@(when (>= emacs-major-version 29) '(emoji))
+ epa
+ ert
+ eshell
+ eval-sexp-fu
+ evil-mc
+ eww
+ fanyi
+ finder
+ flycheck
+ flymake
+ forge
+ free-keys
+ fzfa
+ geiser
+ ggtags
+ git-timemachine
+ gited
+ gnus
+ go-mode
+ gptel
+ grep
+ guix
+ hackernews
+ helm
+ help
+ helpful
+ hg-histedit
+ hideshow
+ hungry-delete
+ hyrolo
+ ibuffer
+ ielm
+ (image image-mode)
+ image-dired
+ image+
+ imenu
+ imenu-list
+ (indent "indent")
+ indium
+ info
+ ivy
+ js2-mode
+ ,@(when (>= emacs-major-version 30) '(kmacro))
+ leetcode
+ lispy
+ lms
+ log-edit
+ log-view
+ lsp-ui-imenu
+ lua-mode
+ kotlin-mode
+ macrostep
+ man
+ (magit magit-submodule) ;; See https://github.com/emacs-evil/evil-collection/issues/637
+ magit-repos
+ magit-section
+ magit-todos
+ markdown-mode
+ message
+ minesweeper
+ ,@(when evil-collection-setup-minibuffer '(minibuffer))
+ monky
+ mpc
+ mpdel
+ mpdired
+ mu4e
+ mu4e-conversation
+ neotree
+ newsticker
+ notmuch
+ nov
+ omnisharp
+ org
+ org-agenda
+ org-present
+ org-roam
+ osx-dictionary
+ outline
+ ovpn-mode
+ p4
+ (package-menu package)
+ pass
+ (pdf pdf-view)
+ popup
+ proced
+ (process-menu simple)
+ prodigy
+ profiler
+ p-search
+ python
+ quickrun
+ racer
+ racket-describe
+ reader
+ realgud
+ reftex
+ replace ;; For `occur'.
+ restclient
+ rg
+ ripgrep
+ rjsx-mode
+ robe
+ rtags
+ ruby-mode
+ scheme
+ scroll-lock
+ selectrum
+ sh-script
+ shell-maker
+ ,@(when (>= emacs-major-version 28) '(shortdoc))
+ simple
+ simple-mpc
+ slime
+ sly
+ smerge-mode
+ snake
+ so-long
+ speedbar
+ ,@(when (>= emacs-major-version 27) '(tab-bar))
+ tablist
+ tabulated-list
+ tar-mode
+ telega
+ (term term ansi-term multi-term)
+ tetris
+ ,@(when (>= emacs-major-version 27) '(thread))
+ tide
+ timer-list
+ transmission
+ trashed
+ tuareg
+ typescript-mode
+ ultra-scroll
+ vc-annotate
+ vc-dir
+ vc-git
+ vdiff
+ vertico
+ view
+ vlf
+ vterm
+ vundo
+ w3m
+ wdired
+ wgrep
+ which-key
+ with-editor
+ woman
+ xref
+ xwidget
+ yaml-mode
+ youtube-dl
+ zmusic
+ (ztree ztree-diff ztree-dir))
+ "List of modes supported by evil-collection. Elements are
+either target mode symbols or lists which `car' is the mode
+symbol and `cdr' the packages to register.")
+
+(dolist (mode evil-collection--supported-modes)
+ (let ((ec-mode-name (if (listp mode) (car mode) mode)))
+ (autoload
+ (intern (format "evil-collection-%s-setup" ec-mode-name))
+ (expand-file-name
+ (format "modes/%s/evil-collection-%s" ec-mode-name ec-mode-name)
+ evil-collection-base-dir))))
+
+(defcustom evil-collection-mode-list evil-collection--supported-modes
+ "The list of modes which will be evilified by `evil-collection-init'.
+Elements are either target mode symbols or lists which `car' is the
+mode symbol and `cdr' the packages to register.
+
+By default, `minibuffer' is not included because many users find
+this confusing. It will be included if
+`evil-collection-setup-minibuffer' is set to t."
+ :type '(repeat (choice symbol sexp))
+ :group 'evil-collection)
+
+(defcustom evil-collection-config
+ '((buff-menu :defer t)
+ (calc :defer t)
+ (comint :defer t)
+ (debug :defer t)
+ (diff-mode :defer t)
+ (dired :hook dired-mode)
+ (edebug :defer t)
+ (eldoc :defer t)
+ (help :defer t)
+ (image :defer t)
+ (indent :defer t)
+ (info :defer t)
+ (replace :defer t)
+ (outline :defer t)
+ (package-menu :defer t)
+ (process-menu :defer t)
+ (simple :defer t)
+ (tab-bar :defer t)
+ (tabulated-list :defer t)
+ (xref :defer t))
+ "The list of modes with special configuration.
+
+These modes should match entries within `evil-collection-mode-list'.
+
+This variable is consumed only by `evil-collection-setup'.
+
+
+NOTE: The API of this variable may change drastically.
+
+Currently supported keys:
+
+:defer t or TIME in seconds to defer loading mode.
+
+:hook HOOK-NAME to initialize the mode when a hook fires. The hook
+name does not need the \"-hook\" suffix; it will be appended
+automatically. When :hook is present, :defer is ignored."
+ :type '(repeat (choice symbol sexp))
+ :group 'evil-collection)
+
+(defcustom evil-collection-key-whitelist '()
+ "List of keys that may be used by Evil Collection.
+This is a list of strings that are suitable for input to
+`kbd'. If there are no keys in the list, the whitelist will be ignored."
+ :type '(repeat string)
+ :group 'evil-collection)
+
+(defcustom evil-collection-key-blacklist '()
+ "List of keys that may not be used by Evil Collection.
+This is a list of strings that are suitable for input to `kbd'."
+ :type '(repeat string)
+ :group 'evil-collection)
+
+(defcustom evil-collection-state-passlist '()
+ "List of evil states that may be used by Evil Collection.
+This is a list of symbols that are suitable for input to
+ `evil-define-key'. Ignore when there are no states in the list."
+ :type '(repeat symbol)
+ :group 'evil-collection)
+
+(defcustom evil-collection-state-denylist
+ (if (bound-and-true-p evil-disable-insert-state-bindings)
+ '(insert)
+ '())
+ "List of evil states that may not be used by Evil Collection.
+This is a list of symbols that are suitable for input to
+ `evil-define-key'."
+ :type '(repeat symbol)
+ :group 'evil-collection)
+
+(defcustom evil-collection-repl-submit-state 'normal
+ "Evil state in which RET submits the prompt in REPL-like buffers.
+
+The other state gets RET bound to `newline'. S-RET always inserts a
+newline regardless of state."
+ :type '(choice (const :tag "Submit in normal state" normal)
+ (const :tag "Submit in insert state" insert))
+ :group 'evil-collection)
+
+(defvar evil-collection-setup-hook nil
+ "Hook run by `evil-collection-init' for each mode that is evilified.
+This hook runs after all setup (including keybindings) for a mode has already
+taken place. The arguments passed to functions for this hook are the name of the
+mode and a list of keymap names (i.e. symbols, not actual keymaps) customized by
+Evil Collection for that mode. More arguments may be added in the future, so
+functions added to this hook should include a \"&rest _rest\" for forward
+compatibility.")
+
+(defun evil-collection-define-operator-key (operator map-sym &rest bindings)
+ "Define a key on a specific OPERATOR e.g. yank or delete.
+
+This function is useful for adding specific binds to operator maps
+\(e.g. `evil-yank' or `evil-delete') without erasing the original bind.
+
+For example, say one wants to bind \"yf\" to something but also wants to keep
+\"yy\".
+
+This function takes care of checking the whitelist/blacklist against the full
+binding.
+
+For example:
+\(evil-collection-define-operator-key \='yank
+ \='pass-mode-map \"f\" \='pass-copy-field)
+
+This will check \"yf\" against a user's white/blacklist and also record the
+binding in `annalist' as so."
+ (declare (indent defun))
+ (let* ((prefix (if (eq operator 'yank) "y" "d"))
+ (operators (if (eq operator 'yank)
+ 'evil-collection-yank-operators
+ 'evil-collection-delete-operators))
+ (remap (if (eq operator 'yank) [remap evil-yank] [remap evil-delete]))
+ (whitelist (mapcar 'kbd evil-collection-key-whitelist))
+ (blacklist (mapcar 'kbd evil-collection-key-blacklist))
+ filtered-bindings)
+ (while bindings
+ (let* ((key (pop bindings))
+ (key-with-prefix (concat prefix key))
+ (def (pop bindings))
+ (def-with-menu-item
+ `(menu-item
+ ""
+ nil
+ :filter
+ (lambda (&optional _)
+ (when (or
+ (eq evil-this-operator (key-binding ,remap))
+ (memq evil-this-operator ,operators))
+ (setq evil-inhibit-operator t)
+ ',def)))))
+ (when (or (and whitelist (member key-with-prefix whitelist))
+ (not (member key-with-prefix blacklist)))
+ (when (featurep 'annalist)
+ (annalist-record 'evil-collection 'keybindings
+ ;; Record the binding as if it was in 'normal mode
+ ;; instead of 'operator mode as the user would be
+ ;; in normal mode when triggering the operator.
+ (list map-sym 'normal key-with-prefix def)
+ :local (or (eq map-sym 'local)
+ (local-variable-p map-sym))))
+ ;; Use the original key declared when actually setting the binding.
+ (push key filtered-bindings)
+ ;; Use the definition attached to the menu-item when setting the
+ ;; binding.
+ (push def-with-menu-item filtered-bindings))))
+ (setq filtered-bindings (nreverse filtered-bindings))
+ (evil-collection--define-key 'operator map-sym filtered-bindings)))
+
+(defun evil-collection--filter-states (state)
+ "Return a list states after filtering STATE (a single symbol or list of symbols).
+The return value adheres to `evil-collection-state-passlist' and
+`evil-collection-state-denylist'. When the STATE is nil, which
+means all states for `evil-define-key', return nil."
+ (let ((states (if (listp state) state (list state))))
+ (seq-difference
+ (if evil-collection-state-passlist
+ (seq-intersection states evil-collection-state-passlist)
+ states)
+ evil-collection-state-denylist)))
+
+(defun evil-collection--keys-conflict (key-a key-b)
+ "Return t if KEY-A and KEY-B conflict.
+Keys conflict if they're equal or if one is a prefix of the other."
+ (setq key-a (vconcat key-a)
+ key-b (vconcat key-b))
+ (let ((len (min (length key-a) (length key-b))))
+ (equal (substring key-a 0 len) (substring key-b 0 len))))
+
+(defsubst evil-collection--can-bind-key (key whitelist blacklist)
+ "Return t if KEY can be bound.
+Return nil if KEY conflicts with a key in BLACKLIST and is not
+a member of WHITELIST.
+
+Both WHITELIST and BLACKLIST must be lists of keys in Emacs'
+internal key representation (i.e., after calling `kbd' on the key
+description."
+ (or (member key whitelist)
+ (not (cl-member key blacklist
+ :test #'evil-collection--keys-conflict))))
+
+(defun evil-collection-define-key (state map-sym &rest bindings)
+ "Wrapper for `evil-define-key*' with additional features.
+Unlike `evil-define-key*' MAP-SYM should be a quoted keymap other than the
+unquoted keymap required for `evil-define-key*'. This function adds the ability
+to filter keys on the basis of `evil-collection-key-whitelist' and
+`evil-collection-key-blacklist'. It also records bindings with annalist.el."
+ (declare (indent defun))
+ (let* ((whitelist (mapcar 'kbd evil-collection-key-whitelist))
+ (blacklist (mapcar 'kbd evil-collection-key-blacklist))
+ (states-to-bind (evil-collection--filter-states state))
+ filtered-bindings)
+ (when (or states-to-bind (null state))
+ (while bindings
+ (let ((key (pop bindings))
+ (def (pop bindings)))
+ (when (evil-collection--can-bind-key key whitelist blacklist)
+ (when (featurep 'annalist)
+ (annalist-record 'evil-collection 'keybindings
+ (list map-sym state key def)
+ :local (or (eq map-sym 'local)
+ (local-variable-p map-sym))))
+ (push key filtered-bindings)
+ (push def filtered-bindings))))
+ (setq filtered-bindings (nreverse filtered-bindings))
+ (evil-collection--define-key states-to-bind map-sym filtered-bindings))))
+
+(defun evil-collection-can-bind-key (key)
+ "Return whether or not we should bind KEY."
+ (let* ((whitelist (mapcar 'kbd evil-collection-key-whitelist))
+ (blacklist (mapcar 'kbd evil-collection-key-blacklist)))
+ (evil-collection--can-bind-key key whitelist blacklist)))
+
+(defun evil-collection--define-key (state map-sym bindings)
+ "Workhorse function for `evil-collection-define-key'.
+
+See `evil-collection-define-key' docstring for more details."
+ (cond ((null bindings))
+ ((and (boundp map-sym) (keymapp (symbol-value map-sym)))
+ (condition-case-unless-debug err
+ (apply #'evil-define-key*
+ state (symbol-value map-sym) bindings)
+ (error
+ (message "evil-collection: error setting key in %s %S"
+ map-sym err))))
+ ((boundp map-sym)
+ (user-error "evil-collection: %s is not a keymap" map-sym))
+ (t
+ (let* ((fname (format "evil-collection-define-key-in-%s" map-sym))
+ (fun (make-symbol fname)))
+ (fset fun `(lambda (&rest args)
+ (when (and (boundp ',map-sym) (keymapp ,map-sym))
+ (remove-hook 'after-load-functions #',fun)
+ (condition-case-unless-debug err
+ (apply #'evil-define-key*
+ ',state ,map-sym ',bindings)
+ (error
+ (message
+ ,(format
+ "evil-collection: error setting key in %s %%S"
+ map-sym)
+ err))))))
+ (add-hook 'after-load-functions fun t)))))
+
+(defun evil-collection-inhibit-insert-state (map-sym)
+ "Unmap insertion keys from normal state.
+This is particularly useful for read-only modes."
+ (evil-collection-define-key 'normal map-sym
+ [remap evil-append] #'ignore
+ [remap evil-append-line] #'ignore
+ [remap evil-insert] #'ignore
+ [remap evil-insert-line] #'ignore
+ [remap evil-change] #'ignore
+ [remap evil-change-line] #'ignore
+ [remap evil-substitute] #'ignore
+ [remap evil-change-whole-line] #'ignore
+ [remap evil-delete] #'ignore
+ [remap evil-delete-line] #'ignore
+ [remap evil-delete-char] #'ignore
+ [remap evil-delete-backward-char] #'ignore
+ [remap evil-replace] #'ignore
+ [remap evil-replace-state] #'ignore
+ [remap evil-open-below] #'ignore
+ [remap evil-open-above] #'ignore
+ [remap evil-paste-after] #'ignore
+ [remap evil-paste-before] #'ignore
+ [remap evil-join] #'ignore
+ [remap evil-indent] #'ignore
+ [remap evil-shift-left] #'ignore
+ [remap evil-shift-right] #'ignore
+ [remap evil-invert-char] #'ignore))
+
+(defun evil-collection-set-readonly-bindings (map-sym)
+ "Unmap insertion keys from normal state. Additionally q can `quit-window'.
+This is particularly useful for read-only modes. Make sure it's
+called before setting up other evil bindings so that it can be
+overriden."
+ (evil-collection-inhibit-insert-state map-sym)
+ (evil-collection-define-key 'normal map-sym
+ "q" #'quit-window
+ "ZZ" #'quit-window
+ "ZQ" #'evil-quit))
+
+(defun evil-collection--binding-lessp (a b)
+ "Comparison function used to sort bindings of the form (state key def)."
+ (let ((a-state (symbol-name (nth 0 a)))
+ (b-state (symbol-name (nth 0 b)))
+ (a-key (nth 1 a))
+ (b-key (nth 1 b)))
+ (if (not (string= a-state b-state))
+ (string-lessp a-state b-state)
+ (string-lessp a-key b-key))))
+
+(with-eval-after-load 'annalist
+ (annalist-define-view 'keybindings 'evil-collection-valid
+ (list (list 'keymap :sort #'annalist-string-<)
+ (list 'state :sort #'annalist-string-<))
+ :inherit 'valid)
+
+ (annalist-define-view 'keybindings 'evil-collection-active
+ (list (list 'keymap :sort #'annalist-string-<)
+ (list 'state :sort #'annalist-string-<))
+ :inherit 'active))
+
+(defun evil-collection-describe-bindings (&optional arg)
+ "Print bindings made by Evil Collection to separate buffer.
+
+With non-nil ARG, restrict to bindings corresponding to active
+modes in the current buffer.
+
+Requires the optional `annalist' package."
+ (interactive "P")
+ (unless (require 'annalist nil t)
+ (user-error
+ "`evil-collection-describe-bindings' requires the `annalist' package"))
+ (annalist-describe 'evil-collection 'keybindings
+ (if arg
+ 'evil-collection-active
+ 'evil-collection-valid)))
+
+(defun evil-collection--mode-file (mode file)
+ "Return path to FILE for MODE. Return nil if it doesn't exist."
+ (let ((path (expand-file-name
+ (format "modes/%s/%s" mode file) evil-collection-base-dir)))
+ (when (file-exists-p path)
+ path)))
+
+(defun evil-collection-open-config-file (mode)
+ "Open configuration file corresponding to MODE."
+ (interactive
+ (list
+ (completing-read
+ "Mode: "
+ (cl-remove-if-not
+ (lambda (mode)
+ (evil-collection--mode-file mode (format "evil-collection-%s.el" mode)))
+ (directory-files
+ (expand-file-name "modes" evil-collection-base-dir)
+ nil "^[^.]")))))
+ (find-file (evil-collection--mode-file mode (format "evil-collection-%s.el" mode))))
+
+(defun evil-collection-open-readme (mode)
+ "Open README.org corresponding to MODE."
+ (interactive
+ (list
+ (completing-read
+ "Mode: "
+ (cl-remove-if-not
+ (lambda (mode)
+ (evil-collection--mode-file mode "README.org"))
+ (directory-files
+ (expand-file-name "modes" evil-collection-base-dir)
+ nil "^[^.]")))))
+ (find-file (evil-collection--mode-file mode "README.org")))
+
+(defun evil-collection--delay (condition form hook &optional append local name)
+ "Execute FORM when CONDITION becomes true, checking with HOOK.
+NAME specifies the name of the entry added to HOOK. If APPEND is
+non-nil, the entry is appended to the hook. If LOCAL is non-nil,
+the buffer-local value of HOOK is modified.
+
+This is a backport of `evil-delay' without the deprecation notice to deal with
+CI until migration can be done.
+Ref: https://github.com/emacs-evil/evil-collection/issues/750"
+ (eval `(evil-with-delay ,condition (,hook ,append ,local ,name) ,form) t))
+
+;;;###autoload
+(cl-defun evil-collection-translate-minor-mode-key (states modes
+ &rest translations
+ &key destructive
+ &allow-other-keys)
+ "Translate keys in the keymap(s) corresponding to STATES and MODES.
+
+Similar to `evil-collection-translate-key' but for minor modes.
+STATES should be the name of an evil state, a list of states, or nil. MODES
+should be a symbol corresponding to minor-mode to make the translations in or a
+list of minor-mode symbols. TRANSLATIONS corresponds to a list of
+key replacement pairs. For example, specifying \"a\" \"b\" will bind \"a\" to
+\"b\"'s definition in the keymap. Specifying nil as a replacement will unbind a
+key. If DESTRUCTIVE is nil, a backup of the keymap will be stored on the initial
+invocation, and future invocations will always look up keys in the backup
+keymap. When no TRANSLATIONS are given, this function will only create the
+backup keymap without making any translations. On the other hand, if DESTRUCTIVE
+is non-nil, the keymap will be destructively altered without creating a backup.
+For example, calling this function multiple times with \"a\" \"b\" \"b\" \"a\"
+would continue to swap and unswap the definitions of these keys. This means that
+when DESTRUCTIVE is non-nil, all related swaps/cycles should be done in the same
+invocation."
+ (declare (indent defun))
+ (unless (listp modes)
+ (setq modes (list modes)))
+ (unless (and (listp states)
+ (not (null states)))
+ (setq states (list states)))
+ (dolist (mode-symbol modes)
+ (let ((keymap-symbol (intern (format "%S-map" mode-symbol))))
+ (dolist (state states)
+ (let ((hook-name
+ (symbol-name
+ (gensym
+ (format "evil-collection-translate-key-in-%s" keymap-symbol)))))
+ (evil-collection--delay `(and (boundp ',keymap-symbol)
+ (keymapp ,keymap-symbol))
+ `(evil-collection--translate-minor-mode-key
+ ',state
+ ',mode-symbol
+ ',translations
+ ,destructive)
+ 'after-load-functions
+ t
+ nil
+ hook-name))))))
+
+
+(defun evil-collection--translate-minor-mode-key (state
+ mode-symbol
+ translations
+ destructive)
+ "Helper function for `evil-collection-translate-minor-mode-key'.
+In the minor mode keymap corresponding to STATE and MODE-SYMBOL, make the key
+TRANSLATIONS. When DESTRUCTIVE is non-nil, make the TRANSLATIONS destructively
+without creating/referencing a backup keymap."
+ (let* ((keymap-symbol (intern (format "%S-map" mode-symbol)))
+ (backup-keymap-symbol (intern (format "evil-collection-%s%s-backup-map"
+ mode-symbol
+ (if state
+ (format "-%s-state" state)
+ ""))))
+ (keymap (symbol-value keymap-symbol))
+ (lookup-keymap (if (and (not destructive)
+ (boundp backup-keymap-symbol))
+ (symbol-value backup-keymap-symbol)
+ (copy-keymap
+ (if state
+ (evil-get-minor-mode-keymap state mode-symbol)
+ keymap))))
+ (maps (cl-loop for (key replacement) on translations by 'cddr
+ ;; :destructive can be in TRANSLATIONS
+ unless (keywordp key)
+ collect key
+ and collect (when replacement
+ (evil-lookup-key lookup-keymap replacement)))))
+ (unless (or destructive
+ (boundp backup-keymap-symbol))
+ (set backup-keymap-symbol lookup-keymap))
+ (apply #'evil-define-minor-mode-key state mode-symbol maps)))
+
+(defun evil-collection--translate-key (state keymap-symbol
+ translations
+ destructive)
+ "Helper function for `evil-collection-translate-key'.
+In the keymap corresponding to STATE and KEYMAP-SYMBOL, make the key
+TRANSLATIONS. When DESTRUCTIVE is non-nil, make the TRANSLATIONS destructively
+without creating/referencing a backup keymap."
+ (let* ((backup-keymap-symbol (intern (format "evil-collection-%s%s-backup-map"
+ keymap-symbol
+ (if state
+ (format "-%s-state" state)
+ ""))))
+ (keymap (symbol-value keymap-symbol))
+ (lookup-keymap (if (and (not destructive)
+ (boundp backup-keymap-symbol))
+ (symbol-value backup-keymap-symbol)
+ (copy-keymap
+ (if state
+ (evil-get-auxiliary-keymap keymap state t t)
+ keymap))))
+ (maps (cl-loop for (key replacement) on translations by 'cddr
+ ;; :destructive can be in TRANSLATIONS
+ unless (keywordp key)
+ collect key
+ and collect (when replacement
+ (evil-lookup-key lookup-keymap replacement)))))
+ (unless (or destructive
+ (boundp backup-keymap-symbol))
+ (set backup-keymap-symbol lookup-keymap))
+ (apply #'evil-define-key* state keymap maps)))
+
+;;;###autoload
+(cl-defun evil-collection-translate-key (states keymaps
+ &rest translations
+ &key destructive
+ &allow-other-keys)
+ "Translate keys in the keymap(s) corresponding to STATES and KEYMAPS.
+STATES should be the name of an evil state, a list of states, or nil. KEYMAPS
+should be a symbol corresponding to the keymap to make the translations in or a
+list of keymap symbols. Like `evil-define-key', when a keymap does not exist,
+the keybindings will be deferred until the keymap is defined, so
+`with-eval-after-load' is not necessary. TRANSLATIONS corresponds to a list of
+key replacement pairs. For example, specifying \"a\" \"b\" will bind \"a\" to
+\"b\"'s definition in the keymap. Specifying nil as a replacement will unbind a
+key. If DESTRUCTIVE is nil, a backup of the keymap will be stored on the initial
+invocation, and future invocations will always look up keys in the backup
+keymap. When no TRANSLATIONS are given, this function will only create the
+backup keymap without making any translations. On the other hand, if DESTRUCTIVE
+is non-nil, the keymap will be destructively altered without creating a backup.
+For example, calling this function multiple times with \"a\" \"b\" \"b\" \"a\"
+would continue to swap and unswap the definitions of these keys. This means that
+when DESTRUCTIVE is non-nil, all related swaps/cycles should be done in the same
+invocation."
+ (declare (indent defun))
+ (unless (listp keymaps)
+ (setq keymaps (list keymaps)))
+ (unless (and (listp states)
+ (not (null states)))
+ (setq states (list states)))
+ (dolist (keymap-symbol keymaps)
+ (dolist (state states)
+ (let ((hook-name
+ (symbol-name
+ (gensym
+ (format "evil-collection-translate-key-in-%s" keymap-symbol)))))
+ (evil-collection--delay `(and (boundp ',keymap-symbol)
+ (keymapp ,keymap-symbol))
+ `(evil-collection--translate-key
+ ',state
+ ',keymap-symbol
+ ',translations
+ ,destructive)
+ 'after-load-functions
+ t
+ nil
+ hook-name)))))
+
+
+;;;###autoload
+(defmacro evil-collection-swap-key (states keymaps &rest args)
+ "Wrapper around `evil-collection-translate-key' for swapping keys.
+STATES, KEYMAPS, and ARGS are passed to `evil-collection-translate-key'. ARGS
+should consist of key swaps (e.g. \"a\" \"b\" is equivalent to \"a\" \"b\" \"b\"
+\"a\" with `evil-collection-translate-key') and optionally keyword arguments for
+`evil-collection-translate-key'."
+ (declare (indent defun))
+ (setq args (cl-loop for (key replacement) on args by 'cddr
+ collect key and collect replacement
+ and unless (keywordp key)
+ collect replacement and collect key))
+ `(evil-collection-translate-key ,states ,keymaps ,@args))
+
+;;;###autoload
+(defmacro evil-collection-swap-minor-mode-key (states modes &rest args)
+ "Wrapper around `evil-collection-translate-minor-mode-key' for swapping keys.
+STATES, MODES, and ARGS are passed to
+`evil-collection-translate-minor-mode-key'. ARGS should consist of key swaps
+\(e.g. \"a\" \"b\" is equivalent to \"a\" \"b\" \"b\" \"a\"
+with `evil-collection-translate-minor-mode-key') and optionally keyword
+arguments for `evil-collection-translate-minor-mode-key'."
+ (declare (indent defun))
+ (setq args (cl-loop for (key replacement) on args by 'cddr
+ collect key and collect replacement
+ and unless (keywordp key)
+ collect replacement and collect key))
+ `(evil-collection-translate-minor-mode-key ,states ,modes ,@args))
+
+;;;###autoload
+(defun evil-collection-require (mode &optional noerror)
+ "Require the evil-collection-MODE file, but do not activate it.
+
+MODE should be a symbol. This requires the evil-collection-MODE
+feature without needing to manipulate `load-path'. NOERROR is
+forwarded to `require'."
+ (let* ((mode-name (symbol-name mode))
+ (feature (intern (format "evil-collection-%s" mode-name)))
+ (file (expand-file-name
+ (format "modes/%s/evil-collection-%s" mode-name mode-name)
+ evil-collection-base-dir)))
+ (require feature file noerror)))
+
+(declare-function evil-collection-unimpaired-setup "evil-collection-unimpaired")
+
+;;;###autoload
+(defun evil-collection-init (&optional modes)
+ "Register the Evil bindings for all modes in `evil-collection-mode-list'.
+
+Alternatively, you may register select bindings manually, for
+instance:
+
+ (with-eval-after-load \='calendar
+ (evil-collection-calendar-setup))
+
+If MODES is specified (as either one mode or a list of modes), use those modes
+instead of the modes in `evil-collection-mode-list'."
+ (interactive)
+ (evil-collection-maybe-display-startup-warning)
+ (if modes
+ (or (listp modes) (setq modes (list modes)))
+ (setq modes evil-collection-mode-list))
+ (dolist (mode modes)
+ (let ((m mode)
+ (reqs (list mode)))
+ (when (listp mode)
+ (setq m (car mode)
+ reqs (cdr mode)))
+ (dolist (req reqs)
+ (with-eval-after-load req
+ ;; (message (format "Loaded %S..." req))
+ (evil-collection-require m)
+ (funcall (intern (concat "evil-collection-" (symbol-name m)
+ "-setup")))
+ (let ((mode-keymaps
+ (ignore-errors
+ (symbol-value
+ (intern (format "evil-collection-%s-maps" m))))))
+ (when (or evil-collection-always-run-setup-hook-after-load
+ (not (memq m evil-collection--modes-with-delayed-setup)))
+ (run-hook-with-args 'evil-collection-setup-hook
+ m mode-keymaps)))))))
+ (when evil-collection-want-unimpaired-p
+ (evil-collection-require 'unimpaired)
+ (evil-collection-unimpaired-setup)))
+
+(defun evil-collection-setup (&optional modes)
+ "Register the Evil bindings for all modes in `evil-collection-mode-list'.
+
+----------------------EXPERIMENTAL------------------------------------------
+
+This is a special wrapper over `evil-collection-init' that respects
+configuration from `evil-collection-config'. This function is experimental,
+so don't use if you don't want breakages or API changes.
+
+If MODES is specified (as either one mode or a list of modes), use those modes
+instead of the modes in `evil-collection-mode-list'.
+
+----------------------EXPERIMENTAL------------------------------------------"
+ (if modes
+ (or (listp modes) (setq modes (list modes)))
+ (setq modes evil-collection-mode-list))
+ (let ((configs evil-collection-config)
+ (deferred) ; alist of (mode . delay)
+ (hooked)) ; alist of (mode . hook)
+ (dolist (config configs)
+ (if-let* ((hook (plist-get (cdr config) :hook)))
+ (push (cons (car config) hook) hooked)
+ (when-let* ((defer (plist-get (cdr config) :defer)))
+ (push (cons (car config) defer) deferred))))
+ (let ((filtered-modes
+ (cl-remove-if
+ (lambda (mode)
+ ;; `evil-collection-config' format is slightly different
+ ;; than `evil-collection-mode-list', so use the mode
+ ;; entry from the mode list instead.
+ (cl-some
+ (lambda (m)
+ (or (when-let* ((entry (assq m deferred)))
+ (setf (car entry) mode) t)
+ (when-let* ((entry (assq m hooked)))
+ (setf (car entry) mode) t)))
+ (if (consp mode) mode (list mode))))
+ modes)))
+ (evil-collection-init filtered-modes))
+ (message (format "Deferring: %S" (mapcar #'car deferred)))
+ (dolist (entry deferred)
+ (let ((mode (car entry))
+ (delay (cdr entry)))
+ (run-with-idle-timer
+ (if (numberp delay) delay evil-collection-defer-delay) nil
+ (apply-partially 'evil-collection-init (list mode)))))
+ (dolist (entry hooked)
+ (let* ((mode (car entry))
+ (hook-sym (cdr entry))
+ (hook-name (let ((name (symbol-name hook-sym)))
+ (if (string-suffix-p "-hook" name)
+ hook-sym
+ (intern (concat name "-hook")))))
+ (mode-sym (if (consp mode) (car mode) mode))
+ (fn-sym (intern (format "evil-collection--init-%s" mode-sym))))
+ (defalias fn-sym
+ (lambda ()
+ (remove-hook hook-name fn-sym)
+ (evil-collection-init (list mode))))
+ (add-hook hook-name fn-sym)))))
+
+(defvar evil-collection-delete-operators '(evil-delete
+ evil-cp-delete
+ evil-sp-delete
+ lispyville-delete)
+ "List of delete operators.")
+
+(defvar evil-collection-yank-operators '(evil-yank
+ evil-cp-yank
+ evil-sp-yank
+ lispyville-yank)
+ "List of yank operators.")
+
+;;* Search
+
+(defun evil-collection-evil-search-enabled ()
+ (eq evil-search-module 'evil-search))
+
+(defvar evil-collection-evil-search-forward
+ '(menu-item "" nil :filter (lambda (&optional _)
+ (if (eq evil-search-module 'evil-search)
+ #'evil-ex-search-forward
+ #'evil-search-forward))))
+
+(defvar evil-collection-evil-search-backward
+ '(menu-item "" nil :filter (lambda (&optional _)
+ (if (eq evil-search-module 'evil-search)
+ #'evil-ex-search-backward
+ #'evil-search-backward))))
+
+(defvar evil-collection-evil-search-next
+ '(menu-item "" nil :filter (lambda (&optional _)
+ (if (eq evil-search-module 'evil-search)
+ #'evil-ex-search-next
+ #'evil-search-next))))
+
+(defvar evil-collection-evil-search-previous
+ '(menu-item "" nil :filter (lambda (&optional _)
+ (if (eq evil-search-module 'evil-search)
+ #'evil-ex-search-previous
+ #'evil-search-previous))))
+
+(provide 'evil-collection)
+;;; evil-collection.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/.nosearch b/.config/emacs/lisp/evil-collection/modes/.nosearch
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/.nosearch
diff --git a/.config/emacs/lisp/evil-collection/modes/2048-game/evil-collection-2048-game.el b/.config/emacs/lisp/evil-collection/modes/2048-game/evil-collection-2048-game.el
new file mode 100644
index 0000000..ce64221
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/2048-game/evil-collection-2048-game.el
@@ -0,0 +1,54 @@
+;;; evil-collection-2048-game.el --- Evil bindings for `2048-game' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: Daniel Phan <daniel.phan36@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, games
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `2048-game'.
+
+;;; Code:
+(require 'evil-collection)
+(require '2048-game nil t)
+
+(defconst evil-collection-2048-game-maps '(2048-mode-map))
+
+;;;###autoload
+(defun evil-collection-2048-game-setup ()
+ "Set up `evil' bindings for `2048-game'."
+ (evil-set-initial-state '2048-mode 'normal)
+ (evil-collection-define-key 'normal '2048-mode-map
+ "h" '2048-left
+ "j" '2048-down
+ "k" '2048-up
+ "l" '2048-right
+ "r" '2048-random-move
+ (kbd "<up>") '2048-up
+ (kbd "<left>") '2048-left
+ (kbd "<right>") '2048-right
+ (kbd "<down>") '2048-down
+ "q" 'quit-window
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-2048-game)
+;;; evil-collection-2048-game.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ag/README.org b/.config/emacs/lisp/evil-collection/modes/ag/README.org
new file mode 100644
index 0000000..48ceccc
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ag/README.org
@@ -0,0 +1,22 @@
+* ag
+
+ Evil bindings for [[https://github.com/Wilfred/ag.el][ag]] search result buffers.
+
+ Initial state for =ag-mode= is forced to =normal= so the buffer can be
+ edited with [[https://github.com/mhayashi1120/Emacs-wgrep][wgrep]].
+
+** Key bindings
+
+ Applied in =normal= and =visual= states.
+
+ | Command | Original | Evil |
+ |------------------------------+----------+-------------------|
+ | =evil-previous-line= | | =k= |
+ | =evil-backward-char= | | =h= |
+ | =recompile= | =g= | =gr= |
+ | =compilation-next-error= | =n= | =gj=, =C-j=, =]]= |
+ | =compilation-previous-error= | =p= | =gk=, =C-k=, =[[= |
+ | =evil-search-backward= | | =?= |
+ | =evil-search-forward= | | =/= |
+ | =evil-search-next= | | =n= |
+ | =evil-search-previous= | | =N= |
diff --git a/.config/emacs/lisp/evil-collection/modes/ag/evil-collection-ag.el b/.config/emacs/lisp/evil-collection/modes/ag/evil-collection-ag.el
new file mode 100644
index 0000000..0ce8b90
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ag/evil-collection-ag.el
@@ -0,0 +1,63 @@
+;;; evil-collection-ag.el --- Evil Bindings for Ag -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ag, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `ag-mode' from the `wgrep-ag' package.
+
+;;; Code:
+(require 'ag nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-ag-maps '(ag-mode-map))
+
+;;;###autoload
+(defun evil-collection-ag-setup ()
+ "Set up `evil' bindings for `ag'."
+ (evil-collection-define-key '(normal visual) 'ag-mode-map
+ "k" 'evil-previous-line
+ "h" 'evil-backward-char
+
+ ;; refresh
+ "gr" 'recompile
+
+ ;; navigation
+ "gj" 'compilation-next-error
+ "gk" 'compilation-previous-error
+ (kbd "C-j") 'compilation-next-error
+ (kbd "C-k") 'compilation-previous-error
+ "]]" 'compilation-next-error
+ "[[" 'compilation-previous-error
+
+ ;; search
+ "?" evil-collection-evil-search-backward
+ "/" evil-collection-evil-search-forward
+ "n" evil-collection-evil-search-next
+ "N" evil-collection-evil-search-previous)
+ ;; `ag' is best set in 'normal state because its buffer can be edited.
+ ;; https://github.com/mhayashi1120/Emacs-wgrep
+ (evil-set-initial-state 'ag-mode 'normal))
+
+(provide 'evil-collection-ag)
+;;; evil-collection-ag.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/agent-shell/README.org b/.config/emacs/lisp/evil-collection/modes/agent-shell/README.org
new file mode 100644
index 0000000..a362a2f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/agent-shell/README.org
@@ -0,0 +1,137 @@
+* agent-shell
+
+ Evil bindings for [[https://github.com/xenodium/agent-shell][agent-shell]] -- a
+ comint-based chat REPL with permission prompts, a side viewport and a diff
+ buffer.
+
+** agent-shell-mode-map
+
+ Upstream's =n= / =p= top-level bindings are unset so they don't intercept
+ keystrokes in insert state; in insert they self-insert.
+
+*** Permission dispatch (normal state)
+
+ Only active when =evil-collection-agent-shell-want-permission-bindings= is
+ non-nil. Each key falls through to its default evil command unless a
+ pending permission button is visible.
+
+ | Command | Action | Evil |
+ |-------------------------------------------------------+------------------+------|
+ | =evil-collection-agent-shell-permission-view-diff= | view diff =v= | =v= |
+ | =evil-collection-agent-shell-permission-allow-once= | allow =y= | =y= |
+ | =evil-collection-agent-shell-permission-reject-once= | reject =C-c C-c= | =n= |
+ | =evil-collection-agent-shell-permission-allow-always= | always allow =!= | =!= |
+
+*** Navigation (normal state)
+
+ | Command | Original | Evil |
+ |----------------------------------+----------+-------------|
+ | =agent-shell-next-item= | =n= | =TAB= |
+ | =agent-shell-previous-item= | =p= | =<backtab>= |
+ | =agent-shell-cycle-session-mode= | n/a | =C-<tab>= |
+
+*** g-prefix (only when =evil-collection-want-g-bindings=)
+
+ | Command | Evil |
+ |----------------------------------+------|
+ | =agent-shell-cycle-session-mode= | =gs= |
+ | =agent-shell-interrupt= | =gx= |
+ | =agent-shell-set-session-mode= | =gm= |
+ | =agent-shell-set-session-model= | =gv= |
+ | =agent-shell-other-buffer= | =go= |
+ | =agent-shell-yank-dwim= | =gp= |
+ | =agent-shell-reload= | =gr= |
+ | =agent-shell-restart= | =gR= |
+ | =agent-shell-fork= | =gF= |
+ | =agent-shell-copy-session-id= | =gy= |
+ | =agent-shell-prompt-compose= | =gc= |
+ | =agent-shell-queue-request= | =gq= |
+ | =agent-shell-open-transcript= | =gt= |
+
+** agent-shell-viewport-edit-mode-map
+
+ The viewport's compose buffer. Standard save/quit verbs become send/cancel.
+
+ | Command | Original | Evil |
+ |------------------------------------------+-----------+--------------------------------|
+ | =agent-shell-viewport-compose-send= | =C-c C-c= | =:w=, =:wq=, =ZZ=, =RET= remap |
+ | =agent-shell-viewport-compose-cancel= | =C-c C-k= | =:q=, =ZQ= |
+ | =agent-shell-viewport-previous-history= | n/a | =M-k= |
+ | =agent-shell-viewport-next-history= | n/a | =M-j= |
+ | =agent-shell-viewport-compose-peek-last= | n/a | =C-o= |
+
+ When =evil-collection-want-g-bindings= is non-nil:
+
+ | Command | Evil |
+ |------------------------------------------+------|
+ | =agent-shell-viewport-compose-help-menu= | =g?= |
+ | =agent-shell-cycle-session-mode= | =gs= |
+ | =agent-shell-viewport-set-session-mode= | =gm= |
+ | =agent-shell-viewport-set-session-model= | =gv= |
+ | =agent-shell-other-buffer= | =go= |
+ | =agent-shell-yank-dwim= | =gp= |
+ | =agent-shell-viewport-search-history= | =g/= |
+ | =agent-shell-viewport-copy-session-id= | =gy= |
+ | =agent-shell-viewport-open-transcript= | =gt= |
+
+** agent-shell-viewport-view-mode-map
+
+ Read-only viewport. =RET= / =:w= / =ZZ= all interrupt the agent; =:q= /
+ =ZQ= bury.
+
+ | Command | Original | Evil |
+ |--------------------------------------+-----------+-------------------------|
+ | =agent-shell-viewport-interrupt= | =C-c C-c= | =RET=, =:w=, =ZZ= remap |
+ | =bury-buffer= | =q= | =q=, =ZQ=, =:q= remap |
+ | =agent-shell-viewport-next-item= | =n= | =TAB=, =gj= |
+ | =agent-shell-viewport-previous-item= | =p= | =<backtab>=, =gk= |
+ | =agent-shell-viewport-next-page= | =f= | =C-j= |
+ | =agent-shell-viewport-previous-page= | =b= | =C-k= |
+
+ When =evil-collection-want-g-bindings= is non-nil:
+
+ | Command | Evil |
+ |-------------------------------------------+--------------|
+ | =agent-shell-viewport-reply-1..9= | =g1= .. =g9= |
+ | =agent-shell-viewport-cycle-session-mode= | =gs= |
+ | =agent-shell-viewport-set-session-model= | =gv= |
+ | =agent-shell-other-buffer= | =go= |
+ | =agent-shell-viewport-set-session-mode= | =gm= |
+ | =agent-shell-viewport-help-menu= | =g?= |
+ | =agent-shell-viewport-reply= | =gr= |
+ | =agent-shell-viewport-reply-yes= | =gy= |
+ | =agent-shell-viewport-reply-more= | =gM= |
+ | =agent-shell-viewport-reply-again= | =ga= |
+ | =agent-shell-viewport-reply-continue= | =gc= |
+ | =agent-shell-viewport-edit= | =ge= |
+ | =agent-shell-viewport-fork= | =gF= |
+ | =agent-shell-viewport-copy-session-id= | =gY= |
+ | =agent-shell-viewport-open-transcript= | =gt= |
+ | =agent-shell-viewport-refresh= | =gz= |
+
+** agent-shell-diff-mode-map
+
+ | Command | Original | Evil (=g-bindings=) | Evil (no =g-bindings=) |
+ |-------------------------------+----------+---------------------+------------------------|
+ | =agent-shell-diff-open-file= | =f= | =gf= | =f= |
+ | =agent-shell-diff-accept-all= | =y= | =gy= | =y= |
+ | =agent-shell-diff-reject-all= | =n= | =gn= | =n= |
+ | =kill-current-buffer= | n/a | =q= | =q= |
+
+** New commands
+
+ | Command | Purpose |
+ |-------------------------------------------------------+----------------------------------------------------|
+ | =evil-collection-agent-shell-permission-allow-once= | Press =y= on the latest pending permission button. |
+ | =evil-collection-agent-shell-permission-reject-once= | Send =C-c C-c= to it. |
+ | =evil-collection-agent-shell-permission-allow-always= | Press =!=. |
+ | =evil-collection-agent-shell-permission-view-diff= | Press =v=. |
+
+ Each only fires when a pending permission button is visible -- otherwise the
+ keymap entry resolves to nil via a =:filter= and evil's default takes over.
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |--------------------------------------------------------+---------+-------------------------------------------------------|
+ | =evil-collection-agent-shell-want-permission-bindings= | =t= | Bind =y= / =n= / =!= / =v= for the dispatchers above. |
diff --git a/.config/emacs/lisp/evil-collection/modes/agent-shell/evil-collection-agent-shell.el b/.config/emacs/lisp/evil-collection/modes/agent-shell/evil-collection-agent-shell.el
new file mode 100644
index 0000000..c738d94
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/agent-shell/evil-collection-agent-shell.el
@@ -0,0 +1,254 @@
+;;; evil-collection-agent-shell.el --- Bindings for agent-shell -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 Joseph LaFreniere
+
+;; Author: Joseph LaFreniere <git@lafreniere.xyz>
+;; Maintainer: Joseph LaFreniere <git@lafreniere.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: evil, agent-shell, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for agent-shell.
+
+;;; Code:
+(require 'evil-collection)
+(require 'agent-shell nil t)
+
+(defconst evil-collection-agent-shell-maps '(agent-shell-mode-map
+ agent-shell-viewport-edit-mode-map
+ agent-shell-viewport-view-mode-map
+ agent-shell-diff-mode-map))
+
+(defvar agent-shell-mode-map)
+(defvar agent-shell-viewport-edit-mode-map)
+(defvar agent-shell-viewport-view-mode-map)
+(defvar agent-shell-diff-mode-map)
+
+(defcustom evil-collection-agent-shell-want-permission-bindings t
+ "When non-nil, bind permission button keys in normal state.
+
+`y', `n', `!', and `v' will activate the latest pending permission
+button when one is visible, and fall through to their default Evil
+commands otherwise."
+ :type 'boolean
+ :group 'evil-collection)
+
+;;; Permission button helpers.
+
+(defun evil-collection-agent-shell--latest-permission-keymap ()
+ "Return the keymap of the latest pending permission button, or nil.
+Walks the buffer backward from `point-max' looking for text with the
+`agent-shell-permission-button' property -- the navigatable single-char
+marker that `agent-shell--make-permission-button' adds to each button."
+ (save-excursion
+ (goto-char (point-max))
+ (when-let* ((match (text-property-search-backward
+ 'agent-shell-permission-button t t)))
+ (get-text-property (prop-match-beginning match) 'keymap))))
+
+(defun evil-collection-agent-shell--pending-permission-p ()
+ "Return non-nil when the current buffer has a pending permission button."
+ (and (evil-collection-agent-shell--latest-permission-keymap) t))
+
+(defun evil-collection-agent-shell--press (key)
+ "Dispatch KEY through the latest pending permission's button keymap.
+KEY is a string passed to `kbd'."
+ (let* ((km (or (evil-collection-agent-shell--latest-permission-keymap)
+ (user-error "No pending permission")))
+ (binding (lookup-key km (kbd key))))
+ (cond
+ ((commandp binding) (call-interactively binding))
+ ((null binding) (user-error "No `%s' action on this permission" key))
+ (t (user-error "Unexpected binding for `%s': %S" key binding)))))
+
+(defun evil-collection-agent-shell-permission-allow-once ()
+ "Allow the latest pending tool-call permission once."
+ (interactive)
+ (evil-collection-agent-shell--press "y"))
+
+(defun evil-collection-agent-shell-permission-reject-once ()
+ "Reject the latest pending tool-call permission and interrupt the agent."
+ (interactive)
+ (evil-collection-agent-shell--press "C-c C-c"))
+
+(defun evil-collection-agent-shell-permission-allow-always ()
+ "Always-allow the tool kind for the latest pending permission."
+ (interactive)
+ (evil-collection-agent-shell--press "!"))
+
+(defun evil-collection-agent-shell-permission-view-diff ()
+ "View the diff for the latest pending permission, if any."
+ (interactive)
+ (evil-collection-agent-shell--press "v"))
+
+(defvar evil-collection-agent-shell-permission-allow-once
+ `(menu-item "" nil :filter
+ ,(lambda (&optional _)
+ (when (evil-collection-agent-shell--pending-permission-p)
+ 'evil-collection-agent-shell-permission-allow-once))))
+
+(defvar evil-collection-agent-shell-permission-reject-once
+ `(menu-item "" nil :filter
+ ,(lambda (&optional _)
+ (when (evil-collection-agent-shell--pending-permission-p)
+ 'evil-collection-agent-shell-permission-reject-once))))
+
+(defvar evil-collection-agent-shell-permission-allow-always
+ `(menu-item "" nil :filter
+ ,(lambda (&optional _)
+ (when (evil-collection-agent-shell--pending-permission-p)
+ 'evil-collection-agent-shell-permission-allow-always))))
+
+(defvar evil-collection-agent-shell-permission-view-diff
+ `(menu-item "" nil :filter
+ ,(lambda (&optional _)
+ (when (evil-collection-agent-shell--pending-permission-p)
+ 'evil-collection-agent-shell-permission-view-diff))))
+
+;;;###autoload
+(defun evil-collection-agent-shell-setup ()
+ "Set up `evil' bindings for `agent-shell'."
+ ;; `agent-shell-mode-map' binds \"n\" and \"p\" at the map level, which causes
+ ;; them to intercept keystrokes even in insert state. Remove those bindings
+ ;; entirely.
+ (if (fboundp 'keymap-unset)
+ (progn
+ (keymap-unset agent-shell-mode-map "n" t)
+ (keymap-unset agent-shell-mode-map "p" t))
+ (define-key agent-shell-mode-map "n" nil)
+ (define-key agent-shell-mode-map "p" nil))
+
+ (evil-collection-define-key 'insert 'agent-shell-mode-map
+ "n" 'self-insert-command
+ "p" 'self-insert-command)
+
+ (when evil-collection-agent-shell-want-permission-bindings
+ (evil-collection-define-key 'normal 'agent-shell-mode-map
+ "v" evil-collection-agent-shell-permission-view-diff
+ "y" evil-collection-agent-shell-permission-allow-once
+ "n" evil-collection-agent-shell-permission-reject-once
+ "!" evil-collection-agent-shell-permission-allow-always))
+
+ (evil-collection-define-key 'normal 'agent-shell-mode-map
+ (kbd "TAB") 'agent-shell-next-item
+ "<backtab>" 'agent-shell-previous-item
+ (kbd "C-<tab>") 'agent-shell-cycle-session-mode)
+
+ (when evil-collection-want-g-bindings
+ (evil-collection-define-key 'normal 'agent-shell-mode-map
+ "gs" 'agent-shell-cycle-session-mode
+ "gx" 'agent-shell-interrupt
+ "gm" 'agent-shell-set-session-mode
+ "gv" 'agent-shell-set-session-model
+ "go" 'agent-shell-other-buffer
+ "gp" 'agent-shell-yank-dwim
+ "gr" 'agent-shell-reload
+ "gR" 'agent-shell-restart
+ "gF" 'agent-shell-fork
+ "gy" 'agent-shell-copy-session-id
+ "gc" 'agent-shell-prompt-compose
+ "gq" 'agent-shell-queue-request
+ "gt" 'agent-shell-open-transcript))
+
+ (evil-collection-define-key 'normal 'agent-shell-viewport-edit-mode-map
+ [remap evil-save-and-close] 'agent-shell-viewport-compose-send
+ [remap evil-save-modified-and-close] 'agent-shell-viewport-compose-send
+ [remap evil-ret] 'agent-shell-viewport-compose-send
+ [remap evil-write] 'agent-shell-viewport-compose-send
+ [remap evil-quit] 'agent-shell-viewport-compose-cancel
+ "M-k" 'agent-shell-viewport-previous-history
+ "M-j" 'agent-shell-viewport-next-history
+ (kbd "C-o") 'agent-shell-viewport-compose-peek-last)
+
+ (when evil-collection-want-g-bindings
+ (evil-collection-define-key 'normal 'agent-shell-viewport-edit-mode-map
+ "g?" 'agent-shell-viewport-compose-help-menu
+ "gs" 'agent-shell-cycle-session-mode
+ "gm" 'agent-shell-viewport-set-session-mode
+ "gv" 'agent-shell-viewport-set-session-model
+ "go" 'agent-shell-other-buffer
+ "gp" 'agent-shell-yank-dwim
+ "g/" 'agent-shell-viewport-search-history
+ "gy" 'agent-shell-viewport-copy-session-id
+ "gt" 'agent-shell-viewport-open-transcript))
+
+ (evil-collection-define-key 'normal 'agent-shell-viewport-view-mode-map
+ [remap evil-save-and-close] 'agent-shell-viewport-interrupt
+ [remap evil-save-modified-and-close] 'agent-shell-viewport-interrupt
+ [remap evil-ret] 'agent-shell-viewport-interrupt
+ [remap evil-write] 'agent-shell-viewport-interrupt
+ [remap evil-quit] 'bury-buffer
+ (kbd "TAB") 'agent-shell-viewport-next-item
+ (kbd "<backtab>") 'agent-shell-viewport-previous-item
+ "gj" 'agent-shell-viewport-next-item
+ "gk" 'agent-shell-viewport-previous-item
+ (kbd "C-j") 'agent-shell-viewport-next-page
+ (kbd "C-k") 'agent-shell-viewport-previous-page
+ "q" 'bury-buffer)
+
+ (when evil-collection-want-g-bindings
+ (evil-collection-define-key 'normal 'agent-shell-viewport-view-mode-map
+ "g1" 'agent-shell-viewport-reply-1
+ "g2" 'agent-shell-viewport-reply-2
+ "g3" 'agent-shell-viewport-reply-3
+ "g4" 'agent-shell-viewport-reply-4
+ "g5" 'agent-shell-viewport-reply-5
+ "g6" 'agent-shell-viewport-reply-6
+ "g7" 'agent-shell-viewport-reply-7
+ "g8" 'agent-shell-viewport-reply-8
+ "g9" 'agent-shell-viewport-reply-9
+ "gs" 'agent-shell-viewport-cycle-session-mode
+ "gv" 'agent-shell-viewport-set-session-model
+ "go" 'agent-shell-other-buffer
+ "gm" 'agent-shell-viewport-set-session-mode
+ "g?" 'agent-shell-viewport-help-menu
+ ;; Maybe move elsewhere.
+ "gr" 'agent-shell-viewport-reply
+ "gy" 'agent-shell-viewport-reply-yes
+ "gM" 'agent-shell-viewport-reply-more
+ "ga" 'agent-shell-viewport-reply-again
+ "gc" 'agent-shell-viewport-reply-continue
+ "ge" 'agent-shell-viewport-edit
+ "gF" 'agent-shell-viewport-fork
+ "gY" 'agent-shell-viewport-copy-session-id
+ "gt" 'agent-shell-viewport-open-transcript
+ "gz" 'agent-shell-viewport-refresh))
+
+ (evil-collection-define-key 'normal 'agent-shell-diff-mode-map
+ "q" #'kill-current-buffer)
+
+ (if evil-collection-want-g-bindings
+ (evil-collection-define-key 'normal 'agent-shell-diff-mode-map
+ "gf" 'agent-shell-diff-open-file
+ "gy" 'agent-shell-diff-accept-all
+ "gn" 'agent-shell-diff-reject-all)
+ (evil-collection-define-key 'normal 'agent-shell-diff-mode-map
+ "f" 'agent-shell-diff-open-file
+ "y" 'agent-shell-diff-accept-all
+ "n" 'agent-shell-diff-reject-all))
+
+ (add-hook 'agent-shell-diff-mode-hook #'evil-normalize-keymaps)
+ (add-hook 'agent-shell-mode-hook #'evil-normalize-keymaps)
+ (add-hook 'agent-shell-viewport-view-mode-hook #'evil-normalize-keymaps)
+ (add-hook 'agent-shell-viewport-edit-mode-hook #'evil-normalize-keymaps)
+
+ (advice-add 'agent-shell-jump-to-latest-permission-button-row
+ :after (lambda (&rest _) (evil-normalize-keymaps))))
+
+(provide 'evil-collection-agent-shell)
+;;; evil-collection-agent-shell.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/alchemist/evil-collection-alchemist.el b/.config/emacs/lisp/evil-collection/modes/alchemist/evil-collection-alchemist.el
new file mode 100644
index 0000000..43a823d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/alchemist/evil-collection-alchemist.el
@@ -0,0 +1,114 @@
+;;; evil-collection-alchemist.el --- Bindings for `alchemist' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, alchemist, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `alchemist'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'alchemist nil t)
+
+(defconst evil-collection-alchemist-maps '(alchemist-compile-mode-map
+ alchemist-eval-mode-map
+ alchemist-execute-mode-map
+ alchemist-message-mode-map
+ alchemist-help-minor-mode-map
+ alchemist-macroexpand-mode-map
+ alchemist-mix-mode-map
+ alchemist-test-report-mode-map
+ alchemist-mode-map))
+
+
+;;;###autoload
+(defun evil-collection-alchemist-setup ()
+ "Set up `evil' bindings for `alchemist'."
+ (evil-set-initial-state 'alchemist-compile-mode 'normal)
+ (evil-set-initial-state 'alchemist-eval-mode 'normal)
+ (evil-set-initial-state 'alchemist-execute-mode 'normal)
+ (evil-set-initial-state 'alchemist-message-mode 'normal)
+ (evil-set-initial-state 'alchemist-help-minor-mode 'normal)
+ (evil-set-initial-state 'alchemist-macroexpand-mode 'normal)
+ (evil-set-initial-state 'alchemist-refcard-mode 'normal)
+ (evil-set-initial-state 'alchemist-mix-mode 'normal)
+ (evil-set-initial-state 'alchemist-test-mode 'normal)
+ (evil-set-initial-state 'alchemist-test-report-mode 'normal)
+
+ (evil-collection-define-key 'normal 'alchemist-compile-mode-map
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'alchemist-eval-mode-map
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'alchemist-execute-mode-map
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'alchemist-message-mode-map
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'alchemist-help-minor-mode-map
+ "q" 'quit-window
+ "K" 'alchemist-help-search-at-point
+ "m" 'alchemist-help-module
+ "s" 'alchemist-help
+ "gh" 'alchemist-help-history
+ "gd" 'alchemist-goto-definition-at-point
+ "g?" 'alchemist-help-minor-mode-key-binding-summary)
+
+ (evil-collection-define-key 'normal 'alchemist-macroexpand-mode-map
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'alchemist-refcard-mode-map
+ "gd" 'alchemist-refcard--describe-funtion-at-point
+ "g?" 'alchemist-refcard--describe-funtion-at-point
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'alchemist-mix-mode-map
+ "q" 'quit-window
+ "i" 'alchemist-mix-send-input-to-mix-process
+ "gr" 'alchemist-mix-rerun-last-task)
+
+ (evil-collection-define-key 'normal 'alchemist-test-report-mode-map
+ "q" 'quit-window
+ "t" 'toggle-truncate-lines
+ "gr" 'alchemist-mix-rerun-last-test
+ "gj" 'alchemist-test-next-result
+ "gk" 'alchemist-test-previous-result
+ (kbd "C-j") 'alchemist-test-next-result
+ (kbd "C-k") 'alchemist-test-previous-result
+ "]]" 'alchemist-test-next-stacktrace-file
+ "[[" 'alchemist-test-previous-stacktrace-file
+ (kbd "C-c C-k") 'alchemist-report-interrupt-current-process)
+
+ (evil-collection-define-key 'normal 'alchemist-mode-map
+ "gz" 'alchemist-iex-run
+ "K" 'alchemist-help-search-at-point
+ "gd" 'alchemist-goto-definition-at-point
+ (kbd "C-t") 'alchemist-goto-jump-back
+ "g?" 'alchemist-help
+ (kbd "C-j") 'alchemist-goto-jump-to-next-def-symbol
+ (kbd "C-k") 'alchemist-goto-jump-to-previous-def-symbol))
+
+(provide 'evil-collection-alchemist)
+;;; evil-collection-alchemist.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/anaconda-mode/evil-collection-anaconda-mode.el b/.config/emacs/lisp/evil-collection/modes/anaconda-mode/evil-collection-anaconda-mode.el
new file mode 100644
index 0000000..a37ecf6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/anaconda-mode/evil-collection-anaconda-mode.el
@@ -0,0 +1,66 @@
+;;; evil-collection-anaconda-mode.el --- Bindings for `anaconda-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, python, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `anaconda-mode'.
+
+;;; Code:
+(require 'anaconda-mode nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-anaconda-mode-maps '(anaconda-view-mode-map
+ anaconda-mode-map))
+
+;;;###autoload
+(defun evil-collection-anaconda-mode-setup ()
+ "Set up `evil' bindings for `anaconda-mode'."
+ ;; Bindings don't seem to be set the first time.
+ (add-hook 'anaconda-mode-hook #'evil-normalize-keymaps)
+
+ ;; latest anaconda has replaced view mode by an xref implementation,
+ ;; anaconda stable uses `anaconda-view-mode-map'
+ (when (boundp 'anaconda-view-mode-map)
+ (evil-collection-define-key 'normal 'anaconda-view-mode-map
+ "gj" 'next-error-no-select
+ "gk" 'previous-error-no-select
+ (kbd "C-j") 'next-error-no-select
+ (kbd "C-k") 'previous-error-no-select
+ "]]" 'next-error-no-select
+ "[[" 'previous-error-no-select
+ "q" 'quit-window))
+
+ (evil-collection-define-key 'normal 'anaconda-mode-map
+ "gd" 'anaconda-mode-find-definitions
+ (kbd "C-t") (if (fboundp 'anaconda-mode-go-back)
+ 'anaconda-mode-go-back
+ 'xref-pop-marker-stack)
+ "K" 'anaconda-mode-show-doc)
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'anaconda-mode-map
+ "gA" 'anaconda-mode-find-assignments
+ "gr" 'anaconda-mode-find-references)))
+
+(provide 'evil-collection-anaconda-mode)
+;;; evil-collection-anaconda-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/apropos/README.org b/.config/emacs/lisp/evil-collection/modes/apropos/README.org
new file mode 100644
index 0000000..650102a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/apropos/README.org
@@ -0,0 +1,15 @@
+* apropos
+
+ Evil bindings for =apropos-mode=.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------+----------+-----------|
+ | =apropos-follow= | =RET= | =RET= |
+ | =forward-button= | =TAB= | =TAB= |
+ | =backward-button= | =S-TAB= | =S-TAB= |
+ | =describe-mode= | =h=, =?= | =g?= |
+ | =revert-buffer= | =g= | =gr= |
+ | =quit-window= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/apropos/evil-collection-apropos.el b/.config/emacs/lisp/evil-collection/modes/apropos/evil-collection-apropos.el
new file mode 100644
index 0000000..7820a49
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/apropos/evil-collection-apropos.el
@@ -0,0 +1,52 @@
+;;; evil-collection-apropos.el --- Evil bindings for apropos-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, help, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `apropos-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'apropos)
+
+(defconst evil-collection-apropos-maps '(apropos-mode-map))
+
+;;;###autoload
+(defun evil-collection-apropos-setup ()
+ "Set up `evil' bindings for `apropos'."
+ (evil-set-initial-state 'apropos-mode 'normal)
+ (evil-collection-define-key 'normal 'apropos-mode-map
+ (kbd "RET") 'apropos-follow
+ (kbd "TAB") 'forward-button
+ (kbd "S-TAB") 'backward-button
+ "g?" 'describe-mode
+ "gr" 'revert-buffer
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-apropos)
+;;; evil-collection-apropos.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/arc-mode/README.org b/.config/emacs/lisp/evil-collection/modes/arc-mode/README.org
new file mode 100644
index 0000000..178486b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/arc-mode/README.org
@@ -0,0 +1,30 @@
+* arc-mode
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/File-Archives.html][arc-mode]] (archive file browser).
+
+ =arc-mode= and =archive-mode= start in normal state.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------------+-----------------+------------------------------|
+ | =archive-next-line= | =n=, =C-n= | =j=, =C-j=, =gj=, =n=, =C-n= |
+ | =archive-previous-line= | =p=, =C-p= | =k=, =C-k=, =gk=, =p=, =C-p= |
+ | =beginning-of-buffer= | =<= | =gg=, =<= |
+ | =end-of-buffer= | =>= | =G=, =>= |
+ | =archive-extract= | =RET=, =e=, =f= | =RET= |
+ | =archive-extract-other-window= | =o= | =go=, =S-RET= |
+ | =archive-view= | =v= | =M-RET= |
+ | =archive-alternate-display= | =a= | =a= |
+ | =archive-flag-deleted= | =d=, =C-d= | =d=, =C-d= |
+ | =archive-rename-entry= | =r= | =r= |
+ | =archive-expunge= | =x= | =x= |
+ | =archive-copy-file= | =C= | =C= |
+ | =archive-chmod-entry= | =M= | =M= |
+ | =archive-chown-entry= | =O= | =O= |
+ | =archive-chgrp-entry= | =G= | =P= |
+ | =archive-mark= | =m= | =m= |
+ | =archive-unflag= | =u= | =u= |
+ | =archive-unmark-all-files= | =M-DEL= | =U=, =M-DEL= |
+ | =revert-buffer= | =g= | =gr= |
+ | =quit-window= | =q= | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/arc-mode/evil-collection-arc-mode.el b/.config/emacs/lisp/evil-collection/modes/arc-mode/evil-collection-arc-mode.el
new file mode 100644
index 0000000..7392b37
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/arc-mode/evil-collection-arc-mode.el
@@ -0,0 +1,78 @@
+;;; evil-collection-arc-mode.el --- Evil bindings for arc-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, arc-mode, archive, bindings, files
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Evil bindings for arc-mode.
+
+;;; Code:
+(require 'arc-mode)
+(require 'evil-collection)
+
+(defconst evil-collection-arc-mode-maps '(archive-mode-map))
+
+;;;###autoload
+(defun evil-collection-arc-mode-setup ()
+ "Set up `evil' bindings for `arc-mode'."
+ (evil-set-initial-state 'arc-mode 'normal)
+ (evil-set-initial-state 'archive-mode 'normal)
+ (evil-collection-define-key 'normal 'archive-mode-map
+ "j" 'archive-next-line
+ "k" 'archive-previous-line
+ (kbd "C-j") 'archive-next-line
+ (kbd "C-k") 'archive-previous-line
+ "gj" 'archive-next-line
+ "gk" 'archive-previous-line
+
+ "gg" 'beginning-of-buffer
+ "G" 'end-of-buffer
+
+ ;; open
+ (kbd "RET") 'archive-extract
+ (kbd "S-<return>") 'archive-extract-other-window
+ (kbd "M-<return>") 'archive-view
+ "go" 'archive-extract-other-window
+
+ "a" 'archive-alternate-display
+ "d" 'archive-flag-deleted
+ "r" 'archive-rename-entry
+ "x" 'archive-expunge
+ "C" 'archive-copy-file
+ "M" 'archive-chmod-entry
+ "O" 'archive-chown-entry
+ "P" 'archive-chgrp-entry
+
+ ;; refresh
+ "gr" 'revert-buffer
+
+ ;; mark
+ "m" 'archive-mark
+ "u" 'archive-unflag
+ "U" 'archive-unmark-all-files
+
+ ;; quit
+ "q" 'quit-window))
+
+(provide 'evil-collection-arc-mode)
+;;; evil-collection-arc-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/atomic-chrome/evil-collection-atomic-chrome.el b/.config/emacs/lisp/evil-collection/modes/atomic-chrome/evil-collection-atomic-chrome.el
new file mode 100644
index 0000000..61d2eb2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/atomic-chrome/evil-collection-atomic-chrome.el
@@ -0,0 +1,42 @@
+;;; evil-collection-atomic-chrome.el --- Evil bindings for atomic-chrome -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for atomic-chrome.
+
+;;; Code:
+(require 'evil-collection)
+(require 'atomic-chrome nil t)
+
+(defconst evil-collection-atomic-chrome-maps nil)
+
+;;;###autoload
+(defun evil-collection-atomic-chrome-setup ()
+ "Set up `evil' bindings for `atomic-chrome'."
+ ;; The browser is in "inserted" state, makes it consistent.
+ (evil-set-initial-state 'atomic-chrome-edit-mode 'insert))
+
+(provide 'evil-collection-atomic-chrome)
+;;; evil-collection-atomic-chrome.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/auto-package-update/evil-collection-auto-package-update.el b/.config/emacs/lisp/evil-collection/modes/auto-package-update/evil-collection-auto-package-update.el
new file mode 100644
index 0000000..7f832b7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/auto-package-update/evil-collection-auto-package-update.el
@@ -0,0 +1,44 @@
+;;; evil-collection-auto-package-update.el --- Evil bindings for auto-package-update -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, auto-package-update, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for auto-package-update.
+
+;;; Code:
+(require 'evil-collection)
+(require 'auto-package-update nil t)
+
+(defconst evil-collection-auto-package-update-maps '(auto-package-update-minor-mode-map))
+
+;;;###autoload
+(defun evil-collection-auto-package-update-setup ()
+ "Set up `evil' bindings for `auto-package-update'."
+ (add-hook 'auto-package-update-minor-mode-hook 'evil-normalize-keymaps)
+ (evil-collection-define-key 'normal 'auto-package-update-minor-mode-map
+ "q" 'quit-window))
+
+(provide 'evil-collection-auto-package-update)
+
+;;; evil-collection-auto-package-update.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/beginend/evil-collection-beginend.el b/.config/emacs/lisp/evil-collection/modes/beginend/evil-collection-beginend.el
new file mode 100644
index 0000000..715a471
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/beginend/evil-collection-beginend.el
@@ -0,0 +1,125 @@
+;;; evil-collection-beginend.el --- Evil bindings for beginend -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Balaji Sivaraman
+
+;; Author: Balaji Sivaraman <balaji@balajisivaraman.com>
+;; Maintainer: Balaji Sivaraman <balaji@balajisivaraman.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for beginend.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'beginend nil t)
+
+(eval-and-compile
+ (defconst evil-collection-beginend-modes '(bs-mode
+ rg-mode
+ org-mode
+ deft-mode
+ prog-mode
+ LaTeX-mode
+ dired-mode
+ latex-mode
+ nroam-mode
+ occur-mode
+ vc-dir-mode
+ ibuffer-mode
+ message-mode
+ outline-mode
+ prodigy-mode
+ org-agenda-mode
+ compilation-mode
+ epa-key-list-mode
+ magit-status-mode
+ elfeed-search-mode
+ elfeed-show-mode
+ magit-revision-mode
+ notmuch-search-mode
+ recentf-dialog-mode)))
+
+
+(defmacro evil-beginend--define-goto-beginning-motion (ec-mode-name)
+ "Macro to define new Evil motion that will use the corresponding
+beginend-goto-beginning function for EC-MODE-NAME when count is not
+provided for the motion; otherwise behave like `evil-goto-first-line'
+if count is provided.
+
+This will also associate the regular Evil `gg' keybinding with the
+newly defined motion."
+ (let ((motion-name (intern (format "evil-beginend-%s-goto-beginning" ec-mode-name)))
+ (beginend-beginning-fn-name (intern (format "beginend-%s-goto-beginning" ec-mode-name)))
+ (beginend-map-name (intern (format "beginend-%s-map" ec-mode-name))))
+ `(progn
+ (declare-function ,motion-name "evil-collection")
+ (declare-function ,beginend-beginning-fn-name "ext:beginend")
+ (evil-define-motion ,motion-name (count)
+ :jump t
+ :type line
+ (if count
+ (evil-goto-first-line count)
+ (,beginend-beginning-fn-name)))
+ (evil-collection-define-key 'normal ',beginend-map-name
+ "gg" ',motion-name))))
+
+(defmacro evil-beginend--define-goto-end-motion (ec-mode-name)
+ "Macro to define new Evil motion that will use the corresponding
+beginend-goto-end function for EC-MODE-NAME when count is not
+provided for the motion; otherwise behave like `evil-goto-line'
+if count is provided.
+
+This will also associate the regular Evil `G' keybinding with the
+newly defined motion."
+ (let ((motion-name (intern (format "evil-beginend-%s-goto-end" ec-mode-name)))
+ (beginend-end-fn-name (intern (format "beginend-%s-goto-end" ec-mode-name)))
+ (beginend-map-name (intern (format "beginend-%s-map" ec-mode-name))))
+ `(progn
+ (declare-function ,motion-name "evil-collection")
+ (declare-function ,beginend-end-fn-name "ext:beginend")
+ (evil-define-motion ,motion-name (count)
+ :jump t
+ :type line
+ (if count
+ (evil-goto-line count)
+ (,beginend-end-fn-name)))
+ (evil-collection-define-key 'normal ',beginend-map-name
+ "G" ',motion-name))))
+
+(defmacro evil-beginend--define-mode-motions ()
+ "Define the goto-beginning and goto-end motions for all modes in
+`evil-collection-beginend-modes'."
+ `(progn
+ ,@(mapcar
+ (lambda (mode-symbol)
+ (let ((mode-string (symbol-name mode-symbol)))
+ `(progn
+ (evil-beginend--define-goto-beginning-motion ,mode-string)
+ (evil-beginend--define-goto-end-motion ,mode-string))))
+ evil-collection-beginend-modes)))
+
+;;;###autoload
+(defun evil-collection-beginend-setup ()
+ "Set up `evil' bindings for `beginend'."
+ (evil-beginend--define-mode-motions))
+
+(provide 'evil-collection-beginend)
+;;; evil-collection-beginend.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/bluetooth/evil-collection-bluetooth.el b/.config/emacs/lisp/evil-collection/modes/bluetooth/evil-collection-bluetooth.el
new file mode 100644
index 0000000..8d18604
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/bluetooth/evil-collection-bluetooth.el
@@ -0,0 +1,59 @@
+;;; evil-collection-bluetooth.el --- Bindings for `bluetooth' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Arian Dehghani
+
+;; Author: Arian Dehghani <arianxdehghani@gmail.com>
+;; Maintainer: Arian Dehghani <arianxdehghani@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, tools, blutooth
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `bluetooth'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'bluetooth nil t)
+
+(defvar bluetooth-mode-map)
+
+(defconst evil-collection-bluetooth-maps '(bluetooth-mode-map))
+
+;;;###autoload
+(defun evil-collection-bluetooth-setup ()
+ "Set up `evil' bindings for `bluetooth'."
+ (evil-collection-set-readonly-bindings 'bluetooth-mode-map)
+ (evil-collection-define-key 'normal 'bluetooth-mode-map
+ "c" 'bluetooth-connect
+ "d" 'bluetooth-disconnect
+ "b" 'bluetooth-toggle-blocked
+ "t" 'bluetooth-toggle-trusted
+ "a" 'bluetooth-set-alias
+ "r" 'bluetooth-start-discovery
+ "R" 'bluetooth-stop-discovery
+ "s" 'bluetooth-toggle-powered
+ "P" 'bluetooth-pair
+ "D" 'bluetooth-toggle-discoverable
+ "x" 'bluetooth-toggle-pairable
+ "i" 'bluetooth-show-device-info
+ "A" 'bluetooth-show-adapter-info
+ "K" 'bluetooth-remove-device
+ "<" 'bluetooth-beginning-of-list
+ ">" 'bluetooth-end-of-list))
+
+(provide 'evil-collection-bluetooth)
+;;; evil-collection-bluetooth.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/bm/evil-collection-bm.el b/.config/emacs/lisp/evil-collection/modes/bm/evil-collection-bm.el
new file mode 100644
index 0000000..d4470f5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/bm/evil-collection-bm.el
@@ -0,0 +1,54 @@
+;;; evil-collection-bm.el --- Evil bindings for bm -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, bm, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for bm.
+
+;;; Code:
+(require 'evil-collection)
+(require 'bm nil t)
+
+(defconst evil-collection-bm-maps '(bm-show-mode-map))
+
+;;;###autoload
+(defun evil-collection-bm-setup ()
+ "Set up `evil' bindings for `bm'."
+ (evil-set-initial-state 'bm-show-mode 'normal)
+
+ (evil-collection-define-key 'normal 'bm-show-mode-map
+ "q" 'bm-show-quit-window
+ "gr" 'revert-buffer
+ "g?" 'describe-mode
+
+ "j" 'bm-show-next
+ "k" 'bm-show-prev
+
+ ;; open
+ (kbd "RET") 'bm-show-goto-bookmark
+ (kbd "S-<return>") 'bm-show-bookmark))
+
+
+(provide 'evil-collection-bm)
+;;; evil-collection-bm.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/bookmark/README.org b/.config/emacs/lisp/evil-collection/modes/bookmark/README.org
new file mode 100644
index 0000000..5d3aa8e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/bookmark/README.org
@@ -0,0 +1,36 @@
+* bookmark
+
+ Evil bindings for the bookmark list (=bookmark-bmenu-mode=).
+
+ Standard motion / quit bindings come from =evil-collection-set-readonly-bindings=
+ and are not repeated below.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------------------------------+-----------------+------------------------------|
+ | =bookmark-bmenu-this-window= | =RET=, =f=, =j= | =RET= |
+ | =bookmark-bmenu-other-window= | =o= | =o=, =go=, =S-RET= |
+ | =bookmark-bmenu-switch-other-window= | =C-o= | =gO=, =M-RET= |
+ | =bookmark-bmenu-select= | =v= | =o= (see above; =v= unbound) |
+ | =bookmark-bmenu-1-window= | =1= | =1= |
+ | =bookmark-bmenu-2-window= | =2= | =2= |
+ | =bookmark-bmenu-other-frame= | =5= | =5= |
+ | =bookmark-bmenu-delete= | =d=, =k= | =d= |
+ | =bookmark-bmenu-delete-backwards= | =C-d= | =D= |
+ | =bookmark-bmenu-execute-deletions= | =x= | =x= |
+ | =bookmark-bmenu-search= | =/= | =s= (=s= also via custom) |
+ | =bookmark-bmenu-rename= | =r= | =r= |
+ | =bookmark-bmenu-relocate= | =R= | =R= |
+ | =bookmark-bmenu-load= | =l= | =L= |
+ | =bookmark-bmenu-save= | =s= | =s=, remap of =evil-write= |
+ | =bookmark-bmenu-toggle-filenames= | =t= | =t= |
+ | =bookmark-bmenu-locate= | =w= | =W= |
+ | =bookmark-bmenu-show-annotation= | =a= | =a= |
+ | =bookmark-bmenu-show-all-annotations= | =A= | =A= |
+ | =bookmark-bmenu-edit-annotation= | =e= | =E= |
+ | =bookmark-bmenu-mark= | =m= | =m= |
+ | =bookmark-bmenu-mark-all= | =M= | =M= |
+ | =bookmark-bmenu-unmark= | =u= | =u= |
+ | =bookmark-bmenu-unmark-all= | =U= | =U= |
+ | =bookmark-bmenu-backup-unmark= | =DEL= | =DEL= |
diff --git a/.config/emacs/lisp/evil-collection/modes/bookmark/evil-collection-bookmark.el b/.config/emacs/lisp/evil-collection/modes/bookmark/evil-collection-bookmark.el
new file mode 100644
index 0000000..f21ad32
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/bookmark/evil-collection-bookmark.el
@@ -0,0 +1,78 @@
+;;; evil-collection-bookmark.el --- Evil bindings for bookmarks -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, bookmark, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for bookmarks.
+
+;;; Code:
+(require 'evil-collection)
+(require 'bookmark)
+
+(defconst evil-collection-bookmark-maps '(bookmark-bmenu-mode-map))
+
+;;;###autoload
+(defun evil-collection-bookmark-setup ()
+ "Set up `evil' bindings for `bookmark'."
+ (evil-set-initial-state 'bookmark-bmenu-mode 'normal)
+ (evil-collection-set-readonly-bindings 'bookmark-bmenu-mode-map)
+ (evil-collection-define-key 'normal 'bookmark-bmenu-mode-map
+ [remap evil-write] 'bookmark-bmenu-save
+
+ "1" 'bookmark-bmenu-1-window
+ "2" 'bookmark-bmenu-2-window
+ "5" 'bookmark-bmenu-other-frame
+ "d" 'bookmark-bmenu-delete
+ "x" 'bookmark-bmenu-execute-deletions
+ "s" 'bookmark-bmenu-search
+ "r" 'bookmark-bmenu-rename
+ "R" 'bookmark-bmenu-relocate
+ "L" 'bookmark-bmenu-load
+ "t" 'bookmark-bmenu-toggle-filenames
+ "W" 'bookmark-bmenu-locate
+ "D" 'bookmark-bmenu-delete-backwards
+
+ ;; annotation
+ "a" 'bookmark-bmenu-show-annotation
+ "A" 'bookmark-bmenu-show-all-annotations
+ "E" 'bookmark-bmenu-edit-annotation
+
+ ;; mark
+ "u" 'bookmark-bmenu-unmark
+ "U" 'bookmark-bmenu-unmark-all
+ "m" 'bookmark-bmenu-mark
+ "M" 'bookmark-bmenu-mark-all
+
+ ;; open
+ "o" 'bookmark-bmenu-select
+ "O" 'bookmark-bmenu-other-window
+ "go" 'bookmark-bmenu-other-window
+ "gO" 'bookmark-bmenu-switch-other-window
+ (kbd "DEL") 'bookmark-bmenu-backup-unmark
+ (kbd "RET") 'bookmark-bmenu-this-window
+ (kbd "S-<return>") 'bookmark-bmenu-other-window
+ (kbd "M-<return>") 'bookmark-bmenu-switch-other-window))
+
+(provide 'evil-collection-bookmark)
+;;; evil-collection-bookmark.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/buff-menu/README.org b/.config/emacs/lisp/evil-collection/modes/buff-menu/README.org
new file mode 100644
index 0000000..b048631
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/buff-menu/README.org
@@ -0,0 +1,35 @@
+* buff-menu
+
+ Evil bindings for the buffer list (=Buffer-menu-mode=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------------------+-----------------+--------------------|
+ | =Buffer-menu-this-window= | =RET=, =f=, =e= | =RET=, =go=, =C-m= |
+ | =Buffer-menu-other-window= | =o= | =gO= |
+ | =Buffer-menu-select= | =v= | =gv= |
+ | =Buffer-menu-view= | =V= | =gV= |
+ | =Buffer-menu-delete= | =d=, =k= | =d=, =C-k= |
+ | =Buffer-menu-delete-backwards= | =C-d= | =C-d= |
+ | =Buffer-menu-execute= | =x= | =x= |
+ | =Buffer-menu-save= | =s= | =s= |
+ | =Buffer-menu-bury= | =b= | =X= |
+ | =Buffer-menu-mark= | =m= | =m= |
+ | =Buffer-menu-unmark= | =u= | =u= |
+ | =Buffer-menu-unmark-all= | =U= | =U= |
+ | =Buffer-menu-backup-unmark= | =DEL= | =DEL= |
+ | =Buffer-menu-not-modified= | =~= | =~= |
+ | =Buffer-menu-toggle-read-only= | =%= | =%= |
+ | =Buffer-menu-toggle-files-only= | =T= | =T= |
+ | =Buffer-menu-visit-tags-table= | =t= | =t= |
+ | =tabulated-list-sort= | =S= | =o= |
+ | =revert-buffer= | =g= | =gr= |
+ | =evil-visual-char= | n/a | =v= |
+ | =quit-window= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+ | =Buffer-menu-1-window= | =1= | =1= |
+ | =Buffer-menu-2-window= | =2= | =2= |
+ | =Buffer-menu-isearch-buffers= | =M-s a C-s= | =M-s a C-s= |
+ | =Buffer-menu-isearch-buffers-regexp= | =M-s a M-C-s= | =M-s a M-C-s= |
+ | =Buffer-menu-multi-occur= | =M-s a C-o= | =M-s a C-o= |
diff --git a/.config/emacs/lisp/evil-collection/modes/buff-menu/evil-collection-buff-menu.el b/.config/emacs/lisp/evil-collection/modes/buff-menu/evil-collection-buff-menu.el
new file mode 100644
index 0000000..a754978
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/buff-menu/evil-collection-buff-menu.el
@@ -0,0 +1,78 @@
+;;; evil-collection-buff-menu.el --- Bindings for `buff-menu' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `buff-menu'.
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-buff-menu-maps '(Buffer-menu-mode-map))
+
+;;;###autoload
+(defun evil-collection-buff-menu-setup ()
+ "Set up `evil' bindings for `buff-menu'.."
+ (evil-set-initial-state 'Buffer-menu-mode 'normal)
+
+ (evil-collection-define-key 'normal 'Buffer-menu-mode-map
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-window
+ "gr" 'revert-buffer
+ "go" 'Buffer-menu-this-window
+ "gO" 'Buffer-menu-other-window
+ "d" 'Buffer-menu-delete
+ "s" 'Buffer-menu-save
+ [mouse-2] 'Buffer-menu-mouse-select
+ [follow-link] 'mouse-face
+ "x" 'Buffer-menu-execute
+ "o" 'tabulated-list-sort
+ "gv" 'Buffer-menu-select
+ "gV" 'Buffer-menu-view
+ "v" 'evil-visual-char
+
+ ;; mark
+ "u" 'Buffer-menu-unmark
+ "U" 'Buffer-menu-unmark-all
+ "m" 'Buffer-menu-mark
+
+ "X" 'Buffer-menu-bury
+
+ ;; Default ones, unchanged. Redundant ones commented
+ "2" 'Buffer-menu-2-window
+ "1" 'Buffer-menu-1-window
+ (kbd "C-m") 'Buffer-menu-this-window
+ (kbd "C-k") 'Buffer-menu-delete
+ (kbd "C-d") 'Buffer-menu-delete-backwards
+ (kbd "<delete>") 'Buffer-menu-backup-unmark
+ "~" 'Buffer-menu-not-modified
+ "t" 'Buffer-menu-visit-tags-table
+ "%" 'Buffer-menu-toggle-read-only
+ "T" 'Buffer-menu-toggle-files-only
+ (kbd "M-s a C-s") 'Buffer-menu-isearch-buffers
+ (kbd "M-s a M-C-s") 'Buffer-menu-isearch-buffers-regexp
+ (kbd "M-s a C-o") 'Buffer-menu-multi-occur))
+
+(provide 'evil-collection-buff-menu)
+;;; evil-collection-buff-menu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/bufler/evil-collection-bufler.el b/.config/emacs/lisp/evil-collection/modes/bufler/evil-collection-bufler.el
new file mode 100644
index 0000000..85aa748
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/bufler/evil-collection-bufler.el
@@ -0,0 +1,57 @@
+;;; evil-collection-bufler.el --- Evil bindings for mpdel -*- lexical-binding: t -*-
+
+;; Copyright (C) 2023 Ruoyu Feng
+
+;; Author: Ruoyu Feng <mail@vonfry.name>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, tools, bufler, buffer list
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for bufler.
+
+;;; Code:
+
+(require 'bufler nil t)
+(require 'evil-collection)
+
+(defvar bufler-list-mode-map)
+
+(defconst evil-collection-bufler-maps '(bufler-list-mode-map))
+
+(defconst evil-collection-bufler-modes '(bufler-list-mode))
+
+;;;###autoload
+(defun evil-collection-bufler-setup ()
+ "Set up `evil' bindings for `bufler'."
+
+ (evil-collection-set-readonly-bindings 'bufler-list-mode-map)
+ (dolist (mode evil-collection-bufler-modes)
+ (evil-set-initial-state mode 'normal))
+ (evil-collection-define-key 'normal 'bufler-list-mode-map
+ "?" 'hydra:bufler/body
+ "B" 'bufler
+ "f" 'bufler-list-group-frame
+ "F" 'bufler-list-group-make-frame
+ "r" 'bufler-list-buffer-name-workspace
+ "D" 'bufler-list-buffer-kill
+ "w" 'bufler-list-buffer-save
+ (kbd "RET") 'bufler-list-buffer-switch
+ "J" 'bufler-list-buffer-peek))
+
+(provide 'evil-collection-bufler)
+;;; evil-collection-bufler.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/calc/README.org b/.config/emacs/lisp/evil-collection/modes/calc/README.org
new file mode 100644
index 0000000..97a2e1b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/calc/README.org
@@ -0,0 +1,52 @@
+* calc
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/calc/index.html][calc]].
+
+ Standard motion / quit bindings come from =evil-collection-set-readonly-bindings=
+ and are not repeated below. Calc's =calc-ext= prefix maps (=V=, =Y=, =Z=, =a=,
+ =b=, =c=, =f=, =g=, =m=, =r=, =s=, =t=, =v=) are kept on their original keys;
+ prefixes that conflict with evil motions are relocated.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------------------+--------------------------+---------------------------|
+ | =calc-enter= | =RET= | =RET=, =SPC= |
+ | =calc-over= | =C-j= | =S-RET= |
+ | =calc-roll-down= | =TAB= | =TAB= |
+ | =calc-roll-up= | =M-TAB= | =C-M-i= |
+ | =calc-pop= | =DEL=, =<delete>=, =C-d= | =DEL=, =<delete>= |
+ | =calc-pop-above= | =M-DEL=, =M-d= | =M-DEL=, =C-M-d= |
+ | =calc-kill= | =C-k= | =d= |
+ | =calc-kill-region= (visual) | =C-w= | =d= |
+ | =calc-yank= | =C-y= | =pp= |
+ | =calc-copy-to-buffer= | =y= | =pP= |
+ | =calc-copy-as-kill= | =M-k= | =M-k= |
+ | =calc-copy-region-as-kill= | =M-w= | =M-w= |
+ | =calc-undo= | =U= | =u= |
+ | =calc-redo= | =D= | =D= (via prefix relocate) |
+ | =calc-precision= | =p= | =C-p= |
+ | =calc-call-last-kbd-macro= | =X= | =X= |
+ | =calc-help= | =?= | =?= |
+ | =calc-info= | =i= | =i= |
+ | =calc-quit= | =q= | =q= |
+ | =calc-last-args= | =M-RET= | =M-RET= |
+ | =calc-percent= | =M-%= | =M-%= |
+ | =calc-transpose-lines= | =C-x C-t= | =C-x C-t= |
+ | =calc-total-algebraic-mode= | =m t= | =M-m t= |
+
+** Relocated prefix maps
+
+ Calc prefixes are moved off keys that conflict with evil motion or operators:
+
+ | Original prefix | Evil prefix |
+ |-----------------+-------------|
+ | =d= | =D= |
+ | =j= | =zj= |
+ | =k= | =zk= |
+ | =l= | =zl= |
+ | =u= | =U= |
+ | =z= | =zz= |
+
+ All operator / digit / symbol keys (=+=, =-=, =*=, =/=, digits, =A=–=T=, =[[=,
+ =]]=, etc.) keep their default calc bindings.
diff --git a/.config/emacs/lisp/evil-collection/modes/calc/evil-collection-calc.el b/.config/emacs/lisp/evil-collection/modes/calc/evil-collection-calc.el
new file mode 100644
index 0000000..8f35b98
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/calc/evil-collection-calc.el
@@ -0,0 +1,172 @@
+;;; evil-collection-calc.el --- Evil bindings for calc -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>, Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, calc, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for calc.
+
+;;; Code:
+(require 'evil-collection)
+(require 'calc)
+
+(defconst evil-collection-calc-maps '(calc-mode-map))
+
+;;;###autoload
+(defun evil-collection-calc-setup ()
+ "Set up `evil' bindings for `calc'."
+ (evil-collection-set-readonly-bindings 'calc-mode-map)
+ (evil-set-initial-state 'calc-mode 'normal)
+
+ ;; Calc sets up its bindings just-in-time for its "extensions". I don't think
+ ;; it's worth copying this clumsy design (for what performance benefit?),
+ ;; while making the bindings much harder to maintain.
+ (require 'calc-ext)
+
+ (evil-collection-define-key 'normal 'calc-mode-map
+ "0" 'calcDigit-start
+ "1" 'calcDigit-start
+ "2" 'calcDigit-start
+ "3" 'calcDigit-start
+ "4" 'calcDigit-start
+ "5" 'calcDigit-start
+ "6" 'calcDigit-start
+ "7" 'calcDigit-start
+ "8" 'calcDigit-start
+ "9" 'calcDigit-start
+
+ (kbd "<tab>") 'calc-roll-down
+ (kbd "S-<return>") 'calc-over
+ (kbd "RET") 'calc-enter
+ (kbd "SPC") 'calc-enter
+
+ (kbd "C-x C-t") 'calc-transpose-lines
+ (kbd "C-M-d") 'calc-pop-above
+ (kbd "C-M-i") 'calc-roll-up
+ (kbd "M-RET") 'calc-last-args
+ (kbd "C-M-w") 'kill-ring-save
+ (kbd "M-%") 'calc-percent
+ (kbd "M-k") 'calc-copy-as-kill
+ (kbd "M-w") 'calc-copy-region-as-kill
+ (kbd "M-DEL") 'calc-pop-above
+ (kbd "M-m t") 'calc-total-algebraic-mode
+ (kbd "<delete>") 'calc-pop
+ (kbd "<mouse-2>") 'calc-yank
+ (kbd "DEL") 'calc-pop ; was "C-d"
+ "d" 'calc-kill ; was "C-k"
+ "u" 'calc-undo ; was "U"
+ "X" 'calc-call-last-kbd-macro ; "@" is already used.
+ "pp" 'calc-yank ; was "C-y"
+ "pP" 'calc-copy-to-buffer ; was "y"
+
+ (kbd "C-p") 'calc-precision ; was "p"
+
+ "?" 'calc-help
+ ;; "h" 'calc-help-prefix ; TODO: Rebind?
+ "i" 'calc-info
+
+ "\"" 'calc-auto-algebraic-entry
+ "$" 'calc-auto-algebraic-entry ; TODO: No need for this one?
+ "'" 'calc-algebraic-entry
+
+ "!" 'calc-factorial
+ "#" 'calcDigit-start
+ "%" 'calc-mod
+ "&" 'calc-inv
+ "(" 'calc-begin-complex
+ ")" 'calc-end-complex
+ "*" 'calc-times
+ "+" 'calc-plus
+ "," 'calc-comma
+ "-" 'calc-minus
+ "." 'calcDigit-start
+ "/" 'calc-divide
+ ":" 'calc-fdiv
+ ";" 'calc-semi ; TODO: Shall we really override `evil-ex'?
+ "<" 'calc-scroll-left
+ "=" 'calc-evaluate
+ ">" 'calc-scroll-right
+ "@" 'calcDigit-start
+ "A" 'calc-abs
+ "B" 'calc-log
+ "C" 'calc-cos
+ ;; "D" 'calc-redo ; TODO: What's the purpose of this? Bind to C-r?
+ "E" 'calc-exp
+ "F" 'calc-floor
+ "G" 'calc-argument
+ "H" 'calc-hyperbolic
+ "I" 'calc-inverse
+ "J" 'calc-conj
+ "K" 'calc-keep-args
+ "L" 'calc-ln
+ "M" 'calc-more-recursion-depth
+ "N" 'calc-eval-num
+ "O" 'calc-option
+ "P" 'calc-pi
+ "Q" 'calc-sqrt
+ "R" 'calc-round
+ "S" 'calc-sin
+ "T" 'calc-tan
+ "[[" 'calc-begin-vector
+ "]]" 'calc-end-vector
+ "\\" 'calc-idiv
+ "^" 'calc-power
+ "_" 'calcDigit-start
+ "`" 'calc-edit
+ "e" 'calcDigit-start
+ "n" 'calc-change-sign
+ "o" 'calc-realign
+ "w" 'calc-why
+ "x" 'calc-execute-extended-command
+ "|" 'calc-concat
+ "{" 'calc-scroll-down ; TODO: Not necessary?
+ "}" 'calc-scroll-up ; TODO: Not necessary?
+ "~" 'calc-num-prefix
+
+ "V" (lookup-key calc-mode-map (kbd "V"))
+ "Y" (lookup-key calc-mode-map (kbd "Y"))
+ "Z" (lookup-key calc-mode-map (kbd "Z"))
+ "a" (lookup-key calc-mode-map (kbd "a"))
+ "b" (lookup-key calc-mode-map (kbd "b"))
+ "c" (lookup-key calc-mode-map (kbd "c"))
+ "D" (lookup-key calc-mode-map (kbd "d"))
+ "f" (lookup-key calc-mode-map (kbd "f"))
+ "g" (lookup-key calc-mode-map (kbd "g"))
+ "zj" (lookup-key calc-mode-map (kbd "j"))
+ "zk" (lookup-key calc-mode-map (kbd "k"))
+ "zl" (lookup-key calc-mode-map (kbd "l"))
+ "m" (lookup-key calc-mode-map (kbd "m"))
+ "r" (lookup-key calc-mode-map (kbd "r"))
+ "s" (lookup-key calc-mode-map (kbd "s"))
+ "t" (lookup-key calc-mode-map (kbd "t"))
+ "U" (lookup-key calc-mode-map (kbd "u"))
+ "v" (lookup-key calc-mode-map (kbd "v"))
+ "zz" (lookup-key calc-mode-map (kbd "z"))
+
+ ;; quit
+ "q" 'calc-quit)
+
+ (evil-collection-define-key 'visual 'calc-mode-map
+ "d" 'calc-kill-region))
+
+(provide 'evil-collection-calc)
+;;; evil-collection-calc.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/calendar/README.org b/.config/emacs/lisp/evil-collection/modes/calendar/README.org
new file mode 100644
index 0000000..2733b42
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/calendar/README.org
@@ -0,0 +1,63 @@
+* calendar
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Calendar_002fDiary.html][calendar]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------------------+----------------+---------------------|
+ | =calendar-backward-day= | =C-b=, =left= | =h= |
+ | =calendar-forward-day= | =C-f=, =right= | =l= |
+ | =calendar-backward-week= | =C-p=, =up= | =k= |
+ | =calendar-forward-week= | =C-n=, =down= | =j= |
+ | =calendar-beginning-of-week= | =C-a= | =0=, =^= |
+ | =calendar-end-of-week= | =C-e= | =$= |
+ | =calendar-beginning-of-month= | =M-a= | =(= |
+ | =calendar-end-of-month= | =M-e= | =)= |
+ | =calendar-backward-month= | =M-{= | ={=, =C-k=, =gk= |
+ | =calendar-forward-month= | =M-}= | =}=, =C-j=, =gj= |
+ | =calendar-backward-year= | =C-x [= | =[[= |
+ | =calendar-forward-year= | =C-x ]= | =]]= |
+ | =calendar-beginning-of-year= | =M-<= | =M-<= |
+ | =calendar-end-of-year= | =M->= | =M->= |
+ | =calendar-scroll-right= | =>=, =C-x <= | =<= |
+ | =calendar-scroll-left= | =<=, =C-x >= | =>= |
+ | =calendar-scroll-right-three-months= | =M-v=, =prior= | =C-b= |
+ | =calendar-scroll-left-three-months= | =C-v=, =next= | =C-f= |
+ | =scroll-other-window= | =SPC= | =SPC= |
+ | =scroll-other-window-down= | =S-SPC=, =DEL= | =S-SPC=, =<delete>= |
+ | =calendar-set-mark= | =C-SPC= | =v= |
+ | =calendar-goto-today= | =.= | =.= |
+ | =calendar-other-month= | =o= | =o=, =gD= |
+ | =calendar-goto-date= | =g d= | =gd= |
+ | =diary-view-entries= | =d= | =d= |
+ | =diary-view-other-diary-entries= | =D= | =D= |
+ | =diary-mark-entries= | =m= | =m= |
+ | =diary-show-all-entries= | =s= | =s= |
+ | =appt-add= | =A a= | =Aa= |
+ | =appt-delete= | =A d= | =Ad= |
+ | =calendar-unmark= | =u= | =u= |
+ | =calendar-mark-holidays= | =x= | =x= |
+ | =calendar-list-holidays= | =a= | =a=, =gh= |
+ | =calendar-cursor-holidays= | =h= | =r= |
+ | =calendar-lunar-phases= | =M= | =gm= |
+ | =calendar-sunrise-sunset= | =S= | =gs= |
+ | =org-calendar-goto-agenda= | n/a | =gc= |
+ | =calendar-redraw= | =C-c C-l= | =gr= |
+ | =calendar-goto-info-node= | =?= | =?=, =g?= |
+ | =calendar-count-days-region= | =M-== | =M-== |
+ | =calendar-exit= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+
+** Org integration
+
+ When =evil-collection-calendar-want-org-bindings= is non-nil, the key named by
+ =org-calendar-to-agenda-key= (default =c=) is bound to =org-calendar-goto-agenda=,
+ and =org-calendar-insert-diary-entry-key= (default =i=) to =org-agenda-diary-entry=
+ when =org-agenda-diary-file= is set.
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |----------------------------------------------+---------+---------------------------------------------|
+ | =evil-collection-calendar-want-org-bindings= | =nil= | Install =org-calendar-*= bindings on entry. |
diff --git a/.config/emacs/lisp/evil-collection/modes/calendar/evil-collection-calendar.el b/.config/emacs/lisp/evil-collection/modes/calendar/evil-collection-calendar.el
new file mode 100644
index 0000000..81464a8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/calendar/evil-collection-calendar.el
@@ -0,0 +1,146 @@
+;;; evil-collection-calendar.el --- Evil bindings for calendar -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, calendar, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for the calendar.
+
+;;; Code:
+(require 'calendar)
+(require 'evil-collection)
+
+(defconst evil-collection-calendar-maps '(calendar-mode-map))
+
+(defun evil-collection-calendar-setup-org-bindings ()
+ "Bind Org functions to Calendar keymap."
+ (require 'org)
+ (require 'org-agenda)
+ (defvar org-calendar-to-agenda-key)
+ (defvar org-agenda-diary-file)
+ (defvar org-calendar-insert-diary-entry-key)
+
+ (let ((key (pcase org-calendar-to-agenda-key
+ ((and key (pred stringp)) key)
+ ;; The default value of `org-calendar-to-agenda-key' is [?c] in Org 9.1
+ ;; We do make a minimal compatibility support for vector of integers.
+ ((and key (pred vectorp)) (mapconcat (lambda (x) (format "%c" x)) key ""))
+ ((and (pred symbolp) 'default) "c")
+ (_ ""))))
+ (evil-collection-define-key 'normal 'calendar-mode-map
+ (kbd key) 'org-calendar-goto-agenda))
+
+ ;; Similar to `org-calendar-to-agenda-key'.
+ (unless (eq org-agenda-diary-file 'diary-file)
+ (let ((key (pcase org-calendar-insert-diary-entry-key
+ ((and key (pred stringp)) key)
+ ((and key (pred vectorp)) (mapconcat (lambda (x) (format "%c" x)) key ""))
+ ;; NOTE Consistent behavior with `org-calendar-to-agenda-key'
+ ;; although it's not supported in Org officially.
+ ((and (pred symbolp) 'default) "i")
+ (_ ""))))
+ (evil-collection-define-key 'normal 'calendar-mode-map
+ (kbd key) 'org-agenda-diary-entry))))
+
+;; Otherwise it will load tons of org stuff at startup.
+(defvar evil-collection-calendar-want-org-bindings)
+(when evil-collection-calendar-want-org-bindings
+ (add-hook 'calendar-mode-hook #'evil-collection-calendar-setup-org-bindings))
+
+;;;###autoload
+(defun evil-collection-calendar-setup ()
+ "Set up `evil' bindings for `calendar'."
+ (evil-set-initial-state 'calendar-mode 'normal)
+ (evil-collection-define-key 'normal 'calendar-mode-map
+ ;; motion
+ "h" 'calendar-backward-day
+ "j" 'calendar-forward-week
+ "k" 'calendar-backward-week
+ "l" 'calendar-forward-day
+ "0" 'calendar-beginning-of-week
+ "^" 'calendar-beginning-of-week
+ "$" 'calendar-end-of-week
+ "[[" 'calendar-backward-year
+ "]]" 'calendar-forward-year
+ (kbd "M-<") 'calendar-beginning-of-year
+ (kbd "M->") 'calendar-end-of-year
+ "(" 'calendar-beginning-of-month
+ ")" 'calendar-end-of-month
+ (kbd "SPC") 'scroll-other-window
+ (kbd "S-SPC") 'scroll-other-window-down
+ (kbd "<delete>") 'scroll-other-window-down
+ "<" 'calendar-scroll-right
+ ">" 'calendar-scroll-left
+ (kbd "C-b") 'calendar-scroll-right-three-months
+ (kbd "C-f") 'calendar-scroll-left-three-months
+ "{" 'calendar-backward-month
+ "}" 'calendar-forward-month
+ (kbd "C-k") 'calendar-backward-month
+ (kbd "C-j") 'calendar-forward-month
+ "gk" 'calendar-backward-month
+ "gj" 'calendar-forward-month
+
+ ;; visual
+ "v" 'calendar-set-mark
+
+ ;; goto
+ "." 'calendar-goto-today
+ "o" 'calendar-other-month
+ "gd" 'calendar-goto-date ; "gd" in evil-org-agenda, "gd" in Emacs.
+ "gD" 'calendar-other-month
+
+ ;; diary
+ "D" 'diary-view-other-diary-entries
+ "d" 'diary-view-entries
+ "m" 'diary-mark-entries
+ "s" 'diary-show-all-entries
+
+ ;; appointment
+ "Aa" 'appt-add
+ "Ad" 'appt-delete
+
+ "u" 'calendar-unmark
+ "x" 'calendar-mark-holidays
+
+ ;; show
+ "gm" 'calendar-lunar-phases ; "gm" in evil-org-agenda. TODO: Shadows calendar-mayan.
+ "gs" 'calendar-sunrise-sunset ; "gs" in evil-org-agenda
+ "gh" 'calendar-list-holidays ; "gh" in evil-org-agenda. TODO: Shadows calendar-hebrew.
+ "gc" 'org-calendar-goto-agenda ; "gc" in evil-org-agenda. TODO: Shadows calendar-iso.
+ "a" 'calendar-list-holidays
+ "r" 'calendar-cursor-holidays
+
+ ;; refresh
+ "gr" 'calendar-redraw
+
+ "g?" 'calendar-goto-info-node
+ "?" 'calendar-goto-info-node ; Search is not very useful.
+ (kbd "M-=") 'calendar-count-days-region
+
+ ;; quit
+ "q" 'calendar-exit
+ "ZQ" 'evil-quit
+ "ZZ" 'calendar-exit))
+
+(provide 'evil-collection-calendar)
+;;; evil-collection-calendar.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/cider/README.org b/.config/emacs/lisp/evil-collection/modes/cider/README.org
new file mode 100644
index 0000000..a72a3a7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/cider/README.org
@@ -0,0 +1,164 @@
+* cider
+
+ Evil bindings for [[https://github.com/clojure-emacs/cider][CIDER]].
+
+ The bulk of CIDER's commands live under the =C-c= prefix in =cider-mode-map=
+ -- those are left alone. Evil only adds vim-style navigation, doc lookup and
+ the debugger keys.
+
+** cider-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------------+---------------+-----------|
+ | =cider-switch-to-repl-buffer= | =C-c C-z= | =gz= |
+ | =cider-find-resource= | =C-c M-.= | =gf= |
+ | =cider-doc= | =C-c C-d C-d= | =K= |
+ | =cider-find-var= | =M-.= | =gd= ([[#xref][†]]) |
+ | =cider-pop-back= | =M-,= | =C-t= ([[#xref][†]]) |
+ | =cider-browse-instrumented-defs= | n/a | =<f6>= |
+ | =cider-debug-defun-at-point= | =C-u C-M-x= | =<f9>= |
+
+ The =<f6>= / =<f9>= bindings only fire when
+ =evil-collection-setup-debugger-keys= is non-nil.
+
+** cider-repl-mode-map
+
+ | Command | Original | Evil |
+ |---------------------------------------+---------------+----------------------------------------------|
+ | =cider-switch-to-last-clojure-buffer= | =C-c C-z= | =gz= |
+ | =cider-refresh= | =C-c M-n r= | =gr= |
+ | =cider-find-resource= | =C-c M-.= | =gf= |
+ | =cider-doc= | =C-c C-d C-d= | =K= |
+ | =cider-find-var= | =M-.= | =gd= ([[#xref][†]]) |
+ | =cider-pop-back= | =M-,= | =C-t= ([[#xref][†]]) |
+ | =cider-repl-return= | =RET= | =RET= in =evil-collection-repl-submit-state= |
+ | =newline= | =C-j= | =RET= in the opposite state |
+
+ See =evil-collection-repl-submit-state= (normal or insert) for which state
+ submits.
+
+** cider-repl-history-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------------------+----------+-------------------|
+ | =cider-repl-history-previous= | =p= | =C-k=, =gk=, =[[= |
+ | =cider-repl-history-forward= | =n= | =C-j=, =gj=, =]]= |
+ | =cider-repl-history-insert-and-quit= | =RET= | =RET= |
+ | =cider-repl-history-update= | =g= | =gr= |
+ | =cider-repl-history-quit= | =q= | =q= |
+ | =cider-repl-history-undo-other-window= | =U= | =u= |
+
+** cider-test-report-mode-map
+
+ | Command | Original | Evil |
+ |------------------------------------+------------+--------------------|
+ | =cider-test-commands-map= | n/a | =C-c ,=, =C-c C-t= |
+ | =cider-test-previous-result= | n/a | =M-p=, =<backtab>= |
+ | =cider-test-next-result= | =TAB= | =M-n=, =<tab>= |
+ | =cider-test-jump= | =t=, =RET= | =gd=, =t=, =RET= |
+ | =cider-test-ediff= | =d= | =d= |
+ | =cider-test-stacktrace= | =e= | =e= |
+ | =cider-test-rerun-failed-tests= | =f= | =f= |
+ | =cider-test-run-ns-tests= | =n= | =n= |
+ | =cider-test-run-loaded-tests= | =l= | =L= |
+ | =cider-test-run-project-tests= | =p= | =p= |
+ | =cider-test-run-test= | =g= | =gr= |
+ | =cider-popup-buffer-quit-function= | n/a | =q= |
+
+** cider-macroexpansion-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------------+----------+-------------|
+ | =cider-popup-buffer-quit-function= | n/a | =q= |
+ | =cider-macroexpand-again= | =g= | =r= |
+ | =cider-doc= | =d= | =K= |
+ | =cider-javadoc= | =j= | =J= |
+ | =cider-find-var= / =xref-find-definitions= | =.= | =.= |
+ | =cider-macroexpand-1-inplace= | =m= | =m= |
+ | =cider-macroexpand-all-inplace= | =a= | =a= |
+ | =cider-macroexpand-undo= | =u= | =u=, =undo= |
+
+** cider-connections-buffer-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------+----------+-------|
+ | =cider-connections-make-default= | n/a | =d= |
+ | =cider-connection-browser= | n/a | =c= |
+ | =cider-connections-close-connection= | n/a | =x= |
+ | =cider-connections-goto-connection= | n/a | =RET= |
+ | =describe-mode= | n/a | =g?= |
+
+** cider-stacktrace-mode-map
+
+ Initial evil state is forced to normal.
+
+ | Command | Original | Evil |
+ |----------------------------------------+----------+-------------------|
+ | =cider-stacktrace-previous-cause= | n/a | =C-k=, =gk=, =[[= |
+ | =cider-stacktrace-next-cause= | n/a | =C-j=, =gj=, =]]= |
+ | =cider-stacktrace-jump= | n/a | =gd= |
+ | =cider-popup-buffer-quit-function= | =q= | =q= |
+ | =cider-stacktrace-toggle-java= | =j= | =J= |
+ | =cider-stacktrace-toggle-clj= | =c= | =C= |
+ | =cider-stacktrace-toggle-repl= | =r= | =R= |
+ | =cider-stacktrace-toggle-tooling= | =t= | =T= |
+ | =cider-stacktrace-toggle-duplicates= | =d= | =D= |
+ | =cider-stacktrace-show-only-project= | =p= | =P= |
+ | =cider-stacktrace-toggle-all= | =a= | =A= |
+ | =cider-stacktrace-cycle-cause-1..5= | =1..5= | =1..5= |
+ | =cider-stacktrace-cycle-all-causes= | =0= | =0=, =<backtab>= |
+ | =cider-stacktrace-cycle-current-cause= | =TAB= | =TAB= |
+
+** cider-inspector-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------------------------------+--------------+--------------|
+ | =quit-window= | n/a | =q= |
+ | =cider-inspector-operate-on-point= | =RET= | =RET= |
+ | =cider-inspector-pop= | =l= | =L= |
+ | =cider-inspector-refresh= | =g= | =gr= |
+ | =cider-inspector-next-page= | =SPC= | =C-j=, =SPC= |
+ | =cider-inspector-prev-page= | =S-SPC= | =C-k= |
+ | =cider-inspector-set-page-size= | =s= | =s= |
+ | =cider-inspector-next-inspectable-object= | =n=, =TAB= | =]]=, =gj= |
+ | =cider-inspector-previous-inspectable-object= | =p=, =S-TAB= | =[[=, =gk= |
+
+** cider--debug-mode-map
+
+ Only active when =evil-collection-setup-debugger-keys= is non-nil. Each key
+ sends a reply through =cider-debug-mode-send-reply=.
+
+ | Command | Reply | Evil |
+ |----------------------------------------------+-------------------+------|
+ | =cider-debug-defun-at-point= | (re-instrument) | =b= |
+ | =evil-collection-cider-debug-continue= | =:continue= | =c= |
+ | =evil-collection-cider-debug-continue-all= | =:continue-all= | =C= |
+ | =evil-collection-cider-debug-next= | =:next= | =n= |
+ | =evil-collection-cider-debug-in= | =:in= | =I= |
+ | =evil-collection-cider-debug-out= | =:out= | =o= |
+ | =evil-collection-cider-debug-force-out= | =:force-out= | =O= |
+ | =cider-debug-move-here= | (move here) | =H= |
+ | =evil-collection-cider-debug-eval= | =:eval= | =e= |
+ | =evil-collection-cider-debug-inspect= | =:inspect= | =p= |
+ | =evil-collection-cider-debug-inspect-prompt= | =:inspect-prompt= | =P= |
+ | =evil-collection-cider-debug-locals= | =:locals= | =L= |
+ | =evil-collection-cider-debug-inject= | =:inject= | =J= |
+ | =evil-collection-cider-debug-stacktrace= | =:stacktrace= | =s= |
+ | =evil-collection-cider-debug-trace= | =:trace= | =t= |
+ | =evil-collection-cider-debug-quit= | =:quit= | =q= |
+
+** New commands
+
+ | Command | Purpose |
+ |-----------------------------------+------------------------------------------------------------------------------------------------------|
+ | =evil-collection-cider-debug-*= | One per cider-debug reply keyword (see =cider--debug-mode-map=). |
+ | =evil-collection-cider-last-sexp= | Advice for =cider-eval-last-sexp= so the last sexp ends at point when =evil-move-beyond-eol= is nil. |
+
+** Xref fallbacks
+ :PROPERTIES:
+ :CUSTOM_ID: xref
+ :END:
+
+ =gd= / =C-t= are only bound when =cider-use-xref= is nil. With xref enabled
+ the user already has =M-.= / =M-,= going through =xref-find-definitions= and
+ nothing extra is added.
diff --git a/.config/emacs/lisp/evil-collection/modes/cider/evil-collection-cider.el b/.config/emacs/lisp/evil-collection/modes/cider/evil-collection-cider.el
new file mode 100644
index 0000000..e8ec712
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/cider/evil-collection-cider.el
@@ -0,0 +1,253 @@
+;;; evil-collection-cider.el --- Evil bindings for Cider -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2024 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, cider, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Cider.
+
+;;; Code:
+(require 'cl-lib)
+(require 'cider nil t)
+(require 'evil-collection)
+
+(defvar cider-use-xref)
+
+(declare-function cider-debug-mode-send-reply "cider-debug")
+
+(defconst evil-collection-cider-maps '(cider-mode-map
+ cider-repl-mode-map
+ cider-repl-history-mode-map
+ cider-test-report-mode-map
+ cider-macroexpansion-mode-map
+ cider-connections-buffer-mode-map))
+
+(defun evil-collection-cider-last-sexp (command &rest args)
+ "In normal-state or motion-state, last sexp ends at point."
+ (if (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p)))
+ (save-excursion
+ (unless (or (eobp) (eolp)) (forward-char))
+ (apply command args))
+ (apply command args)))
+
+(defmacro evil-collection-cider-make-debug-command (&rest cider-commands)
+ "Make functions that wrap `cider-debug' commands.
+
+Cider debug commands are sent through `cider-debug-mode-send-reply'.
+
+ex. \(cider-debug-mode-send-reply \":next\"\)"
+ (let ((commands (if (consp cider-commands)
+ cider-commands
+ (list cider-commands))))
+ `(progn
+ ,@(cl-loop
+ for command in commands
+ collect
+ (let ((funsymbol
+ (intern (format "evil-collection-cider-debug-%s" command))))
+ `(defun ,funsymbol ()
+ ,(format
+ "Send :%s to `cider-debug-mode-send-reply'." command)
+ (interactive)
+ (cider-debug-mode-send-reply ,(format ":%s" command))))))))
+
+(evil-collection-cider-make-debug-command "continue"
+ "continue-all"
+ "next"
+ "in"
+ "out"
+ "force-out"
+ "eval"
+ "inspect"
+ "inspect-prompt"
+ "locals"
+ "inject"
+ "stacktrace"
+ "trace"
+ "quit")
+
+;;;###autoload
+(defun evil-collection-cider-setup ()
+ "Set up `evil' bindings for `cider'."
+ (unless evil-move-beyond-eol
+ (advice-add 'cider-eval-last-sexp :around 'evil-collection-cider-last-sexp)
+ (advice-add 'cider-eval-last-sexp-and-replace :around 'evil-collection-cider-last-sexp)
+ (advice-add 'cider-eval-last-sexp-to-repl :around 'evil-collection-cider-last-sexp)
+ (with-eval-after-load 'cider-eval-sexp-fu
+ (advice-add 'cider-esf--bounds-of-last-sexp :around 'evil-collection-cider-last-sexp)))
+
+ (when evil-collection-setup-debugger-keys
+ (add-hook 'cider-mode-hook #'evil-normalize-keymaps)
+ (add-hook 'cider--debug-mode-hook #'evil-normalize-keymaps)
+ (evil-collection-define-key 'normal 'cider-mode-map
+ [f6] 'cider-browse-instrumented-defs
+ [f9] 'cider-debug-defun-at-point)
+
+ (evil-collection-define-key 'normal 'cider--debug-mode-map
+ "b" 'cider-debug-defun-at-point
+ "c" 'evil-collection-cider-debug-continue
+ "C" 'evil-collection-cider-debug-continue-all
+ "n" 'evil-collection-cider-debug-next
+ "I" 'evil-collection-cider-debug-in
+ "o" 'evil-collection-cider-debug-out
+ "O" 'evil-collection-cider-debug-force-out
+ "H" 'cider-debug-move-here
+ "e" 'evil-collection-cider-debug-eval
+ "p" 'evil-collection-cider-debug-inspect
+ "P" 'evil-collection-cider-debug-inspect-prompt
+ "L" 'evil-collection-cider-debug-locals
+ "J" 'evil-collection-cider-debug-inject
+ "s" 'evil-collection-cider-debug-stacktrace
+ "t" 'evil-collection-cider-debug-trace
+ "q" 'evil-collection-cider-debug-quit))
+
+ (evil-collection-define-key '(normal visual) 'cider-mode-map
+ "gz" 'cider-switch-to-repl-buffer
+ "gf" 'cider-find-resource
+ "K" 'cider-doc)
+
+ (unless cider-use-xref
+ (evil-collection-define-key '(normal visual) 'cider-mode-map
+ "gd" 'cider-find-var
+ (kbd "C-t") 'cider-pop-back))
+
+ (evil-collection-define-key '(normal visual) 'cider-repl-mode-map
+ ;; FIXME: This seems to get overwritten by `cider-switch-to-repl-buffer'.
+ "gz" 'cider-switch-to-last-clojure-buffer
+ "gr" 'cider-refresh
+ "gf" 'cider-find-resource
+ "K" 'cider-doc)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'cider-repl-mode-map
+ (kbd "RET") 'cider-repl-return)
+ (evil-collection-define-key newline-state 'cider-repl-mode-map
+ (kbd "RET") 'newline))
+
+ (unless cider-use-xref
+ (evil-collection-define-key '(normal visual) 'cider-repl-mode-map
+ "gd" 'cider-find-var
+ (kbd "C-t") 'cider-pop-back))
+
+ (evil-collection-define-key '(normal visual) 'cider-repl-history-mode-map
+ (kbd "C-k") 'cider-repl-history-previous
+ (kbd "C-j") 'cider-repl-history-forward
+ "gk" 'cider-repl-history-previous
+ "gj" 'cider-repl-history-forward
+ "[[" 'cider-repl-history-previous
+ "]]" 'cider-repl-history-forward
+
+ (kbd "RET") 'cider-repl-history-insert-and-quit
+ "gr" 'cider-repl-history-update
+ "q" 'cider-repl-history-quit
+ "u" 'cider-repl-history-undo-other-window)
+
+ (evil-collection-define-key 'normal 'cider-test-report-mode-map
+ (kbd "C-c ,") 'cider-test-commands-map
+ (kbd "C-c C-t") 'cider-test-commands-map
+ (kbd "M-p") 'cider-test-previous-result
+ (kbd "M-n") 'cider-test-next-result
+
+ ;; goto
+ "gd" 'cider-test-jump
+
+ (kbd "<backtab>") 'cider-test-previous-result
+ (kbd "<tab>") 'cider-test-next-result
+ (kbd "RET") 'cider-test-jump
+ "t" 'cider-test-jump
+ "d" 'cider-test-ediff
+ "e" 'cider-test-stacktrace
+ "f" 'cider-test-rerun-failed-tests
+ "n" 'cider-test-run-ns-tests
+ "L" 'cider-test-run-loaded-tests
+ "p" 'cider-test-run-project-tests
+ "gr" 'cider-test-run-test
+ "q" 'cider-popup-buffer-quit-function)
+
+ (evil-collection-define-key 'normal 'cider-macroexpansion-mode-map
+ ;; quit
+ "q" 'cider-popup-buffer-quit-function
+
+ "r" 'cider-macroexpand-again
+ "K" 'cider-doc ; Evil has `evil-lookup'.
+ "J" 'cider-javadoc
+ "." (if cider-use-xref 'xref-find-definitions 'cider-find-var)
+ "m" 'cider-macroexpand-1-inplace
+ "a" 'cider-macroexpand-all-inplace
+ "u" 'cider-macroexpand-undo
+ [remap undo] 'cider-macroexpand-undo)
+
+ (evil-collection-define-key 'normal 'cider-connections-buffer-mode-map
+ "d" 'cider-connections-make-default
+ "c" 'cider-connection-browser
+ "x" 'cider-connections-close-connection
+ (kbd "RET") 'cider-connections-goto-connection
+ "g?" 'describe-mode)
+
+ (evil-set-initial-state 'cider-stacktrace-mode 'normal)
+ (evil-collection-define-key 'normal 'cider-stacktrace-mode-map
+ (kbd "C-k") 'cider-stacktrace-previous-cause
+ (kbd "C-j") 'cider-stacktrace-next-cause
+ (kbd "gk") 'cider-stacktrace-previous-cause
+ (kbd "gj") 'cider-stacktrace-next-cause
+ (kbd "[[") 'cider-stacktrace-previous-cause
+ (kbd "]]") 'cider-stacktrace-next-cause
+ "gd" 'cider-stacktrace-jump
+ "q" 'cider-popup-buffer-quit-function
+ "J" 'cider-stacktrace-toggle-java
+ "C" 'cider-stacktrace-toggle-clj
+ "R" 'cider-stacktrace-toggle-repl
+ "T" 'cider-stacktrace-toggle-tooling
+ "D" 'cider-stacktrace-toggle-duplicates
+ "P" 'cider-stacktrace-show-only-project
+ "A" 'cider-stacktrace-toggle-all
+ "1" 'cider-stacktrace-cycle-cause-1
+ "2" 'cider-stacktrace-cycle-cause-2
+ "3" 'cider-stacktrace-cycle-cause-3
+ "4" 'cider-stacktrace-cycle-cause-4
+ "5" 'cider-stacktrace-cycle-cause-5
+ "0" 'cider-stacktrace-cycle-all-causes
+ (kbd "TAB") 'cider-stacktrace-cycle-current-cause
+ [backtab] 'cider-stacktrace-cycle-all-causes)
+
+ (add-hook 'cider-inspector-mode-hook #'evil-normalize-keymaps)
+ (evil-collection-define-key 'normal 'cider-inspector-mode-map
+ "q" 'quit-window
+ (kbd "RET") 'cider-inspector-operate-on-point
+ [mouse-1] 'cider-inspector-operate-on-click
+ "L" 'cider-inspector-pop
+ "gr" 'cider-inspector-refresh
+ ;; Page-up/down
+ (kbd "C-j") 'cider-inspector-next-page
+ (kbd "C-k") 'cider-inspector-prev-page
+ " " 'cider-inspector-next-page
+ "s" 'cider-inspector-set-page-size
+ (kbd "]]") 'cider-inspector-next-inspectable-object
+ (kbd "[[") 'cider-inspector-previous-inspectable-object
+ "gj" 'cider-inspector-next-inspectable-object
+ "gk" 'cider-inspector-previous-inspectable-object))
+
+(provide 'evil-collection-cider)
+;;; evil-collection-cider.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/citre/evil-collection-citre.el b/.config/emacs/lisp/evil-collection/modes/citre/evil-collection-citre.el
new file mode 100644
index 0000000..2bce581
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/citre/evil-collection-citre.el
@@ -0,0 +1,47 @@
+;;; evil-collection-citre.el --- Bindings for `citre' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, citre, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `citre'
+
+;;; Code:
+(require 'evil-collection)
+
+(defun evil-collection-citre-set-bindings ()
+ "Set jump point for citre commands."
+ (dolist (cmd '(citre-jump
+ citre-query-jump
+ citre-jump-to-reference
+ citre-query-jump-to-reference))
+ (evil-declare-not-repeat cmd)
+ (evil-set-command-property cmd :jump t)))
+
+;;;###autoload
+(defun evil-collection-citre-setup ()
+ "Set up `evil' bindings for `citre'."
+ (evil-collection-citre-set-bindings))
+
+(provide 'evil-collection-citre)
+;;; evil-collection-citre.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/cmake-mode/README.org b/.config/emacs/lisp/evil-collection/modes/cmake-mode/README.org
new file mode 100644
index 0000000..d7a7975
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/cmake-mode/README.org
@@ -0,0 +1,13 @@
+* cmake-mode
+
+ Evil setup for [[https://gitlab.kitware.com/cmake/cmake][cmake-mode]]. No key
+ rebindings -- only =evil-shift-width= is aligned to =cmake-tab-width=.
+
+** New commands
+
+ | Command | Purpose |
+ |---------------------------------------------------+------------------------------------------------------|
+ | =evil-collection-cmake-mode-set-evil-shift-width= | Buffer-local =evil-shift-width= = =cmake-tab-width=. |
+
+ Hooked to =cmake-mode-hook= so =>=, =<= and friends indent by the same width
+ cmake-mode uses.
diff --git a/.config/emacs/lisp/evil-collection/modes/cmake-mode/evil-collection-cmake-mode.el b/.config/emacs/lisp/evil-collection/modes/cmake-mode/evil-collection-cmake-mode.el
new file mode 100644
index 0000000..5b0113e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/cmake-mode/evil-collection-cmake-mode.el
@@ -0,0 +1,44 @@
+;;; evil-collection-cmake-mode.el --- Bindings for `cmake-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `cmake-mode'
+
+;;; Code:
+(require 'evil-collection)
+(require 'cmake-mode nil t)
+
+(defvar cmake-tab-width)
+(defun evil-collection-cmake-mode-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `cmake-tab-with'."
+ (setq-local evil-shift-width cmake-tab-width))
+
+;;;###autoload
+(defun evil-collection-cmake-mode-setup ()
+ "Set up `evil' bindings for `cmake-mode'."
+ (add-hook 'cmake-mode-hook #'evil-collection-cmake-mode-set-evil-shift-width))
+
+(provide 'evil-collection-cmake-mode)
+;;; evil-collection-cmake-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/color-rg/evil-collection-color-rg.el b/.config/emacs/lisp/evil-collection/modes/color-rg/evil-collection-color-rg.el
new file mode 100644
index 0000000..5a53b25
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/color-rg/evil-collection-color-rg.el
@@ -0,0 +1,71 @@
+;;; evil-collection-color-rg.el --- Bindings for color-rg -*- lexical-binding: t -*-
+
+;; Copyright (C) 2023 Mumulhl
+
+;; Author: Mumulhl <mumu-lhl@tuta.io>
+;; Maintainer: Mumulhl <mumu-lhl@tuta.io>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for color-rg.
+
+;;; Code:
+(require 'evil-collection)
+(require 'color-rg nil t)
+
+(defvar color-rg-mode-map)
+(defconst evil-collection-color-rg-maps '(color-rg-mode-map))
+
+;;;###autoload
+(defun evil-collection-color-rg-setup ()
+ "Set up `evil' bindings for color-rg."
+ (evil-collection-define-key 'normal 'color-rg-mode-map
+ (kbd "<backtab>") 'color-rg-jump-prev-keyword
+ (kbd "<tab>") 'color-rg-jump-next-keyword
+ "C" 'color-rg-rerun-toggle-case
+ (kbd "C-a") 'color-rg-beginning-of-line
+ "D" 'color-rg-remove-line-from-results
+ "E" 'color-rg-rerun-change-exclude-files
+ "F" 'color-rg-filter-mismatch-results
+ "G" 'color-rg-rerun-change-globs
+ "I" 'color-rg-rerun-toggle-ignore
+ "L" 'color-rg-rerun-literal
+ "N" 'color-rg-rerun-toggle-node
+ "O" 'color-rg-rerun-in-project
+ "R" 'color-rg-rerun-regexp
+ (kbd "RET") 'color-rg-open-file-and-stay
+ "S" 'color-rg-customized-search
+ (kbd "SPC") 'color-rg-open-file
+ "X" 'color-rg-filter-mismatch-files
+ "e" 'color-rg-switch-to-edit-mode
+ "f" 'color-rg-filter-match-results
+ "h" 'color-rg-jump-next-file
+ "i" 'color-rg-insert-current-line
+ "j" 'color-rg-jump-next-keyword
+ "k" 'color-rg-jump-prev-keyword
+ "l" 'color-rg-jump-prev-file
+ "o" 'color-rg-rerun-in-parent-dir
+ "q" 'color-rg-quit
+ "r" 'color-rg-replace-all-matches
+ "s" 'color-rg-rerun-change-dir
+ "u" 'color-rg-unfilter
+ "x" 'color-rg-filter-match-files))
+
+(provide 'evil-collection-color-rg)
+;;; evil-collection-color-rg.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/comint/README.org b/.config/emacs/lisp/evil-collection/modes/comint/README.org
new file mode 100644
index 0000000..0b03dd2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/comint/README.org
@@ -0,0 +1,29 @@
+* comint
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Comint.html][comint-mode]], the base mode for many Emacs shells and
+ REPLs (shell, inferior-lisp, sql, python, etc.). Bindings here propagate to
+ every derived mode that does not override them.
+
+** Key bindings
+
+ Normal-state additions to =comint-mode-map=:
+
+ | Command | Original | Evil |
+ |--------------------------+-----------+-------------------------------------|
+ | =comint-next-prompt= | =C-c C-n= | =C-j=, =gj=, =]]= |
+ | =comint-previous-prompt= | =C-c C-p= | =C-k=, =gk=, =[[= |
+ | =comint-previous-input= | =M-p= | =C-p= |
+ | =comint-next-input= | =M-n= | =C-n= |
+ | =evil-scroll-down= | n/a | =C-d= (when =evil-want-C-d-scroll=) |
+
+ Insert state:
+
+ | Command | Original | Evil |
+ |-------------------------+-----------+-------------------------------------|
+ | =comint-previous-input= | =M-p= | =<up>= |
+ | =comint-next-input= | =M-n= | =<down>= |
+ | =comint-kill-input= | =C-c C-u= | =C-u= (when =evil-want-C-u-delete=) |
+
+ =RET= sends input in the state named by =evil-collection-repl-submit-state=
+ and inserts a newline in the complementary state (both =RET= and =C-m= /
+ =[return]= are wired).
diff --git a/.config/emacs/lisp/evil-collection/modes/comint/evil-collection-comint.el b/.config/emacs/lisp/evil-collection/modes/comint/evil-collection-comint.el
new file mode 100644
index 0000000..40d0a00
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/comint/evil-collection-comint.el
@@ -0,0 +1,74 @@
+;;; evil-collection-comint.el --- Bindings for `comint-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, comint, processes
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `comint-mode'.
+
+;;; Code:
+(require 'comint)
+(require 'evil-collection)
+
+(defconst evil-collection-comint-maps '(comint-mode-map))
+
+;;;###autoload
+(defun evil-collection-comint-setup ()
+ "Set up `evil' bindings for `comint'."
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'normal 'comint-mode-map
+ (kbd "C-d") #'evil-scroll-down))
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'comint-mode-map
+ (kbd "RET") #'comint-send-input
+ (kbd "\C-m") #'comint-send-input
+ [return] #'comint-send-input)
+ (evil-collection-define-key newline-state 'comint-mode-map
+ (kbd "RET") #'newline
+ (kbd "\C-m") #'newline
+ [return] #'newline))
+
+ (evil-collection-define-key 'normal 'comint-mode-map
+ ;; Match Eshell bindings:
+ (kbd "C-j") #'comint-next-prompt
+ (kbd "C-k") #'comint-previous-prompt
+ (kbd "gj") #'comint-next-prompt
+ (kbd "gk") #'comint-previous-prompt
+ (kbd "]]") #'comint-next-prompt
+ (kbd "[[") #'comint-previous-prompt
+ (kbd "C-p") #'comint-previous-input
+ (kbd "C-n") #'comint-next-input)
+
+ ;; TODO: What if the user changes `evil-want-C-u-delete' after this is run?
+ (when evil-want-C-u-delete
+ (evil-collection-define-key 'insert 'comint-mode-map
+ (kbd "C-u") #'comint-kill-input))
+
+ (evil-collection-define-key 'insert 'comint-mode-map
+ (kbd "<up>") #'comint-previous-input
+ (kbd "<down>") #'comint-next-input))
+
+(provide 'evil-collection-comint)
+;;; evil-collection-comint.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/company/README.org b/.config/emacs/lisp/evil-collection/modes/company/README.org
new file mode 100644
index 0000000..22c1d84
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/company/README.org
@@ -0,0 +1,51 @@
+* company
+
+ Evil bindings for [[https://github.com/company-mode/company-mode][company-mode]].
+ Bindings are installed without an explicit state so they apply whenever the
+ company overlay is active.
+
+** company-active-map
+
+ | Command | Original | Evil |
+ |------------------------------------+----------+-------------------------------------|
+ | =company-select-next-or-abort= | =C-n= | =C-n=, =C-j= |
+ | =company-select-previous-or-abort= | =C-p= | =C-p=, =C-k= |
+ | =company-select-next= | n/a | =M-j= |
+ | =company-select-previous= | n/a | =M-k= |
+ | =company-previous-page= | =M-<= | =C-u= (when =evil-want-C-u-scroll=) |
+ | =company-next-page= | =M->= | =C-d= (when =evil-want-C-d-scroll=) |
+
+ With =evil-collection-want-company-extended-keybindings= (vim's =C-x ...=
+ completion family):
+
+ | Command | Evil |
+ |---------------------------------------+-------|
+ | =evil-collection-company-whole-lines= | =C-l= |
+ | =company-etags= | =C-]= |
+ | =company-files= | =C-f= |
+ | =company-capf= | =C-o= |
+ | =company-ispell= | =C-s= |
+
+** company-search-map
+
+ | Command | Original | Evil |
+ |------------------------------------+----------+------------|
+ | =company-select-next-or-abort= | =C-n= | =C-j= |
+ | =company-select-previous-or-abort= | =C-p= | =C-k= |
+ | =company-select-next= | n/a | =M-j= |
+ | =company-select-previous= | n/a | =M-k= |
+ | =company-search-abort= | =C-g= | =<escape>= |
+
+** New commands
+
+ | Command | Purpose |
+ |---------------------------------------+------------------------------------------------|
+ | =evil-collection-company-whole-lines= | Whole-line completion backend (vim =C-x C-l=). |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |-----------------------------------------------------+--------------------------+--------------------------------------------------------------------------------------------------|
+ | =evil-collection-company-supported-states= | =(insert replace emacs)= | Evil states in which company is allowed to pop up. |
+ | =evil-collection-want-company-extended-keybindings= | =nil= | Enable the vim-style =C-x= completion bindings above. |
+ | =evil-collection-company-enable-keymap-protection= | =t= | Re-install =company-active-map= after =company-doc-buffer= et al. so evil does not eat the keys. |
diff --git a/.config/emacs/lisp/evil-collection/modes/company/evil-collection-company.el b/.config/emacs/lisp/evil-collection/modes/company/evil-collection-company.el
new file mode 100644
index 0000000..7042221
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/company/evil-collection-company.el
@@ -0,0 +1,138 @@
+;;; evil-collection-company.el --- Bindings for `company-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, company, abbrev, convenience, matching
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `company-mode'.
+
+;;; Code:
+(require 'company nil t)
+(require 'evil-collection)
+
+(declare-function company-tng-mode "company-tng")
+(declare-function company-grab-line "company")
+(declare-function company-begin-backend "company")
+(declare-function company-ensure-emulation-alist "company")
+
+(defgroup evil-collection-company nil
+ "Evil bindings for `company-mode'."
+ :group 'evil-collection)
+
+(defcustom evil-collection-company-supported-states '(insert replace emacs)
+ "The `evil-state's which `company' function can be requested."
+ :type '(repeat symbol))
+(defcustom evil-collection-want-company-extended-keybindings nil
+ "The \='evil-company-extended' keybindings should be requested"
+ :type 'boolean)
+
+(defcustom evil-collection-company-enable-keymap-protection t
+ "Prevent evil from breaking company completion keymap.
+When non-nil, prevents evil from overriding `company-active-map'
+after calling `company-doc-buffer'. If disabled, the completion
+keymap will be in a broken state."
+ :type 'boolean)
+
+(defvar company-active-map)
+(defvar company-search-map)
+
+(defconst evil-collection-company-maps '(company-active-map company-search-map))
+
+(defun evil-collection-company-supported-p (command &rest _)
+ "Return non-nil if `evil-state' is in supported states."
+ (cond
+ ((not (bound-and-true-p evil-mode)) t)
+ ((eq command 'prefix)
+ (memq evil-state evil-collection-company-supported-states))
+ (t t)))
+
+(defun evil-collection-company-protect-keymap ()
+ "Prevent evil from overriding `company-mode' completion keymap."
+ (when (and evil-collection-company-enable-keymap-protection
+ (memq 'company-emulation-alist emulation-mode-map-alists))
+ (company-ensure-emulation-alist)))
+
+;;;###autoload
+(defun evil-collection-company-whole-lines (command &optional arg &rest _ignored)
+ "`company-mode' completion backend that completes whole-lines, akin to vim's
+C-x C-l."
+ (interactive (list 'interactive))
+ (require 'company)
+ (pcase command
+ (`interactive (company-begin-backend 'evil-collection-company-whole-lines))
+ (`prefix (company-grab-line "^[\t\s]*\\(.+\\)" 1))
+ (`candidates
+ (all-completions
+ arg
+ (delete-dups
+ (split-string
+ (replace-regexp-in-string
+ "^[\t\s]+" ""
+ (concat (buffer-substring-no-properties (point-min) (line-beginning-position))
+ (buffer-substring-no-properties (line-end-position) (point-max))))
+ "\\(\r\n\\|[\n\r]\\)" t))))))
+
+;;;###autoload
+(defun evil-collection-company-setup ()
+ "Set up `evil' bindings for `company'."
+ (evil-collection-define-key nil 'company-active-map
+ (kbd "C-n") 'company-select-next-or-abort
+ (kbd "C-p") 'company-select-previous-or-abort
+ (kbd "C-j") 'company-select-next-or-abort
+ (kbd "C-k") 'company-select-previous-or-abort
+ (kbd "M-j") 'company-select-next
+ (kbd "M-k") 'company-select-previous)
+
+ (when evil-collection-want-company-extended-keybindings
+ (evil-collection-define-key nil 'company-active-map
+ (kbd "C-l") 'evil-collection-company-whole-lines
+ (kbd "C-]") 'company-etags
+ (kbd "C-f") 'company-files
+ (kbd "C-o") 'company-capf
+ (kbd "C-s") 'company-ispell))
+
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key nil 'company-active-map
+ (kbd "C-u") 'company-previous-page))
+
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key nil 'company-active-map
+ (kbd "C-d") 'company-next-page))
+
+ (evil-collection-define-key nil 'company-search-map
+ (kbd "C-j") 'company-select-next-or-abort
+ (kbd "C-k") 'company-select-previous-or-abort
+ (kbd "M-j") 'company-select-next
+ (kbd "M-k") 'company-select-previous
+ (kbd "<escape>") 'company-search-abort)
+
+ ;; https://github.com/emacs-evil/evil-collection/issues/664
+ (add-hook 'evil-local-mode-hook #'evil-collection-company-protect-keymap)
+
+ ;; Make `company-mode' not show popup when not in supported state
+ (advice-add 'company-call-backend
+ :before-while 'evil-collection-company-supported-p))
+
+
+(provide 'evil-collection-company)
+;;; evil-collection-company.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/compile/README.org b/.config/emacs/lisp/evil-collection/modes/compile/README.org
new file mode 100644
index 0000000..c8e3c60
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/compile/README.org
@@ -0,0 +1,18 @@
+* compile
+
+ Evil bindings for =compilation-mode= and =compilation-minor-mode=.
+
+ Standard motion / quit bindings come from =evil-collection-set-readonly-bindings=
+ and are not repeated below.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------------+------------------+------------------------|
+ | =compile-goto-error= | =RET=, =C-c C-c= | =RET= |
+ | =compilation-display-error= | =C-o= | =go=, =M-RET=, =S-RET= |
+ | =compilation-next-error= | =M-n= | =TAB=, =gj=, =C-j= |
+ | =compilation-previous-error= | =M-p= | =S-TAB=, =gk=, =C-k= |
+ | =compilation-next-file= | =M-}= | =]]= |
+ | =compilation-previous-file= | =M-{= | =[[= |
+ | =recompile= | =g= | =gr= |
diff --git a/.config/emacs/lisp/evil-collection/modes/compile/evil-collection-compile.el b/.config/emacs/lisp/evil-collection/modes/compile/evil-collection-compile.el
new file mode 100644
index 0000000..b59f9d4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/compile/evil-collection-compile.el
@@ -0,0 +1,67 @@
+;;; evil-collection-compile.el --- Evil bindings for `compile' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, compile, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `compile'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'compile)
+
+(defconst evil-collection-compile-maps '(compilation-mode-map
+ compilation-minor-mode-map))
+
+;;;###autoload
+(defun evil-collection-compile-setup ()
+ "Set up `evil' bindings for `compile'."
+ (evil-set-initial-state 'compilation-mode 'normal)
+ (evil-collection-set-readonly-bindings 'compilation-mode-map)
+
+ (dolist (keymap evil-collection-compile-maps)
+
+ (evil-collection-define-key nil keymap
+ "g" nil)
+
+ (evil-collection-define-key 'normal keymap
+ (kbd "RET") 'compile-goto-error
+
+ "go" 'compilation-display-error
+ (kbd "M-RET") 'compilation-display-error
+ (kbd "M-<return>") 'compilation-display-error
+ (kbd "S-<return>") 'compilation-display-error
+
+ (kbd "TAB") 'compilation-next-error
+ (kbd "S-TAB") 'compilation-previous-error
+
+ "gj" 'compilation-next-error
+ "gk" 'compilation-previous-error
+ (kbd "C-j") 'compilation-next-error
+ (kbd "C-k") 'compilation-previous-error
+ "[[" 'compilation-previous-file
+ "]]" 'compilation-next-file
+ "gr" 'recompile)))
+
+(provide 'evil-collection-compile)
+;;; evil-collection-compile.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/consult/README.org b/.config/emacs/lisp/evil-collection/modes/consult/README.org
new file mode 100644
index 0000000..c71d837
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/consult/README.org
@@ -0,0 +1,26 @@
+* consult
+
+ Evil bindings for [[https://github.com/minad/consult][consult]].
+
+ No keymap is rebound. Setup marks a small set of jump-style commands as
+ non-repeatable and registers them as evil jumps so =C-o= / =C-i= work after
+ selection.
+
+** Jump commands
+
+ The following are declared with =:jump t= and =evil-declare-not-repeat=:
+
+ - =consult-outline=
+ - =consult-mark=
+ - =consult-global-mark=
+ - =consult-imenu=
+ - =consult-org-heading=
+ - =consult-org-agenda=
+ - =consult-line=
+
+** New commands
+
+ | Command | Purpose |
+ |-------------------------------------+---------------------------------------------------------------|
+ | =evil-collection-consult-mark= | =consult-mark= over evil's per-buffer marker ring. |
+ | =evil-collection-consult-jump-list= | =consult-global-mark= over the evil jump list of this window. |
diff --git a/.config/emacs/lisp/evil-collection/modes/consult/evil-collection-consult.el b/.config/emacs/lisp/evil-collection/modes/consult/evil-collection-consult.el
new file mode 100644
index 0000000..f8b0e93
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/consult/evil-collection-consult.el
@@ -0,0 +1,123 @@
+;;; evil-collection-consult.el --- Evil bindings for consult -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2024 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, consult, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `consult'.
+;;
+;; Since
+;;
+;; `consult-outline'
+;; `consult-mark'
+;; `consult-global-mark'
+;; `consult-imenu'
+;; `consult-org-heading'
+;; `consult-org-agenda'
+;; `consult-line'
+;;
+;; are all autoloaded, no (require 'consult nil t) is needed.
+
+;;; Code:
+(require 'evil-collection)
+
+(defvar consult-line-numbers-widen)
+(declare-function consult--forbid-minibuffer "consult")
+(declare-function consult--fontify-all "consult")
+(declare-function consult--in-range-p "consult")
+(declare-function consult--line-with-mark "consult")
+(declare-function consult--location-candidate "consult")
+(declare-function consult--remove-dups "consult")
+(declare-function consult--mark-candidates "consult")
+(declare-function consult-mark "consult")
+(declare-function consult-global-mark "consult")
+
+(defun evil-collection-consult-set-bindings ()
+ "Set the bindings."
+ (dolist (cmd '(consult-outline
+ consult-mark
+ consult-global-mark
+ consult-imenu
+ consult-org-heading
+ consult-org-agenda
+ consult-line))
+ (evil-declare-not-repeat cmd)
+ (evil-set-command-property cmd :jump t)))
+
+(defun evil-collection-consult--evil-mark-ring ()
+ "Return alist of char & marker for evil markers in current buffer."
+ (sort (cl-remove-if (lambda (elem)
+ (or (evil-global-marker-p (car elem))
+ (not (markerp (cdr-safe elem)))))
+ evil-markers-alist)
+ #'car-less-than-car))
+
+(defun evil-collection-consult--mark-candidates (&optional markers)
+ "Return alist of lines containing markers from `evil-mark-alist'.
+Opional MARKERS should be an alist containing (char . marker) pairs
+as defined in `evil-collection-consult--evil-mark-ring'."
+ (consult--forbid-minibuffer)
+ (unless (evil-collection-consult--evil-mark-ring)
+ (user-error "No marks"))
+ (let* ((candidates)
+ (current-buf (current-buffer)))
+ (save-excursion
+ (pcase-dolist (`(,char . ,marker) (or markers (evil-collection-consult--evil-mark-ring)))
+ (let ((pos (marker-position marker))
+ (buf (marker-buffer marker)))
+ (when (and (eq buf current-buf)
+ (consult--in-range-p pos))
+ (goto-char pos)
+ (push (consult--location-candidate
+ (format "%s: %s" (char-to-string char) (consult--line-with-mark marker))
+ marker
+ (line-number-at-pos pos consult-line-numbers-widen)
+ marker)
+ candidates)))))
+ (nreverse (delete-dups candidates))))
+
+;;;###autoload
+(defun evil-collection-consult-mark ()
+ "Jump to an evil marker in the current buffer."
+ (interactive)
+ (cl-letf (((symbol-function 'consult--mark-candidates)
+ #'evil-collection-consult--mark-candidates))
+ (consult-mark (evil-collection-consult--evil-mark-ring))))
+
+;;;###autoload
+(defun evil-collection-consult-jump-list ()
+ "Jump to a position in the evil jump list."
+ (interactive)
+ (consult-global-mark (delq nil (mapcar (lambda (jump)
+ (let ((mark (car jump)))
+ (when (markerp mark)
+ mark)))
+ (ring-elements (evil--jumps-get-window-jump-list))))))
+
+;;;###autoload
+(defun evil-collection-consult-setup ()
+ "Set up `evil' bindings for `consult'."
+ (evil-collection-consult-set-bindings))
+
+(provide 'evil-collection-consult)
+;;; evil-collection-consult.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/corfu/README.org b/.config/emacs/lisp/evil-collection/modes/corfu/README.org
new file mode 100644
index 0000000..71820eb
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/corfu/README.org
@@ -0,0 +1,54 @@
+* corfu
+
+ Evil bindings for [[https://github.com/minad/corfu][corfu]] in-buffer completion.
+
+ Bindings apply in =insert= state on =corfu-map= and are gated by
+ =evil-collection-corfu-key-themes=. Only =default= is enabled out of the box.
+
+** Key bindings
+
+*** default theme
+
+ | Command | Original | Evil |
+ |-----------------------------------------+----------+-------------------------------------|
+ | =corfu-next= | =<down>= | =C-n=, =C-j=, =M-j=, =<down>= |
+ | =corfu-previous= | =<up>= | =C-p=, =C-k=, =M-k=, =<up>= |
+ | =corfu-insert= | =RET= | =RET= |
+ | =corfu-complete= | =TAB= | =TAB= |
+ | =corfu-quit= | =C-g= | =C-g= |
+ | =evil-collection-corfu-quit-and-escape= | n/a | =<escape>= |
+ | =corfu-scroll-up= | n/a | =C-d= (when =evil-want-C-u-scroll=) |
+ | =corfu-scroll-down= | n/a | =C-u= (when =evil-want-C-d-scroll=) |
+
+*** tab-n-go theme
+
+ Also sets =corfu-cycle= to =t= and =corfu-preselect= to =prompt=.
+
+ | Command | Original | Evil |
+ |------------------+----------+--------------------|
+ | =corfu-next= | n/a | =TAB= |
+ | =corfu-previous= | n/a | =S-TAB=, =backtab= |
+
+*** magic-return theme
+
+ =RET= / =<return>= insert the candidate when one is selected, otherwise
+ fall through to the buffer's default newline.
+
+*** magic-backspace theme
+
+ =DEL= / =<backspace>= reset the selection when one is active, otherwise
+ fall through.
+
+** New commands
+
+ | Command | Purpose |
+ |-----------------------------------------+----------------------------------------------------------|
+ | =evil-collection-corfu-quit-and-escape= | =corfu-quit= then =evil-normal-state=. |
+ | =evil-collection-corfu-insert-exact= | Insert current candidate with =exact= status, else quit. |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |------------------------------------------+------------------------------+-----------------------------------------------------------------------|
+ | =evil-collection-corfu-key-themes= | =(default)= | Themes from =default=, =tab-n-go=, =magic-return=, =magic-backspace=. |
+ | =evil-collection-corfu-supported-states= | =(insert replace emacs nil)= | Evil states in which =corfu= is allowed to run. |
diff --git a/.config/emacs/lisp/evil-collection/modes/corfu/evil-collection-corfu.el b/.config/emacs/lisp/evil-collection/modes/corfu/evil-collection-corfu.el
new file mode 100644
index 0000000..f70dedc
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/corfu/evil-collection-corfu.el
@@ -0,0 +1,180 @@
+;;; evil-collection-corfu.el --- Bindings for `corfu-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, corfu, convenience, matching
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `corfu-mode'.
+
+;;; Code:
+(require 'corfu nil t)
+(require 'evil-collection)
+
+(defgroup evil-collection-corfu nil
+ "Evil bindings for `corfu-mode'."
+ :group 'evil-collection)
+
+(defvar corfu-map)
+(defvar corfu-cycle)
+(defvar corfu-preselect)
+(defvar corfu--index)
+
+(declare-function corfu-insert "corfu")
+(declare-function corfu-reset "corfu")
+(declare-function corfu-quit "corfu")
+
+(defconst evil-collection-corfu-maps '(corfu-map))
+
+(defun evil-collection-corfu-quit-and-escape ()
+ "Call `corfu-quit' and then return to Normal State."
+ (interactive)
+ (call-interactively 'corfu-quit)
+ (evil-normal-state))
+
+;; https://github.com/minad/corfu/pull/169
+;; https://github.com/minad/corfu/pull/225
+(defun evil-collection-corfu-unread-this-command-keys ()
+ (when (> (length (this-command-keys)) 0)
+ (setq unread-command-events (nconc
+ (listify-key-sequence (this-command-keys))
+ unread-command-events))
+ (clear-this-command-keys t)))
+
+(defun evil-collection-corfu-insert-exact ()
+ "Insert current candidate with the `exact' status.
+Quit if no candidate is selected."
+ (interactive)
+ (if (>= corfu--index 0)
+ (corfu--insert 'exact)
+ (corfu-quit)))
+
+(defcustom evil-collection-corfu-key-themes '(default)
+ "Determines the key theme to be mapped.
+
+This variable should be set before `evil-collection-corfu-setup' is called.
+
+By default, only default is added to this list as the other key themes might
+be too obtrusive.
+
+This key theme variable may be refactored in the future so use with caution."
+ :type
+ '(repeat
+ :tag "Key Themes"
+ (choice
+ (const
+ :tag "Default Theme" default)
+ (const
+ :tag "Tab & Go" tab-n-go)
+ (const
+ :tag "Magic Return" magic-return)
+ (const
+ :tag "Magic Backspace" magic-backspace))))
+
+(defcustom evil-collection-corfu-supported-states '(insert replace emacs nil)
+ "The `evil-state's which `corfu' function can be requested."
+ :type '(repeat symbol))
+
+;;;###autoload
+(defun evil-collection-corfu-setup ()
+ "Set up `evil' bindings for `corfu'."
+ (when (memq 'default evil-collection-corfu-key-themes)
+ (evil-collection-define-key 'insert 'corfu-map
+ (kbd "C-n") 'corfu-next
+ (kbd "C-p") 'corfu-previous
+ (kbd "C-j") 'corfu-next
+ (kbd "C-k") 'corfu-previous
+ (kbd "M-j") 'corfu-next
+ (kbd "M-k") 'corfu-previous
+ (kbd "<down>") 'corfu-next
+ (kbd "<up>") 'corfu-previous
+ (kbd "<escape>") 'evil-collection-corfu-quit-and-escape))
+
+ ;; https://github.com/minad/corfu#tab-and-go-completion
+ (when (memq 'tab-n-go evil-collection-corfu-key-themes)
+ (setq corfu-cycle t
+ corfu-preselect 'prompt)
+ (evil-collection-define-key 'insert 'corfu-map
+ (kbd "TAB") 'corfu-next
+ [tab] 'corfu-next
+ [S-tab] 'corfu-previous
+ [backtab] 'corfu-previous))
+
+ (when (memq 'magic-return evil-collection-corfu-key-themes)
+ (defvar evil-collection-corfu-insert-or-next-line
+ `(menu-item "" nil :filter ,(lambda (&optional _)
+ (when (>= corfu--index 0)
+ 'corfu-insert)))
+ "If we made a selection during `corfu' completion, select it.")
+ ;; FIXME: Not sure why we need to use `define-key' here instead of
+ ;; `evil-collection-define-key';.
+ (when (evil-collection-can-bind-key "<return>")
+ (define-key corfu-map (kbd "<return>")
+ evil-collection-corfu-insert-or-next-line))
+ (when (evil-collection-can-bind-key "RET")
+ (define-key corfu-map (kbd "RET")
+ evil-collection-corfu-insert-or-next-line)))
+
+ (when (memq 'magic-backspace evil-collection-corfu-key-themes)
+ (defvar evil-collection-corfu-cancel-or-backspace
+ `(menu-item "" nil :filter ,(lambda (&optional _)
+ (when (>= corfu--index 0)
+ 'corfu-reset)))
+ "If we made a selection during `corfu' completion, cancel it.")
+ (evil-collection-define-key 'insert
+ 'corfu-map (kbd "DEL") evil-collection-corfu-cancel-or-backspace)
+ (evil-collection-define-key 'insert
+ 'corfu-map [backspace] evil-collection-corfu-cancel-or-backspace)
+ (evil-collection-define-key 'insert
+ 'corfu-map (kbd "<backspace>") evil-collection-corfu-cancel-or-backspace))
+
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'insert 'corfu-map
+ (kbd "C-d") 'corfu-scroll-up))
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'insert 'corfu-map
+ (kbd "C-u") 'corfu-scroll-down))
+
+ (advice-add 'corfu--setup :after (lambda (&rest _) (evil-normalize-keymaps)))
+ (advice-add 'corfu--teardown :after (lambda (&rest _) (evil-normalize-keymaps)))
+ (advice-add 'corfu--continue-p
+ :before-while (lambda (&rest _) (memq evil-state evil-collection-corfu-supported-states)))
+
+ (cl-defmethod corfu--insert :around (status)
+ (if (or (eq this-command 'evil-collection-corfu-insert-exact)
+ (not (eq status 'exact)))
+ (cl-call-next-method)
+ (evil-collection-corfu-unread-this-command-keys)
+ (setq this-command 'evil-collection-corfu-insert-exact)))
+
+ (mapc #'evil-declare-ignore-repeat
+ '(corfu-next
+ corfu-previous
+ corfu-first
+ corfu-last))
+
+ (mapc #'evil-declare-change-repeat
+ '(evil-collection-corfu-insert-exact
+ corfu-insert
+ corfu-complete)))
+
+(provide 'evil-collection-corfu)
+;;; evil-collection-corfu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/crdt/evil-collection-crdt.el b/.config/emacs/lisp/evil-collection/modes/crdt/evil-collection-crdt.el
new file mode 100644
index 0000000..25cd61f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/crdt/evil-collection-crdt.el
@@ -0,0 +1,57 @@
+;;; evil-collection-crdt.el --- Bindings for `crdt' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Arte Ebrahimi and Jonathan Ming
+
+;; Authors: Arte Ebrahimi <arteebrahimi@gmail.com> and Jonathan Ming <jming422@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for crdt.
+
+;;; Code:
+(require 'evil-collection)
+(require 'crdt nil t)
+
+(defvar crdt-mode-map)
+(defconst evil-collection-crdt-maps
+ '(crdt-buffer-menu-mode-map crdt-session-menu-mode-map crdt-user-menu-mode-map crdt-read-settings-map))
+
+(defun evil-collection-crdt-setup ()
+ "Set up `evil' bindings for crdt."
+ (evil-collection-define-key 'normal 'crdt-buffer-menu-mode-map
+ (kbd "RET") 'crdt-switch-to-buffer-other-window
+ "x" 'crdt-stop-share-buffer)
+
+ (evil-collection-define-key 'normal 'crdt-session-menu-mode-map
+ (kbd "RET") 'crdt-list-buffers
+ "x" 'crdt--stop-session)
+
+ (evil-collection-define-key 'normal 'crdt-user-menu-mode-map
+ (kbd "RET") 'crdt-goto-user
+ "x" 'crdt-kill-user
+ "f" 'crdt-follow-user)
+
+ (evil-collection-define-key 'normal 'crdt-read-settings-map
+ (kbd "RET") 'exit-recursive-edit
+ "q" 'abort-recursive-edit
+ "ZZ" 'exit-recursive-edit))
+
+(provide 'evil-collection-crdt)
+;;; evil-collection-crdt.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/csv/evil-collection-csv.el b/.config/emacs/lisp/evil-collection/modes/csv/evil-collection-csv.el
new file mode 100644
index 0000000..395aee2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/csv/evil-collection-csv.el
@@ -0,0 +1,43 @@
+;;; evil-collection-csv.el --- Bindings for `csv' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for csv.
+
+;;; Code:
+(require 'evil-collection)
+(require 'csv nil t)
+
+(defvar csv-mode-map)
+(defconst evil-collection-csv-maps '(csv-mode-map))
+
+;;;###autoload
+(defun evil-collection-csv-setup ()
+ "Set up `evil' bindings for csv."
+ (evil-collection-define-key 'normal 'csv-mode-map
+ [tab] 'csv-tab-command
+ [backtab] 'csv-backtab-command))
+
+(provide 'evil-collection-csv)
+;;; evil-collection-csv.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/cus-theme/README.org b/.config/emacs/lisp/evil-collection/modes/cus-theme/README.org
new file mode 100644
index 0000000..f34e2c0
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/cus-theme/README.org
@@ -0,0 +1,30 @@
+* cus-theme
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Custom-Themes.html][cus-theme]] (=M-x customize-themes=, =M-x customize-create-theme=).
+
+ Both =custom-theme-choose-mode= and =custom-new-theme-mode= start in
+ normal state.
+
+** Key bindings
+
+*** custom-theme-choose-mode-map
+
+ | Command | Original | Evil |
+ |-------------------------+--------------+---------------------------------|
+ | =widget-forward= | =TAB=, =n= | =gj=, =]]=, =C-j=, =TAB=, =n= |
+ | =widget-backward= | =S-TAB=, =p= | =gk=, =[[=, =C-k=, =S-TAB=, =p= |
+ | =custom-describe-theme= | =?= | =K= |
+ | =widget-button-press= | =RET= | =RET= |
+ | =quit-window= | =q= | =q= |
+ | =revert-buffer= | =g= | =g= |
+
+*** custom-new-theme-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------+--------------+---------------------------------|
+ | =widget-forward= | =TAB=, =n= | =gj=, =]]=, =C-j=, =TAB=, =n= |
+ | =widget-backward= | =S-TAB=, =p= | =gk=, =[[=, =C-k=, =S-TAB=, =p= |
+ | =Custom-buffer-done= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+ | =widget-button-press= | =RET= | =RET= |
+ | =revert-buffer= | =g= | =g= |
diff --git a/.config/emacs/lisp/evil-collection/modes/cus-theme/evil-collection-cus-theme.el b/.config/emacs/lisp/evil-collection/modes/cus-theme/evil-collection-cus-theme.el
new file mode 100644
index 0000000..09926a3
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/cus-theme/evil-collection-cus-theme.el
@@ -0,0 +1,65 @@
+;;; evil-collection-cus-theme.el --- Bindings for `cus-theme' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, custom themes, help, faces
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `cus-theme'.
+
+;;; Code:
+(require 'cus-theme)
+(require 'evil-collection)
+
+(defconst evil-collection-cus-theme-maps '(custom-theme-choose-mode-map
+ custom-new-theme-mode-map))
+
+;;;###autoload
+(defun evil-collection-cus-theme-setup ()
+ "Set up `evil' bindings for `cus-theme'."
+ (evil-set-initial-state 'custom-new-theme-mode 'normal)
+ (evil-set-initial-state 'custom-theme-choose-mode 'normal)
+
+ (evil-collection-define-key 'normal 'custom-theme-choose-mode-map
+ "gj" 'widget-forward
+ "gk" 'widget-backward
+ (kbd "]]") 'widget-forward
+ (kbd "[[") 'widget-backward
+ (kbd "C-j") 'widget-forward
+ (kbd "C-k") 'widget-backward
+ "K" 'custom-describe-theme)
+
+ (evil-collection-define-key 'normal 'custom-new-theme-mode-map
+ "gj" 'widget-forward
+ "gk" 'widget-backward
+ (kbd "]]") 'widget-forward
+ (kbd "[[") 'widget-backward
+ (kbd "C-j") 'widget-forward
+ (kbd "C-k") 'widget-backward
+
+ ;; quit
+ "q" 'Custom-buffer-done
+ "ZQ" 'evil-quit
+ "ZZ" 'Custom-buffer-done))
+
+(provide 'evil-collection-cus-theme)
+;;; evil-collection-cus-theme.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/custom/README.org b/.config/emacs/lisp/evil-collection/modes/custom/README.org
new file mode 100644
index 0000000..d06b556
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/custom/README.org
@@ -0,0 +1,16 @@
+* custom
+
+ Evil bindings for the Customize interface (=Custom-mode=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------------+-------------------------+---------------------------------------|
+ | =Custom-newline= | =RET= | =RET= |
+ | =widget-forward= | =TAB=, =n= | =TAB=, =]]=, =gj=, =C-j= |
+ | =widget-backward= | =S-TAB=, =backtab=, =p= | =S-TAB=, =backtab=, =[[=, =gk=, =C-k= |
+ | =scroll-up-command= | =SPC= | =SPC= |
+ | =scroll-down-command= | =S-SPC=, =DEL= | =S-SPC=, =<delete>= |
+ | =Custom-goto-parent= | =u= | =^=, =<=, =C-o= |
+ | =Custom-buffer-done= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/custom/evil-collection-custom.el b/.config/emacs/lisp/evil-collection/modes/custom/evil-collection-custom.el
new file mode 100644
index 0000000..bf9114b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/custom/evil-collection-custom.el
@@ -0,0 +1,68 @@
+;;; evil-collection-custom.el --- Evil bindings for Customize -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, custom, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for the Customize interface.
+
+;;; Code:
+(require 'cus-edit)
+(require 'evil-collection)
+
+(defconst evil-collection-custom-maps '(custom-mode-map))
+
+;;;###autoload
+(defun evil-collection-custom-setup ()
+ "Set up `evil' bindings for `Custom-mode'."
+ (evil-set-initial-state 'Custom-mode 'normal)
+
+ (evil-collection-define-key 'normal 'custom-mode-map
+ ;; motion
+ (kbd "<tab>") 'widget-forward
+ (kbd "S-<tab>") 'widget-backward
+ (kbd "<backtab>") 'widget-backward
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<delete>") 'scroll-down-command
+ (kbd "RET") 'Custom-newline
+ (kbd "]]") 'widget-forward
+ (kbd "[[") 'widget-backward
+ ;; TODO: Should the following be added?
+ (kbd "C-j") 'widget-forward
+ (kbd "C-k") 'widget-backward
+ "gj" 'widget-forward
+ "gk" 'widget-backward
+
+ "^" 'Custom-goto-parent
+ (kbd "C-o") 'Custom-goto-parent
+ ;; TODO: Should the following be added?
+ "<" 'Custom-goto-parent
+
+ ;; quit
+ "q" 'Custom-buffer-done
+ "ZQ" 'evil-quit
+ "ZZ" 'Custom-buffer-done))
+
+(provide 'evil-collection-custom)
+;;; evil-collection-custom.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/daemons/evil-collection-daemons.el b/.config/emacs/lisp/evil-collection/modes/daemons/evil-collection-daemons.el
new file mode 100644
index 0000000..d02ea44
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/daemons/evil-collection-daemons.el
@@ -0,0 +1,68 @@
+;;; evil-collection-daemons.el --- Evil Bindings for Daemons -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: Jay Kamat <jaygkamat@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, daemons, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `daemons' from the `daemons.el' package.
+
+;;; Code:
+(require 'daemons nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-daemons-maps '(daemons-mode-map
+ daemons-output-mode-map))
+
+;;;###autoload
+(defun evil-collection-daemons-setup ()
+ "Set up `evil' bindings for `daemons'."
+ (evil-collection-define-key '(normal visual) 'daemons-mode-map
+ (kbd "RET") 'daemons-status-at-point
+ "s" 'daemons-start-at-point
+ "S" 'daemons-stop-at-point
+ "r" 'daemons-reload-at-point
+ "R" 'daemons-restart-at-point
+
+ "gr" 'revert-buffer
+
+ "q" 'quit-window
+ "ZZ" 'quit-window
+ "ZQ" 'quit-window)
+
+ ;; Functions are available in daemons-output-mode-map as well
+ (evil-collection-define-key '(normal visual) 'daemons-output-mode-map
+ (kbd "RET") 'daemons-status-at-point
+ "s" 'daemons-start-at-point
+ "S" 'daemons-stop-at-point
+ "r" 'daemons-reload-at-point
+ "R" 'daemons-restart-at-point
+
+ "q" 'quit-window
+ "ZZ" 'quit-window
+ "ZQ" 'quit-window)
+
+ (evil-set-initial-state 'daemons-mode 'normal)
+ (evil-set-initial-state 'daemons-output-mode 'normal))
+
+(provide 'evil-collection-daemons)
+;;; evil-collection-daemons.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/dape/README.org b/.config/emacs/lisp/evil-collection/modes/dape/README.org
new file mode 100644
index 0000000..7899945
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dape/README.org
@@ -0,0 +1,29 @@
+* dape
+
+ Evil bindings for [[https://github.com/svaante/dape][dape]] (Debug Adapter
+ Protocol for Emacs).
+
+ The =dape-info-*= mode maps are marked as overriding so dape's single-letter
+ commands still win in normal state.
+
+** dape-info-watch-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------------+----------+------|
+ | =dape-info-watch-edit-mode= | n/a | =i= |
+
+ Underlying upstream keys (=e=, =m=, ===, =W=, =b= for scope ops) remain
+ reachable through the overriding map.
+
+** dape-info-watch-edit-mode-map
+
+ | Command | Original | Evil |
+ |---------------------------------+-----------+------------------------|
+ | =dape-info-watch-finish-edit= | =C-c C-c= | =ZZ=, =<escape>=, =:w= |
+ | =dape-info-watch-abort-changes= | =C-c C-k= | =ZQ= |
+
+** dape-memory-mode-map
+
+ | Command | Original | Evil |
+ |---------------+-----------+------------|
+ | =save-buffer= | =C-x C-s= | =ZZ=, =:w= |
diff --git a/.config/emacs/lisp/evil-collection/modes/dape/evil-collection-dape.el b/.config/emacs/lisp/evil-collection/modes/dape/evil-collection-dape.el
new file mode 100644
index 0000000..9f4f5a9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dape/evil-collection-dape.el
@@ -0,0 +1,74 @@
+;;; evil-collection-dape.el --- Bindings for `dape' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 Daniel Pettersson
+
+;; Author: Daniel Pettersson <daniel@dpettersson.net>
+;; Maintainer: Daniel Pettersson <daniel@dpettersson.net>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, dape
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `dape'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'dape nil t)
+
+(defvar dape-info-scope-mode-map)
+(defvar dape-info-watch-mode-map)
+(defvar dape-info-stack-mode-map)
+(defvar dape-info-sources-mode-map)
+(defvar dape-info-modules-mode-map)
+(defvar dape-info-breakpoints-mode-map)
+(defvar dape-info-threads-mode-map)
+
+(defconst evil-collection-dape--info-mode-maps '(dape-info-scope-mode-map
+ dape-info-watch-mode-map
+ dape-info-stack-mode-map
+ dape-info-sources-mode-map
+ dape-info-modules-mode-map
+ dape-info-breakpoints-mode-map
+ dape-info-threads-mode-map))
+
+(defconst evil-collection-dape-maps `(dape-info-watch-edit-mode-map
+ dape-memory-mode-map
+ . ,evil-collection-dape--info-mode-maps))
+
+;;;###autoload
+(defun evil-collection-dape-setup ()
+ "Set up `evil' bindings for `dape'."
+ (dolist (map-symbol evil-collection-dape--info-mode-maps)
+ (evil-make-overriding-map (symbol-value map-symbol)))
+
+ (evil-collection-define-key 'normal 'dape-info-watch-mode-map
+ "i" 'dape-info-watch-edit-mode)
+
+ (evil-collection-define-key nil 'dape-info-watch-edit-mode-map
+ [remap evil-write] 'dape-info-watch-finish-edit)
+
+ (evil-collection-define-key 'normal 'dape-memory-mode-map
+ [remap evil-write] 'save-buffer
+ "ZZ" 'save-buffer)
+
+ (evil-collection-define-key 'normal 'dape-info-watch-edit-mode-map
+ "ZQ" 'dape-info-watch-abort-changes
+ "ZZ" 'dape-info-watch-finish-edit
+ (kbd "<escape>") 'dape-info-watch-finish-edit))
+
+(provide 'evil-collection-dape)
+;;; evil-collection-dape.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/dashboard/evil-collection-dashboard.el b/.config/emacs/lisp/evil-collection/modes/dashboard/evil-collection-dashboard.el
new file mode 100644
index 0000000..2cc1386
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dashboard/evil-collection-dashboard.el
@@ -0,0 +1,91 @@
+;;; evil-collection-dashboard.el --- Evil bindings for Dashboard -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2020, 2022 Kisaragi Hiu
+
+;; Author: Kisaragi Hiu <mail@kisaragi-hiu.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, dashboard, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Evil bindings for Dashboard.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'dashboard nil t)
+
+(defvar dashboard-mode-map)
+
+(defconst evil-collection-dashboard-maps '(dashboard-mode-map))
+
+(defun evil-collection-dashboard-setup-jump-commands (&rest _)
+ "Set up bindings for jump commands in Dashboard."
+ (evil-collection-define-key 'normal 'dashboard-mode-map
+ "r" (lookup-key dashboard-mode-map "r") ; recents
+ "m" (lookup-key dashboard-mode-map "m") ; bookmarks
+ "p" (lookup-key dashboard-mode-map "p") ; projects
+ "a" (lookup-key dashboard-mode-map "a") ; agenda
+ ;; - Dashboard inserts shortcut hints in its buffer, so it's
+ ;; hard to differ from the default.
+ ;;
+ ;; - "registers" isn't shown in Dashboard by default; those who
+ ;; added it would have to choose between the widget and losing
+ ;; `evil-forward-word-end'. That's probably still better than
+ ;; having a shortcut hint that isn't correct.
+ "e" (lookup-key dashboard-mode-map "e"))) ; registers
+
+;;;###autoload
+(defun evil-collection-dashboard-setup ()
+ "Set up Evil bindings for Dashboard."
+ (evil-collection-set-readonly-bindings 'dashboard-mode-map)
+ (evil-collection-define-key 'normal 'dashboard-mode-map
+ ;; Movement
+ "j" 'dashboard-next-line
+ "k" 'dashboard-previous-line
+ ;; Like `evil-collection-outline.el'.
+ ;; These don't support COUNT, so it's probably better to leave [[
+ ;; and ]] alone.
+ "gj" 'dashboard-next-section
+ "gk" 'dashboard-previous-section
+
+ ;; Enabling this binding makes RET insert a newline.
+ ;; Default `evil-ret' works better.
+ ;; (kbd "RET") 'dashboard-return
+
+ ;; Other commands
+ [tab] 'widget-forward
+ [backtab] 'widget-backward
+ [down-mouse-1] 'widget-button-click)
+
+ ;; Jump commands
+ ;;
+ ;; I had to use an advice as dashboard.el defines these bindings
+ ;; after the map has been defined, as unnamed functions bound to a
+ ;; local variable. See
+ ;; https://github.com/emacs-dashboard/emacs-dashboard/blob/f15d3e2e/dashboard-widgets.el#L308
+ ;; for what I mean.
+ ;;
+ ;; Despite the name, this function is what sets up the dashboard
+ ;; buffer itself.
+ (advice-add 'dashboard-insert-startupify-lists :after
+ 'evil-collection-dashboard-setup-jump-commands))
+
+(provide 'evil-collection-dashboard)
+
+;;; evil-collection-dashboard.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/deadgrep/README.org b/.config/emacs/lisp/evil-collection/modes/deadgrep/README.org
new file mode 100644
index 0000000..c35427a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/deadgrep/README.org
@@ -0,0 +1,24 @@
+* deadgrep
+
+ Evil bindings for [[https://github.com/Wilfred/deadgrep][deadgrep]].
+
+** deadgrep-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------+-----------+---------------|
+ | =deadgrep-visit-result= | =RET= | =RET= |
+ | =deadgrep-visit-result-other-window= | =o= | =S-RET=, =go= |
+ | =deadgrep-forward-match= | =n= | =C-j=, =gj= |
+ | =deadgrep-backward-match= | =p= | =C-k=, =gk= |
+ | =deadgrep-toggle-file-results= | =TAB= | =TAB= |
+ | =deadgrep-restart= | =g= | =gr= |
+ | =deadgrep-edit-mode= | =C-x C-q= | =i= |
+ | =quit-window= | n/a | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+
+** deadgrep-edit-mode-map
+
+ | Command | Original | Evil |
+ |-------------------------+-----------+------------|
+ | =deadgrep-visit-result= | =RET= | =RET= |
+ | =deadgrep-mode= | =C-c C-c= | =<escape>= |
diff --git a/.config/emacs/lisp/evil-collection/modes/deadgrep/evil-collection-deadgrep.el b/.config/emacs/lisp/evil-collection/modes/deadgrep/evil-collection-deadgrep.el
new file mode 100644
index 0000000..89e3444
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/deadgrep/evil-collection-deadgrep.el
@@ -0,0 +1,64 @@
+;;; evil-collection-deadgrep.el --- Bindings for deadgrep -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for deadgrep.
+
+;;; Code:
+(require 'evil-collection)
+(require 'deadgrep nil t)
+
+(defconst evil-collection-deadgrep-maps '(deadgrep-edit-mode-map
+ deadgrep-mode-map))
+
+;;;###autoload
+(defun evil-collection-deadgrep-setup ()
+ "Set up `evil' bindings for deadgrep.."
+ (evil-collection-define-key 'normal 'deadgrep-edit-mode-map
+ (kbd "RET") 'deadgrep-visit-result
+ (kbd "<escape>") 'deadgrep-mode)
+ (evil-collection-define-key 'normal 'deadgrep-mode-map
+ (kbd "RET") 'deadgrep-visit-result
+ (kbd "<S-return>") 'deadgrep-visit-result-other-window
+ "go" 'deadgrep-visit-result-other-window
+ "gr" 'deadgrep-restart
+ (kbd "C-j") 'deadgrep-forward
+ (kbd "C-k") 'deadgrep-backward
+ "gj" 'deadgrep-forward
+ "gk" 'deadgrep-backward
+ (kbd "TAB") 'deadgrep-toggle-file-results
+
+ "i" 'deadgrep-edit-mode
+
+ ;; FIXME: Maybe we should bind this to something?
+ ;; (define-key map (kbd "C-c C-k") #'deadgrep-kill-process)
+
+ ;; Quit
+ "q" 'quit-window
+ "ZZ" 'quit-window
+ "ZQ" 'evil-quit))
+
+(provide 'evil-collection-deadgrep)
+;;; evil-collection-deadgrep.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/debbugs/evil-collection-debbugs.el b/.config/emacs/lisp/evil-collection/modes/debbugs/evil-collection-debbugs.el
new file mode 100644
index 0000000..be0b7bf
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/debbugs/evil-collection-debbugs.el
@@ -0,0 +1,81 @@
+;;; evil-collection-debbugs.el --- Evil bindings for debbugs -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, debbugs, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for debbugs.
+
+;;; Code:
+(require 'debbugs nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-debbugs-maps '(debbugs-gnu-mode-map))
+
+;;;###autoload
+(defun evil-collection-debbugs-setup ()
+ "Set up `evil' bindings for `debbugs-gnu-mode'."
+ (evil-set-initial-state 'debbugs-gnu-mode 'normal)
+
+ (evil-collection-define-key 'normal 'debbugs-gnu-mode-map
+ ;; motion
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+ (kbd "SPC") 'scroll-up-command
+
+ (kbd "RET") 'debbugs-gnu-select-report
+ "c" 'debbugs-gnu-send-control-message
+ "d" 'debbugs-gnu-display-status
+
+ ;; filter
+ "s" 'debbugs-gnu-narrow-to-status
+ "S" 'debbugs-gnu-search
+ ;; "S" 'debbugs-gnu-widen ; Useless if we can just press "s RET" (empty filter).
+ "x" 'debbugs-gnu-toggle-suppress
+ "r" 'debbugs-gnu-show-all-blocking-reports
+
+ ;; sort
+ "o" 'debbugs-gnu-toggle-sort
+ "O" 'tabulated-list-sort
+
+ ;; show
+ "gB" 'debbugs-gnu-show-blocking-reports
+ "gb" 'debbugs-gnu-show-blocked-by-reports
+
+ ;; mark
+ "m" 'debbugs-gnu-toggle-tag
+
+ ;; refresh
+ "gr" 'debbugs-gnu-rescan
+
+ "g?" 'debbugs-gnu-manual
+ "gt" 'debbugs-gnu-view-bug-triage
+ "g#" 'debbugs-gnu-bugs
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'quit-window
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-debbugs)
+;;; evil-collection-debbugs.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/debug/README.org b/.config/emacs/lisp/evil-collection/modes/debug/README.org
new file mode 100644
index 0000000..ea4dcfe
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/debug/README.org
@@ -0,0 +1,26 @@
+* debug
+
+ Evil bindings for the Elisp debugger (=debugger-mode=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------------------------------------+----------+-----------|
+ | =debug-help-follow= / =backtrace-help-follow-symbol= | =RET= | =RET= |
+ | =forward-button= | =TAB= | =TAB= |
+ | =backward-button= | =S-TAB= | =S-TAB= |
+ | =next-line= | n/a | =SPC= |
+ | =debugger-continue= | =c= | =c= |
+ | =debugger-step-through= | =d= | =d= |
+ | =debugger-jump= | =j= | =J= |
+ | =debugger-eval-expression= | =e= | =x=, =E= |
+ | =debugger-record-expression= | =R= | =R= |
+ | =debugger-return-value= | =r= | =r= |
+ | =debugger-frame= | =b= | =gb= |
+ | =debugger-frame-clear= | =u= | =u= |
+ | =debugger-list-functions= | =l= | =gl= |
+ | =debugger-toggle-locals= / =backtrace-toggle-locals= | =v= | =L=, =p= |
+ | =backtrace-multi-line= | =+= | =zo= |
+ | =backtrace-single-line= | =-= | =zc= |
+ | =top-level= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/debug/evil-collection-debug.el b/.config/emacs/lisp/evil-collection/modes/debug/evil-collection-debug.el
new file mode 100644
index 0000000..cf00b51
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/debug/evil-collection-debug.el
@@ -0,0 +1,79 @@
+;;; evil-collection-debug.el --- Evil bindings for the debugger -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, debug, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for the debugger.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'debug)
+
+(defconst evil-collection-debug-maps '(debugger-mode-map))
+
+;;;###autoload
+(defun evil-collection-debug-setup ()
+ "Set up `evil' bindings for `debug'."
+ (evil-set-initial-state 'debugger-mode 'normal)
+
+ (evil-collection-define-key 'normal 'debugger-mode-map
+ ;; motion
+ (kbd "<tab>") 'forward-button
+ (kbd "S-<tab>") 'backward-button
+ (kbd "RET") (if (fboundp 'debug-help-follow)
+ 'debug-help-follow
+ 'backtrace-help-follow-symbol)
+ (kbd "SPC") 'next-line
+
+ "R" 'debugger-record-expression
+ "c" 'debugger-continue
+ "d" 'debugger-step-through
+
+ "x" 'debugger-eval-expression
+ "E" 'debugger-eval-expression
+
+ "J" 'debugger-jump
+
+ "gl" 'debugger-list-functions
+ "gb" 'debugger-frame
+ "r" 'debugger-return-value
+ "u" 'debugger-frame-clear
+ "L" (if (fboundp 'debugger-toggle-locals)
+ 'debugger-toggle-locals
+ 'backtrace-toggle-locals)
+ "p" (if (fboundp 'debugger-toggle-locals)
+ 'debugger-toggle-locals
+ 'backtrace-toggle-locals)
+
+ "zo" 'backtrace-multi-line
+ "zc" 'backtrace-single-line
+
+ ;; quit
+ "q" 'top-level
+ "ZQ" 'evil-quit
+ "ZZ" 'top-level))
+
+(provide 'evil-collection-debug)
+;;; evil-collection-debug.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/devdocs/evil-collection-devdocs.el b/.config/emacs/lisp/evil-collection/modes/devdocs/evil-collection-devdocs.el
new file mode 100644
index 0000000..696f669
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/devdocs/evil-collection-devdocs.el
@@ -0,0 +1,66 @@
+;;; evil-collection-devdocs.el --- Evil bindings for devdocs -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for devdocs.
+
+;;; Code:
+(require 'evil-collection)
+(require 'devdocs nil t)
+
+(defconst evil-collection-devdocs-maps '(devdocs-mode-map))
+
+;;;###autoload
+(defun evil-collection-devdocs-setup ()
+ "Set up `evil' bindings for `devdocs'."
+ (evil-set-initial-state 'devdocs-mode 'normal)
+ (evil-collection-set-readonly-bindings 'devdocs-mode-map)
+
+ (evil-collection-define-key 'normal 'devdocs-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+
+ "[[" 'devdocs-previous-page
+ "]]" 'devdocs-next-page
+ "gk" 'devdocs-previous-page
+ "gj" 'devdocs-next-page
+
+ "g." 'devdocs-goto-target
+
+ ;; history
+ (kbd "C-p") 'devdocs-go-back
+ (kbd "C-n") 'devdocs-go-forward
+
+ ;; copy
+ "C" 'devdocs-copy-url
+
+ ;; search
+ "s" 'devdocs-lookup))
+
+(provide 'evil-collection-devdocs)
+;;; evil-collection-devdocs.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/dictionary/evil-collection-dictionary.el b/.config/emacs/lisp/evil-collection/modes/dictionary/evil-collection-dictionary.el
new file mode 100644
index 0000000..7113fb3
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dictionary/evil-collection-dictionary.el
@@ -0,0 +1,51 @@
+;;; evil-collection-dictionary.el --- Evil bindings for dictionary-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: Sid Kasivajhula <sid@countvajhula.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, dictionary, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `dictionary'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'dictionary nil t)
+
+(defconst evil-collection-dictionary-maps '(dictionary-mode-map))
+
+;;;###autoload
+(defun evil-collection-dictionary-setup ()
+ "Set up `evil' bindings for `dictionary'."
+ (evil-set-initial-state 'dictionary-mode 'normal)
+ (evil-collection-set-readonly-bindings 'dictionary-mode-map)
+ (evil-collection-define-key 'normal 'dictionary-mode-map
+ ;; button
+ [tab] 'forward-button
+ [backtab] 'backward-button
+ ;; mouse
+ [mouse-1] 'link-selected
+ ;; misc
+ "g?" 'dictionary-help ; normally under `h` which is rebound here
+ (kbd "C-o") 'dictionary-previous)) ; normally under `l` which is rebound here
+
+(provide 'evil-collection-dictionary)
+;;; evil-collection-dictionary.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/diff-hl/README.org b/.config/emacs/lisp/evil-collection/modes/diff-hl/README.org
new file mode 100644
index 0000000..67e87a7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/diff-hl/README.org
@@ -0,0 +1,29 @@
+* diff-hl
+
+ Evil bindings for [[https://github.com/dgutov/diff-hl][diff-hl]]'s show-hunk popup and inline overlay.
+
+ Also adds =evil-normalize-keymaps= to
+ =diff-hl-show-hunk-inline-transient-mode-hook= so the bindings take
+ effect when the transient mode toggles on.
+
+** Key bindings
+
+*** diff-hl-show-hunk-map
+
+ | Command | Original | Evil |
+ |----------------------------------------+----------+------|
+ | =diff-hl-show-hunk-previous= | =p=, ={= | =p= |
+ | =diff-hl-show-hunk-next= | =n=, =}= | =n= |
+ | =diff-hl-show-hunk-copy-original-text= | =c= | =c= |
+ | =diff-hl-show-hunk-revert-hunk= | =r= | =r= |
+ | =diff-hl-show-hunk-stage-hunk= | =S= | =S= |
+
+*** diff-hl-show-hunk-inline-transient-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------------+-------------------+------------|
+ | =diff-hl-show-hunk-inline-hide= | =q=, =C-g=, =ESC= | =q=, =ESC= |
+ | =diff-hl-show-hunk-inline--popup-down= | =<down>=, =C-n= | =j= |
+ | =diff-hl-show-hunk-inline--popup-up= | =<up>=, =C-p= | =k= |
+ | =diff-hl-show-hunk-inline--popup-pagedown= | =<next>=, =C-v= | =C-f= |
+ | =diff-hl-show-hunk-inline--popup-pageup= | =<prior>=, =M-v= | =C-b= |
diff --git a/.config/emacs/lisp/evil-collection/modes/diff-hl/evil-collection-diff-hl.el b/.config/emacs/lisp/evil-collection/modes/diff-hl/evil-collection-diff-hl.el
new file mode 100644
index 0000000..9a9fe5b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/diff-hl/evil-collection-diff-hl.el
@@ -0,0 +1,75 @@
+;;; evil-collection-diff-hl.el --- Evil bindings for diff-hl -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, diff, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for diff-hl.
+;;
+;; All functions used below are autoloaded except for
+;; `diff-hl-show-hunk-inline--popup-down' et al commands.
+;;
+;; When users invoke `diff-hl-show-hunk' (it invokes
+;; `diff-hl-show-hunk-function' under the hood), `diff-hl-show-hunk-inline.el' or
+;; `diff-hl-show-hunk-posframe.el' will be loaded eventually.
+;;
+;; So there is no
+;;
+;; (require 'diff-hl nil t)
+;;
+;; below.
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-diff-hl-maps '(diff-hl-show-hunk-map
+ diff-hl-show-hunk-inline-transient-mode-map))
+
+;;;###autoload
+(defun evil-collection-diff-hl-setup()
+ "Set up `evil' bindings for `diff-hl'."
+ (add-hook 'diff-hl-show-hunk-inline-transient-mode-hook 'evil-normalize-keymaps)
+
+ (evil-collection-define-key 'normal 'diff-hl-show-hunk-inline-transient-mode-map
+ ;; quit
+ "q" 'diff-hl-show-hunk-inline-hide
+ (kbd "<escape>") 'diff-hl-show-hunk-inline-hide
+
+ ;; motion
+ "j" 'diff-hl-show-hunk-inline--popup-down
+ "k" 'diff-hl-show-hunk-inline--popup-up
+ (kbd "C-f") 'diff-hl-show-hunk-inline--popup-pagedown
+ (kbd "C-b") 'diff-hl-show-hunk-inline--popup-pageup)
+
+ ;; Actually `diff-hl-show-hunk-inline-transient-mode-map' will inherit it by
+ ;; `set-keymap-parent'.
+ (evil-collection-define-key 'normal 'diff-hl-show-hunk-map
+ ;; Keep it the same as the overlay shows.
+ "p" 'diff-hl-show-hunk-previous
+ "n" 'diff-hl-show-hunk-next
+ "c" 'diff-hl-show-hunk-copy-original-text
+ "r" 'diff-hl-show-hunk-revert-hunk
+ "S" 'diff-hl-show-hunk-stage-hunk))
+
+(provide 'evil-collection-diff-hl)
+;;; evil-collection-diff-hl.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/diff-mode/README.org b/.config/emacs/lisp/evil-collection/modes/diff-mode/README.org
new file mode 100644
index 0000000..a15d829
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/diff-mode/README.org
@@ -0,0 +1,66 @@
+* diff-mode
+
+ Evil bindings for =diff-mode=. By default they are installed on a dedicated
+ minor mode (=evil-collection-diff-mode=) attached to every =diff-mode= buffer,
+ so normal/insert states keep working for editing. Set
+ =evil-collection-diff-mode-want-minor-mode= to =nil= to instead bind on
+ =diff-mode-map= and have read-only / motion state toggle together.
+
+** Key bindings (minor-mode setup, default)
+
+ Active in normal state.
+
+ | Command | Original | Evil |
+ |--------------------+-----------+-------------|
+ | =diff-goto-source= | =C-c C-c= | =RET= |
+ | =diff-file-prev= | =M-{= | =[[= |
+ | =diff-file-next= | =M-}= | =]]= |
+ | =diff-hunk-prev= | =M-p= | =gk=, =C-k= |
+ | =diff-hunk-next= | =M-n= | =gj=, =C-j= |
+ | =diff-ediff-patch= | =C-c C-e= | =ge= |
+ | =read-only-mode= | n/a | =\= |
+ | =quit-window= | n/a | =q= |
+
+ With =evil-collection-want-g-bindings= (the default), edit commands sit under
+ =g=:
+
+ | Command | Original | Evil |
+ |-----------------------------------------------+-----------+------|
+ | =diff-apply-hunk= | =C-c C-a= | =ga= |
+ | =diff-refine-hunk= | =C-c C-b= | =g*= |
+ | =diff-hunk-kill= | =C-c C-k= | =gx= |
+ | =diff-file-kill= | =C-c M-k= | =gX= |
+ | =diff-split-hunk= | =C-c C-s= | =gs= |
+ | =diff-test-hunk= | =C-c C-t= | =gc= |
+ | =diff-reverse-direction= | =C-c C-r= | =g~= |
+ | =diff-ignore-whitespace-hunk= | =C-c C-w= | =g#= |
+ | =diff-add-change-log-entries-other-window= | =C-x 4 A= | =gA= |
+ | =evil-collection-diff-toggle-context-unified= | n/a | =g%= |
+ | =evil-collection-diff-toggle-restrict-view= | =C-c C-n= | =go= |
+ | =next-error-follow-minor-mode= | =C-c C-f= | =gi= |
+
+ Without =evil-collection-want-g-bindings=, the commands above land on their
+ single-letter equivalents (=a=, =*=, =d=, =D=, =s=, =c=, =~=, =#=, =A=, =x=,
+ =o=, =i=) instead.
+
+** Motion-state setup (when =evil-collection-diff-mode-want-minor-mode= is nil)
+
+ Same set of commands, but they go on =diff-mode-map= directly in normal and
+ motion states. A hook (=evil-collection-diff-toggle-setup=) flips state
+ whenever the buffer's read-only flag changes — read-only buffers enter motion
+ state, writable buffers normal state. Toggle this hook per-buffer with =M-x
+ evil-collection-diff-toggle-setup=.
+
+** New commands
+
+ | Command | Key | |
+ |-----------------------------------------------+------+--------------------------------------------------|
+ | =evil-collection-diff-toggle-context-unified= | =g%= | Toggle context <-> unified view. |
+ | =evil-collection-diff-toggle-restrict-view= | =go= | Toggle =diff-restrict-view=; widens if narrowed. |
+ | =evil-collection-diff-toggle-setup= | n/a | Toggle the read-only state hook in the buffer. |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |---------------------------------------------+---------+----------------------------------------------------------------------------|
+ | =evil-collection-diff-mode-want-minor-mode= | =t= | Bind on =evil-collection-diff-mode= minor mode instead of =diff-mode-map=. |
diff --git a/.config/emacs/lisp/evil-collection/modes/diff-mode/evil-collection-diff-mode.el b/.config/emacs/lisp/evil-collection/modes/diff-mode/evil-collection-diff-mode.el
new file mode 100644
index 0000000..1015705
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/diff-mode/evil-collection-diff-mode.el
@@ -0,0 +1,222 @@
+;;; evil-collection-diff-mode.el --- Add Evil bindings to diff-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, diff, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Evil-Collection-Diff re-uses the read-only particularity of `diff-mode':
+;; When the buffer is read-only, enter motion state
+;; and manipulate the diffs with simple bindings.
+;; When the buffer is writage, use normal/insert states with some Evil-specific
+;; keys to ease navigation.
+;;
+;; See also `evil-collection-diff-toggle-setup'.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'diff-mode)
+
+(defconst evil-collection-diff-mode-maps '(diff-mode-map))
+
+(defun evil-collection-diff-read-only-state-switch ()
+ "Make read-only in motion state, writable in normal state."
+ (when (eq major-mode 'diff-mode)
+ (if buffer-read-only
+ (evil-motion-state)
+ (evil-normal-state))))
+
+;;;###autoload
+(defun evil-collection-diff-toggle-setup ()
+ "Toggle visiting diff buffers in motion state."
+ (interactive)
+ (when (eq major-mode 'diff-mode)
+ (if (memq 'evil-collection-diff-read-only-state-switch read-only-mode-hook)
+ (remove-hook 'read-only-mode-hook 'evil-collection-diff-read-only-state-switch t)
+ (add-hook 'read-only-mode-hook 'evil-collection-diff-read-only-state-switch nil t))))
+
+;;; TODO: Report toggle function upstream?
+(defun evil-collection-diff-toggle-context-unified (start end)
+ "Toggle between context and unified views.
+
+START and END are either taken from the region (if a prefix arg is given) or
+else cover the whole buffer."
+ (interactive (if (or current-prefix-arg (use-region-p))
+ (list (region-beginning) (region-end))
+ (list (point-min) (point-max))))
+ ;; There seems to be no way to know whether we are in context or unified views.
+ ;; Workaround: assume that point-max will change. This is brittle.
+ (let ((old-point-max (point-max)))
+ (diff-unified->context start end)
+ (when (= old-point-max (point-max))
+ (diff-context->unified start end))))
+
+;;; TODO: Report toggle function upstream?
+(defun evil-collection-diff-toggle-restrict-view (&optional arg)
+ "Toggle the restriction of the view to the current hunk.
+When restricting and if the prefix ARG is given, restrict the view to the
+current file instead."
+ (interactive "P")
+ (if (buffer-narrowed-p)
+ (widen)
+ (diff-restrict-view arg)))
+
+(defcustom evil-collection-diff-mode-want-minor-mode t
+ "Whether to bind keys to a `evil-collection' created minor mode.
+
+When this is enabled, disable bootstrap related to setting up keys for motion,
+binding keys to a minor mode created by `evil-collection' instead."
+ :type 'boolean
+ :group 'evil-collection)
+
+(define-obsolete-variable-alias 'evil-collection-diff-mode-want-g-bindings
+ 'evil-collection-want-g-bindings "0.0.11")
+
+(defvar evil-collection-diff-mode-map (make-sparse-keymap))
+
+(define-minor-mode evil-collection-diff-mode
+ "A minor mode to attach to `diff-mode' results"
+ :group 'evil-collection-diff-mode
+ :keymap evil-collection-diff-mode-map
+ :lighter nil)
+
+(defun evil-collection-diff-mode-turn-on ()
+ "Turn on `evil-collection-diff-mode' and normalize keymaps."
+ (evil-collection-diff-mode)
+ (evil-normalize-keymaps))
+
+(defun evil-collection-diff-mode-setup-on-minor-mode ()
+ "Set up bindings on `evil-collection-diff-mode'."
+ (evil-collection-define-key 'normal 'evil-collection-diff-mode-map
+ (kbd "[[") 'diff-file-prev
+ (kbd "]]") 'diff-file-next
+ (kbd "C-j") 'diff-hunk-next
+ (kbd "C-k") 'diff-hunk-prev
+ "gj" 'diff-hunk-next
+ "gk" 'diff-hunk-prev
+ "ge" 'diff-ediff-patch
+ "q" 'quit-window
+ "\\" 'read-only-mode
+ (kbd "RET") 'diff-goto-source)
+
+ (if evil-collection-want-g-bindings
+ (evil-collection-define-key 'normal 'evil-collection-diff-mode-map
+ "gA" 'diff-add-change-log-entries-other-window
+ "ga" 'diff-apply-hunk
+ "g*" 'diff-refine-hunk
+ "gX" 'diff-file-kill
+ "gx" 'diff-hunk-kill
+ "gi" 'next-error-follow-minor-mode
+ "go" 'evil-collection-diff-toggle-restrict-view
+ "g~" 'diff-reverse-direction
+ "gs" 'diff-split-hunk
+ "gc" 'diff-test-hunk
+ "g%" 'evil-collection-diff-toggle-context-unified
+ "g#" 'diff-ignore-whitespace-hunk)
+ (evil-collection-define-key 'normal 'evil-collection-diff-mode-map
+ "A" 'diff-add-change-log-entries-other-window
+ "a" 'diff-apply-hunk
+ "*" 'diff-refine-hunk
+ "D" 'diff-file-kill
+ "d" 'diff-hunk-kill
+ "i" 'next-error-follow-minor-mode
+ "o" 'evil-collection-diff-toggle-restrict-view
+ "~" 'diff-reverse-direction
+ "s" 'diff-split-hunk
+ "c" 'diff-test-hunk
+ "x" 'evil-collection-diff-toggle-context-unified
+ "#" 'diff-ignore-whitespace-hunk))
+
+ ;; Enable a separate minor mode so that we can bind keys to it.
+ (add-hook 'diff-mode-hook 'evil-collection-diff-mode))
+
+(defun evil-collection-diff-mode-setup-on-motion-state ()
+ "Set up keys with motion state."
+ (evil-collection-define-key 'normal 'diff-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "[[") 'diff-file-prev
+ (kbd "]]") 'diff-file-next
+ (kbd "C-j") 'diff-hunk-next
+ (kbd "C-k") 'diff-hunk-prev
+ "gj" 'diff-hunk-next
+ "gk" 'diff-hunk-prev
+
+ "q" 'quit-window
+
+ "\\" 'read-only-mode) ; magit has "\"
+
+ (evil-collection-define-key 'motion 'diff-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "[[") 'diff-file-prev
+ (kbd "]]") 'diff-file-next
+ (kbd "C-j") 'diff-hunk-next
+ (kbd "C-k") 'diff-hunk-prev
+ "gj" 'diff-hunk-next
+ "gk" 'diff-hunk-prev
+
+ (kbd "RET") 'diff-goto-source
+ "A" 'diff-add-change-log-entries-other-window
+
+ "a" 'diff-apply-hunk
+ "*" 'diff-refine-hunk
+ "D" 'diff-file-kill
+ "d" 'diff-hunk-kill
+
+ "ge" 'diff-ediff-patch
+ "i" 'next-error-follow-minor-mode
+ "o" 'evil-collection-diff-toggle-restrict-view
+ "~" 'diff-reverse-direction
+ "s" 'diff-split-hunk
+ "c" 'diff-test-hunk
+ "x" 'evil-collection-diff-toggle-context-unified
+ "#" 'diff-ignore-whitespace-hunk
+
+ "\\" 'read-only-mode) ; magit has "\"
+ )
+
+;;;###autoload
+(defun evil-collection-diff-mode-setup ()
+ "Set up `evil' bindings for `diff-mode'."
+ ;; Don't switch to read-only/motion state by default as this can interfere
+ ;; with other modes which require a writable buffer, e.g. magit.
+ (evil-set-initial-state 'diff-mode 'normal)
+
+ (if evil-collection-diff-mode-want-minor-mode
+ (evil-collection-diff-mode-setup-on-minor-mode)
+ (evil-collection-diff-mode-setup-on-motion-state)))
+
+(unless evil-collection-diff-mode-want-minor-mode
+ (add-hook 'diff-mode-hook 'evil-collection-diff-toggle-setup))
+
+(defun evil-collection-diff-unload-function ()
+ "For `unload-feature'."
+ (unless evil-collection-diff-mode-want-minor-mode
+ (remove-hook 'diff-mode-hook 'evil-collection-diff-toggle-setup)))
+
+(provide 'evil-collection-diff-mode)
+;;; evil-collection-diff-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/difftastic/README.org b/.config/emacs/lisp/evil-collection/modes/difftastic/README.org
new file mode 100644
index 0000000..2486a73
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/difftastic/README.org
@@ -0,0 +1,20 @@
+* difftastic
+
+ Evil bindings for [[https://github.com/pkryger/difftastic.el][difftastic]] result buffers.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------------------------------+---------------------+-------------|
+ | =difftastic-previous-file= | =P=, =M-p= | =[[= |
+ | =difftastic-next-file= | =N=, =M-n= | =]]= |
+ | =difftastic-next-chunk= | =n= | =C-j=, =gj= |
+ | =difftastic-previous-chunk= | =p= | =C-k=, =gk= |
+ | =difftastic-hide-chunk= | | =zc= |
+ | =difftastic-show-chunk= | | =zo= |
+ | =difftastic-toggle-chunk= | =TAB= | =TAB= |
+ | =difftastic-diff-visit-file= | =RET= | =RET= |
+ | =difftastic-diff-visit-worktree-file= | =C-<return>=, =C-j= | =o= |
+ | =difftastic-rerun= | =g= | =gr= |
+ | =difftastic-leave= | =c=, =e= | =q= |
+ | =difftastic-quit= | =q= | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/difftastic/evil-collection-difftastic.el b/.config/emacs/lisp/evil-collection/modes/difftastic/evil-collection-difftastic.el
new file mode 100644
index 0000000..e1b223c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/difftastic/evil-collection-difftastic.el
@@ -0,0 +1,57 @@
+;;; evil-collection-difftastic.el --- Bindings for `difftastic' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025 hiecaq
+
+;; Author: hiecaq <soc.github@hiecaq.org>
+;; Maintainer: hiecaq <soc.github@hiecaq.org>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for difftastic.
+
+;;; Code:
+(require 'evil-collection)
+(require 'difftastic nil t)
+
+(defvar difftastic-mode-map)
+
+(defconst evil-collection-difftastic-maps '(difftastic-mode-map))
+
+;;;###autoload
+(defun evil-collection-difftastic-setup ()
+ "Set up `evil' bindings for `difftastic'."
+ (evil-collection-define-key 'normal 'difftastic-mode-map
+ (kbd "[[") 'difftastic-previous-file
+ (kbd "]]") 'difftastic-next-file
+ (kbd "C-j") 'difftastic-next-chunk
+ (kbd "C-k") 'difftastic-previous-chunk
+ "gj" 'difftastic-next-chunk
+ "gk" 'difftastic-previous-chunk
+ "zc" 'difftastic-hide-chunk
+ "zo" 'difftastic-show-chunk
+ (kbd "TAB") 'difftastic-toggle-chunk
+ (kbd "RET") 'difftastic-diff-visit-file
+ "o" 'difftastic-diff-visit-worktree-file
+ "gr" 'difftastic-rerun
+ "q" 'difftastic-leave
+ "ZQ" 'difftastic-quit))
+
+(provide 'evil-collection-difftastic)
+
+;;; evil-collection-difftastic.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/dired-sidebar/evil-collection-dired-sidebar.el b/.config/emacs/lisp/evil-collection/modes/dired-sidebar/evil-collection-dired-sidebar.el
new file mode 100644
index 0000000..f03f379
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dired-sidebar/evil-collection-dired-sidebar.el
@@ -0,0 +1,52 @@
+;;; evil-collection-dired-sidebar.el --- Evil bindings for dired-sidebar -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, dired, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `dired-sidebar'
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'dired-sidebar nil t)
+
+(defconst evil-collection-dired-sidebar-maps '(dired-sidebar-mode-map))
+
+;;;###autoload
+(defun evil-collection-dired-sidebar-setup ()
+ "Set up `evil' bindings for `dired-sidebar'."
+ (evil-collection-define-key 'normal 'dired-sidebar-mode-map
+ (kbd "RET") 'dired-sidebar-find-file
+ (kbd "C-m") 'dired-sidebar-find-file
+ (kbd "<return>") 'dired-sidebar-find-file
+ (kbd "TAB") 'dired-sidebar-subtree-toggle
+ [tab] 'dired-sidebar-subtree-toggle
+ "^" 'dired-sidebar-up-directory
+ "-" 'dired-sidebar-up-directory
+ (kbd "C-o") 'dired-sidebar-find-file-alt
+ [mouse-2] 'dired-sidebar-mouse-subtree-cycle-or-find-file
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-dired-sidebar)
+;;; evil-collection-dired-sidebar.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/dired/README.org b/.config/emacs/lisp/evil-collection/modes/dired/README.org
new file mode 100644
index 0000000..4068799
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dired/README.org
@@ -0,0 +1,40 @@
+* dired
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired.html][Dired]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------------+-----------------+-----------------|
+ | =dired-next-line= | =n=, =SPC= | =j=, =SPC= |
+ | =dired-previous-line= | =p=, =S-SPC= | =k=, =S-SPC= |
+ | =dired-find-file= | =f=, =RET=, =e= | =gf=, =RET= |
+ | =dired-find-file-other-window= | =o= | =gO= |
+ | =dired-view-file= | =v= | =go= |
+ | =revert-buffer= | =g= | =gr= |
+ | =dired-summary= | =?=, =h= | =g?= |
+ | =dired-show-file-type= | =y= | =gy= |
+ | =dired-copy-filename-as-kill= | =w= | =Y= |
+ | =dired-do-kill-lines= | =k= | =K= |
+ | =dired-do-chgrp= | =G= | =gG= |
+ | =dired-hide-subdir= | =$= | =g$= |
+ | =dired-next-dirline= | =>= | =gj=, =]]=, =>= |
+ | =dired-prev-dirline= | =<= | =gk=, =[[=, =<= |
+ | =dired-up-directory= | =^= | =^=, =-= |
+ | =dired-sort-toggle-or-edit= | =s= | =o= |
+ | =dired-do-redisplay= | =l= | =r= |
+ | =dired-find-alternate-file= | =a= | =a= |
+ | =quit-window= | =q= | =q= |
+
+ Uppercase operator keys (=A=, =B=, =C=, =D=, =H=, =L=, =M=, =O=, =P=, =Q=,
+ =R=, =S=, =T=, =U=, =W=, =X=, =Z=) and marking/flagging keys (=+=, =&=,
+ =!=, =%=, =*=, =~=, =#=, =.=, ===) keep their default dired bindings.
+
+ On Emacs 30+: =E= → =dired-do-open=.
+
+** Integrations
+
+ - [[https://github.com/Fuco1/dired-hacks][dired-narrow]]: =s= → =dired-narrow-regexp=.
+ - [[https://github.com/Fuco1/dired-hacks][dired-subtree]]: =TAB= toggle, =gh= / =gl= up/down, =M-j= / =M-k= sibling navigation.
+ - [[https://github.com/Fuco1/dired-hacks][dired-filter]]: =*= → =dired-filter-mark-map=, =g/= → =dired-filter-map=.
+ - dired-x: =*(=, =*.=, =*O= for sexp / extension / omitted marking.
diff --git a/.config/emacs/lisp/evil-collection/modes/dired/evil-collection-dired.el b/.config/emacs/lisp/evil-collection/modes/dired/evil-collection-dired.el
new file mode 100644
index 0000000..7898c1a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/dired/evil-collection-dired.el
@@ -0,0 +1,224 @@
+;;; evil-collection-dired.el --- Evil bindings for Dired -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, dired, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Dired.
+
+;;; Code:
+(require 'dired)
+(require 'evil-collection)
+
+(defvar dired-filter-mark-map)
+(defvar dired-filter-map)
+
+(defconst evil-collection-dired-maps '(dired-mode-map
+ dired-filter-mark-map
+ dired-filter-map))
+
+;;;###autoload
+(defun evil-collection-dired-setup ()
+ "Set up `evil' bindings for `dired'."
+ (evil-collection-define-key 'normal 'dired-mode-map
+ "q" 'quit-window
+ "j" 'dired-next-line
+ "k" 'dired-previous-line
+ [mouse-2] 'dired-mouse-find-file-other-window
+ [follow-link] 'mouse-face
+ ;; Commands to mark or flag certain categories of files
+ "#" 'dired-flag-auto-save-files
+ "." 'dired-clean-directory
+ "~" 'dired-flag-backup-files
+ ;; Upper case keys (except !) for operating on the marked files
+ "A" 'dired-do-find-regexp
+ "C" 'dired-do-copy
+ "B" 'dired-do-byte-compile
+ "D" 'dired-do-delete
+ "gG" 'dired-do-chgrp ;; FIXME: This can probably live on a better binding.
+ "H" 'dired-do-hardlink
+ "L" 'dired-do-load
+ "M" 'dired-do-chmod
+ "O" 'dired-do-chown
+ "P" 'dired-do-print
+ "Q" 'dired-do-find-regexp-and-replace
+ "R" 'dired-do-rename
+ "S" 'dired-do-symlink
+ "T" 'dired-do-touch
+ "X" 'dired-do-shell-command
+ "Z" 'dired-do-compress
+ "c" 'dired-do-compress-to
+ "!" 'dired-do-shell-command
+ "&" 'dired-do-async-shell-command
+ ;; Comparison commands
+ "=" 'dired-diff
+ ;; Tree Dired commands
+ (kbd "M-C-?") 'dired-unmark-all-files
+ (kbd "M-C-d") 'dired-tree-down
+ (kbd "M-C-u") 'dired-tree-up
+ (kbd "M-C-n") 'dired-next-subdir
+ (kbd "M-C-p") 'dired-prev-subdir
+ ;; move to marked files
+ (kbd "M-{") 'dired-prev-marked-file
+ (kbd "M-}") 'dired-next-marked-file
+ ;; Make all regexp commands share a `%' prefix:
+ ;; We used to get to the submap via a symbol dired-regexp-prefix,
+ ;; but that seems to serve little purpose, and copy-keymap
+ ;; does a better job without it.
+ "%" nil
+ "%u" 'dired-upcase
+ "%l" 'dired-downcase
+ "%d" 'dired-flag-files-regexp
+ "%g" 'dired-mark-files-containing-regexp
+ "%m" 'dired-mark-files-regexp
+ "%r" 'dired-do-rename-regexp
+ "%C" 'dired-do-copy-regexp
+ "%H" 'dired-do-hardlink-regexp
+ "%R" 'dired-do-rename-regexp
+ "%S" 'dired-do-symlink-regexp
+ "%&" 'dired-flag-garbage-files
+ ;; mark
+ "*" nil
+ "**" 'dired-mark-executables
+ "*/" 'dired-mark-directories
+ "*@" 'dired-mark-symlinks
+ "*%" 'dired-mark-files-regexp
+ "*c" 'dired-change-marks
+ "*s" 'dired-mark-subdir-files
+ "*m" 'dired-mark
+ "*u" 'dired-unmark
+ "*?" 'dired-unmark-all-files
+ "*!" 'dired-unmark-all-marks
+ "U" 'dired-unmark-all-marks
+ (kbd "* <delete>") 'dired-unmark-backward
+ (kbd "* C-n") 'dired-next-marked-file
+ (kbd "* C-p") 'dired-prev-marked-file
+ "*t" 'dired-toggle-marks
+ ;; Lower keys for commands not operating on all the marked files
+ "a" 'dired-find-alternate-file
+ "d" 'dired-flag-file-deletion
+ "gf" 'dired-find-file
+ (kbd "C-m") 'dired-find-file
+ "gr" 'revert-buffer
+ "i" 'dired-toggle-read-only
+ "I" 'dired-maybe-insert-subdir
+ "J" 'dired-goto-file
+ "K" 'dired-do-kill-lines
+ "r" 'dired-do-redisplay
+ "m" 'dired-mark
+ "t" 'dired-toggle-marks
+ "u" 'dired-unmark ; also "*u"
+ "W" 'browse-url-of-dired-file
+ "x" 'dired-do-flagged-delete
+ "gy" 'dired-show-file-type ;; FIXME: This could probably go on a better key.
+ "Y" 'dired-copy-filename-as-kill
+ "+" 'dired-create-directory
+ ;; open
+ (kbd "RET") 'dired-find-file
+ (kbd "S-<return>") 'dired-find-file-other-window
+ (kbd "M-RET") 'dired-display-file
+ "gO" 'dired-find-file-other-window
+ "go" 'dired-view-file
+ ;; sort
+ "o" 'dired-sort-toggle-or-edit
+ ;; moving
+ "gj" 'dired-next-dirline
+ "gk" 'dired-prev-dirline
+ "[[" 'dired-prev-dirline
+ "]]" 'dired-next-dirline
+ "<" 'dired-prev-dirline
+ ">" 'dired-next-dirline
+ "^" 'dired-up-directory
+ "-" 'dired-up-directory
+ " " 'dired-next-line
+ [?\S-\ ] 'dired-previous-line
+ [remap next-line] 'dired-next-line
+ [remap previous-line] 'dired-previous-line
+ ;; hiding
+ "g$" 'dired-hide-subdir ;; FIXME: This can probably live on a better binding.
+ (kbd "M-$") 'dired-hide-all
+ "(" 'dired-hide-details-mode
+ ;; isearch
+ (kbd "M-s a C-s") 'dired-do-isearch
+ (kbd "M-s a M-C-s") 'dired-do-isearch-regexp
+ (kbd "M-s f C-s") 'dired-isearch-filenames
+ (kbd "M-s f M-C-s") 'dired-isearch-filenames-regexp
+ ;; misc
+ [remap read-only-mode] 'dired-toggle-read-only
+ ;; `toggle-read-only' is an obsolete alias for `read-only-mode'
+ [remap toggle-read-only] 'dired-toggle-read-only
+ "g?" 'dired-summary
+ (kbd "<delete>") 'dired-unmark-backward
+ [remap undo] 'dired-undo
+ [remap advertised-undo] 'dired-undo
+ ;; thumbnail manipulation (image-dired)
+ (kbd "C-t d") 'image-dired-display-thumbs
+ (kbd "C-t t") 'image-dired-tag-files
+ (kbd "C-t r") 'image-dired-delete-tag
+ (kbd "C-t j") 'image-dired-jump-thumbnail-buffer
+ (kbd "C-t i") 'image-dired-dired-display-image
+ (kbd "C-t x") 'image-dired-dired-display-external
+ (kbd "C-t a") 'image-dired-display-thumbs-append
+ (kbd "C-t .") 'image-dired-display-thumb
+ (kbd "C-t c") 'image-dired-dired-comment-files
+ (kbd "C-t f") 'image-dired-mark-tagged-files
+ (kbd "C-t C-t") 'image-dired-dired-toggle-marked-thumbs
+ (kbd "C-t e") 'image-dired-dired-edit-comment-and-tags
+ ;; encryption and decryption (epa-dired)
+ ";d" 'epa-dired-do-decrypt
+ ";v" 'epa-dired-do-verify
+ ";s" 'epa-dired-do-sign
+ ";e" 'epa-dired-do-encrypt)
+
+ (when (>= emacs-major-version 30)
+ (evil-collection-define-key 'normal 'dired-mode-map
+ "E" 'dired-do-open))
+
+ ;; dired-x commands
+ (with-eval-after-load 'dired-x
+ (evil-collection-define-key 'normal 'dired-mode-map
+ "*(" 'dired-mark-sexp
+ "*." 'dired-mark-extension
+ "*O" 'dired-mark-omitted))
+
+ ;; dired-narrow commands
+ (with-eval-after-load 'dired-narrow
+ (evil-collection-define-key 'normal 'dired-mode-map
+ "s" 'dired-narrow-regexp))
+
+ ;; dired-subtree commands
+ (with-eval-after-load 'dired-subtree
+ (evil-collection-define-key 'normal 'dired-mode-map
+ (kbd "TAB") 'dired-subtree-toggle
+ "gh" 'dired-subtree-up
+ "gl" 'dired-subtree-down
+ (kbd "M-j") 'dired-subtree-next-sibling
+ (kbd "M-k") 'dired-subtree-previous-sibling))
+
+ (with-eval-after-load 'dired-filter
+ (evil-collection-define-key 'normal 'dired-mode-map
+ "*" dired-filter-mark-map
+ "g/" dired-filter-map)))
+
+(provide 'evil-collection-dired)
+;;; evil-collection-dired.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/disk-usage/evil-collection-disk-usage.el b/.config/emacs/lisp/evil-collection/modes/disk-usage/evil-collection-disk-usage.el
new file mode 100644
index 0000000..ee1b5c9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/disk-usage/evil-collection-disk-usage.el
@@ -0,0 +1,89 @@
+;;; evil-collection-disk-usage.el --- Evil bindings for disk-usage.el -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Pierre Neidhardt
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, files, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `disk-usage-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'disk-usage nil t)
+
+(defconst evil-collection-disk-usage-maps '(disk-usage-mode-map
+ disk-usage-by-types-mode-map))
+
+;;;###autoload
+(defun evil-collection-disk-usage-setup ()
+ "Set up `evil' bindings for `disk-usage'."
+ (evil-collection-set-readonly-bindings 'disk-usage-mode-map)
+ (evil-collection-define-key 'normal 'disk-usage-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+
+ "S" 'tabulated-list-sort
+ "^" 'disk-usage-up
+
+ "zh" 'disk-usage-toggle-human-readable
+ "zf" 'disk-usage-toggle-full-path
+ "zr" 'disk-usage-toggle-recursive
+
+ (kbd "ze") 'disk-usage-eshell-at-point
+ (kbd "zs") 'disk-usage-shell-at-point
+ (kbd "d") 'disk-usage-dired-at-point
+
+ "m" 'disk-usage-mark
+ "u" 'disk-usage-unmark
+ "x" 'disk-usage-delete-marked-files
+
+ "a" 'disk-usage-add-filters
+ "A" 'disk-usage-remove-filters
+
+ "g?" 'describe-mode
+ "gr" 'revert-buffer)
+
+ (evil-collection-set-readonly-bindings 'disk-usage-by-types-mode-map)
+ (evil-collection-define-key 'normal 'disk-usage-by-types-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+
+ (kbd "RET") 'disk-usage-files
+
+ "S" 'tabulated-list-sort
+
+ "zh" 'disk-usage-toggle-human-readable
+
+ "g?" 'describe-mode
+ "gr" 'revert-buffer
+
+ "a" 'disk-usage-add-filters
+ "A" 'disk-usage-remove-filters))
+
+(provide 'evil-collection-disk-usage)
+;;; evil-collection-disk-usage.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/distel/evil-collection-distel.el b/.config/emacs/lisp/evil-collection/modes/distel/evil-collection-distel.el
new file mode 100644
index 0000000..098cc1d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/distel/evil-collection-distel.el
@@ -0,0 +1,81 @@
+;;; evil-collection-distel.el --- Bindings for `distel' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, elisp, lisp
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `distel'.
+
+;;; Code:
+(require 'distel nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-distel-maps '(erlang-extended-mode-map
+ edb-attach-mode-map
+ edb-monitor-mode-map
+ edb-variables-mode-map))
+
+;;;###autoload
+(defun evil-collection-distel-setup ()
+ "Set up `evil' bindings for `distel'."
+ (evil-collection-define-key 'normal 'erlang-extended-mode-map
+ "gd" 'erl-find-source-under-point
+ (kbd "C-t") 'erl-find-source-unwind
+ "gz" 'erl-ie-show-session
+ "K" 'erl-find-doc-under-point)
+
+ (when evil-collection-setup-debugger-keys
+ (evil-collection-define-key 'normal 'erlang-extended-mode-map
+ [f5] 'edb-toggle-interpret
+ [f9] 'edb-toggle-breakpoint
+ ;; ("\C-c\C-ds" edb-synch-breakpoints)
+ ;; ("\C-c\C-dS" edb-save-dbg-state)
+ ;; ("\C-c\C-dR" edb-restore-dbg-state)
+ ;; ("\C-c\C-dm" edb-monitor)
+ )
+
+ (evil-collection-define-key 'normal 'edb-monitor-mode-map
+ (kbd "RET") 'edb-attach-command
+ "q" 'erl-bury-viewer)
+
+ (evil-collection-define-key 'normal 'edb-variables-mode-map
+ (kbd "RET") 'edb-show-variable)
+
+ (evil-collection-define-key 'normal 'edb-attach-mode-map
+ "i" 'edb-attach-step ;; Step Into
+ "n" 'edb-attach-next
+ "c" 'edb-attach-continue
+ "U" 'edb-attach-up
+ "D" 'edb-attach-down
+ "H" 'edb-attach-finish
+ "q" 'erl-quit-viewer
+ "g?" 'edb-attach-help
+ "b" 'edb-toggle-breakpoint))
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'erlang-extended-mode-map
+ "gr" 'erl-who-calls))
+
+ (add-hook 'erlang-extended-mode-hook 'evil-normalize-keymaps))
+
+(provide 'evil-collection-distel)
+;;; evil-collection-distel.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/doc-view/README.org b/.config/emacs/lisp/evil-collection/modes/doc-view/README.org
new file mode 100644
index 0000000..ea0af7c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/doc-view/README.org
@@ -0,0 +1,42 @@
+* doc-view
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Document-View.html][doc-view]] (PDF / PS / DVI viewer).
+
+ =doc-view-mode= starts in normal state.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------------------------+----------------+-------------------------------------|
+ | =doc-view-next-line-or-next-page= | =C-n=, =down= | =j= (remap) |
+ | =doc-view-previous-line-or-previous-page= | =C-p=, =up= | =k= (remap) |
+ | =image-forward-hscroll= | n/a | =l= (remap) |
+ | =image-backward-hscroll= | n/a | =h= (remap) |
+ | =doc-view-next-page= | =n= | =gj=, =C-j=, =n= |
+ | =doc-view-previous-page= | =p= | =gk=, =C-k=, =p= |
+ | =doc-view-first-page= | =M-<= | =gg= |
+ | =doc-view-last-page= | =M->= | =G= |
+ | =doc-view-goto-page= | =M-g M-g= | =J= |
+ | =doc-view-scroll-up-or-next-page= | =SPC= | =SPC= |
+ | =doc-view-scroll-down-or-previous-page= | =DEL=, =S-SPC= | =DEL=, =S-SPC= |
+ | =forward-page= | =next= | =C-d= |
+ | =backward-page= | =prior= | =C-u= (when =evil-want-C-u-scroll=) |
+ | =image-next-line= | =RET= | =RET= |
+ | =doc-view-enlarge= | =+=, === | =+=, === |
+ | =doc-view-shrink= | =-= | =-= |
+ | =doc-view-scale-reset= | =0= | =0= |
+ | =doc-view-fit-width-to-window= | =W= | =W= |
+ | =doc-view-fit-height-to-window= | =H= | =H= |
+ | =doc-view-fit-page-to-window= | =P= | =P= |
+ | =doc-view-kill-proc= | =K= | =X= |
+ | =doc-view-set-slice= | =c s= | =s s= |
+ | =doc-view-set-slice-using-mouse= | =c m= | =s m= |
+ | =doc-view-set-slice-from-bounding-box= | =c b= | =s b= |
+ | =doc-view-reset-slice= | =c r= | =s r= |
+ | =doc-view-search= | =C-s=, =find= | =/= |
+ | =doc-view-search-backward= | =C-r= | =?= |
+ | =doc-view-show-tooltip= | =C-t= | =C-t= |
+ | =doc-view-toggle-display= | =C-c C-c= | =C-c C-c= |
+ | =doc-view-open-text= | =C-c C-t= | =C-c C-t= |
+ | =doc-view-revert-buffer= | n/a | =gr= |
+ | =quit-window= | n/a | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/doc-view/evil-collection-doc-view.el b/.config/emacs/lisp/evil-collection/modes/doc-view/evil-collection-doc-view.el
new file mode 100644
index 0000000..42b10ff
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/doc-view/evil-collection-doc-view.el
@@ -0,0 +1,89 @@
+;;; evil-collection-doc-view.el --- Evil bindings for docview -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, bindings, files, pdf, ps, dvi
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Evil bindings for doc-view.
+
+;;; Code:
+(require 'evil-collection)
+(require 'doc-view)
+
+(defconst evil-collection-doc-view-maps '(doc-view-mode-map))
+
+;;;###autoload
+(defun evil-collection-doc-view-setup ()
+ "Set up `evil' bindings for `doc-view'."
+ (evil-set-initial-state 'doc-view-mode 'normal)
+ (evil-collection-define-key 'normal 'doc-view-mode-map
+ "q" 'quit-window
+ [remap evil-next-line] 'doc-view-next-line-or-next-page
+ [remap evil-previous-line] 'doc-view-previous-line-or-previous-page
+ [remap evil-backward-char] 'image-backward-hscroll
+ [remap evil-forward-char] 'image-forward-hscroll
+ (kbd "C-j") 'doc-view-next-page
+ (kbd "C-k") 'doc-view-previous-page
+ "gj" 'doc-view-next-page
+ "gk" 'doc-view-previous-page
+ (kbd "C-d") 'forward-page
+ (kbd "SPC") 'doc-view-scroll-up-or-next-page
+ (kbd "DEL") 'doc-view-scroll-down-or-previous-page
+ (kbd "S-SPC") 'doc-view-scroll-down-or-previous-page
+ "gg" 'doc-view-first-page
+ "G" 'doc-view-last-page
+ "J" 'doc-view-goto-page
+ (kbd "RET") 'image-next-line
+
+ ;; zoom
+ "+" 'doc-view-enlarge
+ "=" 'doc-view-enlarge
+ "0" 'doc-view-scale-reset
+ "-" 'doc-view-shrink
+
+ "W" 'doc-view-fit-width-to-window ; Like evil-image.
+ "H" 'doc-view-fit-height-to-window ; Like evil-image.
+ "P" 'doc-view-fit-page-to-window
+ "X" 'doc-view-kill-proc
+
+ (kbd "s s") 'doc-view-set-slice
+ (kbd "s m") 'doc-view-set-slice-using-mouse
+ (kbd "s b") 'doc-view-set-slice-from-bounding-box
+ (kbd "s r") 'doc-view-reset-slice
+
+ (kbd "/") 'doc-view-search
+ (kbd "?") 'doc-view-search-backward
+ (kbd "C-t") 'doc-view-show-tooltip
+ (kbd "C-c C-c") 'doc-view-toggle-display
+ (kbd "C-c C-t") 'doc-view-open-text
+
+ ;; refresh
+ (kbd "gr") 'doc-view-revert-buffer)
+
+ ;; TODO: What if the user changes `evil-want-C-u-scroll' after this is run?
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'normal 'doc-view-mode-map
+ (kbd "C-u") 'backward-page)))
+
+(provide 'evil-collection-doc-view)
+;;; evil-collection-doc-view.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/docker/evil-collection-docker.el b/.config/emacs/lisp/evil-collection/modes/docker/evil-collection-docker.el
new file mode 100644
index 0000000..29ecd21
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/docker/evil-collection-docker.el
@@ -0,0 +1,89 @@
+;;; evil-collection-docker.el --- Evil bindings for docker.el -*- lexical-binding: t -*-
+
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, docker, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for docker.el
+
+;;; Code:
+(require 'docker nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-docker-maps '(docker-container-mode-map
+ docker-context-mode-map
+ docker-image-mode-map
+ docker-machine-mode-map
+ docker-network-mode-map
+ docker-volume-mode-map))
+
+(defun evil-collection-docker-setup ()
+ "Set up `evil' bindings for `docker'."
+ (evil-collection-define-key 'normal 'docker-container-mode-map
+ ";" 'docker-container-ls
+ "?" 'docker-container-help
+ "C" 'docker-container-cp
+ "D" 'docker-container-rm
+ "I" 'docker-container-inspect
+ "K" 'docker-container-kill
+ "L" 'docker-container-logs
+ "O" 'docker-container-stop
+ "P" 'docker-container-pause
+ "R" 'docker-container-restart
+ "S" 'docker-container-start
+ "a" 'docker-container-attach
+ "b" 'docker-container-shells
+ "d" 'docker-container-diff
+ "f" 'docker-container-open
+ "r" 'docker-container-rename-selection)
+
+ (evil-collection-define-key 'normal 'docker-context-mode-map
+ "?" 'docker-context-help
+ "D" 'docker-context-rm
+ "I" 'docker-context-inspect
+ "X" 'docker-context-use)
+
+ (evil-collection-define-key 'normal 'docker-image-mode-map
+ ";" 'docker-image-ls
+ "?" 'docker-image-help
+ "D" 'docker-image-rm
+ "F" 'docker-image-pull
+ "I" 'docker-image-inspect
+ "P" 'docker-image-push
+ "R" 'docker-image-run
+ "T" 'docker-image-tag-selection
+ "d" 'docker-image-mark-dangling)
+
+ (evil-collection-define-key 'normal 'docker-network-mode-map
+ ";" 'docker-network-ls
+ "?" 'docker-network-help
+ "D" 'docker-network-rm
+ "I" 'docker-network-inspect
+ "d" 'docker-network-mark-dangling)
+
+ (evil-collection-define-key 'normal 'docker-volume-mode-map
+ ";" 'docker-volume-ls
+ "?" 'docker-volume-help
+ "D" 'docker-volume-rm
+ "I" 'docker-volume-inspect
+ "d" 'docker-volume-mark-dangling
+ "f" 'docker-volume-dired-selection))
+
+(provide 'evil-collection-docker)
+
+;;; evil-collection-docker.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eat/README.org b/.config/emacs/lisp/evil-collection/modes/eat/README.org
new file mode 100644
index 0000000..b8fdfae
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eat/README.org
@@ -0,0 +1,37 @@
+* eat
+
+ Evil bindings for [[https://codeberg.org/akib/emacs-eat][eat]], the Emulate A Terminal package.
+
+ Initial state for =eat-mode= is =insert=. The same =C-*= keys that vterm
+ forwards raw to the terminal are bound to =eat-self-input= here so that
+ shells and TUIs receive them instead of evil-insert-state.
+
+** Key bindings
+
+*** eat-mode-map
+
+ | Command | Original | Evil |
+ |------------------------------------------+----------+-----------|
+ | =evil-collection-eat-toggle-send-escape= | n/a | =C-c C-z= |
+
+ The following keys are forwarded raw to the terminal via =eat-self-input=
+ in insert state: =C-a=, =C-b=, =C-d=, =C-e=, =C-f=, =C-k=, =C-l=, =C-n=,
+ =C-o=, =C-p=, =C-q=, =C-r=, =C-s=, =C-t=, =C-u=, =C-v=, =C-w=, =C-y=,
+ =C-z=, =<delete>=. =C-c= (prefix) and =C-h= (help) are not forwarded.
+
+*** eat-line-mode-map
+
+ =RET=, =C-m= and =[return]= send input to the terminal in the state
+ named by =evil-collection-repl-submit-state=, and insert a newline in
+ the opposite state.
+
+ | Command | Original | State |
+ |-----------------------+----------+-------------------------------------|
+ | =eat-line-send-input= | =RET= | =evil-collection-repl-submit-state= |
+ | =newline= | n/a | opposite of submit state |
+
+** New commands
+
+ | Command | Purpose |
+ |------------------------------------------+---------------------------------------------------|
+ | =evil-collection-eat-toggle-send-escape= | Toggle whether =ESC= goes to eat or back to evil. |
diff --git a/.config/emacs/lisp/evil-collection/modes/eat/evil-collection-eat.el b/.config/emacs/lisp/evil-collection/modes/eat/evil-collection-eat.el
new file mode 100644
index 0000000..b5a6262
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eat/evil-collection-eat.el
@@ -0,0 +1,124 @@
+;;; evil-collection-eat.el --- Bindings for `eat' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 James Cherti
+
+;; Maintainer: James Cherti <https://www.jamescherti.com/contact/>
+;; Author: James Cherti <https://www.jamescherti.com/contact/>
+;; Based on evil-collection-vterm.el by James Nguyen and Pierre Neidhardt
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, eat, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; This package provides `evil-mode' keybindings for `eat'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'eat nil t)
+
+(defconst evil-collection-eat-maps '(eat-mode-map
+ eat-line-mode-map
+ eat-semi-char-mode-map
+ eat-char-mode-map
+ eat-eshell-semi-char-mode-map
+ eat-eshell-char-mode-map))
+
+;; The map symbols below are only referenced inside quoted lists in this
+;; file, so the byte-compiler does not actually require these declarations.
+;; Defining them keeps certain linters happy.
+(defvar eat-line-mode-map)
+(defvar eat-semi-char-mode-map)
+(defvar eat-char-mode-map)
+(defvar eat-eshell-semi-char-mode-map)
+(defvar eat-eshell-char-mode-map)
+
+(defvar-local evil-collection-eat-send-escape-to-eat-p nil
+ "Track whether or not we send ESC to `eat' or `emacs'.")
+
+(defun evil-collection-eat-toggle-send-escape ()
+ "Toggle the destination of the ESC key between `eat' and `emacs'.
+This adjustment is necessary for programs that utilize ESC, such as Vim or an
+SSH-accessed Emacs that also uses `evil-mode'."
+ (interactive)
+ (if evil-collection-eat-send-escape-to-eat-p
+ (evil-collection-define-key 'insert 'eat-mode-map (kbd "<escape>")
+ (lookup-key evil-insert-state-map (kbd "<escape>")))
+ (evil-collection-define-key 'insert 'eat-mode-map
+ (kbd "<escape>") 'eat-self-input))
+ (setq evil-collection-eat-send-escape-to-eat-p
+ (not evil-collection-eat-send-escape-to-eat-p))
+ (message (format "Sending ESC to %s."
+ (if evil-collection-eat-send-escape-to-eat-p
+ "eat"
+ "emacs"))))
+
+;;;###autoload
+(defun evil-collection-eat-setup ()
+ "Set up `evil' bindings for `eat'."
+ (evil-set-initial-state 'eat-mode 'insert)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'eat-line-mode-map
+ (kbd "RET") 'eat-line-send-input
+ (kbd "\C-m") 'eat-line-send-input
+ [return] 'eat-line-send-input)
+ (evil-collection-define-key newline-state 'eat-line-mode-map
+ (kbd "RET") #'newline
+ (kbd "\C-m") #'newline
+ [return] #'newline))
+
+ (evil-collection-define-key '(normal insert) 'eat-mode-map
+ (kbd "C-c C-z") 'evil-collection-eat-toggle-send-escape)
+
+ ;; `Evil' has some "C-" bindings in insert state that shadow the `eat' terminal
+ ;; bindings. Do not send "C-c" (prefix key) nor "C-h" (help prefix) as raw input.
+ (evil-collection-define-key 'insert 'eat-mode-map
+ (kbd "C-a") 'eat-self-input
+ (kbd "C-b") 'eat-self-input
+ (kbd "C-d") 'eat-self-input
+ (kbd "C-e") 'eat-self-input
+ (kbd "C-f") 'eat-self-input
+ (kbd "C-k") 'eat-self-input
+ (kbd "C-l") 'eat-self-input
+ (kbd "C-n") 'eat-self-input
+ (kbd "C-o") 'eat-self-input
+ (kbd "C-p") 'eat-self-input
+ (kbd "C-q") 'eat-self-input
+ (kbd "C-r") 'eat-self-input
+ (kbd "C-s") 'eat-self-input
+ (kbd "C-t") 'eat-self-input
+ (kbd "C-u") 'eat-self-input
+ (kbd "C-v") 'eat-self-input
+ (kbd "C-w") 'eat-self-input
+ (kbd "C-y") 'eat-self-input
+ (kbd "C-z") 'eat-self-input
+ (kbd "<delete>") 'eat-self-input)
+
+ ;; Paste bindings: in a terminal, "paste before/after" is meaningless because
+ ;; the cursor position is controlled by the running program. Bind both `p'
+ ;; and `P' to `eat-yank' so the kill-ring is sent as terminal input.
+ (dolist (map '(eat-semi-char-mode-map
+ eat-char-mode-map
+ eat-eshell-semi-char-mode-map
+ eat-eshell-char-mode-map))
+ (evil-collection-define-key 'normal map
+ (kbd "p") 'eat-yank
+ (kbd "P") 'eat-yank)))
+
+(provide 'evil-collection-eat)
+;;; evil-collection-eat.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ebib/evil-collection-ebib.el b/.config/emacs/lisp/evil-collection/modes/ebib/evil-collection-ebib.el
new file mode 100644
index 0000000..1c51451
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ebib/evil-collection-ebib.el
@@ -0,0 +1,77 @@
+;;; evil-collection-ebib.el --- Evil bindings for ebib -*- lexical-binding: t -*-
+
+;; Author: Justin Burkett
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ebib, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for the ebib.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ebib nil t)
+
+(defconst evil-collection-ebib-maps '(ebib-index-mode-map
+ ebib-entry-mode-map))
+
+(defvar ebib-index-mode-map)
+(defvar ebib-entry-mode-map)
+
+;;;###autoload
+(defun evil-collection-ebib-setup ()
+ "Set up `evil' bindings for `ebib'."
+ (evil-set-initial-state 'ebib-index-mode 'normal)
+ (evil-make-overriding-map ebib-index-mode-map 'normal)
+ (evil-collection-inhibit-insert-state 'ebib-index-mode-map)
+ (evil-collection-define-key 'normal 'ebib-index-mode-map
+ "d" 'ebib-kill-entry
+ "D" 'ebib-delete-entry
+ "gg" 'ebib-goto-first-entry
+ "G" 'ebib-goto-last-entry
+ "j" 'ebib-next-entry
+ "k" 'ebib-prev-entry
+ "n" 'ebib-search-next
+ "p" 'ebib-yank-entry
+ "gj" 'ebib-jump-to-entry
+ "ZQ" 'ebib-quit
+ "ZZ" 'ebib-lower
+ (kbd "C-u") 'ebib-index-scroll-down
+ (kbd "C-d") 'ebib-index-scroll-up
+ (kbd "C-b") 'ebib-index-scroll-down
+ (kbd "C-f") 'ebib-index-scroll-up)
+ (evil-set-initial-state 'ebib-entry-mode 'normal)
+ (evil-make-overriding-map ebib-entry-mode-map 'normal)
+ (evil-collection-inhibit-insert-state 'ebib-entry-mode-map)
+ (evil-collection-define-key 'normal 'ebib-entry-mode-map
+ "[[" 'ebib-goto-prev-set
+ "]]" 'ebib-goto-next-set
+ "d" 'ebib-kill-field-contents
+ "D" 'ebib-delete-field-contents
+ "gg" 'ebib-goto-first-field
+ "gk" 'ebib-goto-prev-set
+ "gj" 'ebib-goto-next-set
+ "G" 'ebib-goto-last-field
+ "j" 'ebib-next-field
+ "k" 'ebib-prev-field
+ "p" 'ebib-yank-field-contents
+ "y" 'ebib-copy-current-field-contents
+ "ZZ" 'ebib-quit-entry-buffer
+ "ZQ" 'ebib-quit-entry-buffer))
+
+(provide 'evil-collection-ebib)
+;;; evil-collection-ebib.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ebuku/evil-collection-ebuku.el b/.config/emacs/lisp/evil-collection/modes/ebuku/evil-collection-ebuku.el
new file mode 100644
index 0000000..8ab4129
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ebuku/evil-collection-ebuku.el
@@ -0,0 +1,63 @@
+;;; evil-collection-ebuku.el --- Evil bindings for Ebuku -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020-2022 Alexis
+
+;; Author: Alexis <flexibeast@gmail.com>
+;; Maintainer: Alexis <flexibeast@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ebuku, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Evil bindings for Ebuku.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'ebuku nil t)
+
+
+;;;###autoload
+(defun evil-collection-ebuku-setup ()
+ "Set up `evil' bindings for `Ebuku'."
+ (evil-collection-define-key 'normal 'ebuku-mode-map
+ "q" 'quit-window
+ "a" 'ebuku-add-bookmark
+ "d" 'ebuku-delete-bookmark
+ "x" 'ebuku-delete-bookmark
+ "e" 'ebuku-edit-bookmark
+ "gr" 'ebuku-refresh
+ "j" 'ebuku-next-bookmark
+ (kbd "C-j") 'ebuku-next-bookmark
+ "k" 'ebuku-previous-bookmark
+ (kbd "C-k") 'ebuku-previous-bookmark
+ "r" 'ebuku-search-on-recent
+ "s" 'ebuku-search
+ "*" 'ebuku-show-all
+ "-" 'ebuku-toggle-results-limit
+ "t" 'ebuku-toggle-results-limit
+ (kbd "RET") 'ebuku-open-url
+ "C" 'ebuku-copy-url
+ "T" 'ebuku-copy-title
+ "I" 'ebuku-copy-index
+ [mouse-1] 'ebuku-open-url
+ [mouse-2] 'ebuku-open-url))
+
+
+(provide 'evil-collection-ebuku)
+;;; evil-collection-ebuku.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eca/evil-collection-eca.el b/.config/emacs/lisp/evil-collection/modes/eca/evil-collection-eca.el
new file mode 100644
index 0000000..37657bd
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eca/evil-collection-eca.el
@@ -0,0 +1,56 @@
+;;; evil-collection-eca.el --- Bindings for eca -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: evil, eca, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for eca.
+
+;;; Code:
+(require 'evil-collection)
+(require 'eca nil t)
+
+(defconst evil-collection-eca-maps '(eca-chat-mode-map))
+
+(defvar eca-chat-mode-map)
+
+;;;###autoload
+(defun evil-collection-eca-setup ()
+ "Set up `evil' bindings for `eca'."
+ (add-hook 'eca-chat-mode-hook 'evil-normalize-keymaps)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'eca-chat-mode-map
+ (kbd "<return>") 'eca-chat--key-pressed-return
+ (kbd "RET") 'eca-chat--key-pressed-return)
+ (evil-collection-define-key newline-state 'eca-chat-mode-map
+ (kbd "<return>") 'eca-chat--key-pressed-newline
+ (kbd "RET") 'eca-chat--key-pressed-newline))
+
+ (evil-collection-define-key 'insert 'eca-chat-mode-map
+ (kbd "S-<return>") 'eca-chat--key-pressed-newline)
+ (evil-collection-define-key 'normal 'eca-chat-mode-map
+ (kbd "S-<return>") 'eca-chat--key-pressed-newline))
+
+(provide 'evil-collection-eca)
+;;; evil-collection-eca.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/edbi/evil-collection-edbi.el b/.config/emacs/lisp/evil-collection/modes/edbi/evil-collection-edbi.el
new file mode 100644
index 0000000..f6b7f63
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/edbi/evil-collection-edbi.el
@@ -0,0 +1,108 @@
+;;; evil-collection-edbi.el --- Evil bindings for EDBI -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Pierre Neidhardt <mail@ambrevar.xyz>
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, database, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for EDBI.
+
+;;; Code:
+(require 'evil-collection)
+(require 'edbi nil t)
+
+(defvar ctbl:table-mode-map)
+(defvar edbi:dbview-keymap)
+(declare-function ctbl:define-keymap "ctable")
+(declare-function epc:add-keymap "epc")
+
+(defconst evil-collection-edbi-maps '(edbi:dbview-query-result-keymap
+ edbi:sql-mode-map))
+
+(defun evil-collection-edbi-dbview-setup ()
+ "The `ctbl:table-mode-map' and `edbi:dbview-keymap' are stored
+as local maps and are not bound to any mode. As such, the only
+way to add Evil bindings to the dbview is to overwrite the
+default bindings."
+ (setq ctbl:table-mode-map
+ (ctbl:define-keymap
+ '(
+ ("k" . ctbl:navi-move-up)
+ ("j" . ctbl:navi-move-down)
+ ("h" . ctbl:navi-move-left)
+ ("l" . ctbl:navi-move-right)
+
+ ("gc" . ctbl:navi-jump-to-column)
+
+ ("$" . ctbl:navi-move-right-most)
+ ("0" . ctbl:navi-move-left-most)
+
+ ("gr" . ctbl:action-update-buffer)
+
+ ("g?" . ctbl:describe-bindings)
+
+ ([mouse-1] . ctbl:navi-on-click)
+ ("C-m" . ctbl:navi-on-click)
+ ("RET" . ctbl:navi-on-click))))
+
+ (setq edbi:dbview-keymap
+ (epc:add-keymap
+ ctbl:table-mode-map
+ '(("gr" . edbi:dbview-update-command)
+ ("SPC" . edbi:dbview-show-tabledef-command)
+ ("c" . edbi:dbview-query-editor-command)
+ ("C" . edbi:dbview-query-editor-new-command)
+ ("C-m" . edbi:dbview-show-table-data-command)
+ ("q" . edbi:dbview-quit-command)))))
+
+;;;###autoload
+(defun evil-collection-edbi-setup ()
+ "Set up `evil' bindings for EDBI."
+ (evil-collection-edbi-dbview-setup)
+ (evil-collection-define-key 'normal 'edbi:dbview-query-result-keymap
+ "0" 'ctbl:navi-move-left-most
+ "$" 'ctbl:navi-move-right-most
+
+ "h" 'ctbl:navi-move-left
+ "j" 'ctbl:navi-move-down
+ "k" 'ctbl:navi-move-up
+ "l" 'ctbl:navi-move-right
+
+ "gc" 'ctbl:navi-jump-to-column
+
+ "g?" 'ctbl:describe-bindings
+
+ ;; motion
+ "gr" 'ctbl:action-update-buffer
+
+ ;; quit
+ "q" 'edbi:dbview-query-result-quit-command
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-window)
+
+ (evil-collection-define-key 'normal 'edbi:sql-mode-map
+ "q" 'edbi:dbview-query-editor-quit-command
+ (kbd "C-n") 'edbi:dbview-query-editor-history-forward-command
+ (kbd "C-p") 'edbi:dbview-query-editor-history-back-command))
+
+(provide 'evil-collection-edbi)
+;;; evil-collection-edbi.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/edebug/README.org b/.config/emacs/lisp/evil-collection/modes/edebug/README.org
new file mode 100644
index 0000000..aba73a1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/edebug/README.org
@@ -0,0 +1,53 @@
+* edebug
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Edebug.html][Edebug]].
+
+** Key bindings
+
+ Bindings live in =edebug-mode-map=. Edebug overlays the source while a form
+ is instrumented; evil-collection sets the initial state to normal and frees
+ =g=, =G=, and =h= as prefixes.
+
+ | Command | Original | Evil |
+ |-------------------------------------+-----------+-----------------|
+ | =edebug-step-mode= | =SPC= | =s=, =C-c C-s= |
+ | =edebug-next-mode= | =n= | =n=, =C-c C-n= |
+ | =edebug-go-mode= | =g= | =go=, =C-c C-c= |
+ | =edebug-Go-nonstop-mode= | =G= | =gO= |
+ | =edebug-trace-mode= | =t= | =t= |
+ | =edebug-Trace-fast-mode= | =T= | =T= |
+ | =edebug-continue-mode= | =c= | =c= |
+ | =edebug-Continue-fast-mode= | =C= | =C= |
+ | =edebug-forward-sexp= | =f= | =f= |
+ | =edebug-step-in= | =i= | =i= |
+ | =edebug-step-out= | =o= | =o= |
+ | =edebug-goto-here= | =h= | =H= |
+ | =edebug-instrument-callee= | =I= | =I= |
+ | =edebug-stop= | =S= | =S= |
+ | =top-level= | =q= | =q= |
+ | =edebug-top-level-nonstop= | =Q= | =Q= |
+ | =abort-recursive-edit= | =a= | =a= |
+ | =edebug-set-breakpoint= | =b= | =b=, =C-x SPC= |
+ | =edebug-unset-breakpoint= | =u= | =u=, =C-c C-d= |
+ | =edebug-next-breakpoint= | =B= | =B= |
+ | =edebug-set-conditional-breakpoint= | =x= | =x= |
+ | =edebug-set-global-break-condition= | =X= | =X= |
+ | =edebug-previous-result= | =r= | =r= |
+ | =edebug-eval-expression= | =e= | =e= |
+ | =edebug-eval-last-sexp= | =C-x C-e= | =C-x C-e= |
+ | =edebug-visit-eval-list= | =E= | =EL= |
+ | =edebug-where= | =w= | =WW=, =C-c C-l= |
+ | =edebug-bounce-point= | =p= | =p= |
+ | =edebug-view-outside= | =v=, =P= | =P= |
+ | =edebug-toggle-save-windows= | =W= | =WS= |
+ | =edebug-help= | =?= | =g?= |
+ | =edebug-backtrace= | =d= | =d= |
+ | =edebug-temp-display-freq-count= | === | === |
+ | =negative-argument= | =-= | =-= |
+
+** Integrations
+
+ - edebug-x: in =edebug-x-instrumented-function-list-mode-map=, =RET= jumps to
+ the function, =E= evaluates, =Q= clears data, =q= quits. In
+ =edebug-x-breakpoint-list-mode-map=, =RET= visits the breakpoint, =x= kills
+ it, =Q= clears data, =q= quits.
diff --git a/.config/emacs/lisp/evil-collection/modes/edebug/evil-collection-edebug.el b/.config/emacs/lisp/evil-collection/modes/edebug/evil-collection-edebug.el
new file mode 100644
index 0000000..2c3d1d7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/edebug/evil-collection-edebug.el
@@ -0,0 +1,126 @@
+;;; evil-collection-edebug.el --- Evil bindings for Edebug -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, edebug, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `edebug-mode'.
+
+;;; Code:
+(require 'edebug)
+(require 'evil-collection)
+
+(defconst evil-collection-edebug-maps
+ '(edebug-mode-map
+ edebug-x-instrumented-function-list-mode-map
+ edebug-x-breakpoint-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-edebug-setup ()
+ "Set up `evil' bindings for `edebug'."
+ (evil-set-initial-state 'edebug-mode 'normal)
+
+ (add-hook 'edebug-mode-hook #'evil-normalize-keymaps)
+
+ (evil-collection-define-key nil 'edebug-mode-map
+ "g" nil
+ "G" nil
+ "h" nil)
+
+ ;; FIXME: Seems like other minor modes will readily clash with `edebug'.
+ ;; `lispyville' and `edebug' 's' key?
+ (evil-collection-define-key 'normal 'edebug-mode-map
+ ;; control
+ "s" 'edebug-step-mode
+ "n" 'edebug-next-mode
+ "go" 'edebug-go-mode
+ "gO" 'edebug-Go-nonstop-mode
+ "t" 'edebug-trace-mode
+ "T" 'edebug-Trace-fast-mode
+ "c" 'edebug-continue-mode
+ "C" 'edebug-Continue-fast-mode
+
+ "f" 'edebug-forward-sexp
+ "H" 'edebug-goto-here
+ "I" 'edebug-instrument-callee
+ "i" 'edebug-step-in
+ "o" 'edebug-step-out
+
+ ;; quit
+ "q" 'top-level
+ "Q" 'edebug-top-level-nonstop
+ "a" 'abort-recursive-edit
+ "S" 'edebug-stop
+
+ ;; breakpoints
+ "b" 'edebug-set-breakpoint
+ "u" 'edebug-unset-breakpoint
+ "B" 'edebug-next-breakpoint
+ "x" 'edebug-set-conditional-breakpoint
+ "X" 'edebug-set-global-break-condition
+
+ ;; evaluation
+ "r" 'edebug-previous-result
+ "e" 'edebug-eval-expression
+ (kbd "C-x C-e") 'edebug-eval-last-sexp
+ "EL" 'edebug-visit-eval-list
+
+ ;; views
+ "WW" 'edebug-where
+ "p" 'edebug-bounce-point
+ "P" 'edebug-view-outside ;; same as v
+ "WS" 'edebug-toggle-save-windows
+
+ ;; misc
+ "g?" 'edebug-help
+ "d" 'edebug-backtrace
+
+ "-" 'negative-argument
+
+ ;; statistics
+ "=" 'edebug-temp-display-freq-count
+
+ ;; GUD bindings
+ (kbd "C-c C-s") 'edebug-step-mode
+ (kbd "C-c C-n") 'edebug-next-mode
+ (kbd "C-c C-c") 'edebug-go-mode
+
+ (kbd "C-x SPC") 'edebug-set-breakpoint
+ (kbd "C-c C-d") 'edebug-unset-breakpoint
+ (kbd "C-c C-t") (lambda () (interactive) (edebug-set-breakpoint t))
+ (kbd "C-c C-l") 'edebug-where)
+
+ (with-eval-after-load 'edebug-x
+ (evil-collection-define-key 'normal 'edebug-x-instrumented-function-list-mode-map
+ "E" 'edebug-x-evaluate-function
+ "Q" 'edebug-x-clear-data
+ (kbd "RET") 'edebug-x-find-function
+ "q" 'quit-window)
+ (evil-collection-define-key 'normal 'edebug-x-breakpoint-list-mode-map
+ (kbd "RET") 'edebug-x-visit-breakpoint
+ "x" 'edebug-x-kill-breakpoint
+ "Q" 'edebug-x-clear-data
+ "q" 'quit-window)))
+
+(provide 'evil-collection-edebug)
+;;; evil-collection-edebug.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ediff/README.org b/.config/emacs/lisp/evil-collection/modes/ediff/README.org
new file mode 100644
index 0000000..6aa4b6f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ediff/README.org
@@ -0,0 +1,21 @@
+* ediff
+
+ The table below shows the binding changes that are made to ediff-mode.
+
+| Command | Original Binding | evil-collection-ediff |
+|-----------------------------+------------------+-----------------------|
+| =ediff-next-difference= | =n, SPC= | =j, n, SPC= |
+| =ediff-previous-difference= | =p, DEL= | =k, N, p, DEL= |
+| =ediff-jump-to-difference= | =j= | =d= |
+| jump to first difference | =1j= | =gg, 1d= |
+| jump to last difference | N/A | =G= |
+| copy region A to region B | =a= | =a, l= |
+| copy region B to region A | =b= | =b, h= |
+| scroll down 1 line | =C-u 1 v= | =C-e= |
+| scroll up 1 line | =C-u 1 V= | =C-y= |
+| scroll down half page | =v, C-v= | =C-d, v, C-v= |
+| scroll up half page | =V, M-v= | =C-u, V, M-v= |
+| scroll left | =>= | =zh= |
+| scroll right | =<= | =zl= |
+| toggle highlighting | =h= | =H= |
+| =ediff-suspend= | =z= | =C-z= |
diff --git a/.config/emacs/lisp/evil-collection/modes/ediff/evil-collection-ediff.el b/.config/emacs/lisp/evil-collection/modes/ediff/evil-collection-ediff.el
new file mode 100644
index 0000000..549d692
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ediff/evil-collection-ediff.el
@@ -0,0 +1,205 @@
+;;; evil-collection-ediff.el --- Evil bindings for ediff -*- lexical-binding: t -*-
+;; Copyright (C) 2015 Justin Burkett
+
+;; Author: Justin Burkett <justin@burkett.cc>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Homepage: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3") (evil "1.2.3"))
+;; Keywords: evil, ediff, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Make ediff a little evil. This configures ediff to be friendlier to users
+;; of vim-like keybindings. Consult the help buffer (=?=) for more info.
+
+;; Here's a table describing the bindings
+
+;; | Command | Original Binding | Evil-ediff |
+;; |-----------------------------+------------------+-------------|
+;; | ediff-next-difference | n,SPC | C-j,n,SPC |
+;; | ediff-previous-difference | p,DEL | C-k,N,p,DEL |
+;; | ediff-jump-to-difference | j | d |
+;; | jump to first difference | 1j | gg (or 1d) |
+;; | jump to last difference | N/A | G |
+;; | copy region A to region B | a | a,l |
+;; | copy region B to region A | b | b,h |
+;; | scroll down 1 line | C-u 1 v | j |
+;; | scroll up 1 line | C-u 1 V | k |
+;; | scroll down half page | v,C-v | C-d,v,C-v |
+;; | scroll up half page | V,M-v | C-u,V,M-v |
+;; | scroll left | > | zh |
+;; | scroll right | < | zl |
+;; | toggle highlighting | h | H |
+;; | ediff-suspend | z | C-z |
+
+;; Not implemented yet
+;; | restore old diff | ra,rb,rc | u |
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'ediff nil t)
+
+(defconst evil-collection-ediff-maps '(ediff-mode-map))
+
+(defvar evil-collection-ediff-initial-state-backup (evil-initial-state 'ediff-mode))
+(defvar evil-collection-ediff-long-help-message-compare2-backup ediff-long-help-message-compare2)
+(defvar evil-collection-ediff-long-help-message-compare3-backup ediff-long-help-message-compare3)
+(defvar evil-collection-ediff-long-help-message-narrow2-backup ediff-long-help-message-narrow2)
+(defvar evil-collection-ediff-long-help-message-word-backup ediff-long-help-message-word-mode)
+(defvar evil-collection-ediff-long-help-message-merge-backup ediff-long-help-message-merge)
+(defvar evil-collection-ediff-long-help-message-head-backup ediff-long-help-message-head)
+(defvar evil-collection-ediff-long-help-message-tail-backup ediff-long-help-message-tail)
+
+(defvar evil-collection-ediff-help-changed nil)
+
+(defun evil-collection-ediff-adjust-help ()
+ "Adjust long help messages to reflect evil-ediff bindings."
+ (unless evil-collection-ediff-help-changed
+ (dolist (msg '(ediff-long-help-message-compare2
+ ediff-long-help-message-compare3
+ ediff-long-help-message-narrow2
+ ediff-long-help-message-word-mode
+ ediff-long-help-message-merge
+ ediff-long-help-message-head
+ ediff-long-help-message-tail))
+ (dolist (chng '( ;;("^" . " ")
+ ("p,DEL -previous diff " . "k,N,p -previous diff ")
+ ("n,SPC -next diff " . " j,n -next diff ")
+ (" j -jump to diff " . " d -jump to diff ")
+ (" h -highlighting " . " H -highlighting ")
+ (" v/V -scroll up/dn " . "C-u/d -scroll up/dn ")
+ (" </> -scroll lt/rt " . "zh/zl -scroll lt/rt ")
+ (" z/q -suspend/quit" . "C-z/q -suspend/quit")))
+ (setf (symbol-value msg)
+ (replace-regexp-in-string (car chng) (cdr chng) (symbol-value msg))))))
+ (setq evil-collection-ediff-help-changed t))
+
+(defun evil-collection-ediff-scroll-left (&optional arg)
+ "Scroll left."
+ (interactive "P")
+ (let ((last-command-event ?>))
+ (ediff-scroll-horizontally arg)))
+
+(defun evil-collection-ediff-scroll-right (&optional arg)
+ "Scroll right."
+ (interactive "P")
+ (let ((last-command-event ?<))
+ (ediff-scroll-horizontally arg)))
+
+(defun evil-collection-ediff-scroll-up (&optional arg)
+ "Scroll up by half of a page."
+ (interactive "P")
+ (let ((last-command-event ?V))
+ (ediff-scroll-vertically arg)))
+
+(defun evil-collection-ediff-scroll-down (&optional arg)
+ "Scroll down by half of a page."
+ (interactive "P")
+ (let ((last-command-event ?v))
+ (ediff-scroll-vertically arg)))
+
+(defun evil-collection-ediff-scroll-down-1 ()
+ "Scroll down by a line."
+ (interactive)
+ (let ((last-command-event ?v))
+ (ediff-scroll-vertically 1)))
+
+(defun evil-collection-ediff-scroll-up-1 ()
+ "Scroll down by a line."
+ (interactive)
+ (let ((last-command-event ?V))
+ (ediff-scroll-vertically 1)))
+
+(defun evil-collection-ediff-first-difference ()
+ "Jump to first difference."
+ (interactive)
+ (ediff-jump-to-difference 1))
+
+(defun evil-collection-ediff-last-difference ()
+ "Jump to last difference."
+ (interactive)
+ (ediff-jump-to-difference ediff-number-of-differences))
+
+;; (defun evil-collection-ediff-restore-diff ()
+;; "Restore the copy of current region."
+;; (interactive)
+;; (ediff-restore-diff nil ?a)
+;; (ediff-restore-diff nil ?b))
+
+(defvar evil-collection-ediff-bindings
+ '(("d" . ediff-jump-to-difference)
+ ("H" . ediff-toggle-hilit)
+ ("\C-e" . evil-collection-ediff-scroll-down-1)
+ ("\C-y" . evil-collection-ediff-scroll-up-1)
+ ("j" . ediff-next-difference)
+ ("k" . ediff-previous-difference)
+ ("N" . ediff-previous-difference)
+ ("gg" . evil-collection-ediff-first-difference)
+ ("G" . evil-collection-ediff-last-difference)
+ ("\C-d" . evil-collection-ediff-scroll-down)
+ ("\C-u" . evil-collection-ediff-scroll-up)
+ ("\C-z" . ediff-suspend)
+ ("z" . nil)
+ ("zl" . evil-collection-ediff-scroll-right)
+ ("zh" . evil-collection-ediff-scroll-left)
+ ;; Not working yet
+ ;; ("u" . evil-collection-ediff-restore-diff)
+ )
+ "A list of bindings changed/added in evil-ediff.")
+
+(defun evil-collection-ediff-startup-hook ()
+ "Place evil-ediff bindings in `ediff-mode-map'."
+ (evil-make-overriding-map ediff-mode-map 'normal)
+ (dolist (entry evil-collection-ediff-bindings)
+ (define-key ediff-mode-map (car entry) (cdr entry)))
+ (unless (or ediff-3way-comparison-job
+ (eq ediff-split-window-function 'split-window-vertically))
+ (define-key ediff-mode-map "l" 'ediff-copy-A-to-B)
+ (define-key ediff-mode-map "h" 'ediff-copy-B-to-A))
+ (evil-normalize-keymaps)
+ nil)
+
+;;;###autoload
+(defun evil-collection-ediff-setup ()
+ "Initialize evil-ediff."
+ (interactive)
+ (evil-set-initial-state 'ediff-mode 'normal)
+ (add-hook 'ediff-keymap-setup-hook 'evil-collection-ediff-startup-hook)
+ (evil-collection-ediff-adjust-help))
+
+(defun evil-collection-ediff-revert ()
+ "Revert changes made by evil-ediff."
+ (interactive)
+ (evil-set-initial-state 'ediff-mode evil-collection-ediff-initial-state-backup)
+ (unless evil-collection-ediff-help-changed
+ (dolist (msg
+ '((ediff-long-help-message-compare2 . ediff-long-help-message-compare2-backup)
+ (ediff-long-help-message-compare3 . ediff-long-help-message-compare3-backup)
+ (ediff-long-help-message-narrow2 . ediff-long-help-message-narrow2-backup)
+ (ediff-long-help-message-word-mode . ediff-long-help-message-word-mode-backup)
+ (ediff-long-help-message-merge . ediff-long-help-message-merge-backup)
+ (ediff-long-help-message-head . ediff-long-help-message-head-backup)
+ (ediff-long-help-message-tail . ediff-long-help-message-tail-backup)))
+ (setf (symbol-value (car msg)) (symbol-value (cdr msg)))))
+ (setq evil-collection-ediff-help-changed nil)
+ (remove-hook 'ediff-keymap-setup-hook 'evil-collection-ediff-startup-hook))
+
+(provide 'evil-collection-ediff)
+;;; evil-collection-ediff.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eglot/README.org b/.config/emacs/lisp/evil-collection/modes/eglot/README.org
new file mode 100644
index 0000000..b93d3c1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eglot/README.org
@@ -0,0 +1,19 @@
+* eglot
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/eglot/index.html][eglot]], the built-in LSP client.
+
+** Key bindings (normal state)
+
+ | Command | Original | Evil |
+ |--------------------------------------+-----------+-------|
+ | =xref-find-definitions= | =M-.= | =gd= |
+ | =xref-find-definitions-other-window= | =C-x 4 .= | =gD= |
+ | =xref-find-definitions-other-frame= | =C-x 5 .= | =g5= |
+ | =xref-pop-marker-stack= | =M-,= | =C-t= |
+ | =eldoc-doc-buffer= | n/a | =K= |
+ | =xref-find-references= | =M-?= | =gr= |
+
+ =gr= is only bound when =evil-collection-want-find-usages-bindings= is non-nil.
+
+ =eglot-managed-mode-hook= adds =evil-normalize-keymaps= so the bindings
+ activate as soon as eglot manages a buffer.
diff --git a/.config/emacs/lisp/evil-collection/modes/eglot/evil-collection-eglot.el b/.config/emacs/lisp/evil-collection/modes/eglot/evil-collection-eglot.el
new file mode 100644
index 0000000..6633107
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eglot/evil-collection-eglot.el
@@ -0,0 +1,50 @@
+;;; evil-collection-eglot.el --- Bindings for `eglot' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, eglot, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `eglot'.
+
+;;; Code:
+(require 'eglot nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-eglot-maps '(eglot-mode-map))
+
+;;;###autoload
+(defun evil-collection-eglot-setup ()
+ "Set up `evil' bindings for `eglot'."
+ (add-hook 'eglot-managed-mode-hook 'evil-normalize-keymaps)
+ (evil-collection-define-key 'normal 'eglot-mode-map
+ "gd" 'xref-find-definitions
+ "gD" 'xref-find-definitions-other-window
+ "g5" 'xref-find-definitions-other-frame
+ (kbd "C-t") 'xref-pop-marker-stack
+ "K" 'eldoc-doc-buffer)
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'eglot-mode-map
+ "gr" 'xref-find-references)))
+
+(provide 'evil-collection-eglot)
+;;; evil-collection-eglot.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eldoc/README.org b/.config/emacs/lisp/evil-collection/modes/eldoc/README.org
new file mode 100644
index 0000000..1f1f776
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eldoc/README.org
@@ -0,0 +1,19 @@
+* eldoc
+
+ Evil bindings for the buffer popped by =eldoc-doc-buffer=.
+
+** Key bindings
+
+ Applied via =evil-collection-eldoc-doc-buffer-mode=, a minor mode attached
+ to the =*eldoc*= buffer.
+
+ | Command | Original | Evil |
+ |---------------+----------+-----------|
+ | =quit-window= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+
+** Notes
+
+ On Emacs < 29, the minor mode is attached via advice on =eldoc-doc-buffer=.
+ On Emacs 29+, eldoc buffers derive from =special-mode=, which
+ evil-collection covers separately.
diff --git a/.config/emacs/lisp/evil-collection/modes/eldoc/evil-collection-eldoc.el b/.config/emacs/lisp/evil-collection/modes/eldoc/evil-collection-eldoc.el
new file mode 100644
index 0000000..698ab10
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eldoc/evil-collection-eldoc.el
@@ -0,0 +1,67 @@
+;;; evil-collection-eldoc.el --- Bindings for `eldoc' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `eldoc'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'eldoc nil t)
+
+(defconst evil-collection-eldoc-maps
+ '(evil-collection-eldoc-doc-buffer-mode-map))
+
+(defvar eldoc--doc-buffer) ;; Internal to `eldoc'.
+
+(defvar evil-collection-eldoc-doc-buffer-mode-map (make-sparse-keymap))
+
+(define-minor-mode evil-collection-eldoc-doc-buffer-mode
+ "A minor mode to attach to `eldoc-doc-buffer' buffers."
+ :group 'evil-collection-eldoc-mode
+ :keymap evil-collection-eldoc-doc-buffer-mode-map
+ :lighter nil)
+
+(defun evil-collection-eldoc-setup-doc-buffer-mode (&rest _)
+ "Set up `evil-collection-eldoc-doc-buffer-mode'."
+ (with-current-buffer eldoc--doc-buffer
+ (evil-collection-eldoc-doc-buffer-mode +1)
+ (evil-normalize-keymaps)))
+
+;;;###autoload
+(defun evil-collection-eldoc-setup ()
+ "Set up `evil' bindings for `eldoc'."
+ (evil-collection-define-key 'normal 'evil-collection-eldoc-doc-buffer-mode-map
+ "q" #'quit-window
+ "ZZ" #'quit-window
+ "ZQ" #'evil-quit)
+
+ ;; 'special-mode' is used in eldoc since
+ ;; https://github.com/emacs-mirror/emacs/commit/97abe8511a829861f6efb865209ac2dd0e7ae129
+ (when (< emacs-major-version 29)
+ ;; Enable a separate minor mode so that we can bind keys to it.
+ (advice-add 'eldoc-doc-buffer
+ :after 'evil-collection-eldoc-setup-doc-buffer-mode)))
+
+(provide 'evil-collection-eldoc)
+;;; evil-collection-eldoc.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/elfeed/README.org b/.config/emacs/lisp/evil-collection/modes/elfeed/README.org
new file mode 100644
index 0000000..b1f2dcd
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elfeed/README.org
@@ -0,0 +1,64 @@
+* elfeed
+
+ Evil bindings for [[https://github.com/skeeto/elfeed][elfeed]].
+
+ Standard motion / quit bindings (=gg=, =G=, =j=, =k=, =q=, =ZZ=, =ZQ=) come
+ from =evil-collection-set-readonly-bindings= and are not repeated below.
+
+** elfeed-search-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------------+----------+---------------------|
+ | =elfeed-search-show-entry= | =RET= | =RET= |
+ | =elfeed-search-browse-url= | =b= | =S-RET=, =go= |
+ | =elfeed-search-yank= | =y= | =y= |
+ | =elfeed-search-live-filter= | =s= | =s= |
+ | =elfeed-search-set-filter= | =S= | =S= |
+ | =elfeed-search-clear-filter= | =c= | =c= |
+ | =elfeed-search-fetch= | =G= | =gR= |
+ | =revert-buffer= | =g= | =gr= |
+ | =elfeed-search-tag-all= | =+= | =+= |
+ | =elfeed-search-untag-all= | =-= | =-= |
+ | =elfeed-search-tag-all-unread= | =u= | =U= |
+ | =elfeed-search-untag-all-unread= | =r= | =u= |
+ | =scroll-up-command= | n/a | =SPC= |
+ | =scroll-down-command= | n/a | =S-SPC= |
+ | =elfeed-search-quit-window= | =q= | =q=, =ZQ=, =ZZ= ([[#fallbacks][†]]) |
+
+** elfeed-show-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------------------------+----------+-------------------|
+ | =elfeed-show-visit= | =b= | =S-RET=, =go= |
+ | =elfeed-show-yank= | =y= | =yu= |
+ | =elfeed-show-next= | =n= | =]]=, =gj=, =C-j= |
+ | =elfeed-show-prev= | =p= | =[[=, =gk=, =C-k= |
+ | =elfeed-show-refresh= | n/a | =gr= |
+ | =elfeed-show-new-live-search= | =s= | =s= |
+ | =elfeed-show-tag= | =+= | =+= |
+ | =elfeed-show-untag= | =-= | =-= |
+ | =elfeed-show-play-enclosure= | =P= | =P= |
+ | =elfeed-show-add-enclosure-to-playlist= | =A= | =A= |
+ | =elfeed-show-save-enclosure= | =d= | =d= |
+ | =elfeed-show-next-link= | =TAB= | =TAB= |
+ | =scroll-up-command= | =SPC= | =SPC= |
+ | =scroll-down-command= | =S-SPC= | =S-SPC= |
+ | =elfeed-kill-buffer= | =q= | =q=, =ZQ=, =ZZ= |
+
+** elfeed-tree-mode-map
+
+ | Command | Original | Evil |
+ |----------------------+----------+-------|
+ | =elfeed-tree-search= | =RET= | =RET= |
+
+** Fallbacks
+ :PROPERTIES:
+ :CUSTOM_ID: fallbacks
+ :END:
+
+ Two version-compat fallbacks fire only when running older elfeed:
+
+ - Before elfeed commit =518e5bd3= (no =revert-buffer-function=), =gr= calls
+ =elfeed-search-update--force= instead of =revert-buffer=.
+ - Before elfeed commit =2ef14c92= (no =quit-window-hook= save), =q=, =ZQ=,
+ =ZZ= use =elfeed-search-quit-window= to persist the db on exit.
diff --git a/.config/emacs/lisp/evil-collection/modes/elfeed/evil-collection-elfeed.el b/.config/emacs/lisp/evil-collection/modes/elfeed/evil-collection-elfeed.el
new file mode 100644
index 0000000..c691575
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elfeed/evil-collection-elfeed.el
@@ -0,0 +1,139 @@
+;;; evil-collection-elfeed.el --- Evil bindings for elfeed -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, elfeed, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for elfeed.
+
+;;; Code:
+(require 'elfeed nil t)
+(require 'evil-collection)
+
+(defvar elfeed-search-mode-map)
+(defvar elfeed-show-mode-map)
+(defvar elfeed-tree-mode-map)
+
+(defconst evil-collection-elfeed-maps '(elfeed-search-mode-map
+ elfeed-show-mode-map
+ elfeed-tree-mode-map))
+
+;;;###autoload
+(defun evil-collection-elfeed-setup ()
+ "Set up `evil' bindings for `elfeed'."
+
+ (evil-collection-set-readonly-bindings 'elfeed-search-mode-map)
+ (evil-set-initial-state 'elfeed-search-mode 'normal)
+ (evil-collection-define-key 'normal 'elfeed-search-mode-map
+ ;; open
+ (kbd "RET") 'elfeed-search-show-entry
+ (kbd "S-<return>") 'elfeed-search-browse-url
+ "go" 'elfeed-search-browse-url
+
+ "y" 'elfeed-search-yank
+
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+
+ ;; filter
+ "s" 'elfeed-search-live-filter
+ "S" 'elfeed-search-set-filter
+ "c" 'elfeed-search-clear-filter
+
+ ;; refresh
+ "gR" 'elfeed-search-fetch ; TODO: Which update function is more useful?
+ "gr" 'revert-buffer
+
+ ;; quit -- `q'/`ZZ' default to `quit-window' via
+ ;; `evil-collection-set-readonly-bindings'.
+ "ZQ" 'quit-window)
+
+ ;; Refresh fallback for elfeed before commit 518e5bd3, where
+ ;; `revert-buffer-function' is not wired up.
+ (unless (fboundp 'elfeed-search--update-force)
+ (evil-collection-define-key 'normal 'elfeed-search-mode-map
+ "gr" 'elfeed-search-update--force))
+
+ ;; Quit fallback for elfeed before commit 2ef14c92, where
+ ;; `quit-window-hook' does not run `elfeed-db-save'.
+ (when (and (fboundp 'elfeed-search-quit-window)
+ (not (eq (indirect-function 'elfeed-search-quit-window)
+ (symbol-function 'quit-window))))
+ (evil-collection-define-key 'normal 'elfeed-search-mode-map
+ "q" 'elfeed-search-quit-window
+ "ZQ" 'elfeed-search-quit-window
+ "ZZ" 'elfeed-search-quit-window))
+
+ (evil-collection-define-key '(normal visual) 'elfeed-search-mode-map
+ "+" 'elfeed-search-tag-all
+ "-" 'elfeed-search-untag-all
+ "U" 'elfeed-search-tag-all-unread
+ "u" 'elfeed-search-untag-all-unread)
+
+ (evil-collection-set-readonly-bindings 'elfeed-show-mode-map)
+ (evil-set-initial-state 'elfeed-show-mode 'normal)
+ (evil-collection-define-key 'normal 'elfeed-show-mode-map
+ (kbd "S-<return>") 'elfeed-show-visit
+ "go" 'elfeed-show-visit
+
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'elfeed-show-next-link
+
+ ;; filter
+ "s" 'elfeed-show-new-live-search
+
+ "+" 'elfeed-show-tag
+ "-" 'elfeed-show-untag
+
+ "A" 'elfeed-show-add-enclosure-to-playlist
+ "P" 'elfeed-show-play-enclosure
+ "d" 'elfeed-show-save-enclosure
+
+ "]]" 'elfeed-show-next
+ "[[" 'elfeed-show-prev
+ "gj" 'elfeed-show-next
+ "gk" 'elfeed-show-prev
+ (kbd "C-j") 'elfeed-show-next
+ (kbd "C-k") 'elfeed-show-prev
+
+ ;; refresh
+ "gr" 'elfeed-show-refresh
+
+ ;; quit
+ "q" 'elfeed-kill-buffer
+ "ZQ" 'elfeed-kill-buffer
+ "ZZ" 'elfeed-kill-buffer)
+
+ ;; yu, like `eww'
+ (evil-collection-define-operator-key 'yank 'elfeed-show-mode-map
+ "u" 'elfeed-show-yank)
+
+ (evil-collection-set-readonly-bindings 'elfeed-tree-mode-map)
+ (evil-set-initial-state 'elfeed-tree-mode 'normal)
+ (evil-collection-define-key 'normal 'elfeed-tree-mode-map
+ ;; open
+ (kbd "RET") 'elfeed-tree-search))
+
+(provide 'evil-collection-elfeed)
+;;; evil-collection-elfeed.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/elisp-mode/README.org b/.config/emacs/lisp/evil-collection/modes/elisp-mode/README.org
new file mode 100644
index 0000000..1fbd2a9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elisp-mode/README.org
@@ -0,0 +1,23 @@
+* elisp-mode
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/elisp/index.html][Emacs Lisp]] editing (=emacs-lisp-mode= and
+ =emacs-lisp-compilation-mode=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------------------------------------+----------+------|
+ | =evil-collection-elisp-mode-ielm-repl= (=elisp-mode=) | n/a | =gz= |
+ | =emacs-lisp-compilation-recompile= | n/a | =gr= |
+ | =xref-find-references= (when find-usages enabled) | =M-?= | =gr= |
+
+ In the =*Help*= printed-value overlay (=eval-print-last-sexp= output), =RET=
+ in normal/motion state calls =elisp-last-sexp-toggle-display=; in insert
+ state =RET= falls through to the global binding.
+
+** Notes
+
+ - =elisp--eval-last-sexp= is advised so its output ends at point in
+ normal/motion state when =evil-move-beyond-eol= is nil.
+ - =last-sexp-setup-props= is overridden to install an evil-aware =C-m=
+ handler on the printed-value text properties.
diff --git a/.config/emacs/lisp/evil-collection/modes/elisp-mode/evil-collection-elisp-mode.el b/.config/emacs/lisp/evil-collection/modes/elisp-mode/evil-collection-elisp-mode.el
new file mode 100644
index 0000000..b92f262
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elisp-mode/evil-collection-elisp-mode.el
@@ -0,0 +1,99 @@
+;;; evil-collection-elisp-mode.el --- Bindings for `elisp-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, elisp, lisp
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `elisp-mode'.
+
+;;; Code:
+(require 'elisp-mode)
+(require 'evil-collection)
+
+(defconst evil-collection-elisp-mode-maps '(emacs-lisp-mode-map
+ emacs-lisp-compilation-mode-map))
+
+(defun evil-collection-elisp-mode-last-sexp-setup-props (beg end value alt1 alt2)
+ "Set up text properties for the output of `elisp--eval-last-sexp'.
+BEG and END are the start and end of the output in current-buffer.
+VALUE is the Lisp value printed, ALT1 and ALT2 are strings for the
+alternative printed representations that can be displayed."
+ (let ((map (make-sparse-keymap)))
+ (define-key map (kbd "C-m") 'evil-collection-elisp-mode-return-or-last-sexp-toggle-display)
+ (define-key map [down-mouse-2] 'mouse-set-point)
+ (define-key map [mouse-2] 'elisp-last-sexp-toggle-display)
+ (add-text-properties
+ beg end
+ `(printed-value (,value ,alt1 ,alt2)
+ mouse-face highlight
+ keymap ,map
+ help-echo "RET, mouse-2: toggle abbreviated display"
+ rear-nonsticky (mouse-face keymap help-echo
+ printed-value)))))
+
+(defun evil-collection-elisp-mode-return-or-last-sexp-toggle-display ()
+ "Trigger RET or call `elisp-last-sexp-toggle-display'."
+ (interactive)
+ (if (eq evil-state 'insert)
+ (call-interactively
+ (lookup-key (current-global-map) (kbd "C-m")))
+ (call-interactively 'elisp-last-sexp-toggle-display)))
+
+(defun evil-collection-elisp-mode-last-sexp (command &rest args)
+ "In normal-state or motion-state, last sexp ends at point."
+ (if (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p)))
+ (save-excursion
+ (unless (or (eobp) (eolp)) (forward-char))
+ (apply command args))
+ (apply command args)))
+
+(defun evil-collection-elisp-mode-ielm-repl ()
+ "Open the Emacs Lisp REPL (`ielm')."
+ (interactive)
+ (pop-to-buffer (get-buffer-create "*ielm*"))
+ (ielm))
+
+;;;###autoload
+(defun evil-collection-elisp-mode-setup ()
+ "Set up `evil' bindings for `elisp-mode'."
+ (add-hook 'emacs-lisp-compilation-mode-hook 'evil-normalize-keymaps)
+
+ (unless evil-move-beyond-eol
+ (advice-add 'eval-print-last-sexp :around 'evil-collection-elisp-mode-last-sexp))
+ (advice-add 'last-sexp-setup-props
+ :override 'evil-collection-elisp-mode-last-sexp-setup-props)
+
+ (evil-set-initial-state 'emacs-lisp-mode 'normal)
+ (evil-collection-define-key 'normal 'emacs-lisp-mode-map
+ "gz" 'evil-collection-elisp-mode-ielm-repl)
+
+ (evil-collection-define-key 'normal 'emacs-lisp-compilation-mode-map
+ "gr" 'emacs-lisp-compilation-recompile)
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'emacs-lisp-mode-map
+ "gr" 'xref-find-references)))
+
+(provide 'evil-collection-elisp-mode)
+;;; evil-collection-elisp-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/elisp-refs/README.org b/.config/emacs/lisp/evil-collection/modes/elisp-refs/README.org
new file mode 100644
index 0000000..fe6eb22
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elisp-refs/README.org
@@ -0,0 +1,12 @@
+* elisp-refs
+
+ Evil bindings for [[https://github.com/Wilfred/elisp-refs][elisp-refs]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------+--------------+----------------------|
+ | =elisp-refs-next-match= | =n=, =TAB= | =TAB=, =C-j=, =gj= |
+ | =elisp-refs-prev-match= | =p=, =S-TAB= | =S-TAB=, =C-k=, =gk= |
+ | =elisp-refs-visit-match= | =RET= | =RET= |
+ | =kill-current-buffer= | n/a | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/elisp-refs/evil-collection-elisp-refs.el b/.config/emacs/lisp/evil-collection/modes/elisp-refs/evil-collection-elisp-refs.el
new file mode 100644
index 0000000..c146c04
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elisp-refs/evil-collection-elisp-refs.el
@@ -0,0 +1,52 @@
+;;; evil-collection-elisp-refs.el --- Evil bindings for Elisp Refs -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2024 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, elisp-refs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; This package provides a sane set of defaults for `elisp-refs' when using
+;; `evil-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'elisp-refs nil t)
+
+(defconst evil-collection-elisp-refs-maps '(elisp-refs-mode-map))
+
+;;;###autoload
+(defun evil-collection-elisp-refs-setup ()
+ "Set up `evil' bindings for `elisp-refs'."
+ (evil-collection-define-key 'normal 'elisp-refs-mode-map
+ (kbd "<tab>") 'elisp-refs-next-match
+ (kbd "<backtab>") 'elisp-refs-prev-match
+ (kbd "C-j") 'elisp-refs-next-match
+ (kbd "C-k") 'elisp-refs-prev-match
+ "gj" 'elisp-refs-next-match
+ "gk" 'elisp-refs-prev-match
+ (kbd "RET") 'elisp-refs-visit-match
+
+ ;; quit
+ "q" 'kill-current-buffer))
+
+(provide 'evil-collection-elisp-refs)
+;;; evil-collection-elisp-refs.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/README.org b/.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/README.org
new file mode 100644
index 0000000..97a2d86
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/README.org
@@ -0,0 +1,11 @@
+* elisp-slime-nav
+
+ Evil bindings for [[https://github.com/purcell/elisp-slime-nav][elisp-slime-nav]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------------------------------+-----------------------------+-------|
+ | =elisp-slime-nav-find-elisp-thing-at-point= | =M-.= | =gd= |
+ | =pop-tag-mark= | =M-,= | =C-t= |
+ | =elisp-slime-nav-describe-elisp-thing-at-point= | =C-c C-d C-d= / =C-c C-d d= | =K= |
diff --git a/.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/evil-collection-elisp-slime-nav.el b/.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/evil-collection-elisp-slime-nav.el
new file mode 100644
index 0000000..c3d9f04
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elisp-slime-nav/evil-collection-elisp-slime-nav.el
@@ -0,0 +1,44 @@
+;;; evil-collection-elisp-slime-nav.el --- Bindings for `elisp-slime-nav' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, elisp-slime-nav, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `elisp-slime-nav'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'elisp-slime-nav nil t)
+
+(defconst evil-collection-elisp-slime-nav-maps '(elisp-slime-nav-mode-map))
+
+;;;###autoload
+(defun evil-collection-elisp-slime-nav-setup ()
+ "Set up `evil' bindings for `elisp-slime-nav'."
+ (evil-collection-define-key 'normal 'elisp-slime-nav-mode-map
+ "gd" 'elisp-slime-nav-find-elisp-thing-at-point
+ (kbd "C-t") 'pop-tag-mark
+ "K" 'elisp-slime-nav-describe-elisp-thing-at-point))
+
+(provide 'evil-collection-elisp-slime-nav)
+;;; evil-collection-elisp-slime-nav.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/elpaca/evil-collection-elpaca.el b/.config/emacs/lisp/evil-collection/modes/elpaca/evil-collection-elpaca.el
new file mode 100644
index 0000000..c501f91
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/elpaca/evil-collection-elpaca.el
@@ -0,0 +1,118 @@
+;;; evil-collection-elpaca.el --- Bindings for `elpaca' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2023 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `elpaca'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'elpaca nil t)
+(require 'elpaca-ui nil t)
+
+(defvar elpaca-info-mode-map)
+(defvar elpaca-ui-mode-map)
+(defvar elpaca-ui-view-map)
+(declare-function elpaca-ui-search "elpaca-ui")
+(declare-function elpaca-ui-visit "elpaca-ui")
+
+
+(defconst evil-collection-elpaca-maps '(elpaca-info-mode-map
+ elpaca-ui-mode-map))
+
+(defcustom evil-collection-elpaca-want-movement t
+ "When non nil, prioritize movement keys like \"h\", \"l\", \"b\", etc."
+ :group 'evil-collection
+ :type 'boolean)
+
+(defcustom evil-collection-elpaca-want-v t
+ "When non nil, use v for visual mode.
+When this is true, move the `elpaca-visit' to gv and gd."
+ :group 'evil-collection
+ :type 'boolean)
+
+(defun evil-collection-elpaca-ui-visit-build-dir ()
+ "Visit package's build-dir."
+ (interactive)
+ (elpaca-ui-visit 'build))
+
+(defmacro evil-collection-elpaca-defsearch (name query)
+ "Return search command with NAME for QUERY."
+ (declare (indent 1) (debug t))
+ `(defun ,(intern (format "elpaca-ui-search-%s" name)) ()
+ ,(format "Search for %S" query)
+ (interactive)
+ (elpaca-ui-search ,query)))
+
+(defun evil-collection-elpaca-setup ()
+ "Set up `evil' bindings for elpaca."
+ (evil-collection-define-key 'normal 'elpaca-ui-view-map
+ (kbd "a") (evil-collection-elpaca-defsearch marked "#unique #marked")
+ (kbd "i") (evil-collection-elpaca-defsearch installed "#unique #installed")
+ (kbd "l") 'elpaca-log
+ (kbd "m") 'elpaca-manager
+ (kbd "o") (evil-collection-elpaca-defsearch orphaned "#unique #orphan")
+ (kbd "r") 'elpaca-ui-search-refresh
+ (kbd "t") (evil-collection-elpaca-defsearch tried "#unique #installed !#declared")
+ (kbd "b") 'evil-collection-elpaca-ui-visit-build-dir)
+
+ (evil-collection-define-key 'normal 'elpaca-info-mode-map
+ (kbd "TAB") 'forward-button
+ (kbd "<tab>") 'forward-button
+ (kbd "S-TAB") 'backward-button
+ (kbd "<backtab>") 'backward-button
+ (kbd "i") 'elpaca-info
+ (kbd "s") 'elpaca-info)
+
+ (evil-collection-define-key 'normal 'elpaca-ui-mode-map
+ (kbd "RET") 'elpaca-ui-info
+ (kbd "!") 'elpaca-ui-send-input
+ (kbd "+") 'elpaca-ui-show-hidden-rows
+ (kbd "c") 'elpaca-ui-copy
+ (kbd "d") 'elpaca-ui-mark-delete
+ (kbd "g") elpaca-ui-view-map
+ (kbd "i") 'elpaca-ui-mark-try
+ (kbd "m") 'elpaca-ui-mark-merge
+ (kbd "p") 'elpaca-ui-mark-pull
+ (kbd "r") 'elpaca-ui-mark-rebuild
+ (kbd "s") 'elpaca-ui-search
+ (kbd "u") 'elpaca-ui-unmark
+ (kbd "x") 'elpaca-ui-execute-marks)
+
+ (if evil-collection-elpaca-want-v
+ (evil-collection-define-key 'normal 'elpaca-ui-view-map
+ (kbd "v") 'elpaca-ui-visit)
+ (evil-collection-define-key 'normal 'elpaca-ui-mode-map
+ (kbd "v") 'elpaca-ui-visit))
+
+ (if evil-collection-elpaca-want-movement
+ (evil-collection-define-key 'normal 'elpaca-ui-mode-map
+ (kbd "B") 'elpaca-ui-browse-package ;; b -> B
+ (kbd "F") 'elpaca-ui-mark-fetch ;; f -> F
+ )
+ (evil-collection-define-key 'normal 'elpaca-ui-mode-map
+ (kbd "b") 'elpaca-ui-browse-package
+ (kbd "f") 'elpaca-ui-mark-fetch)))
+
+(provide 'evil-collection-elpaca)
+;;; evil-collection-elpaca.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/embark/README.org b/.config/emacs/lisp/evil-collection/modes/embark/README.org
new file mode 100644
index 0000000..3a76f32
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/embark/README.org
@@ -0,0 +1,19 @@
+* embark
+
+ Evil bindings for [[https://github.com/oantolin/embark][embark]]. Only
+ =embark-collect-mode-map= is touched -- the embark action keymaps
+ (=embark-general-map=, =embark-file-map=, ...) are left alone so embark's own
+ prefix UI keeps working.
+
+** embark-collect-mode-map
+
+ Initial state is forced to normal.
+
+ | Command | Original | Evil |
+ |-------------------------------------------+----------+-------|
+ | =embark-act= | =a= | =a= |
+ | =embark-act-all= | =A= | =A= |
+ | =embark-export= | =E= | =E= |
+ | =embark-select= | n/a | =m= |
+ | =embark-collect-direct-action-minor-mode= | =M-a= | =M-a= |
+ | =revert-buffer= | =g= | =gr= |
diff --git a/.config/emacs/lisp/evil-collection/modes/embark/evil-collection-embark.el b/.config/emacs/lisp/evil-collection/modes/embark/evil-collection-embark.el
new file mode 100644
index 0000000..c22d294
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/embark/evil-collection-embark.el
@@ -0,0 +1,52 @@
+;;; evil-collection-embark.el --- Evil bindings for embark -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for embark.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'embark nil t)
+
+(defconst evil-collection-embark-maps '(embark-collect-mode-map))
+
+;;;###autoload
+(defun evil-collection-embark-setup ()
+ "Set up `evil' bindings for `embark'."
+ (evil-set-initial-state 'embark-collect-mode 'normal)
+ (evil-collection-define-key 'normal 'embark-collect-mode-map
+ ;; embark specific commands. `isearch-forward' isn't defined, use
+ ;; `evil-search-forward' instead.
+ "a" 'embark-act
+ "A" 'embark-act-all
+ "E" 'embark-export ;; was e
+ "m" 'embark-select
+ (kbd "M-a") 'embark-collect-direct-action-minor-mode
+
+ "gr" 'revert-buffer))
+
+(provide 'evil-collection-embark)
+;;; evil-collection-embark.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ement/evil-collection-ement.el b/.config/emacs/lisp/evil-collection/modes/ement/evil-collection-ement.el
new file mode 100644
index 0000000..a9c7a1b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ement/evil-collection-ement.el
@@ -0,0 +1,138 @@
+;;; evil-collection-ement.el --- Evil integration for Ement.el -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Nicholas Vollmer
+
+;; Author: Nicholas Vollmer
+;; Keywords: convenience
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.0
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Evil bindings for Ement.el
+
+;;; Code:
+(require 'evil-collection)
+(require 'ement nil t)
+(require 'ement-room-list nil t)
+
+(defgroup evil-collection-ement nil
+ "Evil bindings for Ement.el."
+ :group 'evil-collection)
+
+(defcustom evil-collection-ement-want-auto-retro nil
+ "When non-nil, automatically run `ement-room-retro' when scrolled up at `bob'."
+ :type 'boolean)
+
+(defconst evil-collection-ement-maps '(ement-describe-room-mode-map
+ ement-directory-mode-map
+ ement-room-list-mode-map
+ ement-room-mode-map))
+
+(declare-function ement-room-retro "ement-room")
+(defun evil-collection-ement--auto-retro ()
+ "Call `ement-room-retro' scroll requested from beginning of buffer hit."
+ (and (= (line-beginning-position) (point-min))
+ (not (eq evil-state 'emacs))
+ (member this-command '(previous-line evil-scroll-up))
+ (call-interactively #'ement-room-retro)
+ (setq this-command 'ement-room-retro)))
+
+(defun evil-collection-ement--install-auto-retro ()
+ "Install `evil-collection-ement--auto-retro'."
+ (add-hook 'post-command-hook #'evil-collection-ement--auto-retro nil t))
+
+(defun evil-collection-ement-setup ()
+ "Set up `evil' bindings for Ement.el."
+ (evil-collection-define-key 'normal 'ement-describe-room-mode-map
+ (kbd "q") 'quit-window)
+
+ (evil-collection-define-key 'normal 'ement-directory-mode-map
+ (kbd "RET") 'ement-directory-RET
+ (kbd "<return>") 'ement-directory-RET
+ (kbd "s") 'ement-directory-search
+ (kbd "q") 'quit-window)
+
+ (evil-collection-define-key 'normal 'ement-room-list-mode-map
+ (kbd "d") 'ement-room-list-kill-buffer
+ (kbd "x") 'ement-room-leave
+ (kbd "X") 'ement-forget-room
+ (kbd "RET") 'ement-room-list-RET
+ (kbd "<return>") 'ement-room-list-RET)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'ement-room-mode-map
+ (kbd "<return>") 'ement-room-send-message
+ (kbd "RET") 'ement-room-send-message)
+ (evil-collection-define-key newline-state 'ement-room-mode-map
+ (kbd "<return>") 'newline
+ (kbd "RET") 'newline))
+
+ (evil-collection-define-key '(normal motion) 'ement-room-mode-map
+ (kbd "<") 'ement-room-transient
+ (kbd "M-RET") 'ement-room-compose-message
+ (kbd "<M-return>") 'ement-room-compose-message
+ (kbd "a") 'ement-room-send-message
+ (kbd "A") 'ement-room-compose-message
+ (kbd "d") 'ement-room-delete-message
+ (kbd "D") 'ement-room-delete-message
+ (kbd "J") 'ement-room-write-reply
+ (kbd "]]") 'ement-room-goto-next
+ (kbd "[[") 'ement-room-goto-prev
+ (kbd "gr") 'ement-room-sync
+ (kbd "gu") 'ement-room-goto-fully-read-marker
+ (kbd "gm") 'ement-room-mark-read
+ (kbd "gv") 'ement-room-view-event
+ (kbd "i") 'ement-room-edit-message
+ (kbd "q") 'quit-window
+ ;; Room prefix bindings
+ (kbd "r/") 'ement-room-occur
+ (kbd "rd") 'ement-room-describe
+ (kbd "rf") 'ement-room-set-message-format
+ (kbd "rl") 'ement-room-list
+ (kbd "rm") 'ement-list-members
+ (kbd "rn") 'ement-room-override-name
+ (kbd "rN") 'ement-room-set-notification-state
+ (kbd "rt") 'ement-room-set-topic
+ (kbd "rT") 'ement-tag-room
+ ;; Room membership
+ (kbd "Rc") 'ement-create-room
+ (kbd "Rj") 'ement-room-join
+ (kbd "Rl") 'ement-room-leave
+ (kbd "RF") 'ement-room-forget
+ (kbd "Rn") 'ement-room-set-display-name
+ (kbd "Rs") 'ement-room-toggle-space
+ ;; Send prefix bindings
+ (kbd "se") 'ement-room-send-emote
+ (kbd "sf") 'ement-room-send-file
+ (kbd "si") 'ement-room-send-image
+ (kbd "sr") 'ement-room-send-reaction
+ ;; User prefix bindings
+ (kbd "ui") 'ement-invite-user
+ (kbd "uI") 'ement-ignore-user
+ (kbd "u RET") 'ement-send-direct-message
+ (kbd "u <return>") 'ement-send-direct-message)
+
+ (when evil-collection-ement-want-auto-retro
+ (add-hook 'ement-room-mode-hook #'evil-collection-ement--install-auto-retro))
+ nil)
+
+(provide 'evil-collection-ement)
+;;; evil-collection-ement.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/emms/README.org b/.config/emacs/lisp/evil-collection/modes/emms/README.org
new file mode 100644
index 0000000..cd6d6af
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/emms/README.org
@@ -0,0 +1,131 @@
+* emms
+
+ Evil bindings for [[https://www.gnu.org/software/emms/][EMMS]].
+
+** emms-browser-mode-map
+
+ Insert state is inhibited; the browser is forced into normal state.
+
+ | Command | Original | Evil |
+ |--------------------------------------------+-------------+-------------------|
+ | =emms-pause= | =P= | =x= |
+ | =emms-stop= | =s= | =X= |
+ | =emms-random= | =r= | =r= |
+ | =emms-seek-backward= | =<= | =<= |
+ | =emms-seek-forward= | =>= | =>= |
+ | =emms-browser-add-tracks= | =RET= | =RET= |
+ | =emms-browser-add-tracks-and-play= | =C-RET= | =C-RET= |
+ | =emms-volume-raise= | =+= | =+=, === |
+ | =emms-volume-lower= | =-= | =-= |
+ | =emms-playlist-mode-undo= | =C-/= | =u= |
+ | =emms-browser-prev-non-track= | =<backtab>= | =[[=, =C-k=, =gk= |
+ | =emms-browser-next-non-track= | n/a | =]]=, =C-j=, =gj= |
+ | =emms-browser-toggle-subitems-recursively= | n/a | =TAB=, =S-TAB= |
+ | =emms-browser-move-up-level= | =^= | =^= |
+ | =emms-browser-toggle-subitems= | =SPC= | =SPC= |
+ | =emms-browser-collapse-all= | =1= | =g1=, =zm=, =zc= |
+ | =emms-browser-expand-to-level-2= | =2= | =g2= |
+ | =emms-browser-expand-to-level-3= | =3= | =g3= |
+ | =emms-browser-expand-to-level-4= | =4= | =g4= |
+ | =emms-browser-expand-all= | =E= | =g0=, =zr= |
+ | =emms-browser-expand-one-level= | n/a | =zo= |
+ | =emms-browse-by-artist= | =b 1= | =ga= |
+ | =emms-browse-by-album= | =b 2= | =gA= |
+ | =emms-browse-by-genre= | =b 3= | =gb= |
+ | =emms-browse-by-year= | =b 4= | =gy= |
+ | =emms-browse-by-composer= | =b 5= | =gc= |
+ | =emms-browse-by-performer= | =b 6= | =gp= |
+ | =emms-isearch-buffer= | =/= | =/= |
+ | =isearch-repeat-forward= | n/a | =n= |
+ | =isearch-repeat-backward= | n/a | =N= |
+ | =emms-browser-clear-playlist= | =C= | =C= |
+ | =emms-browser-delete-files= | =D= | (default) |
+ | =emms-browser-remove-tracks= | n/a | =D= |
+ | =emms-browser-view-in-dired= | =d= | =d=, =gd= |
+ | (parent =W= prefix) | =W= | =g= |
+ | (parent =s= prefix) | =s= | =s= |
+
+** emms-playlist-mode-map
+
+ Initial evil state is normal.
+
+ | Command | Original | Evil |
+ |-----------------------------------------------------------+------------+-------------|
+ | =emms-pause= | =P= | =x= |
+ | =emms-stop= | =s= | =X= |
+ | =emms-random= | =r= | =r= |
+ | =emms-seek-backward= | =<= | =<= |
+ | =emms-seek-forward= | =>= | =>= |
+ | =emms-next= | =n= | =C-j=, =gj= |
+ | =emms-previous= | =p= | =C-k=, =gk= |
+ | =emms-playlist-mode-play-smart= | =RET= | =RET= |
+ | =emms-volume-raise= | =+= | =+=, === |
+ | =emms-volume-lower= | =-= | =-= |
+ | =emms-playlist-mode-undo= | =C-/= | =u= |
+ | =emms-playlist-mode-first= | =M-<= | =gg= |
+ | =emms-playlist-mode-last= | =M->= | =G= |
+ | =emms-playlist-mode-next= | =M-n= | =]]= |
+ | =emms-playlist-mode-previous= | =M-p= | =[[= |
+ | =emms-playlist-mode-kill-track= | =C-k=, =D= | =D= |
+ | =emms-playlist-clear= | =C= | =C= |
+ | =evil-collection-emms-playlist-mode-insert-newline-above= | n/a | =O= |
+ | =evil-collection-emms-playlist-mode-insert-newline-below= | n/a | =o= |
+ | =evil-collection-emms-playlist-mode-paste-before= | n/a | =P= |
+ | =evil-collection-emms-playlist-mode-paste-after= | n/a | =p= |
+ | =emms-tag-editor-edit= | n/a | =ze= |
+ | =emms-tag-editor-rename= | n/a | =R= |
+ | =emms-playlist-mode-center-current= | =c= | =.= |
+ | =emms-playlist-mode-goto-dired-at-point= | =d= | =d=, =gd= |
+ | =emms-show= | =f= | =zs= |
+ | =emms-playlist-mode-add-contents= | =a= | =a= |
+ | =emms-playlist-set-playlist-buffer= | =b= | =zp= |
+ | (parent =S= sort prefix) | =S= | =S= |
+ | (parent =/= filter prefix) | =/= | =s= |
+ | =emms-playlist-mode-yank-pop= | =M-y= | =M-y= |
+ | =emms-playlist-mode-kill= (visual) | =C-w= | =D= |
+
+** emms-browser-search-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------+----------+------|
+ | =emms-browser-kill-search= | n/a | =q= |
+
+** emms-metaplaylist-mode-map
+
+ Initial evil state is normal.
+
+ | Command | Original | Evil |
+ |-----------------------------------------+----------+-------|
+ | =emms-metaplaylist-mode-goto-current= | =RET= | =RET= |
+ | =emms-metaplaylist-mode-set-active= | =SPC= | =SPC= |
+ | =emms-metaplaylist-mode-update= | =g= | =gr= |
+ | =emms-metaplaylist-mode-new-buffer= | =C= | =C= |
+ | =emms-metaplaylist-mode-center-current= | =c= | =.= |
+ | =emms-metaplaylist-mode-kill-buffer= | =C-k= | =D= |
+ | =kill-current-buffer= | =q= | =q= |
+
+** emms-stream-mode-map
+
+ Initial evil state is normal.
+
+ | Command | Original | Evil |
+ |-------------------------------------+----------+----------|
+ | =emms-stream-play= | =RET= | =RET= |
+ | =emms-stream-next-line= | =n= | =j= |
+ | =emms-stream-previous-line= | =p= | =k= |
+ | =emms-stream-yank-bookmark= | =y= | =y= |
+ | =emms-stream-kill-bookmark= | =k= | =d= |
+ | =emms-stream-edit-bookmark= | =e= | =c=, =r= |
+ | =emms-stream-info-bookmark= | =i= | =i= |
+ | =emms-stream-save-bookmarks-file= | =s= | =s= |
+ | =emms-stream-toggle-default-action= | =t= | =x= |
+ | =emms-stream-quit= | =q= | =q= |
+
+** New commands
+
+ | Command | Purpose |
+ |-----------------------------------------------------------+---------------------------------------------------------------|
+ | =evil-collection-emms-playlist-mode-insert-newline-above= | =O= equivalent that respects =emms-with-inhibit-read-only-t=. |
+ | =evil-collection-emms-playlist-mode-insert-newline-below= | =o= variant. |
+ | =evil-collection-emms-playlist-mode-paste-before= | =P= -- yank playlist items before point. |
+ | =evil-collection-emms-playlist-mode-paste-after= | =p= -- yank playlist items after point. |
diff --git a/.config/emacs/lisp/evil-collection/modes/emms/evil-collection-emms.el b/.config/emacs/lisp/evil-collection/modes/emms/evil-collection-emms.el
new file mode 100644
index 0000000..47b4e8d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/emms/evil-collection-emms.el
@@ -0,0 +1,266 @@
+;;; evil-collection-emms.el --- Evil bindings for EMMS -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2024 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emms, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for EMMS.
+
+;;; Code:
+(require 'emms nil t)
+(require 'evil-collection)
+
+(declare-function emms-with-inhibit-read-only-t "emms")
+(declare-function emms-playlist-mode-correct-previous-yank "emms-playlist-mode")
+(declare-function emms-playlist-mode-yank "emms-playlist-mode")
+
+(defvar emms-browser-mode-map)
+(defvar emms-playlist-mode-map)
+
+(defconst evil-collection-emms-maps '(emms-browser-mode-map
+ emms-playlist-mode-map
+ emms-browser-search-mode-map
+ emms-metaplaylist-mode-map
+ emms-stream-mode-map))
+
+(defun evil-collection-emms-playlist-mode-insert-newline-above ()
+ "Insert a newline above point."
+ (interactive)
+ (emms-with-inhibit-read-only-t
+ (evil-insert-newline-above)))
+
+(defun evil-collection-emms-playlist-mode-insert-newline-below ()
+ "Insert a newline below point."
+ (interactive)
+ (emms-with-inhibit-read-only-t
+ (evil-insert-newline-below)))
+
+(defun evil-collection-emms-playlist-mode-paste-before ()
+ "Pastes the latest yanked playlist items before the cursor position.
+The return value is the yanked text."
+ (interactive)
+ (emms-with-inhibit-read-only-t
+ (goto-char (line-beginning-position))
+ (emms-playlist-mode-yank)
+ (emms-playlist-mode-correct-previous-yank)
+ (evil-previous-line)
+ (evil-beginning-of-line)))
+
+(defun evil-collection-emms-playlist-mode-paste-after ()
+ "Pastes the latest yanked playlist items behind point.
+The return value is the yanked text."
+ (interactive)
+ (unless (eobp) (evil-next-line))
+ (evil-collection-emms-playlist-mode-paste-before))
+
+;;;###autoload
+(defun evil-collection-emms-browser-setup ()
+ "Set up `evil' bindings for `emms-browser'."
+ ;; TODO: Why doesn't evil-set-initial-state work with emms-browser-mode?
+
+ (evil-collection-inhibit-insert-state 'emms-browser-mode-map)
+ (add-hook 'emms-browser-mode-hook 'evil-normal-state)
+ (evil-collection-define-key 'normal 'emms-browser-mode-map
+ ;; The following overrides other "g-" and "s-" prefixed keys so we set it first.
+ "g" nil
+ "g" (lookup-key emms-browser-mode-map (kbd "W"))
+ "s" nil
+ "s" (lookup-key emms-browser-mode-map (kbd "s"))
+
+ ;; playback controls
+ "x" 'emms-pause
+ "X" 'emms-stop
+ "r" 'emms-random
+ "<" 'emms-seek-backward
+ ">" 'emms-seek-forward
+ (kbd "RET") 'emms-browser-add-tracks
+ (kbd "C-<return>") 'emms-browser-add-tracks-and-play
+
+ ;; volume controls
+ "+" 'emms-volume-raise
+ "=" 'emms-volume-raise
+ "-" 'emms-volume-lower
+
+ "u" 'emms-playlist-mode-undo
+
+ ;; motion
+ "[[" 'emms-browser-prev-non-track
+ "]]" 'emms-browser-next-non-track
+ (kbd "C-k") 'emms-browser-prev-non-track
+ (kbd "C-j") 'emms-browser-next-non-track
+ "gk" 'emms-browser-prev-non-track
+ "gj" 'emms-browser-next-non-track
+
+ (kbd "<tab>") 'emms-browser-toggle-subitems-recursively
+ (kbd "<backtab>") 'emms-browser-toggle-subitems-recursively
+ "^" 'emms-browser-move-up-level
+ (kbd "SPC") 'emms-browser-toggle-subitems
+ "g1" 'emms-browser-collapse-all
+ "g2" 'emms-browser-expand-to-level-2
+ "g3" 'emms-browser-expand-to-level-3
+ "g4" 'emms-browser-expand-to-level-4
+ "g0" 'emms-browser-expand-all
+ "ga" 'emms-browse-by-artist
+ "gA" 'emms-browse-by-album
+ "gb" 'emms-browse-by-genre
+ "gy" 'emms-browse-by-year
+ "gc" 'emms-browse-by-composer
+ "gp" 'emms-browse-by-performer
+ "zm" 'emms-browser-collapse-all
+ "zr" 'emms-browser-expand-all
+ "zo" 'emms-browser-expand-one-level
+ ;; TODO find a real replacement for zc
+ "zc" 'emms-browser-collapse-all
+
+ ;; TODO find a way to integrate this with evil-collection-evil-search
+ "/" 'emms-isearch-buffer ; This shows hidden items during search.
+ "n" 'isearch-repeat-forward
+ "N" 'isearch-repeat-backward
+
+ ;; filter
+ ;; "" 'emms-browser-previous-filter ; TODO: What does this do?
+ ;; "" 'emms-browser-next-filter
+
+
+ "C" 'emms-browser-clear-playlist
+ "D" 'emms-browser-remove-tracks
+ "d" 'emms-browser-view-in-dired
+ ;; "d" does the same, keep "gd" for consistency.
+ "gd" 'emms-browser-view-in-dired)
+
+ (unless evil-collection-always-run-setup-hook-after-load
+ (run-hook-with-args 'evil-collection-setup-hook
+ 'emms '(emms-browser-mode-map))))
+
+;;;###autoload
+(defun evil-collection-emms-playlist-setup ()
+ "Set up `evil' bindings for `emms-playlist'."
+ (evil-set-initial-state 'emms-playlist-mode 'normal)
+ (evil-collection-define-key 'normal 'emms-playlist-mode-map
+ ;; playback controls
+ "x" 'emms-pause
+ "X" 'emms-stop
+ "r" 'emms-random
+ "<" 'emms-seek-backward
+ ">" 'emms-seek-forward
+ (kbd "C-j") 'emms-next
+ (kbd "C-k") 'emms-previous
+ "gj" 'emms-next
+ "gk" 'emms-previous
+ (kbd "RET") 'emms-playlist-mode-play-smart
+
+ ;; volume controls
+ "+" 'emms-volume-raise
+ "=" 'emms-volume-raise
+ "-" 'emms-volume-lower
+
+ "u" 'emms-playlist-mode-undo
+
+ ;; motion
+ "gg" 'emms-playlist-mode-first
+ "G" 'emms-playlist-mode-last
+ "]]" 'emms-playlist-mode-next
+ "[[" 'emms-playlist-mode-previous
+
+ "D" 'emms-playlist-mode-kill-track ; emms-browser uses "D"
+ "C" 'emms-playlist-clear
+ "O" 'evil-collection-emms-playlist-mode-insert-newline-above
+ "o" 'evil-collection-emms-playlist-mode-insert-newline-below
+ "P" 'evil-collection-emms-playlist-mode-paste-before
+ "p" 'evil-collection-emms-playlist-mode-paste-after
+
+ "u" 'emms-playlist-mode-undo
+
+ "ze" 'emms-tag-editor-edit
+ "R" 'emms-tag-editor-rename
+
+ "." 'emms-playlist-mode-center-current
+ "d" 'emms-playlist-mode-goto-dired-at-point
+ "gd" 'emms-playlist-mode-goto-dired-at-point ; "d" does the same, keep "gd" for consistency.
+
+ "zs" 'emms-show
+ "a" 'emms-playlist-mode-add-contents
+ "zp" 'emms-playlist-set-playlist-buffer
+
+ ;; filter
+ "S" (lookup-key emms-playlist-mode-map (kbd "S"))
+ "s" (lookup-key emms-playlist-mode-map (kbd "/"))
+ ;; "" 'emms-playlist-limit-to-all ; TODO: Test.
+
+ (kbd "M-y") 'emms-playlist-mode-yank-pop)
+
+ (evil-collection-define-key 'visual 'emms-playlist-mode-map
+ ;; "d" 'emms-playlist-mode-kill
+ "D" 'emms-playlist-mode-kill)
+
+ (unless evil-collection-always-run-setup-hook-after-load
+ (run-hook-with-args 'evil-collection-setup-hook
+ 'emms '(emms-playlist-mode-map))))
+
+;;;###autoload
+(defun evil-collection-emms-setup ()
+ "Set up `evil' bindings for `emms'."
+ ;; emms-browser and emms-playlist-mode must be set up after they are loaded
+ ;; because we need the mode map to be defined when we `(lookup-key
+ ;; ...-mode-map ...)'.
+ (with-eval-after-load 'emms-browser
+ (evil-collection-emms-browser-setup))
+ (with-eval-after-load 'emms-playlist-mode
+ (evil-collection-emms-playlist-setup))
+
+ (evil-collection-define-key 'normal 'emms-browser-search-mode-map
+ "q" 'emms-browser-kill-search)
+
+ (evil-set-initial-state 'emms-metaplaylist-mode 'normal)
+ (evil-collection-define-key 'normal 'emms-metaplaylist-mode-map
+ (kbd "RET") 'emms-metaplaylist-mode-goto-current
+ (kbd "<space>") 'emms-metaplaylist-mode-set-active
+ "gr" 'emms-metaplaylist-mode-update
+ "C" 'emms-metaplaylist-mode-new-buffer
+ "." 'emms-metaplaylist-mode-center-current
+ "D" 'emms-metaplaylist-mode-kill-buffer
+ "q" 'kill-current-buffer)
+
+ (evil-set-initial-state 'emms-stream-mode 'normal)
+ (evil-collection-define-key 'normal 'emms-stream-mode-map
+ (kbd "RET") 'emms-stream-play
+ "j" 'emms-stream-next-line
+ "k" 'emms-stream-previous-line
+ "y" 'emms-stream-yank-bookmark
+ "d" 'emms-stream-kill-bookmark
+ "c" 'emms-stream-edit-bookmark
+ "r" 'emms-stream-edit-bookmark
+ "i" 'emms-stream-info-bookmark
+ "s" 'emms-stream-save-bookmarks-file
+ "x" 'emms-stream-toggle-default-action
+ "q" 'emms-stream-quit)
+
+ (unless evil-collection-always-run-setup-hook-after-load
+ (run-hook-with-args
+ 'evil-collection-setup-hook 'emms
+ '(emms-browser-search-mode-map
+ emms-metaplaylist-mode-map
+ emms-stream-mode-map))))
+
+(provide 'evil-collection-emms)
+;;; evil-collection-emms.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/emoji/README.org b/.config/emacs/lisp/evil-collection/modes/emoji/README.org
new file mode 100644
index 0000000..5a3c09b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/emoji/README.org
@@ -0,0 +1,13 @@
+* emoji
+
+ Evil bindings for =emoji-list-mode= (the buffer produced by =M-x emoji-list=).
+
+** Key bindings
+
+ Read-only motion/quit bindings come from =evil-collection-set-readonly-bindings=
+ and are not repeated below.
+
+ | Command | Original | Evil |
+ |---------------------+----------+-------|
+ | =emoji-list-select= | =RET= | =RET= |
+ | =emoji-list-help= | =h= | =gh= |
diff --git a/.config/emacs/lisp/evil-collection/modes/emoji/evil-collection-emoji.el b/.config/emacs/lisp/evil-collection/modes/emoji/evil-collection-emoji.el
new file mode 100644
index 0000000..0cb0972
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/emoji/evil-collection-emoji.el
@@ -0,0 +1,44 @@
+;;; evil-collection-emoji.el --- Evil bindings for emoji -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for emoji.
+
+;;; Code:
+(require 'evil-collection)
+(require 'emoji nil t)
+
+(defconst evil-collection-emoji-maps '(emoji-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-emoji-setup ()
+ "Set up `evil' bindings for `emoji'."
+ (evil-collection-set-readonly-bindings 'emoji-list-mode-map)
+ (evil-collection-define-key 'normal 'emoji-list-mode-map
+ (kbd "RET") 'emoji-list-select
+ "gh" 'emoji-list-help))
+
+(provide 'evil-collection-emoji)
+;;; evil-collection-emoji.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/epa/README.org b/.config/emacs/lisp/evil-collection/modes/epa/README.org
new file mode 100644
index 0000000..52f4696
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/epa/README.org
@@ -0,0 +1,34 @@
+* epa
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/epa/index.html][EasyPG Assistant]] (=epa-key-list-mode=, =epa-key-mode=,
+ =epa-info-mode=).
+
+** Key bindings
+
+*** epa-key-list-mode-map
+
+ | Command | Original | Evil |
+ |--------------------+----------+-------|
+ | =widget-forward= | =TAB= | =TAB= |
+ | =revert-buffer= | =g= | =gr= |
+ | =epa-exit-buffer= | =q= | =q= |
+ | =quit-window= | n/a | =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+ | =epa-decrypt-file= | =d= | =E= |
+ | =epa-delete-keys= | =r= | =d= |
+ | =epa-verify-file= | =v= | =V= |
+ | =epa-mark-key= | =m= | =m= |
+ | =epa-unmark-key= | =u= | =u= |
+ | =epa-sign-file= | =s= | =s= |
+ | =epa-encrypt-file= | =e= | =e= |
+ | =epa-import-keys= | =i= | =i= |
+ | =epa-export-keys= | =o= | =o= |
+
+*** epa-key-mode-map / epa-info-mode-map
+
+ | Command | Original | Evil |
+ |-------------------+----------+------------|
+ | =epa-exit-buffer= | =q= | =q= |
+ | =delete-window= | n/a | =q= (info) |
+ | =quit-window= | n/a | =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/epa/evil-collection-epa.el b/.config/emacs/lisp/evil-collection/modes/epa/evil-collection-epa.el
new file mode 100644
index 0000000..04d818e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/epa/evil-collection-epa.el
@@ -0,0 +1,71 @@
+;;; evil-collection-epa.el --- Evil bindings for epa-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: Maximiliano Sandoval <msandova@protonmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, epa, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `epa-mode'.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'epa nil t)
+
+(defconst evil-collection-epa-maps '(epa-key-list-mode-map
+ epa-key-mode-map
+ epa-info-mode-map))
+
+;;;###autoload
+(defun evil-collection-epa-setup ()
+ (evil-collection-define-key 'normal 'epa-key-list-mode-map
+ (kbd "<tab>") 'widget-forward
+ "gr" 'revert-buffer
+ "q" 'epa-exit-buffer
+ "E" 'epa-decrypt-file
+ "d" 'epa-delete-keys
+ "ZZ" 'quit-window
+ "ZQ" 'evil-quit
+ "V" 'epa-verify-file
+
+ ;; mark
+ "m" 'epa-mark-key
+ "u" 'epa-unmark-key
+
+ ;; Unchanged keybindings.
+ "s" 'epa-sign-file
+ "e" 'epa-encrypt-file
+ "i" 'epa-import-keys
+ "o" 'epa-export-keys)
+
+ (evil-collection-define-key 'normal 'epa-key-mode-map
+ "q" 'epa-exit-buffer
+ "ZZ" 'quit-window
+ "ZQ" 'evil-quit)
+
+ (evil-collection-define-key 'normal 'epa-info-mode-map
+ "q" 'delete-window
+ "ZZ" 'quit-window
+ "ZQ" 'evil-quit))
+
+(provide 'evil-collection-epa)
+;;; evil-collection-epa.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ert/README.org b/.config/emacs/lisp/evil-collection/modes/ert/README.org
new file mode 100644
index 0000000..c1f8a94
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ert/README.org
@@ -0,0 +1,24 @@
+* ert
+
+ Evil bindings for =ert-results-mode=.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------------------------------------+----------+-------------------|
+ | =ert-results-next-test= | =n= | =gj=, =]]=, =C-j= |
+ | =ert-results-previous-test= | =p= | =gk=, =[[=, =C-k= |
+ | =ert-results-jump-between-summary-and-result= | =j= | =J= |
+ | =ert-results-toggle-printer-limits-for-test-at-point= | =L= | =L= |
+ | =ert-results-rerun-all-tests= | =R= | =gr=, =R= |
+ | =ert-results-rerun-test-at-point= | =r= | =r= |
+ | =ert-results-rerun-test-at-point-debugging-errors= | =d= | =d= |
+ | =ert-results-find-test-at-point-other-window= | =.= | =.=, =gd= |
+ | =ert-results-pop-to-backtrace-for-test-at-point= | =b= | =B= |
+ | =ert-results-pop-to-messages-for-test-at-point= | =m= | =M= |
+ | =ert-results-pop-to-should-forms-for-test-at-point= | =l= | =s= |
+ | =ert-results-describe-test-at-point= | =h= | =K=, =g?= |
+ | =ert-results-pop-to-timings= | =T= | =T= |
+ | =ert-delete-test= | =D= | =x= |
+ | =evil-next-line= / =evil-previous-line= | n/a | =j= / =k= |
+ | =evil-backward-char= / =evil-forward-char= | n/a | =h= / =l= |
diff --git a/.config/emacs/lisp/evil-collection/modes/ert/evil-collection-ert.el b/.config/emacs/lisp/evil-collection/modes/ert/evil-collection-ert.el
new file mode 100644
index 0000000..0e97f66
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ert/evil-collection-ert.el
@@ -0,0 +1,71 @@
+;;; evil-collection-ert.el --- Bindings for `ert' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `ert'.
+
+;;; Code:
+(require 'ert)
+(require 'evil-collection)
+
+(defconst evil-collection-ert-maps '(ert-results-mode-map))
+
+;;;###autoload
+(defun evil-collection-ert-setup ()
+ "Set up `evil' bindings for `ert'."
+ (evil-collection-inhibit-insert-state 'ert-results-mode-map)
+ (evil-set-initial-state 'ert-results-mode 'normal)
+
+ (evil-collection-define-key 'normal 'ert-results-mode-map
+ "j" 'evil-next-line
+ "k" 'evil-previous-line
+ "h" 'evil-backward-char
+ "l" 'evil-forward-char
+ ;; Stuff that's not in the menu.
+ "J" 'ert-results-jump-between-summary-and-result
+ "L" 'ert-results-toggle-printer-limits-for-test-at-point
+ "gj" 'ert-results-next-test
+ "gk" 'ert-results-previous-test
+ "]]" 'ert-results-next-test
+ "[[" 'ert-results-previous-test
+ (kbd "C-j") 'ert-results-next-test
+ (kbd "C-k") 'ert-results-previous-test
+ ;; Stuff that is in the menu.
+ "gr" 'ert-results-rerun-all-tests
+ "R" 'ert-results-rerun-all-tests
+ "r" 'ert-results-rerun-test-at-point
+ "d" 'ert-results-rerun-test-at-point-debugging-errors
+ "." 'ert-results-find-test-at-point-other-window
+ "gd" 'ert-results-find-test-at-point-other-window
+ "B" 'ert-results-pop-to-backtrace-for-test-at-point
+ "M" 'ert-results-pop-to-messages-for-test-at-point
+ "s" 'ert-results-pop-to-should-forms-for-test-at-point
+ "K" 'ert-results-describe-test-at-point
+ "g?" 'ert-results-describe-test-at-point
+ "x" 'ert-delete-test
+ "T" 'ert-results-pop-to-timings))
+
+(provide 'evil-collection-ert)
+;;; evil-collection-ert.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eshell/README.org b/.config/emacs/lisp/evil-collection/modes/eshell/README.org
new file mode 100644
index 0000000..0d4ab5f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eshell/README.org
@@ -0,0 +1,36 @@
+* eshell
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/eshell/index.html][Eshell]].
+
+** Key bindings
+
+ Normal-state bindings added to =eshell-mode-map=.
+
+ | Command | Original | Evil |
+ |---------------------------------------------------+-----------+-------------------|
+ | =eshell-previous-prompt= | =C-c C-p= | =[[=, =gk=, =C-k= |
+ | =eshell-next-prompt= | =C-c C-n= | =]]=, =gj=, =C-j= |
+ | =eshell-backward-argument= | =C-c C-b= | =M-h= |
+ | =eshell-forward-argument= | =C-c C-f= | =M-l= |
+ | =eshell-previous-matching-input-from-input= | =C-c M-p= | =C-p= |
+ | =eshell-next-matching-input-from-input= | =C-c M-n= | =C-n= |
+ | =eshell-bol= (Emacs < 30) | =C-a= | =0=, =^= |
+ | =eshell-kill-input= (when =evil-want-C-u-delete=) | =C-c C-u= | =C-u= (insert) |
+
+ =RET= sends input in the state named by =evil-collection-repl-submit-state=,
+ and inserts a newline in the complementary state.
+
+** New commands
+
+ | Command | Key | |
+ |--------------------------------------------+-----------+-----------------------------------------|
+ | =evil-collection-eshell-interrupt-process= | =C-c C-c= | interrupt process, then enter insert |
+ | =evil-collection-eshell-evil-change= | =c= | change, never touches prompt or history |
+ | =evil-collection-eshell-evil-change-line= | =C= | change to end-of-line |
+ | =evil-collection-eshell-evil-delete= | =d= | delete, never touches prompt or history |
+ | =evil-collection-eshell-evil-delete-line= | =D= | delete to end-of-line |
+
+** Notes
+
+ - On entering insert/replace state, point jumps to the next prompt.
+ - On entering normal state, point stays put (no Vim-style backward step).
diff --git a/.config/emacs/lisp/evil-collection/modes/eshell/evil-collection-eshell.el b/.config/emacs/lisp/evil-collection/modes/eshell/evil-collection-eshell.el
new file mode 100644
index 0000000..30580d2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eshell/evil-collection-eshell.el
@@ -0,0 +1,168 @@
+;;; evil-collection-eshell.el --- Evil bindings for Eshell -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2021 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, eshell, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Eshell.
+
+;;; Code:
+(require 'em-prompt)
+(require 'eshell)
+(require 'evil-collection)
+
+(defconst evil-collection-eshell-maps '(eshell-mode-map))
+
+(defun evil-collection-eshell-next-prompt ()
+ "`evil' wrapper around `eshell-next-prompt'."
+ (when (get-text-property (point) 'read-only)
+ ;; If at end of prompt, `eshell-next-prompt' will not move, so go backward.
+ (beginning-of-line)
+ (eshell-next-prompt 1)))
+
+(defun evil-collection-eshell-next-prompt-on-insert ()
+ "Go to next prompt on `evil' replace/insert enter."
+ (dolist (hook '(evil-replace-state-entry-hook evil-insert-state-entry-hook))
+ (add-hook hook 'evil-collection-eshell-next-prompt nil t)))
+
+(defun evil-collection-eshell-interrupt-process ()
+ "Interupt `eshell' process and enter insert state."
+ (interactive)
+ (eshell-interrupt-process)
+ (evil-insert 1))
+
+(defun evil-collection-eshell-escape-stay ()
+ "Go back to normal state but don't move cursor backwards.
+Moving cursor backwards is the default Vim behavior but it is not
+appropriate in some cases like terminals."
+ (setq-local evil-move-cursor-back nil))
+
+;; Taken from Doom Emacs
+(evil-define-operator evil-collection-eshell-evil-change (beg end type register yank-handler delete-func)
+ "Like `evil-change' but will not delete/copy the prompt."
+ (interactive "<R><x><y>")
+ (save-restriction
+ (narrow-to-region eshell-last-output-end (point-max))
+ (evil-change (max beg (point-min))
+ (if (eq type 'line) (point-max) (min (or end (point-max)) (point-max)))
+ type register yank-handler delete-func)))
+
+;; Taken from Doom Emacs
+(evil-define-operator evil-collection-eshell-evil-change-line (beg end type register yank-handler)
+ "Change to end of line."
+ :motion evil-end-of-line
+ (interactive "<R><x><y>")
+ (evil-collection-eshell-evil-change beg end type register yank-handler #'evil-delete-line))
+
+;; Taken from Doom Emacs
+(evil-define-operator evil-collection-eshell-evil-delete (beg end type register yank-handler)
+ "Like `evil-delete' but will not delete/copy the prompt."
+ (interactive "<R><x><y>")
+ (save-restriction
+ (narrow-to-region eshell-last-output-end (point-max))
+ (evil-delete (if beg (max beg (point-min)) (point-min))
+ (if (eq type 'line) (point-max) (min (or end (point-max)) (point-max)))
+ type register yank-handler)))
+
+;; Taken from Doom Emacs
+;;
+;; Although the BEG argument doesn't get used in any meaningful way,
+;; `evil-define-operator' must access it nonetheless, so putting an underscore
+;; in front will make the CI fail.
+(evil-define-operator evil-collection-eshell-evil-delete-line (beg end type register yank-handler)
+ "Change to end of line."
+ :motion nil
+ :keep-visual t
+ (interactive "<R><x>")
+ (evil-collection-eshell-evil-delete (point) end type register yank-handler))
+
+;; `eshell-mode-map' is reset when Eshell is initialized in `eshell-mode'. We
+;; need to add bindings to `eshell-first-time-mode-hook'.
+(defun evil-collection-eshell-setup-keys ()
+ "Set up `evil' bindings for `eshell'."
+ (evil-collection-define-key 'normal 'eshell-mode-map
+ ;; motion
+ "[[" 'eshell-previous-prompt
+ "]]" 'eshell-next-prompt
+ (kbd "C-k") 'eshell-previous-prompt
+ (kbd "C-j") 'eshell-next-prompt
+ "gk" 'eshell-previous-prompt
+ "gj" 'eshell-next-prompt
+ (kbd "M-h") 'eshell-backward-argument
+ (kbd "M-l") 'eshell-forward-argument
+
+ (kbd "C-n") 'eshell-next-matching-input-from-input
+ (kbd "C-p") 'eshell-previous-matching-input-from-input
+
+ (kbd "C-c C-c") 'evil-collection-eshell-interrupt-process
+ "c" 'evil-collection-eshell-evil-change
+ "C" 'evil-collection-eshell-evil-change-line
+ "d" 'evil-collection-eshell-evil-delete
+ "D" 'evil-collection-eshell-evil-delete-line)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'eshell-mode-map
+ (kbd "RET") 'eshell-send-input)
+ (evil-collection-define-key newline-state 'eshell-mode-map
+ (kbd "RET") 'newline))
+
+ (when (< emacs-major-version 30)
+ (evil-collection-define-key 'normal 'eshell-mode-map
+ "0" 'eshell-bol
+ "^" 'eshell-bol))
+
+ (when evil-want-C-u-delete
+ (evil-collection-define-key 'insert 'eshell-mode-map
+ (kbd "C-u") 'eshell-kill-input))
+
+ (evil-collection-define-key 'visual 'eshell-mode-map
+ ;; motion
+ ;; TODO: This does not work with `evil-visual-line'.
+ "[[" 'eshell-previous-prompt
+ "]]" 'eshell-next-prompt
+ (kbd "C-k") 'eshell-previous-prompt
+ (kbd "C-j") 'eshell-next-prompt
+ "gk" 'eshell-previous-prompt
+ "gj" 'eshell-next-prompt)
+
+ (when (< emacs-major-version 30)
+ (evil-collection-define-key 'visual 'eshell-mode-map
+ "0" 'eshell-bol
+ "^" 'eshell-bol))
+
+ (evil-normalize-keymaps)
+ (unless evil-collection-always-run-setup-hook-after-load
+ (run-hook-with-args
+ 'evil-collection-setup-hook 'eshell evil-collection-eshell-maps)))
+
+;; TODO: Compare this setup procedure with evil-ediff.
+;;;###autoload
+(defun evil-collection-eshell-setup ()
+ "Set up `evil' bindings for `eshell'."
+ (add-hook 'eshell-mode-hook 'evil-collection-eshell-escape-stay)
+ (add-hook 'eshell-mode-hook 'evil-collection-eshell-next-prompt-on-insert)
+ (add-hook 'eshell-first-time-mode-hook 'evil-collection-eshell-setup-keys))
+
+(provide 'evil-collection-eshell)
+;;; evil-collection-eshell.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/README.org b/.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/README.org
new file mode 100644
index 0000000..6563ec9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/README.org
@@ -0,0 +1,16 @@
+* eval-sexp-fu
+
+ Evil compatibility for [[https://github.com/hchbaw/eval-sexp-fu.el][eval-sexp-fu]]. No key bindings.
+
+ When =evil-move-beyond-eol= is nil, the setup advises
+ =ad-Advice-eval-last-sexp= so that =eval-last-sexp= treats the sexp under
+ point as ending at point (rather than one character earlier as evil's
+ normal-state cursor positioning would imply). This makes =C-x C-e= and
+ related commands work the way they do in evil's insert/emacs states.
+
+** New commands
+
+ - =evil-collection-eval-sexp-fu-bounds-of-thing-at-point-sexp= - Advice
+ wrapper that fixes the sexp bounds in evil normal/motion state.
+ - =evil-collection-eval-sexp-fu-advise-bounds-of-thing-at-point= - Wraps
+ the advice around a single call to =eval-last-sexp=.
diff --git a/.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/evil-collection-eval-sexp-fu.el b/.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/evil-collection-eval-sexp-fu.el
new file mode 100644
index 0000000..b6743cb
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eval-sexp-fu/evil-collection-eval-sexp-fu.el
@@ -0,0 +1,61 @@
+;;; evil-collection-eval-sexp-fu.el --- Bindings for `eval-sexp-fu' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, eval-sexp-fu, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `eval-sexp-fu'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'eval-sexp-fu nil t)
+
+(defconst evil-collection-eval-sexp-fu-maps nil)
+
+(defun evil-collection-eval-sexp-fu-bounds-of-thing-at-point-sexp (command &rest args)
+ "In normal-state or motion-state, last sexp ends at point."
+ (if (and (eq (nth 0 args) 'sexp)
+ (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p))))
+ (save-excursion
+ (unless (or (eobp) (eolp)) (forward-char))
+ (apply command args))
+ (apply command args)))
+
+(defun evil-collection-eval-sexp-fu-advise-bounds-of-thing-at-point (command &rest args)
+ "Advise `bounds-of-thing-at-point' to handle `evil's `evil-move-beyond-eol'."
+ (advice-add 'bounds-of-thing-at-point
+ :around 'evil-collection-eval-sexp-fu-bounds-of-thing-at-point-sexp)
+ (apply command args)
+ (advice-remove 'bounds-of-thing-at-point
+ 'evil-collection-eval-sexp-fu-bounds-of-thing-at-point-sexp))
+
+;;;###autoload
+(defun evil-collection-eval-sexp-fu-setup ()
+ "Set up `evil' with `eval-sexp-fu'."
+ (unless evil-move-beyond-eol
+ (advice-add 'ad-Advice-eval-last-sexp
+ :around 'evil-collection-eval-sexp-fu-advise-bounds-of-thing-at-point)))
+
+(provide 'evil-collection-eval-sexp-fu)
+;;; evil-collection-eval-sexp-fu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/evil-mc/README.org b/.config/emacs/lisp/evil-collection/modes/evil-mc/README.org
new file mode 100644
index 0000000..c23adfd
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/evil-mc/README.org
@@ -0,0 +1,49 @@
+* evil-mc
+
+ Evil bindings for [[https://github.com/gabesoft/evil-mc][evil-mc]], multiple cursors for evil.
+
+ Upstream installs its cursors map under =gr= on top of the normal/visual
+ state. evil-collection clears both =evil-mc-key-map= and
+ =evil-mc-cursors-map= and re-installs the cursors map under =g.= so =gr=
+ stays free for =xref-find-references=.
+
+** Key bindings
+
+*** evil-mc-key-map
+
+ | Command | Original | Evil |
+ |-----------------------+----------+------|
+ | =evil-mc-cursors-map= | =gr= | =g.= |
+
+*** evil-mc-cursors-map
+
+ Prefix is =g.= in normal/visual state.
+
+ | Command | Original | Evil |
+ |-----------------------------------------------+----------+---------|
+ | =evil-mc-make-all-cursors= | =m= | =a= |
+ | =evil-mc-undo-all-cursors= | =q= | =q= |
+ | =evil-mc-undo-last-added-cursor= | =u= | =u= |
+ | =evil-mc-pause-cursors= | =s= | =C-p= |
+ | =evil-mc-resume-cursors= | =r= | =C-r= |
+ | =evil-mc-make-cursor-here= | =h= | =C-m= |
+ | =evil-mc-make-and-goto-first-cursor= | =f= | =0= |
+ | =evil-mc-make-and-goto-last-cursor= | =l= | =$= |
+ | =evil-mc-make-cursor-in-visual-selection-beg= | =I= | =I= |
+ | =evil-mc-make-cursor-in-visual-selection-end= | =A= | =A= |
+ | =evil-mc-make-cursor-move-next-line= | =j= | =o= |
+ | =evil-mc-make-cursor-move-prev-line= | =k= | =O= |
+ | =evil-mc-make-and-goto-next-match= | =n= | =n= |
+ | =evil-mc-make-and-goto-prev-match= | =N= | =N= |
+ | =evil-mc-skip-and-goto-next-match= | =n= | =C-n= |
+ | =evil-mc-skip-and-goto-prev-match= | =p= | =C-S-n= |
+ | =evil-mc-make-and-goto-next-cursor= | =M-n= | =M-n= |
+ | =evil-mc-make-and-goto-prev-cursor= | =M-p= | =M-N= |
+ | =evil-mc-skip-and-goto-next-cursor= | =N= | =C-u= |
+ | =evil-mc-skip-and-goto-prev-cursor= | =P= | =C-S-u= |
+
+** Notes
+
+ A hook on =evil-mc-after-cursors-deleted= sets
+ =evil-was-yanked-without-register= so paste after cursor deletion does
+ not clobber the unnamed register (see upstream issue #70).
diff --git a/.config/emacs/lisp/evil-collection/modes/evil-mc/evil-collection-evil-mc.el b/.config/emacs/lisp/evil-collection/modes/evil-mc/evil-collection-evil-mc.el
new file mode 100644
index 0000000..7de6405
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/evil-mc/evil-collection-evil-mc.el
@@ -0,0 +1,79 @@
+;;; evil-collection-evil-mc.el --- Bindings for evil-mc -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for evil-mc.
+
+;;; Code:
+(require 'evil-collection)
+(require 'evil-mc nil t)
+(eval-when-compile (require 'subr-x)) ; `if-let*' and `when-let*'
+
+(defvar evil-mc-key-map)
+(defvar evil-mc-cursors-map)
+(defconst evil-collection-evil-mc-maps '(evil-mc-key-map evil-mc-cursors-map))
+
+;;;###autoload
+(defun evil-collection-evil-mc-setup ()
+ "Set up `evil' bindings for evil-mc."
+
+ (setcdr evil-mc-cursors-map nil)
+
+ (define-key evil-mc-cursors-map (kbd "a") 'evil-mc-make-all-cursors)
+ (define-key evil-mc-cursors-map (kbd "q") 'evil-mc-undo-all-cursors)
+ (define-key evil-mc-cursors-map (kbd "u") 'evil-mc-undo-last-added-cursor)
+
+ (define-key evil-mc-cursors-map (kbd "C-p") 'evil-mc-pause-cursors)
+ (define-key evil-mc-cursors-map (kbd "C-r") 'evil-mc-resume-cursors)
+ (define-key evil-mc-cursors-map (kbd "C-m") 'evil-mc-make-cursor-here)
+
+ (define-key evil-mc-cursors-map (kbd "0") 'evil-mc-make-and-goto-first-cursor)
+ (define-key evil-mc-cursors-map (kbd "$") 'evil-mc-make-and-goto-last-cursor)
+
+ (define-key evil-mc-cursors-map (kbd "I") 'evil-mc-make-cursor-in-visual-selection-beg)
+ (define-key evil-mc-cursors-map (kbd "A") 'evil-mc-make-cursor-in-visual-selection-end)
+
+ (define-key evil-mc-cursors-map (kbd "o") 'evil-mc-make-cursor-move-next-line)
+ (define-key evil-mc-cursors-map (kbd "O") 'evil-mc-make-cursor-move-prev-line)
+
+ (define-key evil-mc-cursors-map (kbd "n") 'evil-mc-make-and-goto-next-match)
+ (define-key evil-mc-cursors-map (kbd "N") 'evil-mc-make-and-goto-prev-match)
+ (define-key evil-mc-cursors-map (kbd "C-n") 'evil-mc-skip-and-goto-next-match)
+ (define-key evil-mc-cursors-map (kbd "C-S-n") 'evil-mc-skip-and-goto-prev-match)
+ (define-key evil-mc-cursors-map (kbd "M-n") 'evil-mc-make-and-goto-next-cursor)
+ (define-key evil-mc-cursors-map (kbd "M-N") 'evil-mc-make-and-goto-prev-cursor)
+ (define-key evil-mc-cursors-map (kbd "C-u") 'evil-mc-skip-and-goto-next-cursor)
+ (define-key evil-mc-cursors-map (kbd "C-S-u") 'evil-mc-skip-and-goto-prev-cursor)
+
+ (setcdr evil-mc-key-map nil)
+ (evil-collection-define-key '(normal visual) 'evil-mc-key-map (kbd "g.") evil-mc-cursors-map)
+
+ ;; https://github.com/gabesoft/evil-mc/issues/70
+ (add-hook 'evil-mc-after-cursors-deleted
+ (lambda ()
+ (setq evil-was-yanked-without-register t))))
+
+(provide 'evil-collection-evil-mc)
+;;; evil-collection-evil-mc.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/eww/README.org b/.config/emacs/lisp/evil-collection/modes/eww/README.org
new file mode 100644
index 0000000..2b0aaa4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eww/README.org
@@ -0,0 +1,61 @@
+* eww
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/eww/index.html][EWW]] (Emacs Web Wowser).
+
+** eww-mode-map
+
+ | Command | Original | Evil |
+ |------------------------------------+------------+--------------------|
+ | =eww-up-url= | =u= | =^=, =u= |
+ | =eww-top-url= | =t= | =U= |
+ | =eww-back-url= | =l=, =DEL= | =H=, =DEL= |
+ | =eww-forward-url= | =r= | =L= |
+ | =eww-view-source= | =v= | =gf= |
+ | =eww-browse-with-external-browser= | =&= | =&=, =S-RET=, =go= |
+ | =url-cookie-list= | =C= | =gc= |
+ | =eww-toggle-paragraph-direction= | =D= | =zd= |
+ | =eww-set-character-encoding= | =E= | =ze= |
+ | =eww-toggle-fonts= | =F= | =zf= |
+ | =eww-download= | =d= | =d= |
+ | =eww-add-bookmark= | =b= | =m= |
+ | =eww-readable= | =R= | =R=, =r= |
+ | =eww-next-url= | =n= | =]]=, =gj= |
+ | =eww-previous-url= | =p= | =[[=, =gk= |
+ | =eww= | =G= | =o= |
+ | =scroll-up-command= | n/a | =SPC= |
+ | =scroll-down-command= | n/a | =S-SPC= |
+ | =shr-next-link= | =TAB= | =TAB= |
+ | =shr-previous-link= | =S-TAB= | =S-TAB= |
+ | =eww-list-bookmarks= | =B= | =gb= |
+ | =eww-list-histories= | =H= | =gh= |
+ | =eww-list-buffers= | =S= | =gt= |
+ | =eww-reload= | =g= | =gr= |
+ | =eww-copy-page-url= (=y= operator) | =w= | =yu= |
+ | =quit-window= | n/a | =q=, =ZQ=, =ZZ= |
+
+** eww-history-mode-map
+
+ | Command | Original | Evil |
+ |----------------------+----------+-------|
+ | =eww-history-browse= | =RET= | =RET= |
+ | =revert-buffer= | n/a | =gr= |
+
+** eww-buffers-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------+----------+------------|
+ | =eww-buffer-kill= | =D= | =D= |
+ | =eww-buffer-select= | =RET= | =RET= |
+ | =eww-buffer-show-next= | n/a | =]]=, =gj= |
+ | =eww-buffer-show-previous= | n/a | =[[=, =gk= |
+ | =revert-buffer= | n/a | =gr= |
+
+** eww-bookmark-mode-map
+
+ | Command | Original | Evil |
+ |------------------------------------+----------+-------|
+ | =eww-bookmark-kill= | =D= | =D= |
+ | =eww-bookmark-yank= | =P= | =P= |
+ | =eww-bookmark-browse= | =RET= | =RET= |
+ | =revert-buffer= | n/a | =gr= |
+ | =eww-copy-page-url= (=y= operator) | n/a | =yu= |
diff --git a/.config/emacs/lisp/evil-collection/modes/eww/evil-collection-eww.el b/.config/emacs/lisp/evil-collection/modes/eww/evil-collection-eww.el
new file mode 100644
index 0000000..96a848e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/eww/evil-collection-eww.el
@@ -0,0 +1,128 @@
+;;; evil-collection-eww.el --- Evil bindings for EWW -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, eww, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for EWW.
+
+;;; Code:
+(require 'eww)
+(require 'evil-collection)
+
+(defvar evil-collection-eww-maps '(eww-mode-map
+ eww-history-mode-map
+ eww-buffers-mode-map
+ eww-bookmark-mode-map))
+
+;;;###autoload
+(defun evil-collection-eww-setup ()
+ "Set up `evil' bindings for `eww'."
+
+ (evil-set-initial-state 'eww-mode 'normal)
+ (evil-collection-define-key 'normal 'eww-mode-map
+ "^" 'eww-up-url
+ "u" 'eww-up-url
+ "U" 'eww-top-url
+ (kbd "DEL") 'eww-back-url
+ "H" 'eww-back-url
+ "L" 'eww-forward-url
+
+ "gf" 'eww-view-source ; Like qutebrowser.
+
+ "&" 'eww-browse-with-external-browser
+ "gc" 'url-cookie-list
+ "zd" 'eww-toggle-paragraph-direction
+ "ze" 'eww-set-character-encoding
+ "zf" 'eww-toggle-fonts
+ "d" 'eww-download
+ "m" 'eww-add-bookmark
+ "R" 'eww-readable ; Default binding.
+ "r" 'eww-readable
+
+ "]]" 'eww-next-url
+ "[[" 'eww-previous-url
+ "gj" 'eww-next-url
+ "gk" 'eww-previous-url
+
+ ;; open
+ (kbd "S-<return>") 'eww-browse-with-external-browser
+ "go" 'eww-browse-with-external-browser
+ "o" 'eww ; Like qutebrowser.
+
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'shr-next-link
+ (kbd "<backtab>") 'shr-previous-link
+
+ ;; bookmarks
+ "gb" 'eww-list-bookmarks
+
+ "gh" 'eww-list-histories
+ "gt" 'eww-list-buffers ; Like dwb, qutebrowser.
+
+ ;; refresh
+ "gr" 'eww-reload
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'quit-window
+ "ZZ" 'quit-window)
+
+ (evil-collection-define-operator-key 'yank 'eww-mode-map
+ "u" 'eww-copy-page-url)
+
+ (evil-collection-set-readonly-bindings 'eww-history-mode-map)
+ (evil-set-initial-state 'eww-history-mode 'normal)
+ (evil-collection-define-key 'normal 'eww-history-mode-map
+ (kbd "RET") 'eww-history-browse
+ ;; refresh
+ "gr" 'revert-buffer)
+
+ (evil-collection-set-readonly-bindings 'eww-buffers-mode-map)
+ (evil-set-initial-state 'eww-buffers-mode 'normal)
+ (evil-collection-define-key 'normal 'eww-buffers-mode-map
+ "D" 'eww-buffer-kill
+ (kbd "RET") 'eww-buffer-select
+ "]]" 'eww-buffer-show-next
+ "[[" 'eww-buffer-show-previous
+ "gj" 'eww-buffer-show-next
+ "gk" 'eww-buffer-show-previous
+ ;; refresh
+ "gr" 'revert-buffer)
+
+ (evil-collection-set-readonly-bindings 'eww-bookmark-mode-map)
+ (evil-set-initial-state 'eww-bookmark-mode 'normal)
+ (evil-collection-define-key 'normal 'eww-bookmark-mode-map
+ "D" 'eww-bookmark-kill
+ "P" 'eww-bookmark-yank
+
+ (kbd "RET") 'eww-bookmark-browse
+ ;; refresh
+ "gr" 'revert-buffer)
+
+ (evil-collection-define-operator-key 'yank 'eww-bookmark-mode-map
+ "u" 'eww-copy-page-url))
+
+(provide 'evil-collection-eww)
+;;; evil-collection-eww.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/explain-pause-mode/evil-collection-explain-pause-mode.el b/.config/emacs/lisp/evil-collection/modes/explain-pause-mode/evil-collection-explain-pause-mode.el
new file mode 100644
index 0000000..fa5b43f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/explain-pause-mode/evil-collection-explain-pause-mode.el
@@ -0,0 +1,50 @@
+;;; evil-collection-explain-pause-mode.el --- Evil bindings for explain-pause-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for explain-pause-mode.
+
+;;; Code:
+(require 'evil-collection)
+(require 'explain-pause-mode nil t)
+
+(defconst evil-collection-explain-pause-mode-maps '(explain-pause-top-mode-map))
+
+;;;###autoload
+(defun evil-collection-explain-pause-mode-setup ()
+ "Set up `evil' bindings for `explain-pause-mode'."
+ (evil-set-initial-state 'explain-pause-top-mode 'normal)
+ (evil-collection-define-key 'normal 'explain-pause-top-mode-map
+ "a" 'explain-pause-top-auto-refresh
+ "c" 'explain-pause-top-clear
+ "o" 'explain-pause-top-sort
+
+ "q" 'quit-window
+ "ZZ" 'quit-window
+ "ZQ" 'quit-window))
+
+(provide 'evil-collection-explain-pause-mode)
+
+;;; evil-collection-explain-pause-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/fanyi/evil-collection-fanyi.el b/.config/emacs/lisp/evil-collection/modes/fanyi/evil-collection-fanyi.el
new file mode 100644
index 0000000..69e589c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/fanyi/evil-collection-fanyi.el
@@ -0,0 +1,47 @@
+;;; evil-collection-fanyi.el --- Evil bindings for fanyi -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for fanyi.
+
+;;; Code:
+(require 'evil-collection)
+(require 'fanyi nil t)
+
+(defconst evil-collection-fanyi-maps '(fanyi-mode-map))
+
+;;;###autoload
+(defun evil-collection-fanyi-setup ()
+ "Set up `evil' bindings for `fanyi'."
+ (evil-collection-set-readonly-bindings 'fanyi-mode-map)
+ (evil-collection-define-key 'normal 'fanyi-mode-map
+ ;; tab
+ [tab] 'forward-button
+ [backtab] 'backward-button
+
+ "s" 'fanyi-dwim))
+
+(provide 'evil-collection-fanyi)
+;;; evil-collection-fanyi.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/finder/README.org b/.config/emacs/lisp/evil-collection/modes/finder/README.org
new file mode 100644
index 0000000..56562b9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/finder/README.org
@@ -0,0 +1,13 @@
+* finder
+
+ Evil bindings for =finder-mode= (the package-keyword browser opened by
+ =M-x finder-by-keyword=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------+------------+--------------|
+ | =finder-select= | =RET=, =f= | =RET=, =SPC= |
+ | =finder-list-keywords= | =d= | =d= |
+ | =finder-summary= | =?= | =s= |
+ | =finder-exit= | =q= | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/finder/evil-collection-finder.el b/.config/emacs/lisp/evil-collection/modes/finder/evil-collection-finder.el
new file mode 100644
index 0000000..3ec4f25
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/finder/evil-collection-finder.el
@@ -0,0 +1,49 @@
+;;; evil-collection-finder.el --- Evil bindings for finder -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, finder, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for finder.
+
+;;; Code:
+(require 'evil-collection)
+(require 'finder)
+
+(defconst evil-collection-finder-maps '(finder-mode-map))
+
+;;;###autoload
+(defun evil-collection-finder-setup ()
+ "Set up `evil' bindings for `finder'."
+ (evil-set-initial-state 'finder-mode 'normal)
+
+ (evil-collection-define-key 'normal 'finder-mode-map
+ (kbd "RET") 'finder-select
+ (kbd "SPC") 'finder-select
+
+ "d" 'finder-list-keywords
+ "s" 'finder-summary
+ "q" 'finder-exit))
+
+(provide 'evil-collection-finder)
+;;; evil-collection-finder.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/flycheck/README.org b/.config/emacs/lisp/evil-collection/modes/flycheck/README.org
new file mode 100644
index 0000000..04031fe
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/flycheck/README.org
@@ -0,0 +1,18 @@
+* flycheck
+
+ Evil bindings for the [[https://www.flycheck.org/][flycheck]] error list.
+
+ Initial state for =flycheck-error-list-mode= is =normal=.
+
+** flycheck-error-list-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |--------------------------------------+----------+-------------------|
+ | =flycheck-error-list-next-error= | =n= | =gj=, =C-j=, =]]= |
+ | =flycheck-error-list-previous-error= | =p= | =gk=, =C-k=, =[[= |
+ | =flycheck-error-list-check-source= | =g= | =gr= |
+ | =flycheck-error-list-set-filter= | =f= | =s= |
+ | =flycheck-error-list-reset-filter= | =F= | =S= |
+ | =flycheck-error-list-explain-error= | =e= | =x= |
+ | =flycheck-error-list-goto-error= | =RET= | =RET= |
+ | =quit-window= | =q= | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/flycheck/evil-collection-flycheck.el b/.config/emacs/lisp/evil-collection/modes/flycheck/evil-collection-flycheck.el
new file mode 100644
index 0000000..889ba32
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/flycheck/evil-collection-flycheck.el
@@ -0,0 +1,56 @@
+;;; evil-collection-flycheck.el --- Evil bindings for flycheck -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, flycheck, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `flycheck-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'flycheck nil t)
+
+(defvar flycheck-error-list-mode-map)
+
+(defconst evil-collection-flycheck-maps '(flycheck-error-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-flycheck-setup ()
+ "Set up `evil' bindings for `flycheck'."
+ (evil-set-initial-state 'flycheck-error-list-mode 'normal)
+ (evil-collection-define-key 'normal 'flycheck-error-list-mode-map
+ "gj" 'flycheck-error-list-next-error
+ "gk" 'flycheck-error-list-previous-error
+ (kbd "C-j") 'flycheck-error-list-next-error
+ (kbd "C-k") 'flycheck-error-list-previous-error
+ "]]" 'flycheck-error-list-next-error
+ "[[" 'flycheck-error-list-previous-error
+ "gr" 'flycheck-error-list-check-source
+ "s" 'flycheck-error-list-set-filter
+ "S" 'flycheck-error-list-reset-filter
+ "x" 'flycheck-error-list-explain-error
+ (kbd "RET") 'flycheck-error-list-goto-error
+ "q" 'quit-window))
+
+(provide 'evil-collection-flycheck)
+;;; evil-collection-flycheck.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/flymake/README.org b/.config/emacs/lisp/evil-collection/modes/flymake/README.org
new file mode 100644
index 0000000..d46e8c2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/flymake/README.org
@@ -0,0 +1,15 @@
+* flymake
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/flymake/index.html][Flymake]].
+
+** Key bindings
+
+ Applied to both =flymake-diagnostics-buffer-mode-map= and
+ =flymake-project-diagnostics-mode-map=.
+
+ | Command | Original | Evil |
+ |---------------------------+----------+------------------------------|
+ | =flymake-goto-next-error= | n/a | =C-j= |
+ | =flymake-goto-prev-error= | n/a | =C-k= |
+ | =flymake-goto-diagnostic= | =RET= | =RET= |
+ | =flymake-show-diagnostic= | =SPC= | =S-RET=, =M-RET=, =go=, =gO= |
diff --git a/.config/emacs/lisp/evil-collection/modes/flymake/evil-collection-flymake.el b/.config/emacs/lisp/evil-collection/modes/flymake/evil-collection-flymake.el
new file mode 100644
index 0000000..86ce75e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/flymake/evil-collection-flymake.el
@@ -0,0 +1,52 @@
+;;; evil-collection-flymake.el --- Evil Bindings for Flymake -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018, 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, flymake, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `flymake-mode'.
+
+;;; Code:
+(require 'flymake)
+(require 'evil-collection)
+
+(defconst evil-collection-flymake-maps '(flymake-mode-map
+ flymake-project-diagnostics-mode-map
+ flymake-diagnostics-buffer-mode-map))
+
+;;;###autoload
+(defun evil-collection-flymake-setup ()
+ "Set up `evil' bindings for `flymake'."
+ (dolist (map '(flymake-diagnostics-buffer-mode-map flymake-project-diagnostics-mode-map))
+ (evil-collection-set-readonly-bindings map)
+ (evil-collection-define-key 'normal map
+ (kbd "C-j") 'flymake-goto-next-error
+ (kbd "C-k") 'flymake-goto-prev-error
+ (kbd "RET") 'flymake-goto-diagnostic
+ (kbd "S-RET") 'flymake-show-diagnostic
+ (kbd "M-RET") 'flymake-show-diagnostic
+ (kbd "go") 'flymake-show-diagnostic
+ (kbd "gO") 'flymake-show-diagnostic)))
+
+(provide 'evil-collection-flymake)
+;;; evil-collection-flymake.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/forge/README.org b/.config/emacs/lisp/evil-collection/modes/forge/README.org
new file mode 100644
index 0000000..b7cf5d5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/forge/README.org
@@ -0,0 +1,44 @@
+* forge
+
+ Evil bindings for [[https://github.com/magit/forge][forge]].
+
+ Setup disables =forge-add-default-bindings= (which would clobber evil keys
+ on magit maps), then rebinds forge dispatch and remaps =magit-browse-thing=
+ on the relevant magit section maps. The state used is controlled by
+ =evil-collection-forge-state=.
+
+** Key bindings
+
+*** magit-mode-map
+
+ | Command | Original | Evil |
+ |------------------+----------+------|
+ | =forge-dispatch= | (none) | =@= |
+
+*** magit-commit-section-map / magit-remote-section-map / magit-branch-section-map
+
+ | Command | Original | Evil |
+ |---------------------------------------------------------+----------+---------------------------------|
+ | =forge-browse-dwim= / =forge-browse-remote= / =-branch= | n/a | (remap of =magit-browse-thing=) |
+ | =forge-visit-topic= | n/a | =C-c C-v= (commit / branch) |
+
+** Transient extensions
+
+ The following are appended to magit transients:
+
+ | Transient | Suffix |
+ |---------------------+-------------------------------------------|
+ | =magit-dispatch= | =@= Forge |
+ | =magit-fetch= | =n= forge topics, =N= forge notifications |
+ | =magit-pull= | =n= forge topics, =N= forge notifications |
+ | =magit-branch= | =f= pull-request, =F= from pull-request |
+ | =magit-worktree= | =n= pull-request worktree |
+ | =magit-status-jump= | =Np= pull-requests, =Ni= issues |
+ | =magit-merge= | =M= Merge using API |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |----------------------------------------+----------------------+---------------------------------------------------|
+ | =evil-collection-forge-use-y-for-yank= | =t= | Keep =y= as yank; also adds visual state. |
+ | =evil-collection-forge-state= | =normal= or =motion= | Evil state used for forge bindings on magit maps. |
diff --git a/.config/emacs/lisp/evil-collection/modes/forge/evil-collection-forge.el b/.config/emacs/lisp/evil-collection/modes/forge/evil-collection-forge.el
new file mode 100644
index 0000000..1392c96
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/forge/evil-collection-forge.el
@@ -0,0 +1,113 @@
+;;; evil-collection-forge.el --- Evil-based key bindings for forge -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Package-Requires: ((emacs "26.3") (evil "1.2.3"))
+;; Homepage: https://github.com/emacs-evil/evil-collection
+;; Version: 0.4.1
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library configures Magit and Evil to play well with each
+;; other. For some background see:
+;; https://github.com/emacs-evil/evil-collection/issues/543.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'forge nil t)
+(require 'transient nil t)
+
+(defcustom evil-collection-forge-use-y-for-yank t
+ "View `evil-collection-magit-state' for more information."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-forge-state
+ (if evil-collection-forge-use-y-for-yank 'normal 'motion)
+ "State to use for forge."
+ :group 'magit
+ :type 'symbol)
+
+(defvar forge-add-default-bindings)
+
+;;;###autoload
+(defun evil-collection-forge-setup ()
+ "Set up `evil' bindings for `magit'."
+ ;; The latest release tag of forge doesn't include
+ ;; `forge-add-default-bindings' yet, it will throw an error:
+ ;;
+ ;; void-variable `forge-add-default-bindings'
+ ;;
+ ;; for GNU Guix and MELPA stable users.
+ (when (bound-and-true-p forge-add-default-bindings)
+ (message "Setting `forge-add-default-bindings' to nil in `evil-collection-forge-setup'.
+To suppress this message you can set this variable to nil in your init.el file.")
+ (setq forge-add-default-bindings nil))
+ (let ((states (if evil-collection-forge-use-y-for-yank
+ `(,evil-collection-forge-state visual)
+ `(,evil-collection-forge-state))))
+ (dolist (state states)
+ (evil-collection-define-key state 'magit-mode-map "@" 'forge-dispatch)
+
+ (evil-collection-define-key
+ state 'magit-commit-section-map
+ [remap magit-browse-thing] 'forge-browse-dwim)
+ (evil-collection-define-key
+ state 'magit-remote-section-map
+ [remap magit-browse-thing] 'forge-browse-remote)
+ (evil-collection-define-key
+ state 'magit-branch-section-map
+ [remap magit-browse-thing] 'forge-browse-branch)
+
+ (evil-collection-define-key
+ state 'magit-commit-section-map (kbd "C-c C-v") 'forge-visit-topic)
+ (evil-collection-define-key
+ state 'magit-branch-section-map (kbd "C-c C-v") 'forge-visit-topic)))
+
+ ;; https://github.com/magit/forge/blob/master/lisp/forge.el
+
+ (transient-append-suffix 'magit-dispatch "!"
+ '("@" "Forge" forge-dispatch)) ;; N -> @
+
+ (transient-append-suffix 'magit-fetch "m"
+ '("n" "forge topics" forge-pull))
+ (transient-append-suffix 'magit-fetch "n"
+ '("N" "forge notifications" forge-pull-notifications))
+ (transient-append-suffix 'magit-pull "m"
+ '("n" "forge topics" forge-pull))
+ (transient-append-suffix 'magit-pull "n"
+ '("N" "forge notifications" forge-pull-notifications))
+ (transient-append-suffix 'magit-branch "w"
+ '("f" "pull-request" forge-checkout-pullreq))
+ (transient-append-suffix 'magit-branch "W"
+ '("F" "from pull-request" forge-branch-pullreq))
+ (transient-append-suffix 'magit-worktree "c"
+ '("n" "pull-request worktree" forge-checkout-worktree))
+ (transient-append-suffix 'magit-status-jump "w"
+ '("Np" "pull-requests" forge-jump-to-pullreqs))
+ (transient-append-suffix 'magit-status-jump "Np"
+ '("Ni" "issues" forge-jump-to-issues))
+ (transient-append-suffix 'magit-merge "a"
+ '(7 "M" "Merge using API" forge-merge)))
+
+;;; evil-collection-forge.el ends soon
+(provide 'evil-collection-forge)
+;; Local Variables:
+;; End:
+;;; evil-collection-forge.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/free-keys/evil-collection-free-keys.el b/.config/emacs/lisp/evil-collection/modes/free-keys/evil-collection-free-keys.el
new file mode 100644
index 0000000..b6a5f49
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/free-keys/evil-collection-free-keys.el
@@ -0,0 +1,53 @@
+;;; evil-collection-free-keys.el --- Bindings for `free-keys' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `free-keys'.
+(require 'evil-collection)
+(require 'free-keys nil t)
+
+;;; Code:
+(defvar free-keys-mode-map)
+
+(defconst evil-collection-free-keys-maps '(free-keys-mode-map))
+
+(defun evil-collection-free-keys-set-header-line-format ()
+ "Tweak `header-line-format' locally for `free-keys'."
+ (setq-local header-line-format
+ "Help: (c) change buffer (p) change prefix (q) quit"))
+
+;;;###autoload
+(defun evil-collection-free-keys-setup ()
+ "Set up `evil' bindings for `free-keys'."
+ (add-hook 'free-keys-mode-hook
+ #'evil-collection-free-keys-set-header-line-format)
+ (evil-set-initial-state 'free-keys-mode 'normal)
+ (evil-collection-define-key 'normal 'free-keys-mode-map
+ "c" 'free-keys-change-buffer
+ "p" 'free-keys-set-prefix
+ "q" 'quit-window))
+
+(provide 'evil-collection-free-keys)
+;;; evil-collection-free-keys.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/fzfa/README.org b/.config/emacs/lisp/evil-collection/modes/fzfa/README.org
new file mode 100644
index 0000000..a093e2f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/fzfa/README.org
@@ -0,0 +1,19 @@
+* fzfa
+
+ Evil bindings for [[https://github.com/jojojames/fzfa][fzfa]].
+
+ No keymap is rebound. Setup marks fzfa's jump-style commands as
+ non-repeatable and registers them as evil jumps so =C-o= / =C-i= work after
+ selection.
+
+** Jump commands
+
+ The commands in =evil-collection-fzfa-jump-commands= are declared with
+ =:jump t= and =evil-declare-not-repeat=. This includes buffer-local jumps
+ (e.g. =fzfa-swiper=, =fzfa-imenu=, =fzfa-mark=, =fzfa-outline=,
+ =fzfa-evil-marks=) and cross-buffer / file jumps (e.g. =fzfa-buffer=,
+ =fzfa-recent-file=, =fzfa-find=, =fzfa-grep=, =fzfa-project-find-file=,
+ =fzfa-evil-jumps=, =fzfa-org-heading=, =fzfa-info=, etc.).
+
+ Non-jumping commands like =fzfa-yank-pop=, =fzfa-register=, =fzfa-M-x= and
+ the various history pickers are intentionally excluded.
diff --git a/.config/emacs/lisp/evil-collection/modes/fzfa/evil-collection-fzfa.el b/.config/emacs/lisp/evil-collection/modes/fzfa/evil-collection-fzfa.el
new file mode 100644
index 0000000..ad54dbf
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/fzfa/evil-collection-fzfa.el
@@ -0,0 +1,111 @@
+;;; evil-collection-fzfa.el --- Evil bindings for fzfa -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: evil, fzfa, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `fzfa'.
+;;
+;; The fzfa commands are autoloaded so no (require 'fzfa nil t) is needed.
+
+;;; Code:
+(require 'evil-collection)
+
+(defvar evil-collection-fzfa-jump-commands
+ '(;; Buffer-local jumps.
+ fzfa-swiper
+ fzfa-imenu
+ fzfa-imenu-all-but-current
+ fzfa-mark
+ fzfa-outline
+ fzfa-evil-marks
+ ;; Cross-buffer / file jumps.
+ fzfa-swiper-all
+ fzfa-imenu-all
+ fzfa-global-mark
+ fzfa-recent-file
+ fzfa-buffer
+ fzfa-bookmark
+ fzfa-tramp
+ fzfa-evil-jumps
+ fzfa-find
+ fzfa-fd
+ fzfa-locate
+ fzfa-grep
+ fzfa-grep-current-file
+ fzfa-ugrep
+ fzfa-rg
+ fzfa-rg-files
+ fzfa-ag
+ fzfa-ag-files
+ fzfa-git-grep
+ fzfa-git-ls-files
+ fzfa-git-modified-locally
+ fzfa-git-added-files
+ fzfa-git-staged-for-commit
+ fzfa-git-modified-in-head
+ fzfa-git-log-grep
+ fzfa-hg-files
+ fzfa-hg-modified-locally
+ fzfa-hg-added-files
+ fzfa-hg-modified-in-head
+ fzfa-project-find-file
+ fzfa-project-find-dir
+ fzfa-project-buffer
+ fzfa-project-recentf
+ fzfa-project-switch-project
+ fzfa-compile-error
+ fzfa-flymake
+ fzfa-flymake-project
+ fzfa-org-heading
+ fzfa-org-heading-all
+ fzfa-org-agenda
+ fzfa-org-todo
+ fzfa-org-tags-view
+ fzfa-info
+ fzfa-info-emacs
+ fzfa-info-elisp
+ fzfa-info-org
+ fzfa-info-cl
+ fzfa-info-eieio
+ fzfa-info-magit
+ fzfa-info-at-point
+ fzfa-hungry-swiper
+ fzfa-hungry-find
+ fzfa-find-any
+ fzfa-find-some
+ fzfa-evil-any)
+ "List of `fzfa' commands that should be treated as evil jumps.")
+
+(defun evil-collection-fzfa-set-bindings ()
+ "Set the bindings."
+ (dolist (cmd evil-collection-fzfa-jump-commands)
+ (evil-declare-not-repeat cmd)
+ (evil-set-command-property cmd :jump t)))
+
+;;;###autoload
+(defun evil-collection-fzfa-setup ()
+ "Set up `evil' bindings for `fzfa'."
+ (evil-collection-fzfa-set-bindings))
+
+(provide 'evil-collection-fzfa)
+;;; evil-collection-fzfa.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/geiser/README.org b/.config/emacs/lisp/evil-collection/modes/geiser/README.org
new file mode 100644
index 0000000..d20565b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/geiser/README.org
@@ -0,0 +1,62 @@
+* geiser
+
+ Evil bindings for [[https://www.nongnu.org/geiser/][Geiser]] (Scheme).
+
+ Sets initial state to =normal= for =geiser-debug-mode= and
+ =geiser-doc-mode=. When =evil-move-beyond-eol= is nil, advises
+ =geiser-eval-last-sexp= and =geiser-eval-last-sexp-and-print= so the
+ last sexp is taken with point treated as one past EOL in normal/motion
+ state.
+
+** Key bindings
+
+*** geiser-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------------------+---------------+-------|
+ | =geiser-edit-symbol-at-point= | =M-.= | =gd= |
+ | =geiser-pop-symbol-stack= | =M-,= | =C-t= |
+ | =geiser-mode-switch-to-repl= | =C-c C-z= | =gz= |
+ | =geiser-mode-switch-to-repl-and-enter= | =C-c C-a= | =gZ= |
+ | =geiser-doc-symbol-at-point= | =C-c C-d C-d= | =K= |
+
+*** geiser-repl-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------------------+---------------+-------------------------------------|
+ | =geiser-edit-symbol-at-point= | =M-.= | =gd= |
+ | =geiser-pop-symbol-stack= | =M-,= | =C-t= |
+ | =geiser-repl-next-prompt= | =C-c C-n= | =gj=, =C-j=, =]]= |
+ | =geiser-repl-previous-prompt= | =C-c C-p= | =gk=, =C-k=, =[[= |
+ | =geiser-doc-symbol-at-point= | =C-c C-d C-d= | =K= |
+ | =geiser-repl-maybe-send= | =RET= | =RET= (submit state) |
+ | =geiser-repl--newline-and-indent= | =C-j= | =S-<return>=, =RET= (newline state) |
+
+ Whether =RET= submits depends on =evil-collection-repl-submit-state=:
+ in =insert= (default) =RET= submits, =S-<return>= inserts a newline;
+ in =normal=, =RET= inserts a newline in insert state and submits in
+ normal state.
+
+*** geiser-doc-mode-map
+
+ | Command | Original | Evil |
+ |-------------------------------+--------------+----------------------|
+ | =forward-button= | =TAB=, =n= | =TAB=, =gj=, =C-j= |
+ | =backward-button= | =S-TAB=, =p= | =S-TAB=, =gk=, =C-k= |
+ | =geiser-edit-symbol-at-point= | =.= | =gd= |
+ | =geiser-pop-symbol-stack= | =M-,= | =C-t= |
+ | =geiser-doc-refresh= | =g=, =r= | =gr= |
+ | =View-quit= | =q= (View) | =q= |
+ | =geiser-doc-switch-to-repl= | =z= | =gz= |
+ | =geiser-doc-next= | =f= | =>= |
+ | =geiser-doc-previous= | =b= | =<= |
+ | =geiser-doc-next-section= | =N= | =]]= |
+ | =geiser-doc-previous-section= | =P= | =[[= |
+ | =geiser-doc-kill-page= | =k= | =x= |
+ | =geiser-doc-clean-history= | =c= | =X= |
+
+*** geiser-debug-mode-map
+
+ | Command | Original | Evil |
+ |---------------+----------+------|
+ | =quit-window= | | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/geiser/evil-collection-geiser.el b/.config/emacs/lisp/evil-collection/modes/geiser/evil-collection-geiser.el
new file mode 100644
index 0000000..24fb46e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/geiser/evil-collection-geiser.el
@@ -0,0 +1,115 @@
+;;; evil-collection-geiser.el --- Bindings for `geiser' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, geiser, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `geiser'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'geiser nil t)
+
+(defvar geiser-debug-mode-map)
+(defvar geiser-doc-mode-map)
+
+(defconst evil-collection-geiser-maps '(geiser-debug-mode-map
+ geiser-doc-mode-map
+ geiser-repl-mode-map
+ geiser-mode-map))
+
+(defun evil-collection-geiser-last-sexp (command &rest args)
+ "In normal-state or motion-state, last sexp ends at point."
+ (if (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p)))
+ (save-excursion
+ (unless (or (eobp) (eolp)) (forward-char))
+ (apply command args))
+ (apply command args)))
+
+;;;###autoload
+(defun evil-collection-geiser-setup ()
+ "Set up bindings for `geiser'."
+ (unless evil-move-beyond-eol
+ (advice-add 'geiser-eval-last-sexp :around 'evil-collection-geiser-last-sexp)
+ (advice-add 'geiser-eval-last-sexp-and-print :around 'evil-collection-geiser-last-sexp))
+
+ (evil-set-initial-state 'geiser-debug-mode 'normal)
+ (evil-set-initial-state 'geiser-doc-mode 'normal)
+
+ (evil-collection-define-key 'normal 'geiser-debug-mode-map
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'geiser-doc-mode-map
+ (kbd "<tab>") 'forward-button
+ (kbd "<S-tab>") 'backward-button
+ "gd" 'geiser-edit-symbol-at-point
+ (kbd "C-t") 'geiser-pop-symbol-stack
+ "gr" 'geiser-doc-refresh
+ "q" 'View-quit
+ "gz" 'geiser-doc-switch-to-repl
+ ">" 'geiser-doc-next
+ "<" 'geiser-doc-previous
+ "gj" 'forward-button
+ "gk" 'backward-button
+ (kbd "C-j") 'forward-button
+ (kbd "C-k") 'backward-button
+ "]]" 'geiser-doc-next-section
+ "[[" 'geiser-doc-previous-section
+ "x" 'geiser-doc-kill-page
+ "X" 'geiser-doc-clean-history)
+
+ (evil-collection-define-key 'insert 'geiser-repl-mode-map
+ (kbd "S-<return>") 'geiser-repl--newline-and-indent)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'geiser-repl-mode-map
+ (kbd "RET") 'geiser-repl-maybe-send
+ (kbd "\C-m") 'geiser-repl-maybe-send
+ [return] 'geiser-repl-maybe-send)
+ (evil-collection-define-key newline-state 'geiser-repl-mode-map
+ (kbd "RET") 'geiser-repl--newline-and-indent
+ (kbd "\C-m") 'geiser-repl--newline-and-indent
+ [return] 'geiser-repl--newline-and-indent))
+
+ (evil-collection-define-key 'normal 'geiser-repl-mode-map
+ "gd" 'geiser-edit-symbol-at-point
+ (kbd "C-t") 'geiser-pop-symbol-stack
+ "gj" 'geiser-repl-next-prompt
+ "gk" 'geiser-repl-previous-prompt
+ (kbd "C-j") 'geiser-repl-next-prompt
+ (kbd "C-k") 'geiser-repl-previous-prompt
+ "]]" 'geiser-repl-next-prompt
+ "[[" 'geiser-repl-previous-prompt
+ "K" 'geiser-doc-symbol-at-point)
+
+ (evil-collection-define-key 'normal 'geiser-mode-map
+ "gd" 'geiser-edit-symbol-at-point
+ (kbd "C-t") 'geiser-pop-symbol-stack
+ "gZ" 'geiser-mode-switch-to-repl-and-enter
+ "gz" 'geiser-mode-switch-to-repl
+ "K" 'geiser-doc-symbol-at-point))
+
+(provide 'evil-collection-geiser)
+;;; evil-collection-geiser.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ggtags/evil-collection-ggtags.el b/.config/emacs/lisp/evil-collection/modes/ggtags/evil-collection-ggtags.el
new file mode 100644
index 0000000..1414255
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ggtags/evil-collection-ggtags.el
@@ -0,0 +1,104 @@
+;;; evil-collection-ggtags.el --- Evil bindings for ggtags -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ggtags, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `ggtags-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ggtags nil t)
+
+(defvar ggtags-global-mode-map)
+(defvar ggtags-mode-map)
+(defvar ggtags-view-search-history-mode-map)
+(defvar ggtags-view-tag-history-mode-map)
+(defvar ggtags-navigation-map)
+
+(defconst evil-collection-ggtags-maps '(ggtags-mode-map
+ ggtags-view-search-history-mode-map
+ ggtags-view-tag-history-mode-map
+ ggtags-navigation-map))
+
+;;;###autoload
+(defun evil-collection-ggtags-setup ()
+ "Set up `evil' bindings for `ggtags'."
+ (evil-set-initial-state 'ggtags-global-mode 'normal)
+ (evil-set-initial-state 'ggtags-view-search-history-mode 'normal)
+ (evil-set-initial-state 'ggtags-view-tag-history-mode 'normal)
+
+ ;; `ggtags-navigation-mode' is global and will conflict with other bindings.
+ ;; https://github.com/leoliu/ggtags/issues/124
+ (when (boundp 'ggtags-enable-navigation-keys)
+ (setq ggtags-enable-navigation-keys nil))
+
+ (evil-collection-define-key 'normal 'ggtags-mode-map
+ "gd" 'ggtags-find-tag-dwim
+ (kbd "C-t") 'ggtags-prev-mark
+ "gf" 'ggtags-find-file)
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'ggtags-mode-map
+ "gr" 'ggtags-find-reference))
+
+ (evil-collection-define-key 'normal 'ggtags-view-search-history-mode-map
+ "gj" 'ggtags-view-search-history-next
+ "gk" 'ggtags-view-search-history-prev
+ (kbd "C-j") 'ggtags-view-search-history-next
+ (kbd "C-k") 'ggtags-view-search-history-prev
+ "]]" 'ggtags-view-search-history-next
+ "[[" 'ggtags-view-search-history-prev
+ "x" 'ggtags-view-search-history-kill
+ "gr" 'ggtags-view-search-history-update
+ "r" 'ggtags-save-to-register
+ "R" 'ggtags-view-search-history-action
+ "q" 'ggtags-kill-window)
+
+ (evil-collection-define-key 'normal 'ggtags-view-tag-history-mode-map
+ "gj" 'next-error-no-select
+ (kbd "C-j") 'next-error-no-select
+ "]]" 'next-error-no-select
+ "gk" 'previous-error-no-select
+ (kbd "C-k") 'previous-error-no-select
+ (kbd "[[") 'previous-error-no-select
+ "q" 'ggtags-kill-window)
+
+ (evil-collection-define-key 'normal 'ggtags-navigation-map
+ ;; navigation
+ "gj" 'next-error
+ "gk" 'previous-error
+ (kbd "C-j") 'next-error
+ (kbd "C-k") 'previous-error
+ "]]" 'ggtags-navigation-next-file
+ "[[" 'ggtags-navigation-previous-file
+
+ ;; search
+ "s" 'ggtags-navigation-isearch-forward
+ "S" 'ggtags-navigation-isearch-forward
+
+ "go" 'ggtags-navigation-visible-mode ;; FIXME: This can be anything.
+ (kbd "RET") 'ggtags-navigation-mode-done))
+
+(provide 'evil-collection-ggtags)
+;;; evil-collection-ggtags.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/git-timemachine/README.org b/.config/emacs/lisp/evil-collection/modes/git-timemachine/README.org
new file mode 100644
index 0000000..bfa19ae
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/git-timemachine/README.org
@@ -0,0 +1,20 @@
+* git-timemachine
+
+ Evil bindings for [[https://codeberg.org/pidu/git-timemachine][git-timemachine]].
+
+ Bindings are installed on =git-timemachine-mode= as minor-mode keys so
+ they apply in =normal= state in any buffer where the minor mode is
+ active.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------------------------------------+----------+-------|
+ | =git-timemachine-show-previous-revision= | =p= | =C-k= |
+ | =git-timemachine-show-next-revision= | =n= | =C-j= |
+ | =git-timemachine-quit= | =q= | =q= |
+ | =git-timemachine-show-nth-revision= | =g= | =gtg= |
+ | =git-timemachine-show-revision-fuzzy= | =t= | =gtt= |
+ | =git-timemachine-kill-abbreviated-revision= | =w= | =gty= |
+ | =git-timemachine-kill-revision= | =W= | =gtY= |
+ | =git-timemachine-blame= | =b= | =gtb= |
diff --git a/.config/emacs/lisp/evil-collection/modes/git-timemachine/evil-collection-git-timemachine.el b/.config/emacs/lisp/evil-collection/modes/git-timemachine/evil-collection-git-timemachine.el
new file mode 100644
index 0000000..3debd22
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/git-timemachine/evil-collection-git-timemachine.el
@@ -0,0 +1,49 @@
+;;; evil-collection-git-timemachine.el --- Bindings for `git-timemachine' -*- lexical-binding: t -*-
+
+;; Author: William Carroll <wpcarro@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, git, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil keybindings for `git-timemachine' that conform to the principles
+;; outlines in evil-collection
+
+;;; Code:
+(require 'evil-collection)
+(require 'git-timemachine nil t)
+
+(defvar git-timemachine-mode-map)
+(defconst evil-collection-git-timemachine-map '(git-timemachine-mode-map))
+
+;;;###autoload
+(defun evil-collection-git-timemachine-setup ()
+ "Setup `evil' keybindings for `git-timemachine'."
+ (evil-define-minor-mode-key 'normal 'git-timemachine-mode
+ "\C-k" 'git-timemachine-show-previous-revision
+ "\C-j" 'git-timemachine-show-next-revision
+ "q" 'git-timemachine-quit
+ "gtg" 'git-timemachine-show-nth-revision
+ "gtt" 'git-timemachine-show-revision-fuzzy
+ "gty" 'git-timemachine-kill-abbreviated-revision
+ "gtY" 'git-timemachine-kill-revision
+ "gtb" 'git-timemachine-blame))
+
+(provide 'evil-collection-git-timemachine)
+;;; evil-collection-git-timemachine.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/gited/evil-collection-gited.el b/.config/emacs/lisp/evil-collection/modes/gited/evil-collection-gited.el
new file mode 100644
index 0000000..c68c48c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/gited/evil-collection-gited.el
@@ -0,0 +1,157 @@
+;;; evil-collection-gited.el --- Evil bindings for Gited -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 Earl Hyatt
+
+;; Author: Earl Hyatt <okamsn@protonmail.com>
+;; Maintainer: Earl Hyatt <okamsn@protonmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3") (evil "1.2") (gited "0.6"))
+;; Keywords: evil, git, tools, vc
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Gited.
+
+;;; Code:
+(require 'gited nil t)
+(require 'evil-collection)
+(declare-function gited-summary "gited")
+(declare-function gited-hide-details-mode "gited")
+
+(defconst evil-collection-gited-maps '(gited-mode-map))
+
+;;;###autoload
+(defun evil-collection-gited-setup ()
+ "Set up `evil' bindings for `gited'."
+ (evil-collection-set-readonly-bindings 'gited-mode-map)
+ (evil-collection-define-key 'normal 'gited-mode-map
+ "g?" 'gited-summary
+ "(" 'gited-hide-details-mode
+ "gr" 'gited-update
+ (kbd "C-c C-c") 'gited-commit
+ (kbd "C-c C-b") 'gited-list-branches
+
+ ;; Movement
+ "j" 'gited-next-line
+ "k" 'gited-prev-line
+ (kbd "M-{") 'gited-prev-marked-branch
+ (kbd "M-}") 'gited-next-marked-branch
+ "G" 'gited-goto-last-branch
+ "gg" 'gited-goto-first-branch
+ "gj" 'gited-next-marked-branch
+ "gk" 'gited-prev-marked-branch
+ "gl" 'tabulated-list-next-column
+ "gh" 'tabulated-list-previous-column
+ "]]" 'gited-next-marked-branch
+ "[[" 'gited-prev-marked-branch
+ "<" 'gited-prev-marked-branch
+ ">" 'gited-next-marked-branch
+ " " 'gited-next-line
+ [?\S-\ ] 'gited-prev-line
+ [remap next-line] 'gited-next-line
+ [remap previous-line] 'gited-prev-line
+ "J" 'gited-goto-branch
+
+ "gA" 'gited-move-to-end-of-author
+ "ga" 'gited-move-to-author
+ "gB" 'gited-move-to-end-of-branchname
+ "gb" 'gited-move-to-branchname
+ "gD" 'gited-move-to-end-of-date
+ "gd" 'gited-move-to-date
+
+ ;; Operations on Things at Point
+ "=" 'gited-diff
+ "A" 'gited-add-patched-files
+ "a" 'gited-apply-patch
+ "B" 'gited-bisect
+ "C" 'gited-copy-branch
+ "c" 'gited-checkout-branch
+ "d" 'gited-flag-branch-deletion
+ "e" 'gited-extract-patches
+ "F" 'gited-pull ; Similar to Magit binding. Don't conflict with "f".
+ "gR" 'gited-change-current-remote-rep
+
+ "gs" 'gited-status ; These "g"-prefixed operations open
+ "gL" 'gited-log ; new windows.
+ "gN" 'gited-log-last-n-commits ;
+ "gO" 'gited-origin ; Use "go" to visit branch source.
+ "gc" 'gited-show-commit ;
+
+ "M" 'gited-merge-branch
+ "O" 'tabulated-list-sort
+ "o" 'tabulated-list-sort
+ "P" 'gited-push ; Only branches.
+ "p" 'gited-set-object-upstream ; Pushes branches and tags.
+ "R" 'gited-rename-branch
+ "r" 'gited-reset-branch
+ "s" nil ; Don't conflict with `tabulated-list-sort' on "S".
+ "ss" 'gited-stash
+ "sA" 'gited-stash-pop
+ "sa" 'gited-stash-apply
+ "sb" 'gited-stash-branch
+ "sD" 'gited-delete-all-stashes
+ "sd" 'gited-stash-drop
+ "Y" 'gited-copy-branchname-as-kill
+
+ (kbd "RET") 'gited-visit-branch-sources
+ "go" 'gited-visit-branch-sources
+
+ ;; Operations on Marked and Flagged Branches/Tags
+ "D" 'gited-do-delete
+ "K" 'gited-do-kill-lines
+ "T" 'gited-do-sync-with-trunk
+ "x" 'gited-do-flagged-delete
+
+ ;; Marks
+ "*" nil
+ "*%" 'gited-mark-branches-regexp
+ "*m" 'gited-mark
+ "*u" 'gited-unmark
+ "*?" 'gited-unmark-all-branches
+ "*!" 'gited-unmark-all-marks
+ (kbd "* <delete>") 'gited-unmark-backward
+ (kbd "* C-n") 'gited-next-marked-branch
+ (kbd "* C-p") 'gited-prev-marked-branch
+ "*t" 'gited-toggle-marks
+ "*l" 'gited-mark-local-tags
+ "*N" 'gited-number-marked
+
+ "U" 'gited-unmark-all-marks
+ "m" 'gited-mark
+ "t" 'gited-toggle-marks
+ "~" 'gited-toggle-marks
+ "u" 'gited-unmark
+ (kbd "<delete>") 'gited-unmark-backward
+
+ ;; Searching for marks
+ "%" nil
+ ;; "%d" No flag for deletion.
+ "%t" 'gited-mark-branches-by-date
+ "%c" 'gited-mark-branches-containing-commit
+ "%g" 'gited-mark-branches-containing-regexp
+ "%m" 'gited-mark-branches-regexp
+ "%M" 'gited-mark-merged-branches
+ "%U" 'gited-mark-unmerged-branches
+
+ ;; Tags instead of thumbnails. Only usable when listing tags. Ideally,
+ ;; these would have a separate map that would be used when displaying tags.
+ (kbd "C-t a") 'gited-tag-add
+ (kbd "C-t d") 'gited-tag-delete
+ (kbd "C-t D") 'gited-remote-tag-delete
+ (kbd "C-t F") 'gited-fetch-remote-tags))
+
+(provide 'evil-collection-gited)
+;;; evil-collection-gited.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/gnus/README.org b/.config/emacs/lisp/evil-collection/modes/gnus/README.org
new file mode 100644
index 0000000..d9a8ae2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/gnus/README.org
@@ -0,0 +1,274 @@
+* gnus
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/gnus/index.html][Gnus]]. Initial state is normal in every gnus mode below,
+ insert state is inhibited, and =zz= is bound to =gnus-recenter= everywhere.
+ Each map keeps the bulk of its upstream alphabetic prefixes (=A=, =B=, =G=,
+ =M=, =S=, =W=, =X=, =Y=, =Z=, =/=, etc.); the tables below cover only what
+ evil-collection relocates or adds.
+
+** Key bindings
+
+*** gnus-summary-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------------------------------+----------------+----------------|
+ | =gnus-summary-exit= | =q= | =q=, =ZZ= |
+ | =gnus-summary-exit-no-update= | =Q= | =Q=, =ZQ= |
+ | =gnus-summary-help-map= | =H= | =g?= |
+ | =gnus-summary-widget-forward= | n/a | =TAB= |
+ | =gnus-summary-widget-backward= | n/a | =<backtab>= |
+ | =gnus-summary-next-page= | =SPC= | =SPC= |
+ | =gnus-summary-prev-page= | =DEL=, =S-SPC= | =DEL=, =S-SPC= |
+ | =gnus-summary-scroll-up= | =RET= | =RET= |
+ | =gnus-summary-prev-unread-article= | =p= | =gk=, =[[= |
+ | =gnus-summary-next-unread-article= | =n= | =gj=, =]]= |
+ | =gnus-summary-prev-thread= | =M-b= | ={= |
+ | =gnus-summary-next-thread= | =M-f= | =}= |
+ | =gnus-summary-prev-article= | =P= | =C-k= |
+ | =gnus-summary-next-article= | =N= | =C-j= |
+ | =gnus-summary-mark-as-processable= | =#= | =m= |
+ | =gnus-uu-mark-buffer= | (M H b) | =M= |
+ | =gnus-summary-unmark-as-processable= | =M-#= | =u= |
+ | =gnus-summary-unmark-all-processable= | (M H U) | =U= |
+ | =gnus-uu-mark-by-regexp= | (M P r) | =%= |
+ | =gnus-summary-mail-other-window= | =m= | =C=, =cc= |
+ | =gnus-summary-news-other-window= | (S i) | =ci= |
+ | =gnus-summary-followup= | =f= | =f=, =cf= |
+ | =gnus-summary-followup-with-original= | =F= | =F=, =cF= |
+ | =gnus-summary-reply= | =r= | =r=, =cr= |
+ | =gnus-summary-reply-with-original= | =R= | =R=, =cR= |
+ | =gnus-summary-very-wide-reply= | (S W) | =cw= |
+ | =gnus-summary-very-wide-reply-with-original= | (S W) | =cW= |
+ | =gnus-summary-mail-forward= | =C-c C-f= | =C-c C-f= |
+ | =gnus-summary-first-unread-article= | (G f) | =.= |
+ | =gnus-summary-best-unread-article= | (G b) | =,= |
+ | =gnus-summary-mark-as-read-forward= | =d= | =!= |
+ | =gnus-summary-tick-article-forward= | =u=, =!= | === |
+ | =gnus-summary-goto-article= | =j= | =J= |
+ | =gnus-summary-rescan-group= | =M-g= | =gr= |
+ | =gnus-summary-edit-article= | =e= | =e= |
+ | =gnus-summary-mark-as-expirable= | =E= | =E= |
+ | =gnus-summary-limit-map= | =/= | =z/= |
+ | =gnus-summary-toggle-header= | =t= | =zt= |
+ | =gnus-summary-limit-to-unread= | =x= | =x= |
+ | =gnus-summary-browse-url= | =w= | =gX= |
+ | =gnus-summary-refer-parent-article= | =^= | =^= |
+ | =gnus-summary-refer-article= | =M-^= | =M-^= |
+ | =gnus-summary-kill-thread= | (T K) | =Tk= |
+ | =gnus-summary-lower-thread= | =M-l= | =Tl= |
+ | =gnus-summary-raise-thread= | (T I) | =Ti= |
+ | =gnus-uu-mark-thread= | (T #) | =Tm= |
+ | =gnus-uu-unmark-thread= | (T M-#) | =Tu= |
+ | =gnus-summary-toggle-threads= | =M-t= | =TT= |
+ | =gnus-summary-show-thread= | =M-s= | =Ts=, =zo= |
+ | =gnus-summary-hide-thread= | =M-h= | =Th=, =zc= |
+ | =gnus-summary-show-all-threads= | (T S) | =TS= |
+ | =gnus-summary-hide-all-threads= | (T H) | =TH= |
+ | =gnus-summary-rethread-current= | (T t) | =Tt= |
+ | =gnus-summary-reparent-thread= | (T ^) | =T^= |
+ | =gnus-summary-reparent-children= | (T M-^) | =T M-^= |
+ | =gnus-summary-next-thread= | =M-f= | =Tn= |
+ | =gnus-summary-prev-thread= | =M-b= | =Tp= |
+ | =gnus-summary-down-thread= | (T d) | =Td= |
+ | =gnus-summary-up-thread= | (T u) | =Ta= |
+ | =gnus-summary-top-thread= | (T o) | =To= |
+ | =gnus-summary-search-article-forward= | =M-s= | =M-s= |
+ | =gnus-summary-search-article-backward= | =M-r= | =M-r= |
+ | =gnus-summary-repeat-search-article-forward= | =M-S= | =M-S= |
+ | =gnus-summary-repeat-search-article-backward= | =M-R= | =M-R= |
+ | =gnus-summary-execute-command= | =&= | =&= |
+ | =gnus-summary-universal-argument= | =M-&= | =M-&= |
+ | =gnus-cache-enter-article= | =*= | =*= |
+ | =gnus-cache-remove-article= | =M-*= | =M-*= |
+ | =gnus-summary-increase-score= | =I= | =I= |
+ | =gnus-summary-lower-score= | =L= | =L= |
+
+ Grouped relocations:
+
+ - Sort (=o= prefix): =oa= author, =oc= chars, =od= date, =oi= score, =ol=
+ lines, =omd= most-recent-date, =omm= marks, =omn= most-recent-number,
+ =on= number, =oo= original, =or= random, =os= subject, =ot= recipient.
+ - Save (=O= prefix, was upstream =O=): =Oo= article, =Om= mail, =Or= rmail,
+ =Of= file, =OF= write-article-file, =Ob= body-file, =Oh= folder, =Ov= vm,
+ =Op= pipe-output, =OP= muttprint. =gnus-summary-pipe-output= is also on
+ the literal pipe key.
+ - Decode (=X= prefix): =Xu/XU/Xvu/XvU= uu, =Xs/XS/Xvs/XvS= unshar,
+ =Xp/XP/Xvp/XvP= postscript, =Xo= save, =Xb= binhex, =XY= yenc.
+ - Mail-group ops (=B= prefix): =Be= expire, =BE= expire-now, =Bd= delete,
+ =Bm= move, =Bc= copy, =Bb= crosspost, =Bi= import, =BI= create, =Br=
+ respool, =Bw= edit, =Bq= respool-query, =Bt= respool-trace, =Bp=
+ article-posted-p.
+
+*** gnus-article-mode-map
+
+ Motion-state additions:
+
+ | Command | Original | Evil |
+ |-----------------------------------------+----------+------|
+ | =gnus-article-followup-with-original= | =F= | =F= |
+ | =gnus-article-reply-with-original= | =R= | =R= |
+ | =gnus-article-wide-reply-with-original= | =W= | =W= |
+
+ Normal-state:
+
+ | Command | Original | Evil |
+ |-----------------------------------------+----------------+----------------------|
+ | =evil-window-delete= | n/a | =q=, =Q=, =ZZ=, =ZQ= |
+ | =forward-button= | =TAB= | =TAB= |
+ | =backward-button= | =<backtab>= | =<backtab>= |
+ | =gnus-article-goto-next-page= | =SPC= | =SPC= |
+ | =gnus-article-goto-prev-page= | =DEL=, =S-SPC= | =DEL=, =S-SPC= |
+ | =gnus-summary-reply= | =r= | =r=, =cr= |
+ | =gnus-article-reply-with-original= | =R= | =R= |
+ | =gnus-article-mail= | =C-c m= | =C=, =cc= |
+ | =gnus-summary-reply-with-original= | n/a | =cR= |
+ | =gnus-summary-followup= | n/a | =cf= |
+ | =gnus-summary-followup-with-original= | n/a | =cF= |
+ | =gnus-summary-very-wide-reply= | n/a | =cw= |
+ | =gnus-article-wide-reply-with-original= | n/a | =cW= |
+ | =gnus-summary-mail-forward= | =C-c C-f= | =C-c C-f= |
+ | =gnus-article-refer-article= | =C-c ^= | =C-]= |
+ | =gnus-article-show-summary= | =h=, =s= | =s= |
+ | =gnus-summary-show-article= | =g= | =gr= |
+ | =gnus-summary-browse-url= | n/a | =gX= |
+
+ Washing commands move under the =zw= prefix:
+
+ | Command | Original | Evil |
+ |-------------------------------------------+----------+--------|
+ | =gnus-summary-stop-page-breaking= | =W l= | =zwl= |
+ | =gnus-summary-caesar-message= | =W r= | =zwr= |
+ | =gnus-summary-morse-message= | =W m= | =zwm= |
+ | =gnus-summary-idna-message= | =W i= | =zwi= |
+ | =gnus-summary-toggle-header= | =t= | =zwt= |
+ | =gnus-summary-verbose-headers= | =W v= | =zwv= |
+ | =gnus-article-treat-overstrike= | =W o= | =zwo= |
+ | =gnus-article-treat-smartquotes= | =W d= | =zwd= |
+ | =gnus-article-treat-non-ascii= | =W U= | =zwu= |
+ | =gnus-article-outlook-deuglify-article= | =W Y f= | =zwyf= |
+ | =gnus-article-outlook-unwrap-lines= | =W Y u= | =zwyu= |
+ | =gnus-article-outlook-repair-attribution= | =W Y a= | =zwya= |
+ | =gnus-article-outlook-rearrange-citation= | =W Y c= | =zwyc= |
+ | =gnus-article-fill-cited-article= | =W w= | =zww= |
+ | =gnus-article-fill-long-lines= | =W Q= | =zwq= |
+ | =gnus-article-capitalize-sentences= | =W C= | =zwc= |
+ | =gnus-article-de-base64-unreadable= | =W 6= | =zw6= |
+ | =gnus-article-decode-HZ= | =W Z= | =zwz= |
+ | =gnus-article-treat-ansi-sequences= | =W A= | =zwa= |
+ | =gnus-article-add-buttons= | =W b= | =zwb= |
+ | =gnus-article-add-buttons-to-head= | =W B= | =zwB= |
+ | =gnus-article-verify-x-pgp-sig= | =W p= | =zwp= |
+ | =gnus-summary-force-verify-and-decrypt= | =W s= | =zws= |
+
+*** gnus-group-mode-map
+
+ | Command | Original | Evil |
+ |------------------------------------------+-------------+------------|
+ | =gnus-group-exit= | =q= | =q=, =ZZ= |
+ | =gnus-group-quit= | =Q= | =Q=, =ZQ= |
+ | =gnus-group-prev-unread-group= | =p= | =gk=, =[[= |
+ | =gnus-group-next-unread-group= | =n= | =gj=, =]]= |
+ | =gnus-group-next-group= | =N= | =C-j= |
+ | =gnus-group-prev-group= | =P= | =C-k= |
+ | =gnus-group-mail= | =m= | =C=, =cc= |
+ | =gnus-group-news= | =i= | =ci= |
+ | =gnus-group-first-unread-group= | =.= | =.= |
+ | =gnus-group-best-unread-group= | =,= | =,= |
+ | =gnus-activate-all-groups= | =M-g M-a= | =A= |
+ | =gnus-group-browse-foreign-server= | =B= | =B= |
+ | =gnus-group-edit-group= | =M-e= | =E= |
+ | =gnus-group-find-new-groups= | =F= | =F= |
+ | =gnus-group-jump-to-group= | =j= | =J= |
+ | =gnus-group-rename-group= | (G r) | =R= |
+ | =gnus-group-expunge-group= | (G x) | =X= |
+ | =gnus-group-select-group= | =RET= | =RET= |
+ | =gnus-group-read-group= | =SPC= | =SPC= |
+ | =gnus-group-get-new-news-this-group= | =g= | =gr= |
+ | =gnus-group-get-new-news= | =g= | =gR= |
+ | =gnus-group-unsubscribe-current-group= | =u= | =gu= |
+ | =gnus-group-unsubscribe-group= | =U= | =gU= |
+ | =gnus-group-catchup-current= | =c= | =gc= |
+ | =gnus-group-catchup-current-all= | =C= | =gC= |
+ | =gnus-group-expire-articles= | =C-c M-x= | =ge= |
+ | =gnus-group-expire-all-groups= | =C-c M-C-x= | =gE= |
+ | =gnus-group-set-current-level= | (G S l) | =gl= |
+ | =gnus-group-kill-group= | =C-k= | =dd=, =D= |
+ | =gnus-group-yank-group= | =C-y= | =p=, =P= |
+ | =gnus-group-mark-group= | =#= | =m= |
+ | =gnus-group-unmark-group= | =M-#= | =u= |
+ | =gnus-group-unmark-all-groups= | (M U) | =U= |
+ | =gnus-group-mark-buffer= | (M b) | =M=, =*= |
+ | =gnus-group-mark-regexp= | (M r) | =%= |
+ | =gnus-group-apropos= | =C-c M-a= | =s= |
+ | =gnus-group-description-apropos= | =C-c M-A= | =S= |
+ | =gnus-group-read-ephemeral-search-group= | n/a | =M-s= |
+ | =gnus-group-enter-server-mode= | =^= | =^= |
+ | =gnus-group-prev-unread-group= | =DEL= | =DEL= |
+ | =gnus-group-help-map= | =H= | =g?= |
+
+ Grouped relocations:
+
+ - Sort (=o= prefix): =oa= alphabet, =ol= level, =om= method, =on=
+ real-name, =or= rank, =os= sort, =ou= unread, =ov= score.
+ - List (=L= prefix, was upstream =A=): =L!= ticked, =L/= limit-map, =L?=
+ dormant, =La= active, =Lc= cached, =Lf= flush-map, =Lk= killed, =Ll=
+ level, =Lm= matching, =LM= all-matching, =Lp= plus-map, =Ls= groups,
+ =Lu= all-groups, =Lz= zombies.
+ - Topic (=T= prefix): =Tn= create, =Tj= jump, =Tr= rename, =Td= delete;
+ =zo= / =zc= show/hide topic. Topic sort under =To{a,u,l,v,r,m,e,s}=.
+
+*** gnus-server-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------------+----------+----------------------|
+ | =gnus-server-exit= | =q= | =q=, =Q=, =ZZ=, =ZQ= |
+ | =gnus-server-read-server= | =RET= | =RET= |
+ | =gnus-server-read-server-in-server-buffer= | =SPC= | =SPC= |
+ | =gnus-server-close-server= | =C= | =C= |
+ | =gnus-server-deny-server= | =D= | =D= |
+ | =gnus-group-make-nnir-group= | =G= | =G= |
+ | =gnus-server-set-cloud-method-server= | =I= | =I= |
+ | =gnus-server-offline-server= | =L= | =L= |
+ | =gnus-server-open-server= | =O= | =O= |
+ | =gnus-server-remove-denials= | =R= | =R= |
+ | =gnus-server-show-server= | =S= | =S= |
+ | =gnus-server-add-server= | =a= | =a= |
+ | =gnus-server-copy-server= | =c= | =y= |
+ | =gnus-server-edit-server= | =e= | =e= |
+ | =gnus-server-regenerate-server= | =g= | =gr= |
+ | =gnus-server-toggle-cloud-server= | =i= | =i= |
+ | =gnus-server-kill-server= | =k= | =d= |
+ | =gnus-server-list-servers= | =l= | =L= |
+ | =gnus-server-scan-server= | =s= | =s= |
+ | =gnus-server-yank-server= | =y= | =p= |
+ | =gnus-server-compact-server= | =z= | =c= |
+ | =gnus-server-close-all-servers= | =M-c= | =M-c= |
+ | =gnus-server-open-all-servers= | =M-o= | =M-o= |
+
+*** gnus-browse-mode-map
+
+ | Command | Original | Evil |
+ |-----------------------------------------+----------+----------------------|
+ | =gnus-browse-exit= | =q=, =l= | =q=, =Q=, =ZZ=, =ZQ= |
+ | =gnus-browse-unsubscribe-current-group= | =u= | =u= |
+ | =gnus-browse-read-group= | =SPC= | =SPC= |
+ | =gnus-browse-select-group= | =RET= | =RET= |
+
+*** gnus-bookmark-bmenu-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------------+----------+----------------------|
+ | =quit-window= | =q= | =q=, =Q=, =ZZ=, =ZQ= |
+ | =gnus-bookmark-bmenu-mark= | =m= | =m= |
+ | =gnus-bookmark-bmenu-unmark= | =u= | =u= |
+ | =gnus-bookmark-bmenu-backup-unmark= | =DEL= | =DEL= |
+ | =gnus-bookmark-bmenu-delete= | =d=, =k= | =d= |
+ | =gnus-bookmark-bmenu-execute-deletions= | =x= | =x= |
+ | =gnus-bookmark-bmenu-select= | =RET= | =RET= |
+ | =gnus-bookmark-bmenu-load= | =l= | =L= |
+ | =gnus-bookmark-bmenu-save= | =s= | =s= |
+ | =gnus-bookmark-bmenu-toggle-infos= | =t= | =t= |
+ | =gnus-bookmark-bmenu-show-details= | =a= | =a= |
+ | =gnus-bookmark-bmenu-show-all-annotations= | n/a | =A= |
+ | =gnus-bookmark-bmenu-edit-annotation= | n/a | =E= |
+ | =gnus-bookmark-bmenu-rename= | n/a | =R= |
diff --git a/.config/emacs/lisp/evil-collection/modes/gnus/evil-collection-gnus.el b/.config/emacs/lisp/evil-collection/modes/gnus/evil-collection-gnus.el
new file mode 100644
index 0000000..cc6b413
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/gnus/evil-collection-gnus.el
@@ -0,0 +1,491 @@
+;;; evil-collection-gnus.el --- Bindings for `gnus' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools, evil
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `gnus'.
+
+;;; Code:
+(require 'gnus nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-gnus-maps '(gnus-article-mode-map
+ gnus-bookmark-bmenu-mode-map
+ gnus-browse-mode-map
+ gnus-group-mode-map
+ gnus-server-mode-map
+ gnus-summary-mode-map))
+
+(defvar evil-collection-gnus-common-normal-bindings
+ '("zz" gnus-recenter)
+ "Keybindings added to all gnus normal mode-maps.
+Note that there is no gnus-common-mode-map")
+
+;;;###autoload
+(defun evil-collection-gnus-setup ()
+ "Set up `evil' bindings for `gnus'."
+
+ ;; For all gnus modes:
+ ;; - Set the initial state to 'normal
+ ;; - Inhibit insert
+ ;; - Use `evil-collection-gnus-common-normal-bindings'
+ (dolist (map evil-collection-gnus-maps)
+ (let* ((map-string (symbol-name map))
+ (mode-string (string-trim-right map-string "-map"))
+ (mode (intern mode-string)))
+ (evil-set-initial-state mode 'normal)
+ (evil-collection-inhibit-insert-state map)
+ (apply #'evil-collection-define-key 'normal map
+ evil-collection-gnus-common-normal-bindings)))
+
+ (evil-collection-define-key 'normal 'gnus-summary-mode-map
+ ;; quit
+ "Q" 'gnus-summary-exit-no-update
+ "ZQ" 'gnus-summary-exit-no-update
+ "q" 'gnus-summary-exit
+ "ZZ" 'gnus-summary-exit
+
+ "g?" 'gnus-summary-help-map
+
+ ;; motion
+ (kbd "<tab>") 'gnus-summary-widget-forward
+ (kbd "<backtab>") 'gnus-summary-widget-backward
+ (kbd "<delete>") 'gnus-summary-prev-page
+ (kbd "S-SPC") 'gnus-summary-prev-page
+ (kbd "SPC") 'gnus-summary-next-page
+ (kbd "RET") 'gnus-summary-scroll-up
+ "gk" 'gnus-summary-prev-unread-article
+ "gj" 'gnus-summary-next-unread-article
+ "[[" 'gnus-summary-prev-unread-article
+ "]]" 'gnus-summary-next-unread-article
+ "{" 'gnus-summary-prev-thread
+ "}" 'gnus-summary-next-thread
+ (kbd "C-j") 'gnus-summary-next-article
+ (kbd "C-k") 'gnus-summary-prev-article
+
+ ;; Marking
+ "m" 'gnus-summary-mark-as-processable
+ "M" 'gnus-uu-mark-buffer
+ "u" 'gnus-summary-unmark-as-processable
+ "U" 'gnus-summary-unmark-all-processable
+ "%" 'gnus-uu-mark-by-regexp
+
+ ;; Composing
+ "C" 'gnus-summary-mail-other-window
+ "cc" 'gnus-summary-mail-other-window
+ "ci" 'gnus-summary-news-other-window
+ "f" 'gnus-summary-followup
+ "F" 'gnus-summary-followup-with-original
+ "cf" 'gnus-summary-followup
+ "cF" 'gnus-summary-followup-with-original
+
+ ;; Reply
+ "r" 'gnus-summary-reply
+ "R" 'gnus-summary-reply-with-original
+ "cr" 'gnus-summary-reply
+ "cR" 'gnus-summary-reply-with-original
+ "cw" 'gnus-summary-very-wide-reply
+ "cW" 'gnus-summary-very-wide-reply-with-original
+ (kbd "C-c C-f") 'gnus-summary-mail-forward
+
+ ;; Actions, like mu4e
+ ;; Keep the following two bindings consistent with group's
+ "." 'gnus-summary-first-unread-article
+ "," 'gnus-summary-best-unread-article
+ "!" 'gnus-summary-mark-as-read-forward
+ "=" 'gnus-summary-tick-article-forward
+ "J" 'gnus-summary-goto-article
+ "gr" 'gnus-summary-rescan-group
+ "e" 'gnus-summary-edit-article
+ "E" 'gnus-summary-mark-as-expirable
+ "z/" 'gnus-summary-limit-map
+ "zt" 'gnus-summary-toggle-header
+ "x" 'gnus-summary-limit-to-unread
+ "gX" 'gnus-summary-browse-url
+
+ ;; Finding the parent
+ "^" 'gnus-summary-refer-parent-article
+ (kbd "M-^") 'gnus-summary-refer-article
+
+ ;; Sorting
+ "oa" 'gnus-summary-sort-by-author
+ "oc" 'gnus-summary-sort-by-chars
+ "od" 'gnus-summary-sort-by-date
+ "oi" 'gnus-summary-sort-by-score
+ "ol" 'gnus-summary-sort-by-lines
+ "omd" 'gnus-summary-sort-by-most-recent-date
+ "omm" 'gnus-summary-sort-by-marks
+ "omn" 'gnus-summary-sort-by-most-recent-number
+ "on" 'gnus-summary-sort-by-number
+ "oo" 'gnus-summary-sort-by-original
+ "or" 'gnus-summary-sort-by-random
+ "os" 'gnus-summary-sort-by-subject
+ "ot" 'gnus-summary-sort-by-recipient
+
+ ;; Threads commands
+ "Tk" 'gnus-summary-kill-thread
+ "Tl" 'gnus-summary-lower-thread
+ "Ti" 'gnus-summary-raise-thread
+ "Tm" 'gnus-uu-mark-thread ;; was T #
+ "Tu" 'gnus-uu-unmark-thread ;; was T M-#
+ "TT" 'gnus-summary-toggle-threads
+ "Ts" 'gnus-summary-show-thread
+ "Th" 'gnus-summary-hide-thread
+ ;; show/hide can be mapped to zo/zc
+ "zo" 'gnus-summary-show-thread
+ "zc" 'gnus-summary-hide-thread
+ "TS" 'gnus-summary-show-all-threads
+ "TH" 'gnus-summary-hide-all-threads
+ "Tt" 'gnus-summary-rethread-current
+ "T^" 'gnus-summary-reparent-thread
+ (kbd "T M-^") 'gnus-summary-reparent-children
+ "Tn" 'gnus-summary-next-thread
+ "Tp" 'gnus-summary-prev-thread
+ "Td" 'gnus-summary-down-thread ;; descend
+ "Ta" 'gnus-summary-up-thread ;; was T u, ascend also makes sense
+ "To" 'gnus-summary-top-thread
+
+ ;; Saving
+ "Oo" 'gnus-summary-save-article
+ "Om" 'gnus-summary-save-article-mail
+ "Or" 'gnus-summary-save-article-rmail
+ "Of" 'gnus-summary-save-article-file
+ "OF" 'gnus-summary-write-article-file
+ "Ob" 'gnus-summary-save-article-body-file
+ "Oh" 'gnus-summary-save-article-folder
+ "Ov" 'gnus-summary-save-article-vm
+ "Op" 'gnus-summary-pipe-output
+ "|" 'gnus-summary-pipe-output
+ "OP" 'gnus-summary-muttprint
+
+ ;; Decoding with marked articles
+ "Xu" 'gnus-uu-decode-uu
+ "XU" 'gnus-uu-decode-uu-and-save
+ "Xvu" 'gnus-uu-decode-uu-view
+ "XvU" 'gnus-uu-decode-uu-and-save-view
+ ;; Shell archives
+ "Xs" 'gnus-uu-decode-unshar
+ "XS" 'gnus-uu-decode-unshar-and-save
+ "Xvs" 'gnus-uu-decode-unshar-view
+ "XvS" 'gnus-uu-decode-unshar-and-save-view
+ ;; PostScript files
+ "Xp" 'gnus-uu-decode-postscript
+ "XP" 'gnus-uu-decode-postscript-and-save
+ "Xvp" 'gnus-uu-decode-postscript-view
+ "XvP" 'gnus-uu-decode-postscript-and-save-view
+ ;; Other files
+ "Xo" 'gnus-uu-decode-save
+ "Xb" 'gnus-uu-decode-binhex
+ "XY" 'gnus-uu-decode-yenc
+
+ ;; Mail group commands
+ "Be" 'gnus-summary-expire-articles
+ "BE" 'gnus-summary-expire-articles-now ;; was B C-M-e
+ "Bd" 'gnus-summary-delete-article ;; was B DEL
+ "Bm" 'gnus-summary-move-article
+ "Bc" 'gnus-summary-copy-article
+ "Bb" 'gnus-summary-crosspost-article ;; was B B
+ "Bi" 'gnus-summary-import-article
+ "BI" 'gnus-summary-create-article
+ "Br" 'gnus-summary-respool-article
+ "Bw" 'gnus-summary-edit-article
+ "Bq" 'gnus-summary-respool-query
+ "Bt" 'gnus-summary-respool-trace
+ "Bp" 'gnus-summary-article-posted-p
+
+ ;; Searching
+ (kbd "M-s") 'gnus-summary-search-article-forward
+ (kbd "M-r") 'gnus-summary-search-article-backward
+ (kbd "M-S") 'gnus-summary-repeat-search-article-forward
+ (kbd "M-R") 'gnus-summary-repeat-search-article-backward
+ "&" 'gnus-summary-execute-command
+ (kbd "M-&") 'gnus-summary-universal-argument
+
+ [mouse-2] 'gnus-mouse-pick-article
+ [follow-link] 'mouse-face
+
+ ;; Rest of the bindings "as is".
+ "*" 'gnus-cache-enter-article
+ (kbd "M-*") 'gnus-cache-remove-article
+ (kbd "M-i") 'gnus-symbolic-argument
+ "I" 'gnus-summary-increase-score
+ "L" 'gnus-summary-lower-score)
+
+ (evil-collection-define-key 'motion 'gnus-article-mode-map
+ "F" 'gnus-article-followup-with-original
+ "R" 'gnus-article-reply-with-original
+ "W" 'gnus-article-wide-reply-with-original)
+ (evil-collection-define-key 'normal 'gnus-article-mode-map
+ ;; quit
+ "Q" 'evil-window-delete
+ "ZQ" 'evil-window-delete
+ "q" 'evil-window-delete
+ "ZZ" 'evil-window-delete
+
+ ;; Movement
+ (kbd "TAB") 'forward-button
+ (kbd "<backtab>") 'backward-button
+ (kbd "SPC") 'gnus-article-goto-next-page
+ (kbd "DEL") 'gnus-article-goto-prev-page
+ (kbd "S-SPC") 'gnus-article-goto-prev-page
+
+ ;; Reply
+ "r" 'gnus-summary-reply
+ "R" 'gnus-article-reply-with-original ;; override `evil-replace-state'
+
+ ;; Composing
+ "C" 'gnus-article-mail
+ "cc" 'gnus-article-mail
+ "cr" 'gnus-summary-reply
+ "cR" 'gnus-summary-reply-with-original
+ "cf" 'gnus-summary-followup
+ "cF" 'gnus-summary-followup-with-original
+ "cw" 'gnus-summary-very-wide-reply
+ "cW" 'gnus-article-wide-reply-with-original
+ (kbd "C-c C-f") 'gnus-summary-mail-forward
+
+ ;; Washing
+ ;;
+ ;; List of unbound commands:
+ ;; - `gnus-article-remove-cr'
+ ;; - `gnus-article-de-quoted-unreadable'
+ ;; - `gnus-article-unsplit-urls'
+ ;; - `gnus-article-wash-html'
+ ;; - `gnus-article-strip-leading-blank-lines'
+ ;; - `gnus-article-strip-multiple-blank-lines'
+ ;; - `gnus-article-remove-trailing-blank-lines'
+ ;; - `gnus-article-strip-blank-lines'
+ ;; - `gnus-article-strip-all-blank-lines'
+ ;; - `gnus-article-strip-leading-space'
+ ;; - `gnus-article-strip-trailing-space'
+ "zwl" 'gnus-summary-stop-page-breaking
+ "zwr" 'gnus-summary-caesar-message
+ "zwm" 'gnus-summary-morse-message
+ "zwi" 'gnus-summary-idna-message
+ "zwt" 'gnus-summary-toggle-header
+ "zwv" 'gnus-summary-verbose-headers
+ "zwo" 'gnus-article-treat-overstrike
+ "zwd" 'gnus-article-treat-smartquotes
+ "zwu" 'gnus-article-treat-non-ascii ;; was W U
+ "zwyf" 'gnus-article-outlook-deuglify-article
+ "zwyu" 'gnus-article-outlook-unwrap-lines
+ "zwya" 'gnus-article-outlook-repair-attribution
+ "zwyc" 'gnus-article-outlook-rearrange-citation
+ "zww" 'gnus-article-fill-cited-article
+ "zwq" 'gnus-article-fill-long-lines ;; was W Q
+ "zwc" 'gnus-article-capitalize-sentences ;; was W C
+ "zw6" 'gnus-article-de-base64-unreadable
+ "zwz" 'gnus-article-decode-HZ ;; was W Z
+ "zwa" 'gnus-article-treat-ansi-sequences ;; was W A
+ "zwb" 'gnus-article-add-buttons
+ "zwB" 'gnus-article-add-buttons-to-head
+ "zwp" 'gnus-article-verify-x-pgp-sig
+ "zws" 'gnus-summary-force-verify-and-decrypt
+
+ ;; Actions
+ (kbd "C-]") 'gnus-article-refer-article
+ "s" 'gnus-article-show-summary
+ "gr" 'gnus-summary-show-article
+ "gX" 'gnus-summary-browse-url)
+
+ (evil-collection-define-key 'normal 'gnus-group-mode-map
+ ;; quit
+ "Q" 'gnus-group-quit
+ "ZQ" 'gnus-group-quit
+ "q" 'gnus-group-exit
+ "ZZ" 'gnus-group-exit
+
+ ;; Movement
+ "[[" 'gnus-group-prev-unread-group
+ "]]" 'gnus-group-next-unread-group
+ "gk" 'gnus-group-prev-unread-group
+ "gj" 'gnus-group-next-unread-group
+ (kbd "C-j") 'gnus-group-next-group
+ (kbd "C-k") 'gnus-group-prev-group
+
+ ;; Composing, like mu4e
+ "C" 'gnus-group-mail
+ "cc" 'gnus-group-mail
+ "ci" 'gnus-group-news
+
+ ;; Actions
+ "." 'gnus-group-first-unread-group
+ "," 'gnus-group-best-unread-group
+ "A" 'gnus-activate-all-groups
+ "B" 'gnus-group-browse-foreign-server
+ "E" 'gnus-group-edit-group
+ "F" 'gnus-group-find-new-groups
+ "J" 'gnus-group-jump-to-group
+ "R" 'gnus-group-rename-group
+ "X" 'gnus-group-expunge-group
+ (kbd "RET") 'gnus-group-select-group
+ (kbd "SPC") 'gnus-group-read-group
+ "gr" 'gnus-group-get-new-news-this-group
+ "gR" 'gnus-group-get-new-news
+ "gu" 'gnus-group-unsubscribe-current-group
+ "gU" 'gnus-group-unsubscribe-group
+ "gc" 'gnus-group-catchup-current
+ "gC" 'gnus-group-catchup-current-all
+ "ge" 'gnus-group-expire-articles
+ "gE" 'gnus-group-expire-all-groups
+ "gl" 'gnus-group-set-current-level
+
+ ;; Deleting & Pasting
+ "dd" 'gnus-group-kill-group
+ "D" 'gnus-group-kill-group
+ "p" 'gnus-group-yank-group
+ "P" 'gnus-group-yank-group
+
+ ;; Marking
+ "m" 'gnus-group-mark-group
+ "u" 'gnus-group-unmark-group
+ "U" 'gnus-group-unmark-all-groups
+ "M" 'gnus-group-mark-buffer
+ "*" 'gnus-group-mark-buffer
+ "%" 'gnus-group-mark-regexp
+
+ ;; Searching
+ "s" 'gnus-group-apropos
+ "S" 'gnus-group-description-apropos
+ (kbd "M-s") 'gnus-group-read-ephemeral-search-group
+
+ ;; Sorting
+ "oa" 'gnus-group-sort-groups-by-alphabet
+ "ol" 'gnus-group-sort-groups-by-level
+ "om" 'gnus-group-sort-groups-by-method
+ "on" 'gnus-group-sort-groups-by-real-name
+ "or" 'gnus-group-sort-groups-by-rank
+ "os" 'gnus-group-sort-groups
+ "ou" 'gnus-group-sort-groups-by-unread
+ "ov" 'gnus-group-sort-groups-by-score
+
+ ;; Listing
+ "L!" 'gnus-group-list-ticked
+ "L/" 'gnus-group-list-limit-map
+ "L?" 'gnus-group-list-dormant
+ "La" 'gnus-group-list-active ;; was A A
+ "Lc" 'gnus-group-list-cached
+ "Lf" 'gnus-group-list-flush-map
+ "Lk" 'gnus-group-list-killed
+ "Ll" 'gnus-group-list-level
+ "Lm" 'gnus-group-list-matching
+ "LM" 'gnus-group-list-all-matching
+ "Lp" 'gnus-group-list-plus-map
+ "Ls" 'gnus-group-list-groups
+ "Lu" 'gnus-group-list-all-groups
+ "Lz" 'gnus-group-list-zombies
+
+ ;; Topic commands
+ ;; `gnus-topic-move-group' can be done through dd then p
+ "Tn" 'gnus-topic-create-topic
+ "Tj" 'gnus-topic-jump-to-topic
+ "Tr" 'gnus-topic-rename
+ "Td" 'gnus-topic-delete
+ "zc" 'gnus-topic-hide-topic
+ "zo" 'gnus-topic-show-topic
+
+ ;; Topic sorting
+ "Toa" 'gnus-topic-sort-groups-by-alphabet
+ "Tou" 'gnus-topic-sort-groups-by-unread
+ "Tol" 'gnus-topic-sort-groups-by-level
+ "Tov" 'gnus-topic-sort-groups-by-score
+ "Tor" 'gnus-topic-sort-groups-by-rank
+ "Tom" 'gnus-topic-sort-groups-by-method
+ "Toe" 'gnus-group-sort-groups-by-server
+ "Tos" 'gnus-group-sort-groups
+
+ "^" 'gnus-group-enter-server-mode
+
+ (kbd "DEL") 'gnus-group-prev-unread-group
+ [mouse-2] 'gnus-mouse-pick-group
+ "g?" 'gnus-group-help-map)
+
+ (evil-collection-define-key 'normal 'gnus-server-mode-map
+ ;; quit
+ "Q" 'gnus-server-exit
+ "ZQ" 'gnus-server-exit
+ "q" 'gnus-server-exit
+ "ZZ" 'gnus-server-exit
+
+ (kbd "RET") 'gnus-server-read-server
+ (kbd "SPC") 'gnus-server-read-server-in-server-buffer
+ "C" 'gnus-server-close-server
+ "D" 'gnus-server-deny-server
+ "G" 'gnus-group-make-nnir-group
+ "I" 'gnus-server-set-cloud-method-server
+ "L" 'gnus-server-offline-server
+ "O" 'gnus-server-open-server
+ "R" 'gnus-server-remove-denials
+ "S" 'gnus-server-show-server
+ "a" 'gnus-server-add-server
+ "y" 'gnus-server-copy-server
+ "e" 'gnus-server-edit-server
+ "gr" 'gnus-server-regenerate-server
+ "i" 'gnus-server-toggle-cloud-server
+ "d" 'gnus-server-kill-server
+ "L" 'gnus-server-list-servers
+ "s" 'gnus-server-scan-server
+ "p" 'gnus-server-yank-server
+ "c" 'gnus-server-compact-server
+ "M-c" 'gnus-server-close-all-servers
+ "M-o" 'gnus-server-open-all-servers)
+
+ (evil-collection-define-key 'normal 'gnus-browse-mode-map
+ ;; quit
+ "Q" 'gnus-browse-exit
+ "ZQ" 'gnus-browse-exit
+ "q" 'gnus-browse-exit
+ "ZZ" 'gnus-browse-exit
+
+ "u" 'gnus-browse-unsubscribe-current-group
+ (kbd "SPC") 'gnus-browse-read-group
+ (kbd "RET") 'gnus-browse-select-group)
+
+ (evil-collection-define-key 'normal 'gnus-bookmark-bmenu-mode-map
+ ;; quit
+ "Q" 'quit-window
+ "ZQ" 'quit-window
+ "q" 'quit-window
+ "ZZ" 'quit-window
+
+ ;; mark and execution
+ "m" 'gnus-bookmark-bmenu-mark
+ "u" 'gnus-bookmark-bmenu-unmark
+ (kbd "DEL") 'gnus-bookmark-bmenu-backup-unmark
+ "d" 'gnus-bookmark-bmenu-delete
+ "x" 'gnus-bookmark-bmenu-execute-deletions
+
+ (kbd "RET") 'gnus-bookmark-bmenu-select
+ [mouse-2] 'gnus-bookmark-bmenu-select-by-mouse
+ "L" 'gnus-bookmark-bmenu-load
+ "s" 'gnus-bookmark-bmenu-save
+ "t" 'gnus-bookmark-bmenu-toggle-infos
+ "a" 'gnus-bookmark-bmenu-show-details
+ ;; not implemented yet
+ "A" 'gnus-bookmark-bmenu-show-all-annotations
+ "E" 'gnus-bookmark-bmenu-edit-annotation
+ "R" 'gnus-bookmark-bmenu-rename))
+
+(provide 'evil-collection-gnus)
+;;; evil-collection-gnus.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/go-mode/README.org b/.config/emacs/lisp/evil-collection/modes/go-mode/README.org
new file mode 100644
index 0000000..2b102d6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/go-mode/README.org
@@ -0,0 +1,19 @@
+* go-mode
+
+ Evil bindings for [[https://github.com/dominikh/go-mode.el][go-mode]] and =godoc-mode=.
+
+** Key bindings
+
+*** go-mode-map
+
+ | Command | Original | Evil |
+ |------------------+-----------+------|
+ | =godef-jump= | =C-c C-j= | =gd= |
+ | =godef-describe= | =C-c C-d= | =K= |
+
+*** godoc-mode-map
+
+ | Command | Original | Evil |
+ |-----------------+----------+------|
+ | =quit-window= | =q= | =q= |
+ | =describe-mode= | =h m= | =g?= |
diff --git a/.config/emacs/lisp/evil-collection/modes/go-mode/evil-collection-go-mode.el b/.config/emacs/lisp/evil-collection/modes/go-mode/evil-collection-go-mode.el
new file mode 100644
index 0000000..b423f7b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/go-mode/evil-collection-go-mode.el
@@ -0,0 +1,47 @@
+;;; evil-collection-go-mode.el --- Bindings for `go-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, golang
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `go-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'go-mode nil t)
+
+(defconst evil-collection-go-mode-maps '(go-mode-map
+ godoc-mode-map))
+
+;;;###autoload
+(defun evil-collection-go-mode-setup ()
+ "Set up `evil' bindings for `go-mode'."
+ (evil-collection-define-key 'normal 'go-mode-map
+ "gd" 'godef-jump
+ "K" 'godef-describe)
+ (evil-collection-define-key 'normal 'godoc-mode-map
+ "q" 'quit-window
+ "g?" 'describe-mode))
+
+(provide 'evil-collection-go-mode)
+;;; evil-collection-go-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/gptel/README.org b/.config/emacs/lisp/evil-collection/modes/gptel/README.org
new file mode 100644
index 0000000..903e622
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/gptel/README.org
@@ -0,0 +1,47 @@
+* gptel
+
+ Evil bindings for [[https://github.com/karthink/gptel][gptel]].
+
+ =RET= submission follows =evil-collection-repl-submit-state=: in the submit
+ state, =RET= sends; in the other state (insert when submit is normal, normal
+ when submit is insert), =RET= inserts a newline. =S-RET= behavior is
+ controlled by two customs.
+
+** Key bindings
+
+*** gptel-mode-map
+
+ Upstream only binds =C-c RET= to =gptel-send=; =RET= itself is unchanged
+ on the buffer's major mode. Evil-collection layers state-aware =RET= /
+ =S-RET= behavior on top.
+
+ | Command | Original | Evil |
+ |--------------+-----------+------------------------------------------------------------------|
+ | =gptel-send= | =C-c RET= | =C-c RET= |
+ | =gptel-send= | n/a | =RET=, =<return>= in submit state |
+ | =newline= | n/a | =S-RET=, =S-<return>= in submit state; all four in newline state |
+ | =gptel-menu= | n/a | =S-RET=, =<S-return>= in normal / visual (default) |
+ | =gptel-send= | =C-c RET= | =S-RET=, =<S-return>= in normal / visual (when menu custom nil) |
+
+*** gptel-context-buffer-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |-------------------------------+-----------+-----------|
+ | =gptel-context-next= | =n= | =j= |
+ | =gptel-context-previous= | =p= | =k= |
+ | =gptel-context-flag-deletion= | =d= | =d= |
+ | =gptel-context-quit= | =C-c C-k= | =q=, =ZQ= |
+ | =gptel-context-confirm= | =C-c C-c= | =ZZ= |
+ | =gptel-context-visit= | =RET= | =RET= |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |------------------------------------------------+---------+-----------------------------------------------------------------------------|
+ | =evil-collection-gptel-want-shift-ret-to-send= | =t= | Bind =S-RET= in normal / visual to =gptel-send=. |
+ | =evil-collection-gptel-want-shift-ret-menu= | =t= | Bind =S-RET= in normal / visual to =gptel-menu=. Wins over the send custom. |
+
+** Integrations
+
+ =gptel-context=: bindings for the context buffer (above) are wired via
+ =with-eval-after-load 'gptel-context=.
diff --git a/.config/emacs/lisp/evil-collection/modes/gptel/evil-collection-gptel.el b/.config/emacs/lisp/evil-collection/modes/gptel/evil-collection-gptel.el
new file mode 100644
index 0000000..6be9535
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/gptel/evil-collection-gptel.el
@@ -0,0 +1,82 @@
+;;; evil-collection-gptel.el --- Bindings for gptel -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>, Zhiwei Chen <condy0919@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for gptel.
+
+;;; Code:
+(require 'evil-collection)
+(require 'gptel nil t)
+
+
+(defconst evil-collection-gptel-maps
+ '(gptel-mode-map gptel-context-buffer-mode-map))
+
+(defcustom evil-collection-gptel-want-shift-ret-to-send t
+ "When non nil, S-RET sends query to LLM."
+ :group 'evil-collection
+ :type 'boolean)
+
+(defcustom evil-collection-gptel-want-shift-ret-menu t
+ "When non nil, S-RET opens calls `gptel-menu'. This takes priority over
+ `evil-collection-gptel-want-shift-ret-to-send'."
+ :group 'evil-collection
+ :type 'boolean)
+
+;;;###autoload
+(defun evil-collection-gptel-setup ()
+ "Set up `evil' bindings for gptel."
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'gptel-mode-map
+ (kbd "RET") 'gptel-send
+ (kbd "<return>") 'gptel-send
+ (kbd "S-RET") 'newline
+ (kbd "S-<return>") 'newline)
+ (evil-collection-define-key newline-state 'gptel-mode-map
+ (kbd "RET") 'newline
+ (kbd "<return>") 'newline
+ (kbd "S-RET") 'newline
+ (kbd "S-<return>") 'newline))
+ (if evil-collection-gptel-want-shift-ret-menu
+ (evil-collection-define-key '(normal visual) 'gptel-mode-map
+ (kbd "S-RET") 'gptel-menu
+ (kbd "<S-return>") 'gptel-menu)
+ (when evil-collection-gptel-want-shift-ret-to-send
+ (evil-collection-define-key '(normal visual) 'gptel-mode-map
+ (kbd "S-RET") 'gptel-send
+ (kbd "<S-return>") 'gptel-send)))
+
+ (with-eval-after-load 'gptel-context
+ (evil-collection-define-key 'normal 'gptel-context-buffer-mode-map
+ "j" 'gptel-context-next
+ "k" 'gptel-context-previous
+ "d" 'gptel-context-flag-deletion
+ "q" 'gptel-context-quit
+ "ZQ" 'gptel-context-quit
+ "ZZ" 'gptel-context-confirm
+ (kbd "RET") 'gptel-context-visit)))
+
+(provide 'evil-collection-gptel)
+;;; evil-collection-gptel.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/grep/README.org b/.config/emacs/lisp/evil-collection/modes/grep/README.org
new file mode 100644
index 0000000..cc8cc0c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/grep/README.org
@@ -0,0 +1,15 @@
+* grep
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Grep-Searching.html][grep]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------+----------+-------|
+ | =evil-search-next= | n/a | =n= |
+ | =next-error-no-select= | =n= | =C-j= |
+ | =previous-error-no-select= | =p= | =C-k= |
+
+** Integrations
+
+ - wgrep: =i= → =wgrep-change-to-wgrep-mode= when =wgrep= is available.
diff --git a/.config/emacs/lisp/evil-collection/modes/grep/evil-collection-grep.el b/.config/emacs/lisp/evil-collection/modes/grep/evil-collection-grep.el
new file mode 100644
index 0000000..bfd3eff
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/grep/evil-collection-grep.el
@@ -0,0 +1,49 @@
+;;; evil-collection-grep.el --- Bindings for `grep' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: Fredrik Bergroth <fbergroth@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `grep'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'grep)
+
+(defconst evil-collection-grep-maps '(grep-mode-map))
+
+;;;###autoload
+(defun evil-collection-grep-setup ()
+ "Set up `evil' bindings for `grep'."
+ (evil-collection-define-key 'normal 'grep-mode-map
+ "n" 'evil-search-next
+ "\C-j" 'next-error-no-select
+ "\C-k" 'previous-error-no-select)
+
+ ;; `wgrep' integration
+ (when (fboundp 'wgrep-setup)
+ (evil-collection-define-key 'normal 'grep-mode-map
+ "i" 'wgrep-change-to-wgrep-mode)))
+
+(provide 'evil-collection-grep)
+;;; evil-collection-grep.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/guix/evil-collection-guix.el b/.config/emacs/lisp/evil-collection/modes/guix/evil-collection-guix.el
new file mode 100644
index 0000000..a18b2ac
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/guix/evil-collection-guix.el
@@ -0,0 +1,217 @@
+;;; evil-collection-guix.el --- Evil bindings for Guix -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, guix, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `guix'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'guix nil t)
+
+(defconst evil-collection-guix-maps '(guix-output-list-mode-map
+ guix-package-info-mode-map
+ guix-profile-list-mode-map
+ guix-profile-info-mode-map
+ guix-generation-list-mode-map
+ guix-generation-info-mode-map
+ guix-license-list-mode-map
+ guix-license-info-mode-map
+ guix-location-list-mode-map
+ guix-hydra-build-list-mode-map
+ guix-hydra-build-info-mode-map
+ guix-build-log-mode-map
+ guix-service-list-mode-map))
+
+(defmacro evil-collection-guix-set (map)
+ "Set common bindings in MAP."
+ `(progn
+ (evil-collection-set-readonly-bindings ',map)
+ (evil-collection-define-key 'normal ',map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+
+ "gm" 'guix-apply-manifest
+
+ ;; sort
+ "o" 'bui-list-sort
+
+ ;; filter
+ "ss" 'bui-enable-filter
+ "sd" 'bui-disable-filter
+
+ ;; mark
+ "m" 'bui-list-mark
+ "M" 'bui-list-mark-all
+ "u" 'bui-list-unmark
+ "U" 'bui-list-unmark-all
+
+ (kbd "C-o") 'bui-history-back
+ (kbd "C-i") 'bui-history-forward
+
+ "g?" 'bui-show-hint
+ "gr" 'revert-buffer
+ "gR" 'bui-redisplay
+
+ ;; repl
+ "gz" 'guix-switch-to-repl)))
+
+;;;###autoload
+(defun evil-collection-guix-setup ()
+ "Set up `evil' bindings for `guix'."
+ (evil-collection-guix-set guix-ui-map) ; Covers output-list and generation-list.
+
+ (evil-collection-define-key 'normal 'guix-output-list-mode-map
+ (kbd "RET") 'bui-list-describe
+
+ "gb" 'guix-package-list-latest-builds
+ "gG" 'guix-output-list-graph
+ "gl" 'guix-output-list-lint
+ "gs" 'guix-package-list-size
+
+ "a" 'guix-output-list-mark-upgrade
+ "A" 'guix-output-list-mark-upgrades
+ "d" 'guix-output-list-mark-delete
+ "gd" 'guix-output-list-edit
+ "i" 'guix-output-list-mark-install
+
+ ;; mark
+ "x" 'guix-output-list-execute)
+
+ (evil-collection-guix-set guix-package-info-mode-map)
+ (evil-collection-define-key 'normal 'guix-package-info-mode-map
+ "gG" 'guix-package-info-graph
+ "gl" 'guix-package-info-lint
+ "gs" 'guix-package-info-size
+
+ "a" 'guix-package-info-upgrade
+ "d" 'guix-package-info-delete
+ "gd" 'guix-package-info-edit
+ "i" 'guix-package-info-install)
+
+ (evil-collection-guix-set guix-profile-list-mode-map)
+ (evil-collection-define-key 'normal 'guix-profile-list-mode-map
+ (kbd "RET") 'bui-list-describe
+
+ "c" 'guix-profile-list-set-current ; TODO: Bind to "." as per the rationale?
+ "p" 'guix-profile-list-show-packages
+ "a" 'guix-profile-list-show-generations
+ "P" 'guix-profile-list-show-search-paths)
+
+ (evil-collection-guix-set guix-profile-info-mode-map)
+ (evil-collection-define-key 'normal 'guix-profile-info-mode-map
+ "gm" 'guix-profile-info-apply-manifest
+
+ "p" 'guix-profile-info-show-packages
+ "a" 'guix-profile-info-show-generations
+ "P" 'guix-profile-info-show-search-paths
+ "c" 'guix-profile-info-set-current)
+
+ (evil-collection-define-key 'normal 'guix-generation-list-mode-map
+ (kbd "RET") 'bui-list-describe
+
+ "p" 'guix-generation-list-show-packages
+ "D" 'guix-generation-list-mark-delete
+ "P" 'guix-generation-list-show-search-paths
+ "c" 'guix-generation-list-set-current
+ "d" 'guix-generation-list-ediff
+
+ "+" 'guix-generation-list-show-added-packages
+ "-" 'guix-generation-list-show-removed-packages
+ "=" 'guix-generation-list-diff
+
+ ;; mark
+ "x" 'guix-generation-list-execute)
+
+ (evil-collection-guix-set guix-license-list-mode-map)
+ (evil-collection-define-key 'normal 'guix-license-list-mode-map
+ (kbd "<tab>") 'forward-button ; Why isn't this binding inhibited?
+ (kbd "RET") 'bui-list-describe
+
+ "p" 'guix-license-list-show-packages
+ "gd" 'guix-license-list-edit)
+
+ (evil-collection-guix-set guix-license-info-mode-map)
+
+ (evil-collection-guix-set guix-location-list-mode-map)
+ (evil-collection-define-key 'normal 'guix-location-list-mode-map
+ (kbd "RET") 'guix-location-list-show-packages ; In Emacs state, it seems to be overriden by `push-button'.
+
+ "p" 'guix-location-list-show-packages
+ "gd" 'guix-location-list-edit)
+
+ (evil-collection-guix-set guix-store-item-list-mode-map)
+ (evil-collection-define-key 'normal 'guix-store-item-list-mode-map
+ (kbd "RET") 'bui-list-describe
+ "d" 'guix-store-item-list-mark-delete
+ "gd" 'guix-store-item-list-edit
+ "x" 'guix-store-item-list-execute)
+
+ (evil-collection-guix-set guix-store-item-info-mode-map)
+
+ (evil-collection-guix-set guix-hydra-build-list-mode-map)
+ (evil-collection-define-key 'normal 'guix-hydra-build-list-mode-map
+ (kbd "RET") 'bui-list-describe
+
+ "gb" 'guix-hydra-build-list-latest-builds
+ "gl" 'guix-hydra-build-list-view-log)
+
+ (evil-collection-guix-set guix-hydra-build-info-mode-map)
+
+ (evil-collection-set-readonly-bindings 'guix-build-log-mode-map)
+ (evil-collection-define-key 'normal 'guix-build-log-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'guix-build-log-phase-toggle
+ (kbd "<backtab>") 'guix-build-log-phase-toggle-all
+
+ "gk" 'guix-build-log-previous-phase
+ "gj" 'guix-build-log-next-phase
+ "[[" 'guix-build-log-previous-phase
+ "]]" 'guix-build-log-next-phase
+ (kbd "C-k") 'guix-build-log-previous-phase
+ (kbd "C-j") 'guix-build-log-next-phase
+
+ "gr" 'revert-buffer
+
+ ;; repl
+ "gz" 'guix-switch-to-repl)
+
+ (evil-collection-guix-set guix-service-list-mode-map)
+ (evil-collection-define-key 'normal 'guix-service-list-mode-map
+ (kbd "<tab>") 'forward-button
+ (kbd "RET") 'bui-list-describe
+
+ "gd" 'guix-service-list-edit)
+
+ (evil-collection-define-key 'normal 'guix-devel-mode-map
+ ;; repl
+ "gz" 'guix-switch-to-repl))
+
+(provide 'evil-collection-guix)
+;;; evil-collection-guix.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/hackernews/evil-collection-hackernews.el b/.config/emacs/lisp/evil-collection/modes/hackernews/evil-collection-hackernews.el
new file mode 100644
index 0000000..2be994b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/hackernews/evil-collection-hackernews.el
@@ -0,0 +1,63 @@
+;;; evil-collection-hackernews.el --- Evil bindings for hackernews-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, news, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for hackernews.
+
+;;; Code:
+(require 'evil-collection)
+(require 'hackernews nil t)
+
+(defconst evil-collection-hackernews-maps '(hackernews-mode-map
+ hackernews-button-map))
+
+;;;###autoload
+(defun evil-collection-hackernews-setup ()
+ "Set up `evil' bindings for `hackernews-mode'."
+ (evil-collection-set-readonly-bindings 'hackernews-mode-map)
+ (evil-collection-define-key 'normal 'hackernews-mode-map
+ "]]" 'hackernews-next-item
+ "[[" 'hackernews-previous-item
+ "gj" 'hackernews-next-item
+ "gk" 'hackernews-previous-item
+ (kbd "C-j") 'hackernews-next-item
+ (kbd "C-k") 'hackernews-previous-item
+
+ "+" 'hackernews-load-more-stories
+
+ "gr" 'hackernews-reload
+ "gf" 'hackernews-switch-feed
+
+ (kbd "<tab>") 'hackernews-next-comment
+ (kbd "S-<tab>") 'hackernews-previous-comment
+
+ "!" 'hackernews-button-mark-as-visited ; like mu4e
+ "?" 'hackernews-button-mark-as-unvisited
+
+ (kbd "RET") 'hackernews-button-browse-internal
+ (kbd "S-<return>") 'push-button))
+
+(provide 'evil-collection-hackernews)
+;;; evil-collection-hackernews.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/helm/README.org b/.config/emacs/lisp/evil-collection/modes/helm/README.org
new file mode 100644
index 0000000..95a3946
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/helm/README.org
@@ -0,0 +1,107 @@
+* helm
+
+ Evil bindings for [[https://emacs-helm.github.io/helm/][helm]].
+
+ =M-= modifiers are preferred over =C-= so the help prefix (=C-h=) is left
+ alone. =h= and =l= are reserved for minibuffer editing in =helm-find-files=
+ and =helm-read-file-map=.
+
+** Key bindings
+
+*** helm-map (insert and normal state unless noted)
+
+ | Command | Original | Evil |
+ |----------------------------------+----------+--------------|
+ | =helm-previous-source= | =C-o= | =M-[= |
+ | =helm-next-source= | =C-o= | =M-]=, =C-o= |
+ | =helm-execute-persistent-action= | =C-j= | =M-l= |
+ | =helm-next-line= | =C-n= | =M-j=, =C-n= |
+ | =helm-previous-line= | =C-p= | =M-k=, =C-p= |
+ | =helm-next-page= | =C-v= | =C-f=, =C-v= |
+ | =helm-previous-page= | =M-v= | =C-b=, =M-v= |
+ | =helm-maybe-exit-minibuffer= | =RET= | =RET= |
+
+*** helm-map (normal state only)
+
+ | Command | Original | Evil |
+ |--------------------------------+-----------+-------------------------------------|
+ | =helm-select-action= | =TAB= | =<tab>= |
+ | =helm-previous-source= | =C-o= | =[[=, =gk= |
+ | =helm-next-source= | =C-o= | =]]=, =gj= |
+ | =helm-prev-visible-mark= | =M-(= | =(= |
+ | =helm-next-visible-mark= | =M-)= | =)= |
+ | =helm-next-line= | =C-n= | =j= |
+ | =helm-previous-line= | =C-p= | =k= |
+ | =helm-beginning-of-buffer= | =M-<= | =gg= |
+ | =helm-end-of-buffer= | =M->= | =G= |
+ | =helm-quit-and-find-file= | =C-x C-f= | =/= |
+ | =helm-refresh= | =C-c C-u= | =gr= |
+ | =helm-yank-selection= | =C-c C-y= | =yp= |
+ | =helm-copy-to-buffer= | n/a | =yP= |
+ | =helm-kill-selection-and-quit= | =C-c C-k= | =yy= |
+ | =helm-toggle-visible-mark= | =C-SPC= | =SPC= |
+ | =helm-previous-page= | =M-v= | =C-u= (when =evil-want-C-u-scroll=) |
+ | =helm-next-page= | =C-v= | =C-d= (when =evil-want-C-d-scroll=) |
+
+*** helm-find-files-map / helm-read-file-map
+
+ | Command | State | Original | Evil |
+ |-----------------------------------+----------------+----------+--------------|
+ | =helm-ff-run-switch-other-window= | normal | =C-c o= | =go= |
+ | =helm-ff-run-switch-other-window= | insert, normal | =C-c o= | =S-<return>= |
+ | =helm-ff-run-find-sh-command= | normal | =C-c /= | =/= |
+ | =helm-find-files-up-one-level= | insert, normal | =C-l= | =M-h= |
+
+*** helm-find-files-map (normal state)
+
+ | Command | Original | Evil |
+ |------------------------------------+----------+------|
+ | =helm-ff-run-ediff-file= | =C-c = | === |
+ | =helm-ff-run-query-replace-regexp= | =M-%= | =%= |
+ | =helm-ff-run-delete-file= | =M-D= | =D= |
+
+*** helm-generic-files-map
+
+ | Command | State | Original | Evil |
+ |-----------------------------------+----------------+----------+--------------|
+ | =helm-ff-run-switch-other-window= | insert, normal | =C-c o= | =S-<return>= |
+ | =helm-ff-run-switch-other-window= | normal | =C-c o= | =go= |
+
+*** helm-buffer-map
+
+ | Command | State | Original | Evil |
+ |----------------------------------------+----------------+----------+--------------|
+ | =helm-buffer-switch-other-window= | insert, normal | =C-c o= | =S-<return>= |
+ | =display-buffer= | insert, normal | n/a | =M-<return>= |
+ | =helm-buffer-switch-other-window= | normal | =C-c o= | =go= |
+ | =display-buffer= | normal | n/a | =gO= |
+ | =helm-buffer-run-ediff= | normal | =C-c = | === |
+ | =helm-buffer-run-query-replace-regexp= | normal | =M-%= | =%= |
+ | =helm-buffer-run-kill-persistent= | normal | =C-c d= | =D= |
+
+*** helm-occur-map / helm-grep-map
+
+ | Command | State | Original | Evil |
+ |---------------------------------------------------------------------+----------------+----------+--------------|
+ | =helm-occur-run-goto-line-ow= / =helm-grep-run-other-window-action= | insert, normal | =C-c o= | =S-<return>= |
+ | same as above | normal | =C-c o= | =go= |
+
+*** helm-occur-mode-map / helm-grep-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |-----------------------------------------------------+----------+-------------|
+ | =helm-occur-mode-goto-line= / =helm-grep-mode-jump= | =RET= | =RET= |
+ | =...-goto-line-ow= / =...-jump-other-window= | =C-o= | =C-o=, =go= |
+ | =...-forward= variant | =M-n= | =M-n=, =gj= |
+ | =...-backward= variant | =M-p= | =M-p=, =gk= |
+ | =helm-gm-next-file= | =M-N= | =M-N= |
+ | =helm-gm-precedent-file= | =M-P= | =M-P= |
+
+** Notes
+
+ - =helm-minibuffer-history-key= is set to =M-p= via =custom-set-variables=.
+ - =helm-default-prompt-display-function= is set so the evil cursor renders
+ correctly in helm's header line when =helm-echo-input-in-header-line= is
+ non-nil.
+ - =evil-collection-helm-hide-minibuffer-maybe= is added to
+ =helm-minibuffer-set-up-hook= to hide the minibuffer cursor in that case.
diff --git a/.config/emacs/lisp/evil-collection/modes/helm/evil-collection-helm.el b/.config/emacs/lisp/evil-collection/modes/helm/evil-collection-helm.el
new file mode 100644
index 0000000..0e82ee8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/helm/evil-collection-helm.el
@@ -0,0 +1,238 @@
+;;; evil-collection-helm.el --- Evil bindings for Helm -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, helm, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Helm.
+
+;;; Code:
+(require 'evil-collection)
+(require 'helm-files nil t) ; TODO: Check if this is the ideal requirement and if we are not loading too much.
+
+;; To navigate Helm entries with <hjkl> in insert state, we need a modifier.
+;; Using the C- modifier would conflict with the help prefix "C-h". So we use
+;; M- prefixed bindings instead.
+
+;; Helm-find-files: We cannot use "h" and "l" in normal state to navigate up and
+;; down the file system hierarchy since we need them to use it to edit the
+;; minibuffer content.
+
+(defvar helm-map)
+(defvar helm-find-files-map)
+(defvar helm-generic-files-map)
+(defvar helm-buffer-map)
+(defvar helm-occur-map)
+(defvar helm-grep-map)
+(defvar helm-read-file-map)
+(defvar helm-occur-mode-map)
+(defvar helm-grep-mode-map)
+(defvar helm-echo-input-in-header-line)
+(defvar helm--prompt)
+(defvar helm--action-prompt)
+(defvar helm-header-line-space-before-prompt)
+(defvar helm-default-prompt-display-function)
+
+(declare-function helm-window "helm-lib")
+
+(defconst evil-collection-helm-maps '(help-map
+ help-find-files-map
+ helm-read-file-map
+ helm-generic-files-map
+ helm-buffer-map
+ helm-occur-map
+ helm-grep-map))
+
+;; From https://github.com/emacs-helm/helm/issues/362.
+;; Also see https://emacs.stackexchange.com/questions/17058/change-cursor-type-in-helm-header-line#17097.
+;; TODO: With Evil, the cursor type is not right in the header line and the evil
+;; cursor remains in the minibuffer. Visual selections also reveal overlayed
+;; text.
+(with-no-warnings
+ (defun evil-collection-helm-hide-minibuffer-maybe ()
+ "Hide text in minibuffer when `helm-echo-input-in-header-line' is non-nil."
+ (when (with-current-buffer (helm-buffer-get) helm-echo-input-in-header-line)
+ (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
+ (overlay-put ov 'window (selected-window))
+ (overlay-put ov 'face (let ((bg-color (face-background 'default nil)))
+ `(:background ,bg-color :foreground ,bg-color)))
+ (setq-local cursor-type nil)))))
+
+(defun evil-collection-helm--set-prompt-display (pos)
+ (let (beg state region-active m)
+ (with-selected-window (minibuffer-window)
+ (setq beg (save-excursion (vertical-motion 0 (helm-window)) (point))
+ state evil-state
+ region-active (region-active-p)
+ m (mark t)))
+ (when region-active
+ (setq m (- m beg))
+ ;; Increment pos to handle the space before prompt (i.e `pref').
+ (put-text-property (1+ (min m pos)) (+ 2 (max m pos))
+ 'face
+ (list :background (face-background 'region))
+ header-line-format))
+ (put-text-property
+ ;; Increment pos to handle the space before prompt (i.e `pref').
+ (+ 1 pos) (+ 2 pos)
+ 'face
+ (if (eq state 'insert)
+ 'underline
+ ;; Don't just use 'cursor, this can hide the current character.
+ (list :inverse-video t
+ :foreground (face-background 'cursor)
+ :background (face-background 'default)))
+ header-line-format)))
+
+
+;;;###autoload
+(defun evil-collection-helm-setup ()
+ "Set up `evil' bindings for `helm'."
+ (add-hook 'helm-minibuffer-set-up-hook 'evil-collection-helm-hide-minibuffer-maybe)
+ (setq helm-default-prompt-display-function 'evil-collection-helm--set-prompt-display)
+ (custom-set-variables
+ '(helm-minibuffer-history-key "M-p"))
+
+ (evil-collection-define-key '(insert normal) 'helm-map
+ (kbd "M-[") 'helm-previous-source
+ (kbd "M-]") 'helm-next-source
+ (kbd "M-l") 'helm-execute-persistent-action
+ (kbd "M-j") 'helm-next-line
+ (kbd "M-k") 'helm-previous-line
+ (kbd "C-f") 'helm-next-page
+ (kbd "C-b") 'helm-previous-page)
+
+ (dolist (map '(helm-find-files-map helm-read-file-map))
+ (evil-collection-define-key 'normal map
+ "go" 'helm-ff-run-switch-other-window
+ "/" 'helm-ff-run-find-sh-command)
+ (evil-collection-define-key '(insert normal) map
+ (kbd "S-<return>") 'helm-ff-run-switch-other-window
+ (kbd "M-h") 'helm-find-files-up-one-level))
+
+ ;; TODO: Change the Helm header to display "M-l" instead of "C-l". We don't
+ ;; want to modify the Emacs Helm map.
+
+ (evil-collection-define-key '(insert normal) 'helm-generic-files-map
+ (kbd "S-<return>") 'helm-ff-run-switch-other-window)
+
+ (evil-collection-define-key '(insert normal) 'helm-buffer-map
+ (kbd "S-<return>") 'helm-buffer-switch-other-window
+ (kbd "M-<return>") 'display-buffer)
+
+ (evil-collection-define-key '(insert normal) 'helm-occur-map
+ (kbd "S-<return>") 'helm-occur-run-goto-line-ow)
+
+ (evil-collection-define-key '(insert normal) 'helm-grep-map
+ (kbd "S-<return>") 'helm-grep-run-other-window-action)
+
+ (evil-collection-define-key 'normal 'helm-generic-files-map
+ "go" 'helm-ff-run-switch-other-window)
+
+ (evil-collection-define-key 'normal 'helm-buffer-map
+ "go" 'helm-buffer-switch-other-window
+ "gO" 'display-buffer
+ "=" 'helm-buffer-run-ediff
+ "%" 'helm-buffer-run-query-replace-regexp
+ "D" 'helm-buffer-run-kill-persistent ; Ivy has "D".
+ )
+
+ (evil-collection-define-key 'normal 'helm-occur-map
+ "go" 'helm-occur-run-goto-line-ow)
+
+ (evil-collection-define-key 'normal 'helm-grep-map
+ "go" 'helm-grep-run-other-window-action)
+
+ (evil-collection-define-key 'normal 'helm-find-files-map
+ "=" 'helm-ff-run-ediff-file
+ "%" 'helm-ff-run-query-replace-regexp
+ "D" 'helm-ff-run-delete-file) ; Ivy has "D".
+
+ ;; These helm bindings should always exist, the evil equivalents do
+ ;; nothing useful in the minibuffer (error or pure failure).
+ ;; RET can't do a second line in the minibuffer.
+ ;; The C-n/C-p completions error with 'helm in helm' session.
+ ;; C-o switches to evil state (again, not useful).
+ (evil-collection-define-key '(insert normal) 'helm-map
+ (kbd "RET") 'helm-maybe-exit-minibuffer
+ (kbd "M-v") 'helm-previous-page
+ (kbd "C-v") 'helm-next-page
+ (kbd "C-p") 'helm-previous-line
+ (kbd "C-n") 'helm-next-line
+ (kbd "C-o") 'helm-next-source)
+
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'normal 'helm-map
+ (kbd "C-u") 'helm-previous-page))
+
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'normal 'helm-map
+ (kbd "C-d") 'helm-next-page))
+
+ (evil-collection-define-key 'normal 'helm-map
+ (kbd "<tab>") 'helm-select-action ; TODO: Ivy has "ga".
+ (kbd "[[") 'helm-previous-source
+ (kbd "]]") 'helm-next-source
+ "gk" 'helm-previous-source
+ "gj" 'helm-next-source
+ (kbd "(") 'helm-prev-visible-mark
+ (kbd ")") 'helm-next-visible-mark
+ "j" 'helm-next-line
+ "k" 'helm-previous-line
+ "gg" 'helm-beginning-of-buffer
+ "G" 'helm-end-of-buffer
+
+ "/" 'helm-quit-and-find-file
+
+ ;; refresh
+ "gr" 'helm-refresh
+
+ "yp" 'helm-yank-selection
+ "yP" 'helm-copy-to-buffer
+ "yy" 'helm-kill-selection-and-quit
+ (kbd "SPC") 'helm-toggle-visible-mark)
+
+ (evil-collection-define-key 'normal 'helm-occur-mode-map
+ (kbd "RET") 'helm-occur-mode-goto-line
+ (kbd "C-o") 'helm-occur-mode-goto-line-ow
+ (kbd "M-n") 'helm-occur-mode-goto-line-ow-forward
+ (kbd "M-p") 'helm-occur-mode-goto-line-ow-backward
+ "go" 'helm-occur-mode-goto-line-ow
+ "gj" 'helm-occur-mode-goto-line-ow-forward
+ "gk" 'helm-occur-mode-goto-line-ow-backward
+ (kbd "M-N") 'helm-gm-next-file
+ (kbd "M-P") 'helm-gm-precedent-file)
+
+ (evil-collection-define-key 'normal 'helm-grep-mode-map
+ (kbd "RET") 'helm-grep-mode-jump
+ (kbd "C-o") 'helm-grep-mode-jump-other-window
+ (kbd "M-n") 'helm-grep-mode-jump-other-window-forward
+ (kbd "M-p") 'helm-grep-mode-jump-other-window-backward
+ "go" 'helm-grep-mode-jump-other-window
+ "gj" 'helm-grep-mode-jump-other-window-forward
+ "gk" 'helm-grep-mode-jump-other-window-backward
+ (kbd "M-N") 'helm-gm-next-file
+ (kbd "M-P") 'helm-gm-precedent-file))
+
+(provide 'evil-collection-helm)
+;;; evil-collection-helm.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/help/README.org b/.config/emacs/lisp/evil-collection/modes/help/README.org
new file mode 100644
index 0000000..ab65337
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/help/README.org
@@ -0,0 +1,23 @@
+* help
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Help-Mode.html][help-mode]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------------+----------------+----------------------|
+ | =scroll-up-command= | =SPC= | =SPC=, =C-f= |
+ | =scroll-down-command= | =S-SPC=, =DEL= | =S-SPC=, =C-b= |
+ | =forward-button= | =TAB= | =TAB=, =g TAB=, =g]= |
+ | =backward-button= | =S-TAB= | =S-TAB=, =g[= |
+ | =help-go-back= | =l= | =C-o=, =<= |
+ | =help-go-forward= | =r= | =C-i=, =>= |
+ | =push-button= | n/a | =go=, =gO= |
+ | =describe-mode= | =h=, =?= | =g?= |
+ | =revert-buffer= | =g= | =gr= |
+ | =help-follow= | n/a | =r= |
+ | =help-view-source= | =s= | =s= |
+ | =help-goto-info= | =i= | =i= |
+ | =help-customize= | =c= | =c= |
+
+ The last three require Emacs 28+.
diff --git a/.config/emacs/lisp/evil-collection/modes/help/evil-collection-help.el b/.config/emacs/lisp/evil-collection/modes/help/evil-collection-help.el
new file mode 100644
index 0000000..6616bac
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/help/evil-collection-help.el
@@ -0,0 +1,80 @@
+;;; evil-collection-help.el --- Evil bindings for help-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, help, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `help-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'help-mode)
+
+(defconst evil-collection-help-maps '(help-mode-map))
+
+;;;###autoload
+(defun evil-collection-help-setup ()
+ "Set up `evil' bindings for `help'."
+ (evil-set-initial-state 'help-mode 'normal)
+ (evil-collection-set-readonly-bindings 'help-mode-map)
+ (evil-collection-define-key 'normal 'help-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "C-f") 'scroll-up-command
+ (kbd "C-b") 'scroll-down-command
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+ ;; This exists because <tab> is recognized as C-i on terminals.
+ (kbd "g TAB") 'forward-button
+ "g]" 'forward-button
+ "g[" 'backward-button
+
+ (kbd "C-o") 'help-go-back
+ (kbd "C-i") 'help-go-forward
+
+ ;; TODO: Enable more help-go-* bindings?
+ ;; "gj" 'help-go-forward
+ ;; "gk" 'help-go-back
+ ;; "\C-j" 'help-go-forward
+ ;; "\C-k" 'help-go-back
+
+ ;; The following bindings don't do what they are supposed to. "go" should open
+ ;; in the same window and "gO" should open in a different one.
+ "go" 'push-button
+ "gO" 'push-button
+
+ "g?" 'describe-mode
+ "gr" 'revert-buffer
+ "<" 'help-go-back
+ ">" 'help-go-forward
+ "r" 'help-follow)
+
+ (when (>= emacs-major-version 28)
+ (evil-collection-define-key 'normal 'help-mode-map
+ "s" 'help-view-source
+ "i" 'help-goto-info
+ "c" 'help-customize)))
+
+(provide 'evil-collection-help)
+;;; evil-collection-help.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/helpful/README.org b/.config/emacs/lisp/evil-collection/modes/helpful/README.org
new file mode 100644
index 0000000..8d41b3d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/helpful/README.org
@@ -0,0 +1,19 @@
+* helpful
+
+ Evil bindings for [[https://github.com/Wilfred/helpful][helpful]].
+
+ Standard motion / quit bindings come from =evil-collection-set-readonly-bindings=
+ and are not repeated below.
+
+** Key bindings
+
+*** helpful-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |---------------------------+-------------+-------------|
+ | =forward-button= | =TAB=, =n= | =<tab>= |
+ | =backward-button= | =<backtab>= | =<backtab>= |
+ | =helpful-visit-reference= | =RET= | =RET= |
+ | =push-button= | n/a | =go=, =gO= |
+ | =describe-mode= | n/a | =g?= |
+ | =helpful-update= | =g= | =gr= |
diff --git a/.config/emacs/lisp/evil-collection/modes/helpful/evil-collection-helpful.el b/.config/emacs/lisp/evil-collection/modes/helpful/evil-collection-helpful.el
new file mode 100644
index 0000000..58b8af7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/helpful/evil-collection-helpful.el
@@ -0,0 +1,54 @@
+;;; evil-collection-helpful.el --- Evil bindings for helpful-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, help, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `helpful-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'helpful nil t)
+
+(defconst evil-collection-helpful-maps '(helpful-mode-map))
+
+;;;###autoload
+(defun evil-collection-helpful-setup ()
+ "Set up `evil' bindings for `helpful'."
+ (evil-collection-set-readonly-bindings 'helpful-mode-map)
+ (evil-collection-define-key 'normal 'helpful-mode-map
+ ;; motion
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+ (kbd "RET") 'helpful-visit-reference
+
+ ;; The following bindings don't do what they are supposed to. "go" should open
+ ;; in the same window and "gO" should open in a different one.
+ "go" 'push-button
+ "gO" 'push-button
+
+ "g?" 'describe-mode
+ "gr" 'helpful-update))
+
+(provide 'evil-collection-helpful)
+;;; evil-collection-helpful.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/hg-histedit/evil-collection-hg-histedit.el b/.config/emacs/lisp/evil-collection/modes/hg-histedit/evil-collection-hg-histedit.el
new file mode 100644
index 0000000..6ee6f74
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/hg-histedit/evil-collection-hg-histedit.el
@@ -0,0 +1,49 @@
+;;; evil-collection-hg-histedit.el --- Bindings for `hg-histedit' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `hg-histedit'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'hg-histedit nil t)
+
+(defconst evil-collection-hg-histedit-maps '(hg-histedit-mode-map))
+
+;;;###autoload
+(defun evil-collection-hg-histedit-setup ()
+ "Set up `evil' bindings for `hg-histedit'."
+ (evil-collection-define-key 'normal 'hg-histedit-mode-map
+ "e" 'hg-histedit-modify-commit-with-edit
+ "m" 'hg-histedit-modify-commit-with-mess
+ "p" 'hg-histedit-modify-commit-with-pick
+ "b" 'hg-histedit-modify-commit-with-base
+ "d" 'hg-histedit-modify-commit-with-drop
+ "f" 'hg-histedit-modify-commit-with-fold
+ "r" 'hg-histedit-modify-commit-with-roll
+ "u" 'hg-histedit-undo))
+
+(provide 'evil-collection-hg-histedit)
+;;; evil-collection-hg-histedit.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/hideshow/README.org b/.config/emacs/lisp/evil-collection/modes/hideshow/README.org
new file mode 100644
index 0000000..5599606
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/hideshow/README.org
@@ -0,0 +1,11 @@
+* hideshow
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Hideshow.html][hideshow]] (=hs-minor-mode=). Standard fold operations
+ (=zo=, =zc=, =zr=, =zm=, =zR=, =zM=, =za=) are provided by evil itself via
+ =evil-fold-list=; this module adds the missing level-hide binding.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------+-------------+------|
+ | =hs-hide-level= | =C-c @ C-l= | =zL= |
diff --git a/.config/emacs/lisp/evil-collection/modes/hideshow/evil-collection-hideshow.el b/.config/emacs/lisp/evil-collection/modes/hideshow/evil-collection-hideshow.el
new file mode 100644
index 0000000..ba27d84
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/hideshow/evil-collection-hideshow.el
@@ -0,0 +1,45 @@
+;;; evil-collection-hideshow --- Bindings for `hideshow' -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2025 Julian Hoch
+
+;; Author: Julian Hoch <julianhoch@web.de>
+;; Maintainer: Julian Hoch <julianhoch@web.de>
+;; Created: 2025-09-27
+;; Keywords: evil, emacs, tools
+;; URL: https://github.com/emacs-evil/evil-collection
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `hideshow'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'hideshow nil t)
+
+(declare-function hs-hide-level "hideshow")
+(defvar hs-minor-mode-map)
+(defconst evil-collection-hideshow-maps '(hs-minor-mode-map))
+
+;;;###autoload
+(defun evil-collection-hideshow-setup ()
+ "Set up `evil' bindings for `hideshow'."
+ (evil-set-initial-state 'hs-minor-mode 'normal)
+ (evil-collection-define-key 'normal 'hs-minor-mode-map
+ "zL" 'hs-hide-level))
+
+(provide 'evil-collection-hideshow)
+;;; evil-collection-hideshow.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/hungry-delete/evil-collection-hungry-delete.el b/.config/emacs/lisp/evil-collection/modes/hungry-delete/evil-collection-hungry-delete.el
new file mode 100644
index 0000000..10b9b4c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/hungry-delete/evil-collection-hungry-delete.el
@@ -0,0 +1,60 @@
+;;; evil-collection-hungry-delete.el --- Bindings for `hungry-delete' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, hungry-delete, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `hungry-delete'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'hungry-delete nil t)
+
+(defconst evil-collection-hungry-delete-maps '(hungry-delete-mode-map))
+
+(defun evil-collection-hungry-delete (f &rest args)
+ "Wrapper function to run `hungry-delete-backward' if
+`hungry-delete-mode' is on."
+ (if (and (bound-and-true-p hungry-delete-mode)
+ (fboundp 'hungry-delete-backward))
+ (hungry-delete-backward 1)
+ (apply f args)))
+
+(defun evil-collection-hungry-delete-for-join (f &rest args)
+ "Wrapper function to run `hungry-delete-backward' if
+`hungry-delete-mode' is on."
+ (if (and (bound-and-true-p hungry-delete-mode)
+ (fboundp 'hungry-delete-backward))
+ (hungry-delete-backward 1)
+ (funcall f args)))
+
+;;;###autoload
+(defun evil-collection-hungry-delete-setup ()
+ "Set up `evil' bindings for `hungry-delete'."
+ (advice-add 'evil-delete-backward-char
+ :around #'evil-collection-hungry-delete)
+ (advice-add 'evil-delete-backward-char-and-join
+ :around #'evil-collection-hungry-delete-for-join))
+
+(provide 'evil-collection-hungry-delete)
+;;; evil-collection-hungry-delete.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/hyrolo/evil-collection-hyrolo.el b/.config/emacs/lisp/evil-collection/modes/hyrolo/evil-collection-hyrolo.el
new file mode 100644
index 0000000..2dd0033
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/hyrolo/evil-collection-hyrolo.el
@@ -0,0 +1,32 @@
+;;; evil-collection-hyrolo.el --- Bindings for `hyrolo' -*- lexical-binding: t -*-
+
+;;; Commentary:
+;;; Bindings for hyrolo.
+
+;;; Code:
+(require 'evil-collection)
+(require 'hyperbole nil t)
+
+(defvar hyrolo-mode-map)
+(defconst evil-collection-hyrolo-maps '(hyrolo-mode-map))
+
+(declare-function hyrolo-to-previous-loc "hyrolo")
+(declare-function hyrolo-to-next-loc "hyrolo")
+(declare-function hyrolo-overview "hyrolo")
+(declare-function hyrolo-outline-show-all "hyrolo")
+
+(defun evil-collection-hyrolo-setup ()
+ "Set up `evil' bindings for hyrolo."
+ (evil-collection-define-key 'normal 'hyrolo-mode-map
+ (kbd "[[") #'hyrolo-to-previous-loc
+ (kbd "]]") #'hyrolo-to-next-loc
+ (kbd "C-k") #'hyrolo-to-previous-loc
+ (kbd "C-j") #'hyrolo-to-next-loc
+ (kbd "gk") #'hyrolo-to-previous-loc
+ (kbd "gj") #'hyrolo-to-next-loc
+ (kbd "zo") #'hyrolo-outline-show-all
+ (kbd "zc") #'hyrolo-overview)
+ (evil-set-initial-state 'hyrolo-mode 'normal))
+
+(provide 'evil-collection-hyrolo)
+;;; evil-collection-hyrolo.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ibuffer/README.org b/.config/emacs/lisp/evil-collection/modes/ibuffer/README.org
new file mode 100644
index 0000000..b4f7fc5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ibuffer/README.org
@@ -0,0 +1,60 @@
+* ibuffer
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Ibuffer.html][IBuffer]].
+
+** Key bindings
+
+ Most marking, filtering, and operate-on-marked commands keep their default
+ ibuffer keys. The table below covers what evil-collection relocates.
+
+ | Command | Original | Evil |
+ |----------------------------------------------+-----------------+--------------------------------------------|
+ | =ibuffer-forward-line= | =n= | (default) |
+ | =ibuffer-backward-line= | =p= | (default) |
+ | =ibuffer-forward-line= (g-prefix) | n/a | =gj= |
+ | =ibuffer-backward-line= (g-prefix) | n/a | =gk= |
+ | =ibuffer-update= | =g= | =gr= |
+ | =ibuffer-redisplay= | =l= | =gR= |
+ | =ibuffer-jump-to-buffer= | =j=, =M-g= | =J=, =M-g= |
+ | =ibuffer-visit-buffer= | =RET=, =e=, =f= | =RET= |
+ | =ibuffer-visit-buffer-other-window= | =o= | =go= |
+ | =ibuffer-visit-buffer-other-window-noselect= | =C-o= | =C-o= |
+ | =ibuffer-visit-buffer-1-window= | =M-o= | =M-o= |
+ | =ibuffer-do-view= | =A=, =v= | =A=, =gv= |
+ | =ibuffer-do-view-horizontally= | =C-x v= | =gV= |
+ | =ibuffer-mark-forward= | =m= | =m= |
+ | =ibuffer-unmark-forward= | =u= | =u= |
+ | =ibuffer-unmark-backward= | =DEL= | =DEL= |
+ | =ibuffer-toggle-marks= | =t= | =t=, =~= |
+ | =ibuffer-unmark-all-marks= | =U= | =U= |
+ | =ibuffer-unmark-all= | =M-DEL= | =M-DEL= |
+ | =ibuffer-mark-for-delete= | =d= | =d= |
+ | =ibuffer-mark-for-delete-backwards= | =C-d= | =C-d= (when =evil-want-C-d-scroll= is nil) |
+ | =ibuffer-do-kill-on-deletion-marks= | =x= | =x= |
+ | =ibuffer-do-kill-lines= | =k= | =K= |
+ | =ibuffer-bury-buffer= | =b= | =X= |
+ | =ibuffer-kill-line= | =C-k= | =gx= |
+ | =ibuffer-yank= | =C-y= | =C-y= |
+ | =ibuffer-copy-filename-as-kill= | =w= | =yf= |
+ | =ibuffer-copy-buffername-as-kill= | =B= | =yb= |
+ | =ibuffer-diff-with-file= | === | === |
+ | =ibuffer-toggle-sorting-mode= | =,= | =,= |
+ | =ibuffer-invert-sorting= | =s i= | =o i= |
+ | =ibuffer-do-sort-by-alphabetic= | =s a= | =o a= |
+ | =ibuffer-do-sort-by-recency= | =s v= | =o v= |
+ | =ibuffer-do-sort-by-size= | =s s= | =o s= |
+ | =ibuffer-do-sort-by-filename/process= | =s f= | =o f= |
+ | =ibuffer-do-sort-by-major-mode= | =s m= | =o m= |
+ | =ibuffer-forward-filter-group= | =M-n=, =TAB= | =C-j=, =M-n=, =]]=, =TAB= |
+ | =ibuffer-backward-filter-group= | =M-p=, =S-TAB= | =C-k=, =M-p=, =[[=, =S-TAB= |
+ | =ibuffer-jump-to-filter-group= | =M-j= | =M-j= |
+ | =ibuffer-forward-next-marked= | =M-}= | =}=, =M-}= |
+ | =ibuffer-backwards-next-marked= | =M-{= | ={=, =M-{= |
+ | =ibuffer-switch-format= | =`= | =`= |
+ | =ibuffer-add-to-tmp-show= | =+= | =+= |
+ | =ibuffer-add-to-tmp-hide= | =-= | =-= |
+ | =quit-window= | =q= | =q=, =ZZ=, =ZQ= |
+
+ Operate-on-marked uppercase keys (=D=, =E=, =F=, =H=, =I=, =M=, =N=, =O=,
+ =P=, =Q=, =R=, =S=, =T=, =V=, =W=), the =% =, =* =, =s = (filter) and
+ =/ = prefixes keep their default ibuffer behavior.
diff --git a/.config/emacs/lisp/evil-collection/modes/ibuffer/evil-collection-ibuffer.el b/.config/emacs/lisp/evil-collection/modes/ibuffer/evil-collection-ibuffer.el
new file mode 100644
index 0000000..ccca359
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ibuffer/evil-collection-ibuffer.el
@@ -0,0 +1,197 @@
+;;; evil-collection-ibuffer.el --- Evil bindings for IBuffer -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ibuffer, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for IBuffer.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ibuffer)
+
+(defconst evil-collection-ibuffer-maps '(ibuffer-mode-map))
+
+;;;###autoload
+(defun evil-collection-ibuffer-setup ()
+ "Set up `evil' bindings for `ibuffer'."
+ (evil-set-initial-state 'ibuffer-mode 'normal)
+
+ (evil-collection-define-key 'normal 'ibuffer-mode-map
+ (kbd "C-d") (if evil-want-C-d-scroll
+ 'evil-scroll-down
+ 'ibuffer-mark-for-delete-backwards))
+
+ (evil-collection-define-key 'normal 'ibuffer-mode-map
+ (kbd "=") 'ibuffer-diff-with-file
+ (kbd "J") 'ibuffer-jump-to-buffer
+ (kbd "M-g") 'ibuffer-jump-to-buffer
+ (kbd "M-s a C-s") 'ibuffer-do-isearch
+ (kbd "M-s a M-C-s") 'ibuffer-do-isearch-regexp
+ (kbd "M-s a C-o") 'ibuffer-do-occur
+
+ ;; mark
+ (kbd "m") 'ibuffer-mark-forward
+ (kbd "~") 'ibuffer-toggle-marks
+ (kbd "u") 'ibuffer-unmark-forward
+ (kbd "DEL") 'ibuffer-unmark-backward
+ (kbd "M-DEL") 'ibuffer-unmark-all
+ (kbd "* *") 'ibuffer-mark-special-buffers
+ (kbd "* c") 'ibuffer-change-marks
+ (kbd "U") 'ibuffer-unmark-all-marks
+ (kbd "* M") 'ibuffer-mark-by-mode
+ (kbd "* m") 'ibuffer-mark-modified-buffers
+ (kbd "* u") 'ibuffer-mark-unsaved-buffers
+ (kbd "* s") 'ibuffer-mark-special-buffers
+ (kbd "* r") 'ibuffer-mark-read-only-buffers
+ (kbd "* /") 'ibuffer-mark-dired-buffers
+ (kbd "* e") 'ibuffer-mark-dissociated-buffers
+ (kbd "* h") 'ibuffer-mark-help-buffers
+ (kbd "* z") 'ibuffer-mark-compressed-file-buffers
+ (kbd ".") 'ibuffer-mark-old-buffers
+
+ (kbd "d") 'ibuffer-mark-for-delete
+ (kbd "x") 'ibuffer-do-kill-on-deletion-marks
+
+ ;; immediate operations
+ (kbd "gj") 'ibuffer-forward-line
+ (kbd "gk") 'ibuffer-backward-line
+
+ (kbd "}") 'ibuffer-forward-next-marked
+ (kbd "{") 'ibuffer-backwards-next-marked
+ (kbd "M-}") 'ibuffer-forward-next-marked
+ (kbd "M-{") 'ibuffer-backwards-next-marked
+
+ (kbd "gR") 'ibuffer-redisplay
+ (kbd "gr") 'ibuffer-update
+
+ "`" 'ibuffer-switch-format
+ "-" 'ibuffer-add-to-tmp-hide
+ "+" 'ibuffer-add-to-tmp-show
+ "X" 'ibuffer-bury-buffer
+ (kbd ",") 'ibuffer-toggle-sorting-mode
+ (kbd "o i") 'ibuffer-invert-sorting
+ (kbd "o a") 'ibuffer-do-sort-by-alphabetic
+ (kbd "o v") 'ibuffer-do-sort-by-recency
+ (kbd "o s") 'ibuffer-do-sort-by-size
+ (kbd "o f") 'ibuffer-do-sort-by-filename/process
+ (kbd "o m") 'ibuffer-do-sort-by-major-mode
+
+ (kbd "s RET") 'ibuffer-filter-by-mode
+ (kbd "s m") 'ibuffer-filter-by-used-mode
+ (kbd "s M") 'ibuffer-filter-by-derived-mode
+ (kbd "s n") 'ibuffer-filter-by-name
+ (kbd "s *") 'ibuffer-filter-by-starred-name
+ (kbd "s f") 'ibuffer-filter-by-filename
+ (kbd "s b") 'ibuffer-filter-by-basename
+ (kbd "s .") 'ibuffer-filter-by-file-extension
+ (kbd "s <") 'ibuffer-filter-by-size-lt
+ (kbd "s >") 'ibuffer-filter-by-size-gt
+ (kbd "s i") 'ibuffer-filter-by-modified
+ (kbd "s v") 'ibuffer-filter-by-visiting-file
+ (kbd "s c") 'ibuffer-filter-by-content
+ (kbd "s e") 'ibuffer-filter-by-predicate
+
+ (kbd "s r") 'ibuffer-switch-to-saved-filters
+ (kbd "s a") 'ibuffer-add-saved-filters
+ (kbd "s x") 'ibuffer-delete-saved-filters
+ (kbd "s d") 'ibuffer-decompose-filter
+ (kbd "s s") 'ibuffer-save-filters
+ (kbd "s p") 'ibuffer-pop-filter
+ (kbd "s <up>") 'ibuffer-pop-filter
+ (kbd "s !") 'ibuffer-negate-filter
+ (kbd "s t") 'ibuffer-exchange-filters
+ (kbd "s TAB") 'ibuffer-exchange-filters
+ (kbd "s o") 'ibuffer-or-filter
+ (kbd "s |") 'ibuffer-or-filter
+ (kbd "s &") 'ibuffer-and-filter
+ (kbd "s g") 'ibuffer-filters-to-filter-group
+ (kbd "s P") 'ibuffer-pop-filter-group
+ (kbd "s S-<up>") 'ibuffer-pop-filter-group
+ (kbd "s D") 'ibuffer-decompose-filter-group
+ (kbd "s /") 'ibuffer-filter-disable
+
+ (kbd "C-j") 'ibuffer-forward-filter-group
+ (kbd "M-n") 'ibuffer-forward-filter-group
+ (kbd "]]") 'ibuffer-forward-filter-group
+ "\t" 'ibuffer-forward-filter-group
+ (kbd "M-p") 'ibuffer-backward-filter-group
+ (kbd "C-k") 'ibuffer-backward-filter-group
+ (kbd "[[") 'ibuffer-backward-filter-group
+ [backtab] 'ibuffer-backward-filter-group
+ (kbd "M-j") 'ibuffer-jump-to-filter-group
+ (kbd "gx") 'ibuffer-kill-line
+ (kbd "C-y") 'ibuffer-yank
+ (kbd "s S") 'ibuffer-save-filter-groups
+ (kbd "s R") 'ibuffer-switch-to-saved-filter-groups
+ (kbd "s X") 'ibuffer-delete-saved-filter-groups
+ (kbd "s \\") 'ibuffer-clear-filter-groups
+
+ (kbd "% n") 'ibuffer-mark-by-name-regexp
+ (kbd "% m") 'ibuffer-mark-by-mode-regexp
+ (kbd "% f") 'ibuffer-mark-by-file-name-regexp
+ (kbd "% g") 'ibuffer-mark-by-content-regexp
+ (kbd "% L") 'ibuffer-mark-by-locked
+
+ (kbd "C-t") 'ibuffer-visit-tags-table
+
+ (kbd "|") 'ibuffer-do-shell-command-pipe
+ (kbd "!") 'ibuffer-do-shell-command-file
+ (kbd "t") 'ibuffer-toggle-marks
+ ;; marked operations
+ (kbd "A") 'ibuffer-do-view
+ (kbd "D") 'ibuffer-do-delete
+ (kbd "E") 'ibuffer-do-eval
+ (kbd "F") 'ibuffer-do-shell-command-file
+ (kbd "I") 'ibuffer-do-query-replace-regexp
+ (kbd "H") 'ibuffer-do-view-other-frame
+ (kbd "N") 'ibuffer-do-shell-command-pipe-replace
+ (kbd "M") 'ibuffer-do-toggle-modified
+ (kbd "O") 'ibuffer-do-occur
+ (kbd "P") 'ibuffer-do-print
+ (kbd "Q") 'ibuffer-do-query-replace
+ (kbd "R") 'ibuffer-do-rename-uniquely
+ (kbd "S") 'ibuffer-do-save
+ (kbd "T") 'ibuffer-do-toggle-read-only
+ (kbd "r") 'ibuffer-do-replace-regexp
+ (kbd "V") 'ibuffer-do-revert
+ (kbd "W") 'ibuffer-do-view-and-eval
+
+ (kbd "K") 'ibuffer-do-kill-lines
+ (kbd "yf") 'ibuffer-copy-filename-as-kill
+ (kbd "yb") 'ibuffer-copy-buffername-as-kill
+
+ (kbd "RET") 'ibuffer-visit-buffer
+ (kbd "go") 'ibuffer-visit-buffer-other-window
+ (kbd "C-o") 'ibuffer-visit-buffer-other-window-noselect
+ (kbd "M-o") 'ibuffer-visit-buffer-1-window
+ (kbd "gv") 'ibuffer-do-view
+ (kbd "gV") 'ibuffer-do-view-horizontally
+
+ ;; Quit
+ "q" 'quit-window
+ "ZZ" 'quit-window
+ "ZQ" 'quit-window))
+
+(provide 'evil-collection-ibuffer)
+;;; evil-collection-ibuffer.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ielm/README.org b/.config/emacs/lisp/evil-collection/modes/ielm/README.org
new file mode 100644
index 0000000..f7ce241
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ielm/README.org
@@ -0,0 +1,22 @@
+* ielm
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Lisp-Interaction.html][IELM]] (Inferior Emacs Lisp Mode).
+
+ Initial state is =insert=. =RET= sends input in the state named by
+ =evil-collection-repl-submit-state=.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------+----------+----------------------|
+ | =ielm-return= | =RET= | =RET= (submit state) |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |-----------------------------------------+---------+--------------------------------------------------------|
+ | =evil-collection-ielm-move-cursor-back= | =nil= | Move cursor back one column when leaving insert state. |
+
+** Notes
+
+ - On entering normal state, point stays put (no Vim-style backward step).
diff --git a/.config/emacs/lisp/evil-collection/modes/ielm/evil-collection-ielm.el b/.config/emacs/lisp/evil-collection/modes/ielm/evil-collection-ielm.el
new file mode 100644
index 0000000..0883bb6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ielm/evil-collection-ielm.el
@@ -0,0 +1,60 @@
+;;; evil-collection-ielm.el --- Bindings for `ielm' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 Ian Pan <ianpan870102@gmail.com>
+
+;; Author: Ian Pan <ianpan870102@gmail.com>
+;; Maintainer: Ian Pan <ianpan870102@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ielm, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `ielm' (Inferior Emacs Lisp Mode).
+
+;;; Code:
+(require 'evil-collection)
+(require 'ielm nil t)
+
+(defvar inferior-emacs-lisp-mode-map)
+(defconst evil-collection-ielm-maps '(inferior-emacs-lisp-mode-map))
+
+(defcustom evil-collection-ielm-move-cursor-back nil
+ "Whether the cursor is moved backwards when exiting insert state."
+ :type 'boolean
+ :group 'ielm)
+
+(defun evil-collection-ielm-escape-stay ()
+ "Go back to normal state but don't move cursor backwards.
+Moving cursor backwards is the default vim behavior but
+it is not intuitive for some cases like REPL buffers."
+ (setq-local evil-move-cursor-back
+ evil-collection-ielm-move-cursor-back))
+
+;;;###autoload
+(defun evil-collection-ielm-setup ()
+ "Set up `evil' bindings for `ielm'."
+ (evil-set-initial-state 'inferior-emacs-lisp-mode 'insert)
+
+ (add-hook 'ielm-mode-hook #'evil-collection-ielm-escape-stay)
+
+ (let* ((submit evil-collection-repl-submit-state))
+ (evil-collection-define-key submit 'inferior-emacs-lisp-mode-map
+ (kbd "RET") #'ielm-return
+ (kbd "<return>") #'ielm-return)))
+
+(provide 'evil-collection-ielm)
+;;; evil-collection-ielm.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/image+/evil-collection-image+.el b/.config/emacs/lisp/evil-collection/modes/image+/evil-collection-image+.el
new file mode 100644
index 0000000..2ff9511
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/image+/evil-collection-image+.el
@@ -0,0 +1,54 @@
+;;; evil-collection-image+.el --- Evil bindings for image-mode with image+ -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, image, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for image-mode with image+.
+
+;;; Code:
+(require 'evil-collection)
+(require 'image+ nil t)
+
+(defconst evil-collection-image+-maps '(image-mode-map))
+
+;;;###autoload
+(defun evil-collection-image+-setup ()
+ "Set up `evil' bindings for `image+'."
+ (evil-collection-define-key 'normal 'image-mode-map
+ ;; zoom
+ "+" 'imagex-sticky-zoom-in
+ "=" 'imagex-sticky-zoom-in
+ "-" 'imagex-sticky-zoom-out
+ "O" 'imagex-sticky-restore-original
+
+ "M" 'imagex-sticky-maximize
+ "m" 'imagex-auto-adjust-mode
+ "S" 'imagex-sticky-save-image
+ "r" 'imagex-sticky-rotate-right
+ "R" 'imagex-sticky-rotate-left
+ "<" 'imagex-sticky-rotate-left ; like sxiv
+ ">" 'imagex-sticky-rotate-right)) ; like sxiv
+
+(provide 'evil-collection-image+)
+;;; evil-collection-image+.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/image-dired/README.org b/.config/emacs/lisp/evil-collection/modes/image-dired/README.org
new file mode 100644
index 0000000..e9f6a05
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/image-dired/README.org
@@ -0,0 +1,31 @@
+* image-dired
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Image_002dDired.html][image-dired-thumbnail-mode]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------------------------------------------+-----------+-----------|
+ | =image-dired-backward-image= | =<left>= | =h= |
+ | =image-dired-forward-image= | =<right>= | =l= |
+ | =image-dired-next-line= | =<down>= | =j= |
+ | =image-dired-previous-line= | =<up>= | =k= |
+ | =image-dired-display-next-thumbnail-original= | =SPC= | =SPC= |
+ | =image-dired-display-previous-thumbnail-original= | =DEL= | =S-SPC= |
+ | =image-dired-display-thumbnail-original-image= | =RET= | =RET= |
+ | =image-dired-comment-thumbnail= | =c= | =c= |
+ | =image-dired-thumbnail-set-image-description= | =D= | =d= |
+ | =image-dired-mark-thumb-original-file= | =m= | =m= |
+ | =image-dired-unmark-thumb-original-file= | =u= | =u= |
+ | =image-dired-delete-char= | =C-d= | =D= |
+ | =image-dired-rotate-thumbnail-right= | n/a | =r= |
+ | =image-dired-rotate-thumbnail-left= | n/a | =R= |
+ | =image-dired-rotate-original-left= | =L= | =<= |
+ | =image-dired-rotate-original-right= | =R= | =>= |
+ | =image-dired-tag-thumbnail= | =t t= | =tt= |
+ | =image-dired-tag-thumbnail-remove= | =t r= | =tr= |
+ | =image-dired-line-up= | =g f= | =ff= |
+ | =image-dired-line-up-dynamic= | =g g= | =fd= |
+ | =image-dired-line-up-interactive= | =g i= | =fi= |
+ | =quit-window= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/image-dired/evil-collection-image-dired.el b/.config/emacs/lisp/evil-collection/modes/image-dired/evil-collection-image-dired.el
new file mode 100644
index 0000000..4e009ac
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/image-dired/evil-collection-image-dired.el
@@ -0,0 +1,74 @@
+;;; evil-collection-image-dired.el --- Evil bindings for image-dired-thumbnail-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, dired, image, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `image-dired-thumbnail-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'image-dired)
+
+(defconst evil-collection-image-dired-maps '(image-dired-thumbnail-mode-map))
+
+;;;###autoload
+(defun evil-collection-image-dired-setup ()
+ "Set up `evil' bindings for `image-dired-thumbnail-mode'."
+ (evil-collection-define-key 'normal 'image-dired-thumbnail-mode-map
+ ;; motion
+ "h" 'image-dired-backward-image
+ "l" 'image-dired-forward-image
+ "j" 'image-dired-next-line
+ "k" 'image-dired-previous-line
+
+ (kbd "SPC") 'image-dired-display-next-thumbnail-original
+ (kbd "S-SPC") 'image-dired-display-previous-thumbnail-original
+ (kbd "RET") 'image-dired-display-thumbnail-original-image
+
+ "c" 'image-dired-comment-thumbnail
+ "d" 'image-dired-thumbnail-set-image-description
+ "m" 'image-dired-mark-thumb-original-file
+ "u" 'image-dired-unmark-thumb-original-file
+ "D" 'image-dired-delete-char
+
+ ;; See image+.
+ "r" 'image-dired-rotate-thumbnail-right
+ "R" 'image-dired-rotate-thumbnail-left
+ "<" 'image-dired-rotate-original-left ; like sxiv
+ ">" 'image-dired-rotate-original-right ; like sxiv
+
+ "tr" 'image-dired-tag-thumbnail-remove
+ "tt" 'image-dired-tag-thumbnail
+
+ "ff" 'image-dired-line-up
+ "fd" 'image-dired-line-up-dynamic
+ "fi" 'image-dired-line-up-interactive
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-image-dired)
+;;; evil-collection-image-dired.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/image/README.org b/.config/emacs/lisp/evil-collection/modes/image/README.org
new file mode 100644
index 0000000..7824491
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/image/README.org
@@ -0,0 +1,36 @@
+* image
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Image-Mode.html][image-mode]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------------------+------------------+---------------------|
+ | =image-bob= | =<= | =gg= |
+ | =image-eob= | =>= | =G= |
+ | =image-forward-hscroll= | =C-f=, =<right>= | =l= |
+ | =image-backward-hscroll= | =C-b=, =<left>= | =h= |
+ | =image-next-line= | =C-n=, =<down>= | =j= |
+ | =image-previous-line= | =C-p=, =<up>= | =k= |
+ | =image-bol= | =C-a= | =0=, =^= |
+ | =image-eol= | =C-e= | =$= |
+ | =image-scroll-up= | =SPC= | =SPC=, =C-d= |
+ | =image-scroll-down= | =S-SPC=, =DEL= | =S-SPC=, =<delete>= |
+ | =image-scroll-down= (=C-u-scroll=) | n/a | =C-u= |
+ | =image-toggle-animation= | =RET= | =RET= |
+ | =image-reset-speed= | =a 0= | =a0= |
+ | =image-reverse-speed= | =a r= | =ar= |
+ | =image-goto-frame= | =F= | =F= |
+ | =image-previous-frame= | =b= | =,= |
+ | =image-next-frame= | =f= | =.=, =;= |
+ | =image-decrease-speed= | n/a | ={= |
+ | =image-increase-speed= | n/a | =}= |
+ | =image-transform-fit-to-height= | =s h= | =H= |
+ | =image-transform-fit-to-width= | =s i= | =W= |
+ | =image-increase-size= | =i += | =+=, === |
+ | =image-decrease-size= | =i -= | =-= |
+ | =image-previous-file= | =p= | =[[=, =gk=, =C-k= |
+ | =image-next-file= | =n= | =]]=, =gj=, =C-j= |
+ | =image-toggle-display= | =C-c C-c= | =C-c C-c= |
+ | =quit-window= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/image/evil-collection-image.el b/.config/emacs/lisp/evil-collection/modes/image/evil-collection-image.el
new file mode 100644
index 0000000..c8da183
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/image/evil-collection-image.el
@@ -0,0 +1,93 @@
+;;; evil-collection-image.el --- Evil bindings for Image -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, bookmark, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `image-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'image-mode)
+
+(defconst evil-collection-image-maps '(image-mode-map))
+
+;;;###autoload
+(defun evil-collection-image-setup ()
+ "Set up `evil' bindings for `image-mode'."
+ (evil-set-initial-state 'image-mode 'normal)
+
+ (evil-collection-define-key 'normal 'image-mode-map
+ ;; motion
+ "gg" 'image-bob
+ "G" 'image-eob
+ [remap evil-forward-char] 'image-forward-hscroll
+ [remap evil-backward-char] 'image-backward-hscroll
+ [remap evil-next-line] 'image-next-line
+ [remap evil-previous-line] 'image-previous-line
+ "0" 'image-bol
+ "^" 'image-bol
+ "$" 'image-eol
+ (kbd "C-d") 'image-scroll-up
+ (kbd "SPC") 'image-scroll-up
+ (kbd "S-SPC") 'image-scroll-down
+ (kbd "<delete>") 'image-scroll-down
+ ;; animation
+ (kbd "RET") 'image-toggle-animation
+ "a0" 'image-reset-speed
+ "ar" 'image-reverse-speed
+ "F" 'image-goto-frame
+ "," 'image-previous-frame ; mplayer/mpv style
+ "." 'image-next-frame ; mplayer/mpv style
+ ";" 'image-next-frame ; Evil style
+ "{" 'image-decrease-speed ; mplayer/mpv style
+ "}" 'image-increase-speed ; mplayer/mpv style
+
+ "H" 'image-transform-fit-to-height
+ "W" 'image-transform-fit-to-width
+
+ "+" 'image-increase-size
+ "=" 'image-increase-size
+ "-" 'image-decrease-size
+
+ "[[" 'image-previous-file
+ "]]" 'image-next-file
+ "gk" 'image-previous-file
+ "gj" 'image-next-file
+ (kbd "C-k") 'image-previous-file
+ (kbd "C-j") 'image-next-file
+
+ (kbd "C-c C-c") 'image-toggle-display
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-window)
+
+ ;; TODO: What if the user changes `evil-want-C-u-scroll' after this is run?
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'normal 'image-mode-map
+ (kbd "C-u") 'image-scroll-down)))
+
+(provide 'evil-collection-image)
+;;; evil-collection-image.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/imenu-list/evil-collection-imenu-list.el b/.config/emacs/lisp/evil-collection/modes/imenu-list/evil-collection-imenu-list.el
new file mode 100644
index 0000000..21a54e3
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/imenu-list/evil-collection-imenu-list.el
@@ -0,0 +1,47 @@
+;;; evil-collection-imenu-list.el --- Bindings for `imenu-list' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: Fredrik Bergroth <fbergroth@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `imenu-list'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'imenu-list nil t)
+
+(defconst evil-collection-imenu-list-maps '(imenu-list-major-mode-map))
+
+;;;###autoload
+(defun evil-collection-imenu-list-setup ()
+ "Set up `evil' bindings for `imenu-list'."
+ (evil-collection-define-key 'normal 'imenu-list-major-mode-map
+ (kbd "RET") 'imenu-list-goto-entry
+ (kbd "TAB") 'hs-toggle-hiding
+ "d" 'imenu-list-display-entry
+ "gr" 'imenu-list-refresh
+ "q" 'imenu-list-quit-window))
+
+
+(provide 'evil-collection-imenu-list)
+;;; evil-collection-imenu-list.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/imenu/README.org b/.config/emacs/lisp/evil-collection/modes/imenu/README.org
new file mode 100644
index 0000000..b34a65d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/imenu/README.org
@@ -0,0 +1,11 @@
+* imenu
+
+ Evil integration for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Imenu.html][imenu]]. No keymap is touched; the setup only marks
+ =imenu= as a non-repeatable jump command for evil's jump list and dot-repeat
+ machinery.
+
+** Notes
+
+ - =imenu= is declared with =evil-declare-not-repeat=.
+ - =imenu= is given the =:jump t= command property so it integrates with
+ =C-o= / =C-i= and =evil-set-jump=.
diff --git a/.config/emacs/lisp/evil-collection/modes/imenu/evil-collection-imenu.el b/.config/emacs/lisp/evil-collection/modes/imenu/evil-collection-imenu.el
new file mode 100644
index 0000000..ac3e905
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/imenu/evil-collection-imenu.el
@@ -0,0 +1,39 @@
+;;; evil-collection-imenu.el --- Evil integration for `imenu' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Jacob First
+
+;; Author: Jacob First <jacob.first@member.fsf.org>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil conveniences for `imenu'.
+
+;;; Code:
+(require 'imenu)
+(require 'evil-collection)
+
+;;;###autoload
+(defun evil-collection-imenu-setup ()
+ "Set up Evil integration for `imenu'."
+ (evil-declare-not-repeat 'imenu)
+ (evil-add-command-properties 'imenu :jump t))
+
+(provide 'evil-collection-imenu)
+;;; evil-collection-imenu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/indent/README.org b/.config/emacs/lisp/evil-collection/modes/indent/README.org
new file mode 100644
index 0000000..480e6d9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/indent/README.org
@@ -0,0 +1,15 @@
+* indent
+
+ Evil bindings for the transient =indent-rigidly-map= used after
+ =indent-rigidly= (=C-x TAB=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------------------+-------------+------|
+ | =indent-rigidly-left= | =<left>= | =h= |
+ | =indent-rigidly-right= | =<right>= | =l= |
+ | =indent-rigidly-left-to-tab-stop= | =S-<left>= | =H= |
+ | =indent-rigidly-right-to-tab-stop= | =S-<right>= | =L= |
+
+ The arrow-key bindings remain available alongside the hjkl additions.
diff --git a/.config/emacs/lisp/evil-collection/modes/indent/evil-collection-indent.el b/.config/emacs/lisp/evil-collection/modes/indent/evil-collection-indent.el
new file mode 100644
index 0000000..87a8e00
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/indent/evil-collection-indent.el
@@ -0,0 +1,48 @@
+;;; evil-collection-indent.el --- Evil bindings for indentation -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for indentation.
+
+;;; Commentary:
+;;
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-indent-maps '(indent-rigidly-map))
+
+;;;###autoload
+(defun evil-collection-indent-setup ()
+ "Set up `evil' bindings for autoloaded files."
+ (evil-collection-define-key nil 'indent-rigidly-map
+ "h" 'indent-rigidly-left
+ "l" 'indent-rigidly-right
+ "H" 'indent-rigidly-left-to-tab-stop
+ "L" 'indent-rigidly-right-to-tab-stop))
+
+
+(provide 'evil-collection-indent)
+;;; evil-collection-indent.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/indium/evil-collection-indium.el b/.config/emacs/lisp/evil-collection/modes/indium/evil-collection-indium.el
new file mode 100644
index 0000000..943fd40
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/indium/evil-collection-indium.el
@@ -0,0 +1,110 @@
+;;; evil-collection-indium.el --- Bindings for `indium' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, indium, javascript, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `indium'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'indium nil t)
+
+(defconst evil-collection-indium-maps '(indium-debugger-mode-map
+ indium-inspector-mode-map
+ indium-debugger-locals-mode-map
+ indium-debugger-frames-mode-map
+ indium-interaction-mode-map
+ indium-repl-mode-map))
+
+;;;###autoload
+(defun evil-collection-indium-setup ()
+ "Set up `evil' bindings for `indium'."
+ (when evil-collection-setup-debugger-keys
+ (evil-collection-define-key 'normal 'indium-debugger-mode-map
+ "n" 'indium-debugger-step-over
+ "i" 'indium-debugger-step-into
+ "o" 'indium-debugger-step-out
+ "c" 'indium-debugger-resume
+ "L" 'indium-debugger-locals
+ "s" 'indium-debugger-stack-frames
+ "q" 'indium-debugger-resume
+ "H" 'indium-debugger-here
+ "e" 'indium-debugger-evaluate
+ ">" 'indium-debugger-next-frame
+ "<" 'indium-debugger-previous-frame)
+
+ (add-hook 'indium-debugger-mode-hook #'evil-normalize-keymaps))
+
+ (evil-collection-define-key 'normal 'indium-inspector-mode-map
+ "q" 'quit-window
+ (kbd "RET") 'indium-follow-link
+ [mouse-1] 'indium-follow-link
+ "L" 'indium-inspector-pop
+ "gr" 'indium-inspector-refresh
+ "gj" 'indium-inspector-next-reference
+ "gk" 'indium-inspector-previous-reference
+ (kbd "C-j") 'indium-inspector-next-reference
+ (kbd "C-k") 'indium-inspector-previous-reference
+ [tab] 'indium-inspector-next-reference
+ [backtab] 'indium-inspector-previous-reference)
+
+ (evil-collection-define-key 'normal 'indium-debugger-locals-mode-map
+ "q" 'quit-window
+ "L" nil
+ "gr" nil)
+
+ (evil-collection-define-key 'normal 'indium-debugger-frames-mode-map
+ "q" 'quit-window
+ [return] 'indium-follow-link
+ (kbd "RET") 'indium-follow-link
+ (kbd "gj") 'indium-debugger-frames-next-frame
+ (kbd "gk") 'indium-debugger-frames-previous-frame
+ (kbd "C-j") 'indium-debugger-frames-next-frame
+ (kbd "C-k") 'indium-debugger-frames-previous-frame
+ [tab] 'indium-debugger-frames-next-frame
+ [backtab] 'indium-debugger-frames-previous-frame)
+
+ (evil-collection-define-key 'normal 'indium-interaction-mode-map
+ "gr" 'indium-update-script-source
+ "gz" 'indium-switch-to-repl-buffer)
+
+ (when evil-collection-setup-debugger-keys
+ (evil-collection-define-key 'normal 'indium-interaction-mode-map
+ [left-fringe mouse-1] 'indium-mouse-toggle-breakpoint
+ [left-margin mouse-1] 'indium-mouse-toggle-breakpoint
+ [f5] 'indium-debugger-resume
+ [S-f5] 'indium-debugger-resume
+ [f9] 'indium-toggle-breakpoint
+ [f10] 'indium-debugger-step-over
+ [f11] 'indium-debugger-step-into
+ [S-f11] 'indium-debugger-step-out))
+
+ (evil-collection-define-key 'normal 'indium-repl-mode-map
+ (kbd "gj") 'indium-repl-next-input
+ (kbd "gk") 'indium-repl-previous-input
+ (kbd "C-j") 'indium-repl-next-input
+ (kbd "C-k") 'indium-repl-previous-input))
+
+(provide 'evil-collection-indium)
+;;; evil-collection-indium.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/info/README.org b/.config/emacs/lisp/evil-collection/modes/info/README.org
new file mode 100644
index 0000000..f8d168b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/info/README.org
@@ -0,0 +1,40 @@
+* info
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/info/index.html][Info]].
+
+ Uses normal state instead of motion state and rebinds movement to standard
+ evil keys.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------------------------+----------------+----------------------|
+ | =Info-next-reference= | =TAB= | =TAB=, =g TAB=, =g]= |
+ | =Info-prev-reference= | =S-TAB= | =S-TAB=, =g[= |
+ | =Info-help= | =h= | =M-h= |
+ | =Info-history-back= | =l= | =C-t=, =C-o= |
+ | =Info-history-forward= | =r= | =C-i= |
+ | =Info-scroll-up= | =SPC= | =SPC= |
+ | =Info-scroll-down= | =DEL=, =S-SPC= | =DEL= |
+ | =Info-follow-nearest-node= | =RET= | =RET=, =C-]= |
+ | =Info-directory= | =d= | =d= |
+ | =Info-up= | =^=, =u= | =u= |
+ | =Info-history= | =L= | =gL= |
+ | =Info-search= | =s= | =s= |
+ | =Info-search-case-sensitively= | =S= | =S= |
+ | =Info-index= | =i= | =i= |
+ | =Info-virtual-index= | =I= | =I= |
+ | =info-apropos= | n/a | =a= |
+ | =Info-nth-menu-item= | =1..9= | =g1..g9= |
+ | =Info-menu= | =m= | =J=, =gm= |
+ | =Info-goto-node= | =g= | =gG= |
+ | =Info-top-node= | =t=, =<= | =gt= |
+ | =Info-toc= | =T= | =gT= |
+ | =Info-follow-reference= | =f= | =gf= |
+ | =Info-forward-node= | =]= | =C-j= |
+ | =Info-backward-node= | =[= | =C-k= |
+ | =Info-next= | =n= | =gj= |
+ | =Info-prev= | =p= | =gk= |
+ | =Info-index-next= | =,= | =g,= |
+ | =Info-summary= | =?= | =g?= |
+ | =Info-copy-current-node-name= (=y= operator) | =c=, =w= | =yu= |
diff --git a/.config/emacs/lisp/evil-collection/modes/info/evil-collection-info.el b/.config/emacs/lisp/evil-collection/modes/info/evil-collection-info.el
new file mode 100644
index 0000000..5f4332e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/info/evil-collection-info.el
@@ -0,0 +1,110 @@
+;;; evil-collection-info.el --- Evil bindings for Info-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, info, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; The default bindings in motion state override the standard movement keys.
+;; This package uses normal state and redefines everything.
+
+;;; Code:
+(require 'evil-collection)
+(require 'info)
+
+(defconst evil-collection-info-maps '(Info-mode-map))
+
+;;;###autoload
+(defun evil-collection-info-setup ()
+ "Set up `evil' bindings for `info-mode'."
+ (evil-collection-set-readonly-bindings 'Info-mode-map)
+ (evil-set-initial-state 'Info-mode 'normal)
+ (evil-collection-define-key 'normal 'Info-mode-map
+ (kbd "<tab>") 'Info-next-reference
+ (kbd "S-<tab>") 'Info-prev-reference
+ ;; This exists because <tab> is recognized as C-i on terminals.
+ (kbd "g TAB") 'Info-next-reference
+ "g]" 'Info-next-reference
+ "g[" 'Info-prev-reference
+
+ ;; From evil-integration.el.
+ (kbd "M-h") 'Info-help ; "h"
+ (kbd "C-t") 'Info-history-back ; "l"
+ (kbd "C-o") 'Info-history-back
+ " " 'Info-scroll-up
+ (kbd "RET") 'Info-follow-nearest-node
+ (kbd "C-]") 'Info-follow-nearest-node
+ (kbd "DEL") 'Info-scroll-down
+ (kbd "C-i") 'Info-history-forward
+
+ "d" 'Info-directory
+ "u" 'Info-up
+ "gL" 'Info-history ; "L"
+ "s" 'Info-search
+ "S" 'Info-search-case-sensitively
+ "i" 'Info-index
+ "I" 'Info-virtual-index
+ "a" 'info-apropos
+
+ ;; mouse integration
+ [mouse-2] 'Info-mouse-follow-nearest-node
+ [follow-link] 'mouse-face
+ ;; make mac user happy
+ [double-wheel-left] 'Info-history-back
+ [double-wheel-right] 'Info-history-forward
+
+ ;; digit arguments
+ "g1" 'Info-nth-menu-item
+ "g2" 'Info-nth-menu-item
+ "g3" 'Info-nth-menu-item
+ "g4" 'Info-nth-menu-item
+ "g5" 'Info-nth-menu-item
+ "g6" 'Info-nth-menu-item
+ "g7" 'Info-nth-menu-item
+ "g8" 'Info-nth-menu-item
+ "g9" 'Info-nth-menu-item
+
+ ;; goto
+ "J" 'Info-menu
+
+ "gG" 'Info-goto-node
+ "gm" 'Info-menu
+ "gt" 'Info-top-node
+ "gT" 'Info-toc
+ "gf" 'Info-follow-reference
+ ;; TODO: "[" and "]" are Emacs default for fine-grained browsing.
+ ;; We usually use "C-j"/"C-k" for that.
+ (kbd "C-j") 'Info-forward-node
+ (kbd "C-k") 'Info-backward-node
+ "gj" 'Info-next
+ "gk" 'Info-prev
+
+ "g," 'Info-index-next
+
+ "g?" 'Info-summary)
+
+ ;; yu, Like eww.
+ (evil-collection-define-operator-key 'yank 'Info-mode-map
+ "u" 'Info-copy-current-node-name))
+
+(provide 'evil-collection-info)
+;;; evil-collection-info.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ivy/README.org b/.config/emacs/lisp/evil-collection/modes/ivy/README.org
new file mode 100644
index 0000000..e6b0bea
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ivy/README.org
@@ -0,0 +1,51 @@
+* ivy
+
+ Evil bindings for [[https://github.com/abo-abo/swiper][ivy]].
+
+** Key bindings
+
+*** ivy-minibuffer-map
+
+ Minibuffer bindings only take effect when =evil-collection-setup-minibuffer=
+ is non-nil (the global =<escape>= → =minibuffer-keyboard-quit= always applies).
+
+ | Command | Original | Evil |
+ |----------------------------+----------+------------------------------|
+ | =minibuffer-keyboard-quit= | =C-g= | =<escape>= (any) |
+ | =abort-recursive-edit= | n/a | =<escape>= (normal) |
+ | =exit-minibuffer= | =RET= | =RET= (normal) |
+ | =ivy-done= | =RET= | =C-m= (normal) |
+ | =ivy-next-line= | =C-n= | =j= (normal), =C-n= (insert) |
+ | =ivy-previous-line= | =C-p= | =k= (normal), =C-p= (insert) |
+ | =ivy-backward-delete-char= | =DEL= | =DEL= (insert) |
+ | =ivy-reverse-i-search= | =C-r= | =C-r= (insert) |
+
+*** ivy-occur-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |------------------------------+------------+-----------|
+ | =ivy-occur-next-line= | =n= | =j= |
+ | =ivy-occur-previous-line= | =p= | =k= |
+ | =evil-backward-char= | n/a | =h= |
+ | =evil-forward-char= | n/a | =l= |
+ | =evil-goto-first-line= | n/a | =gg= |
+ | =ivy-occur-press= | =RET=, =f= | =gf= |
+ | =ivy-occur-press-and-switch= | =o= | =RET= |
+ | =ivy-occur-read-action= | =M-o= | =ga= |
+ | =ivy-occur-dispatch= | =C-c C-o= | =go= |
+ | =ivy-occur-toggle-calling= | =C-c C-p= | =gc= |
+ | =ivy-occur-revert-buffer= | =g= | =gr= |
+ | =ivy-occur-click= | =mouse-1= | =mouse-1= |
+ | =quit-window= | =q= | =q= |
+
+*** ivy-occur-grep-mode-map (normal state)
+
+ Inherits the above plus:
+
+ | Command | Original | Evil |
+ |--------------------------------------------+-----------+-------------------------------------|
+ | =ivy-occur-delete-candidate= | =C-d= | =d=, =gd= |
+ | =ivy-occur-delete-candidate= | =C-d= | =D= (when =evil-want-C-d-scroll=) |
+ | =evil-scroll-down= | n/a | =C-d= (when =evil-want-C-d-scroll=) |
+ | =ivy-wgrep-change-to-wgrep-mode= | =C-x C-q= | =i=, =C-x C-q= |
+ | =evil-digit-argument-or-beginning-of-line= | n/a | =0= |
diff --git a/.config/emacs/lisp/evil-collection/modes/ivy/evil-collection-ivy.el b/.config/emacs/lisp/evil-collection/modes/ivy/evil-collection-ivy.el
new file mode 100644
index 0000000..95334ff
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ivy/evil-collection-ivy.el
@@ -0,0 +1,111 @@
+;;; evil-collection-ivy.el --- Evil bindings for ivy -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ivy, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `ivy-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ivy nil t)
+
+(defconst evil-collection-ivy-maps '(ivy-occur-mode-map
+ ivy-occur-grep-mode-map
+ ivy-minibuffer-map))
+
+;;;###autoload
+(defun evil-collection-ivy-setup ()
+ "Set up `evil' bindings for `ivy-mode'."
+ (evil-collection-define-key nil 'ivy-minibuffer-map
+ (kbd "<escape>") 'minibuffer-keyboard-quit)
+ (evil-collection-define-key 'normal 'ivy-occur-mode-map
+ [mouse-1] 'ivy-occur-click
+ (kbd "RET") 'ivy-occur-press-and-switch
+ "j" 'ivy-occur-next-line
+ "k" 'ivy-occur-previous-line
+ "h" 'evil-backward-char
+ "l" 'evil-forward-char
+ "g" nil
+ "gg" 'evil-goto-first-line
+ "gf" 'ivy-occur-press
+ "ga" 'ivy-occur-read-action
+ "go" 'ivy-occur-dispatch
+ "gc" 'ivy-occur-toggle-calling
+
+ ;; refresh
+ "gr" 'ivy-occur-revert-buffer
+
+ ;; quit
+ "q" 'quit-window)
+
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'normal 'ivy-occur-grep-mode-map
+ "D" 'ivy-occur-delete-candidate
+ (kbd "C-d") 'evil-scroll-down))
+
+ (evil-collection-define-key 'visual 'ivy-occur-grep-mode-map
+ "j" 'evil-next-line
+ "k" 'evil-previous-line)
+
+ (evil-collection-define-key 'normal 'ivy-occur-grep-mode-map
+ "d" 'ivy-occur-delete-candidate
+ (kbd "C-x C-q") 'ivy-wgrep-change-to-wgrep-mode
+ "i" 'ivy-wgrep-change-to-wgrep-mode
+ "gd" 'ivy-occur-delete-candidate
+ [mouse-1] 'ivy-occur-click
+ (kbd "RET") 'ivy-occur-press-and-switch
+ "j" 'ivy-occur-next-line
+ "k" 'ivy-occur-previous-line
+ "h" 'evil-backward-char
+ "l" 'evil-forward-char
+ "g" nil
+ "gg" 'evil-goto-first-line
+ "gf" 'ivy-occur-press
+ "gr" 'ivy-occur-revert-buffer
+ "ga" 'ivy-occur-read-action
+ "go" 'ivy-occur-dispatch
+ "gc" 'ivy-occur-toggle-calling
+
+ "0" 'evil-digit-argument-or-evil-beginning-of-line
+
+ ;; quit
+ "q" 'quit-window)
+
+ (defvar evil-collection-setup-minibuffer)
+ (when evil-collection-setup-minibuffer
+ (evil-collection-define-key 'normal 'ivy-minibuffer-map
+ (kbd "<escape>") 'abort-recursive-edit
+ (kbd "RET") 'exit-minibuffer
+ (kbd "C-m") 'ivy-done
+ "j" 'ivy-next-line
+ "k" 'ivy-previous-line)
+
+ (evil-collection-define-key 'insert 'ivy-minibuffer-map
+ (kbd "DEL") 'ivy-backward-delete-char
+ (kbd "C-r") 'ivy-reverse-i-search
+ (kbd "C-n") 'ivy-next-line
+ (kbd "C-p") 'ivy-previous-line)))
+
+(provide 'evil-collection-ivy)
+;;; evil-collection-ivy.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/js2-mode/README.org b/.config/emacs/lisp/evil-collection/modes/js2-mode/README.org
new file mode 100644
index 0000000..3639801
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/js2-mode/README.org
@@ -0,0 +1,12 @@
+* js2-mode
+
+ Evil compatibility for [[https://github.com/mooz/js2-mode][js2-mode]]. No key bindings.
+
+ Adds a hook to =js2-mode-hook= and =js2-jsx-mode-hook= that sets the
+ buffer-local =evil-shift-width= to match =js-indent-level=, so =>>= and
+ =<<= indent by the same amount js2-mode does.
+
+** New commands
+
+ - =evil-collection-js2-set-evil-shift-width= - Sync =evil-shift-width=
+ with =js-indent-level= in the current buffer.
diff --git a/.config/emacs/lisp/evil-collection/modes/js2-mode/evil-collection-js2-mode.el b/.config/emacs/lisp/evil-collection/modes/js2-mode/evil-collection-js2-mode.el
new file mode 100644
index 0000000..fe29237
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/js2-mode/evil-collection-js2-mode.el
@@ -0,0 +1,46 @@
+;;; evil-collection-js2-mode.el --- Bindings for `js2-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `js2-mode'
+
+;;; Code:
+(require 'evil-collection)
+(require 'js2-mode nil t)
+
+(defvar js-indent-level)
+
+(defun evil-collection-js2-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `js-indent-level'."
+ (setq-local evil-shift-width js-indent-level))
+
+;;;###autoload
+(defun evil-collection-js2-mode-setup ()
+ "Set up `evil' bindings for `js2-mode'."
+ (add-hook 'js2-mode-hook #'evil-collection-js2-set-evil-shift-width)
+ (add-hook 'js2-jsx-mode-hook #'evil-collection-js2-set-evil-shift-width))
+
+(provide 'evil-collection-js2-mode)
+;;; evil-collection-js2-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/kmacro/README.org b/.config/emacs/lisp/evil-collection/modes/kmacro/README.org
new file mode 100644
index 0000000..5c05d82
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/kmacro/README.org
@@ -0,0 +1,22 @@
+* kmacro
+
+ Evil bindings for the [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macros.html][kmacro]] menu.
+
+** Key bindings
+
+ Bindings applied to =kmacro-menu-mode-map=. Initial state is normal.
+
+ | Command | Original | Evil |
+ |---------------------------------+----------+-------|
+ | =kmacro-menu-edit-column= | =RET= | =RET= |
+ | =kmacro-menu-edit-position= | =#= | =#= |
+ | =kmacro-menu-edit-counter= | =c= | =c= |
+ | =kmacro-menu-edit-format= | =f= | =f= |
+ | =kmacro-menu-edit-keys= | =e= | =e= |
+ | =kmacro-menu-flag-for-deletion= | =d= | =d= |
+ | =kmacro-menu-mark= | =m= | =m= |
+ | =kmacro-menu-unmark= | =u= | =u= |
+ | =kmacro-menu-unmark-all= | =U= | =U= |
+ | =kmacro-menu-do-flagged-delete= | =x= | =x= |
+ | =kmacro-menu-do-copy= | =C= | =C= |
+ | =kmacro-menu-do-delete= | =D= | =D= |
diff --git a/.config/emacs/lisp/evil-collection/modes/kmacro/evil-collection-kmacro.el b/.config/emacs/lisp/evil-collection/modes/kmacro/evil-collection-kmacro.el
new file mode 100644
index 0000000..b7c7aff
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/kmacro/evil-collection-kmacro.el
@@ -0,0 +1,58 @@
+;;; evil-collection-kmacro.el --- Evil bindings for kmacro menu -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "30"))
+;; Keywords: evil, kmacro, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for kmacro menu.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'kmacro)
+
+(defconst evil-collection-kmacro-maps '(kmacro-menu-mode-map))
+
+(defun evil-collection-kmacro-setup ()
+ "Set up `evil' bindings to `tab-bar'."
+ (evil-set-initial-state 'kmacro-menu-mode 'normal)
+ (evil-collection-define-key 'normal 'kmacro-menu-mode-map
+ ;; Edit
+ (kbd "RET") 'kmacro-menu-edit-column
+ "#" 'kmacro-menu-edit-position
+ "c" 'kmacro-menu-edit-counter
+ "f" 'kmacro-menu-edit-format
+ "e" 'kmacro-menu-edit-keys
+
+ ;; Mark
+ "d" 'kmacro-menu-flag-for-deletion
+ "m" 'kmacro-menu-mark
+ "u" 'kmacro-menu-unmark
+ "U" 'kmacro-menu-unmark-all
+
+ "x" 'kmacro-menu-do-flagged-delete
+ "C" 'kmacro-menu-do-copy
+ "D" 'kmacro-menu-do-delete))
+
+(provide 'evil-collection-kmacro)
+;;; evil-collection-kmacro.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/kotlin-mode/evil-collection-kotlin-mode.el b/.config/emacs/lisp/evil-collection/modes/kotlin-mode/evil-collection-kotlin-mode.el
new file mode 100644
index 0000000..8d8d454
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/kotlin-mode/evil-collection-kotlin-mode.el
@@ -0,0 +1,42 @@
+;;; evil-collection-kotlin-mode.el --- Bindings for `kotlin-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `kotlin-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'kotlin-mode nil t)
+
+(defconst evil-collection-kotlin-maps '(kotlin-mode-map))
+
+;;;###autoload
+(defun evil-collection-kotlin-mode-setup ()
+ "Set up `evil' bindings for `kotlin-mode'."
+ (evil-collection-define-key 'normal 'kotlin-mode-map
+ "gz" 'kotlin-repl))
+
+(provide 'evil-collection-kotlin-mode)
+;;; evil-collection-kotlin-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/leetcode/evil-collection-leetcode.el b/.config/emacs/lisp/evil-collection/modes/leetcode/evil-collection-leetcode.el
new file mode 100644
index 0000000..e198f63
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/leetcode/evil-collection-leetcode.el
@@ -0,0 +1,46 @@
+;;; evil-collection-leetcode.el --- Bindings for `leetcode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `leetcode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'leetcode nil t)
+
+(defconst evil-collection-leetcode-maps
+ '(leetcode--problems-mode-map
+ leetcode--problem-description-mode-map))
+
+;;;###autoload
+(defun evil-collection-leetcode-setup ()
+ "Set up `evil' bindings for `leetcode'."
+ (evil-collection-define-key 'normal 'leetcode--problems-mode-map
+ (kbd "RET") 'leetcode-show-current-problem
+ "gr" 'leetcode-problems-refresh
+ "q" 'quit-window))
+
+(provide 'evil-collection-leetcode)
+;;; evil-collection-leetcode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/lispy/README.org b/.config/emacs/lisp/evil-collection/modes/lispy/README.org
new file mode 100644
index 0000000..1123fc2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/lispy/README.org
@@ -0,0 +1,140 @@
+* lispy
+
+ Evil bindings for [[https://github.com/abo-abo/lispy][lispy]], the short-key mode for editing s-expressions.
+
+ Installs two additional themes into =lispy-set-key-theme=: ='special-evil'
+ and ='evil'. The setup function applies both, advising
+ =lispy-set-key-theme= so the original themes (=special=, =paredit=, etc.)
+ are bypassed in favour of the evil-flavored variants.
+
+** Key bindings
+
+*** Special state (point on a paren)
+
+ Lispy's "special" state is rebound to mirror vim motions. Keys come from
+ =evil-collection-lispy-mode-map-special=.
+
+ | Command | Original (lispy) | Evil |
+ |-----------------------------------------------------+------------------+----------|
+ | =lispy-right= | =l= | =l= |
+ | =lispy-left= | =h= | =h= |
+ | =lispy-down= | =j= | =j= |
+ | =lispy-up= | =k= | =k= |
+ | =lispy-different= | =o= | =o= |
+ | =lispy-ace-paren= | =f= | =f= |
+ | =lispy-flow= | =n= | =n= |
+ | =lispy-ace-char= | =t= | =t= |
+ | =lispy-teleport= | =T= | =T= |
+ | =lispy-new-copy= | =y= | =y= |
+ | =lispy-paste= | =P= | =p= |
+ | =lispy-eval-other-window= | =P= | =P= |
+ | =lispy-mark-list= | =v= | =v= |
+ | =lispy-view= | =V= | =z= |
+ | =lispy-x= | =x= | =q= |
+ | =lispy-other-mode= | =Q= | =Q= |
+ | =lispy-occur= | =/= | =/= |
+ | =lispy-splice= | =/= | =x= |
+ | =lispy-comment= | =;= | =;= |
+ | =evil-collection-lispy-delete= | n/a | =d= |
+ | =lispy-join= | =+= | =+=, =J= |
+ | =lispy-describe= | =h= | =K= |
+ | =lispy-outline-goto-child= | =L= | =L= |
+ | =lispy-slurp-or-barf-right= | =>= | =>= |
+ | =lispy-slurp-or-barf-left= | =<= | =<= |
+ | =lispy-raise= | =r= | =r= |
+ | =lispy-raise-some= | =R= | =R= |
+ | =lispy-convolute= | =C= | =C= |
+ | =lispy-convolute-left= | =X= | =X= |
+ | =lispy-move-up= | =w= | =w= |
+ | =lispy-move-down= | =s= | =s= |
+ | =lispy-oneline= | =O= | =O= |
+ | =lispy-alt-multiline= | =M= | =M= |
+ | =lispy-stringify= | =S= | =S= |
+ | =lispy-ace-symbol= | =a= | =a= |
+ | =lispy-ace-symbol-replace= | =H= | =H= |
+ | =lispy-eval= | =e= | =e= |
+ | =lispy-eval-and-insert= | =E= | =E= |
+ | =end-of-defun= | n/a | =G= |
+ | =g-knight/body= | n/a | =g= |
+ | =evil-collection-lispy-insert-at-end-of-list= | n/a | =A= |
+ | =evil-collection-lispy-insert-at-beginning-of-list= | n/a | =I= |
+ | =lispy-follow= | =F= | =F= |
+ | =pop-tag-mark= | =D= | =D= |
+ | =lispy-underscore= | =_= | =_= |
+ | =lispy-space= | =SPC= | =SPC= |
+ | =lispy-tab-hydra/body= | n/a | =TAB= |
+ | =lispy-narrow= | =N= | =N= |
+ | =lispy-widen= | =W= | =W= |
+ | =lispy-clone= | =c= | =c= |
+ | =lispy-undo= | =u= | =u= |
+ | =lispy-back= | =b= | =b= |
+ | =lispy-ediff-regions= | =B= | =B= |
+ | =lispy-edebug-stop= | =Z= | =Z= |
+ | =lispy-visit= | =V= | =V= |
+ | =lispy-ace-subword= | =-= | =-= |
+ | =lispy-repeat= | =.= | =.= |
+ | =lispy-tilde= | =~= | =~= |
+ | =lispy-forward= | =]= | =]= |
+ | =lispy-backward= | =[= | =[= |
+ | =lispy-brackets= | ={= | ={= |
+ | =lispy-outline-next= | =J= | =C-J= |
+ | =lispy-outline-prev= | =K= | =C-K= |
+ | =lispy-splice-sexp-killing-backward= | =^= | =^= |
+ | =lispy-splice-sexp-killing-forward= | =$= | =$= |
+ | =lispy-move-down= | =M-j= | =M-j= |
+ | =lispy-move-up= | =M-k= | =M-k= |
+
+*** Evil normal state
+
+ These bindings live in =evil-collection-lispy-mode-map= and are active in
+ evil normal state.
+
+ | Command | Original | Evil |
+ |--------------------------------------+------------+--------------|
+ | =lispy-left= | =C-M-u= | =M-n= |
+ | =lispy-kill-word= | =M-d= | =M-d= |
+ | =lispy-backward-kill-word= | =M-DEL= | =M-DEL= |
+ | =lispy-parens= | =(= | =(= |
+ | =lispy-comment= | =;= | =;= |
+ | =lispy-goto-symbol= | =M-.= | =gd= |
+ | =pop-tag-mark= | =M-,= | =C-t= |
+ | =lispy-wrap-round= | =M-(= | =M-(=, =M-)= |
+ | =lispy-wrap-braces= | =M-{= | =M-{=, =M-}= |
+ | =lispy-splice= | =M-s= | =M-s= |
+ | =lispy-splice-sexp-killing-backward= | =M-<up>= | =M-<up>= |
+ | =lispy-splice-sexp-killing-forward= | =M-<down>= | =M-<down>= |
+ | =lispy-raise-sexp= | =M-r= | =M-r= |
+ | =lispy-raise-some= | =M-R= | =M-R= |
+ | =lispy-convolute-sexp= | =M-C= | =M-C= |
+ | =lispy-split= | =M-S= | =M-S= |
+ | =lispy-join= | =M-J= | =M-J= |
+ | =lispy-forward= | =C-M-n= | =]= |
+ | =lispy-backward= | =C-M-p= | =[= |
+ | =lispy-slurp-or-barf-left= | n/a | =<= |
+ | =lispy-slurp-or-barf-right= | n/a | =>= |
+ | =lispy-new-copy= | =M-y= | =M-y= |
+ | =lispy-open-line= | =C-RET= | =C-RET= |
+ | =lispy-meta-return= | =M-RET= | =M-RET= |
+ | =lispy-move-up= | =M-k= | =M-k= |
+ | =lispy-move-down= | =M-j= | =M-j= |
+ | =lispy-string-oneline= | =M-o= | =M-o= |
+ | =lispy-clone= | =M-p= | =M-p= |
+ | =evil-collection-lispy-delete= | n/a | =M-d= |
+
+** New commands
+
+ | Command | Notes |
+ |-----------------------------------------------------+--------------------------------------------------|
+ | =evil-collection-lispy-insert-at-beginning-of-list= | Enter insert/emacs state at start of list (=I=). |
+ | =evil-collection-lispy-insert-at-end-of-list= | Enter insert/emacs state at end of list (=A=). |
+ | =evil-collection-lispy-delete= | Copy and delete the current sexp. |
+ | =evil-collection-lispy-action-then-next-sexp= | Helper to wrap a lispy action with =lispy-down=. |
+ | =evil-collection-lispy--out-forward= | Helper around =lispy--out-forward=. |
+ | =evil-collection-lispy-set-key-theme= | Replacement for =lispy-set-key-theme= adding the |
+ | | ='special-evil' and ='evil' themes. |
+
+** Customization
+
+ - =evil-collection-lispy-preferred-lispy-state= - The evil state
+ (=insert= or =emacs=) entered by =A= and =I= for using lispy. Defaults
+ to =insert=.
diff --git a/.config/emacs/lisp/evil-collection/modes/lispy/evil-collection-lispy.el b/.config/emacs/lisp/evil-collection/modes/lispy/evil-collection-lispy.el
new file mode 100644
index 0000000..895137e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/lispy/evil-collection-lispy.el
@@ -0,0 +1,659 @@
+;;; evil-collection-lispy.el --- Evil Bindings for Lispy -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, lispy, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `lispy-mode'.
+
+;;; Code:
+(require 'lispy nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-lispy-maps '(lispy-mode-map
+ evil-collection-lispy-mode-map))
+
+(defvar lispy-mode-map-base)
+(defvar lispy-mode-map-special)
+(defvar lispy-mode-map-lispy)
+(defvar lispy-mode-map-paredit)
+(defvar lispy-mode-map-parinfer)
+(defvar lispy-mode-map-evilcp)
+(defvar lispy-mode-map-c-digits)
+(defvar lispy-mode-map-oleh)
+(defvar lispy-mode-map)
+(defvar lispy-outline)
+(defvar lispy-outline-header)
+(defvar hydra-curr-body-fn)
+
+(declare-function lispy--out-backward "lispy")
+(declare-function lispy--out-forward "lispy")
+(declare-function hydra-default-pre "lispy")
+(declare-function hydra-keyboard-quit "lispy")
+(declare-function hydra--call-interactively-remap-maybe "lispy")
+(declare-function lispy-knight-down "lispy")
+(declare-function lispy-knight-up "lispy")
+(declare-function lispy-beginning-of-defun "lispy")
+(declare-function lispy-goto "lispy")
+(declare-function lispy-goto-local "lispy")
+(declare-function hydra-idle-message "lispy")
+(declare-function hydra-set-transient-map "lispy")
+(declare-function lispy-tab "lispy")
+(declare-function lispy-shifttab "lispy")
+(declare-function lispy-left-p "lispy")
+(declare-function lispy-right-p "lispy")
+(declare-function lispy-bolp "lispy")
+(declare-function lispy-down "lispy")
+(declare-function lispy-new-copy "lispy")
+(declare-function lispy-delete "lispy")
+(declare-function lispy-delete-backward "lispy")
+(declare-function lispy-define-key "lispy")
+(declare-function lispy-set-key-theme "lispy")
+
+;; ------------------------------- LISPYVILLE ----------------------------------
+;; Copied from `lispyville'.
+;; -> `lispyville-preferred-lispy-state'
+(defcustom evil-collection-lispy-preferred-lispy-state 'insert
+ "The preferred evil state for insertion and using lispy.
+This is used by any command that should enter special to determine the correct
+state."
+ :type '(choice
+ (const :tag "Use insert state to get into special." insert)
+ (const :tag "Use emacs state to get into special." emacs))
+ :group 'evil-collection)
+
+;; -> `lispyville-insert-at-beginning-of-list'
+(evil-define-command evil-collection-lispy-insert-at-beginning-of-list (count)
+ "Enter `evil-collection-lispy-preferred-lispy-state' at the start of the list.
+
+With COUNT, move backward/out COUNT lists first. This is the
+lispyville equivalent of `evil-cp-insert-at-beginning-of-form' except for lists
+only."
+ (interactive "<c>")
+ (when (lispy--out-backward (or count 1))
+ (forward-char)
+ (evil-change-state evil-collection-lispy-preferred-lispy-state)))
+
+;; -> `lispyville-insert-at-end-of-list'
+(evil-define-command evil-collection-lispy-insert-at-end-of-list (count)
+ "Enter `lispyville-preferred-state' at the end of the list.
+With COUNT, move forward/out COUNT lists first. This is the lispyville
+equivalent of `evil-cp-insert-at-end-of-form' except for lists only."
+ (interactive "<c>")
+ (when (evil-collection-lispy--out-forward (or count 1))
+ (backward-char)
+ (evil-change-state evil-collection-lispy-preferred-lispy-state)))
+
+;; -> `lispyville--out-forward'
+(defun evil-collection-lispy--out-forward (count)
+ "Like `lispyville--out-forward' but don't return nil if move at least once.
+COUNT is passed to `lispy--out-forward'."
+ (let ((orig-pos (point)))
+ (lispy--out-forward count)
+ (not (= (point) orig-pos))))
+
+;; ------------------------------- LISPYVILLE ----------------------------------
+
+;; ------------------------------- HYDRA ---------------------------------------
+(when (featurep 'hydra)
+ ;; (defhydra g-knight (:color blue :hint nil :idle .3 :columns 3)
+ ;; "g knight"
+ ;; ("j" lispy-knight-down "Down")
+ ;; ("k" lispy-knight-up "Up")
+ ;; ("g" lispy-beginning-of-defun "Beginning")
+ ;; ("d" lispy-goto "Goto")
+ ;; ("l" lispy-goto-local "Goto Local"))
+
+ ;; Macroexpanded from g-knight hydra.
+ (progn
+ (set
+ (defvar g-knight/params nil "Params of g-knight.")
+ '(nil nil :columns 3 :exit t :foreign-keys nil :hint nil :idle 0.3))
+ (set
+ (defvar g-knight/docstring nil "Docstring of g-knight.")
+ "g knight")
+ (set
+ (defvar g-knight/heads nil "Heads for g-knight.")
+ '(("j" lispy-knight-down "Down" :exit t)
+ ("k" lispy-knight-up "Up" :exit t)
+ ("g" lispy-beginning-of-defun "Beginning" :exit t)
+ ("d" lispy-goto "Goto" :exit t)
+ ("l" lispy-goto-local "Goto Local" :exit t)))
+ (set
+ (defvar g-knight/keymap nil "Keymap for g-knight.")
+ '(keymap
+ (108 . g-knight/lispy-goto-local-and-exit)
+ (100 . g-knight/lispy-goto-and-exit)
+ (103 . g-knight/lispy-beginning-of-defun-and-exit)
+ (107 . g-knight/lispy-knight-up-and-exit)
+ (106 . g-knight/lispy-knight-down-and-exit)
+ (kp-subtract . hydra--negative-argument)
+ (kp-9 . hydra--digit-argument)
+ (kp-8 . hydra--digit-argument)
+ (kp-7 . hydra--digit-argument)
+ (kp-6 . hydra--digit-argument)
+ (kp-5 . hydra--digit-argument)
+ (kp-4 . hydra--digit-argument)
+ (kp-3 . hydra--digit-argument)
+ (kp-2 . hydra--digit-argument)
+ (kp-1 . hydra--digit-argument)
+ (kp-0 . hydra--digit-argument)
+ (57 . hydra--digit-argument)
+ (56 . hydra--digit-argument)
+ (55 . hydra--digit-argument)
+ (54 . hydra--digit-argument)
+ (53 . hydra--digit-argument)
+ (52 . hydra--digit-argument)
+ (51 . hydra--digit-argument)
+ (50 . hydra--digit-argument)
+ (49 . hydra--digit-argument)
+ (48 . hydra--digit-argument)
+ (45 . hydra--negative-argument)
+ (21 . hydra--universal-argument)))
+ (set
+ (defvar g-knight/hint nil "Dynamic hint for g-knight.")
+ '(format
+ #("g knight:
+j: Down k: Up g: Beginning
+d: Goto l: Goto Local" 10 11
+(face hydra-face-blue)
+24 25
+(face hydra-face-blue)
+38 39
+(face hydra-face-blue)
+51 52
+(face hydra-face-blue)
+65 66
+(face hydra-face-blue))))
+ (defun g-knight/lispy-knight-down-and-exit nil "Call the head `lispy-knight-down' in the \"g-knight\" hydra.
+
+The heads for the associated hydra are:
+
+\"j\": `lispy-knight-down',
+\"k\": `lispy-knight-up',
+\"g\": `lispy-beginning-of-defun',
+\"d\": `lispy-goto',
+\"l\": `lispy-goto-local'
+
+The body can be accessed via `g-knight/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'g-knight/body)
+ (progn
+ (setq this-command 'lispy-knight-down)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-knight-down))))
+ (defun g-knight/lispy-knight-up-and-exit nil "Call the head `lispy-knight-up' in the \"g-knight\" hydra.
+
+The heads for the associated hydra are:
+
+\"j\": `lispy-knight-down',
+\"k\": `lispy-knight-up',
+\"g\": `lispy-beginning-of-defun',
+\"d\": `lispy-goto',
+\"l\": `lispy-goto-local'
+
+The body can be accessed via `g-knight/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'g-knight/body)
+ (progn
+ (setq this-command 'lispy-knight-up)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-knight-up))))
+ (defun g-knight/lispy-beginning-of-defun-and-exit nil "Call the head `lispy-beginning-of-defun' in the \"g-knight\" hydra.
+
+The heads for the associated hydra are:
+
+\"j\": `lispy-knight-down',
+\"k\": `lispy-knight-up',
+\"g\": `lispy-beginning-of-defun',
+\"d\": `lispy-goto',
+\"l\": `lispy-goto-local'
+
+The body can be accessed via `g-knight/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'g-knight/body)
+ (progn
+ (setq this-command 'lispy-beginning-of-defun)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-beginning-of-defun))))
+ (defun g-knight/lispy-goto-and-exit nil "Call the head `lispy-goto' in the \"g-knight\" hydra.
+
+The heads for the associated hydra are:
+
+\"j\": `lispy-knight-down',
+\"k\": `lispy-knight-up',
+\"g\": `lispy-beginning-of-defun',
+\"d\": `lispy-goto',
+\"l\": `lispy-goto-local'
+
+The body can be accessed via `g-knight/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'g-knight/body)
+ (progn
+ (setq this-command 'lispy-goto)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-goto))))
+ (defun g-knight/lispy-goto-local-and-exit nil "Call the head `lispy-goto-local' in the \"g-knight\" hydra.
+
+The heads for the associated hydra are:
+
+\"j\": `lispy-knight-down',
+\"k\": `lispy-knight-up',
+\"g\": `lispy-beginning-of-defun',
+\"d\": `lispy-goto',
+\"l\": `lispy-goto-local'
+
+The body can be accessed via `g-knight/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'g-knight/body)
+ (progn
+ (setq this-command 'lispy-goto-local)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-goto-local))))
+ (defun g-knight/body nil "Call the body in the \"g-knight\" hydra.
+
+The heads for the associated hydra are:
+
+\"j\": `lispy-knight-down',
+\"k\": `lispy-knight-up',
+\"g\": `lispy-beginning-of-defun',
+\"d\": `lispy-goto',
+\"l\": `lispy-goto-local'
+
+The body can be accessed via `g-knight/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (let
+ ((hydra--ignore nil))
+ ;; Unfortunate, but this ignore has to be manually placed here
+ ;; after macroexpanding.
+ (ignore hydra--ignore)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'g-knight/body))
+ (hydra-idle-message 0.3 g-knight/hint 'g-knight)
+ (hydra-set-transient-map g-knight/keymap
+ (lambda nil
+ (hydra-keyboard-quit)
+ nil)
+ nil)
+ (setq prefix-arg current-prefix-arg)))
+
+ ;; (defhydra lispy-tab-hydra (:color blue :hint nil :idle .3)
+ ;; "Tab"
+ ;; ("i" lispy-tab "Tab")
+ ;; ("s" lispy-shifttab "Shifttab"))
+
+ ;; Macroexpanded from lispy-tab-hydra.
+ (progn
+ (set
+ (defvar lispy-tab-hydra/params nil "Params of lispy-tab-hydra.")
+ '(nil nil :exit t :foreign-keys nil :hint nil :idle 0.3))
+ (set
+ (defvar lispy-tab-hydra/docstring nil "Docstring of lispy-tab-hydra.")
+ "Tab")
+ (set
+ (defvar lispy-tab-hydra/heads nil "Heads for lispy-tab-hydra.")
+ '(("i" lispy-tab "Tab" :exit t)
+ ("s" lispy-shifttab "Shifttab" :exit t)))
+ (set
+ (defvar lispy-tab-hydra/keymap nil "Keymap for lispy-tab-hydra.")
+ '(keymap
+ (115 . lispy-tab-hydra/lispy-shifttab-and-exit)
+ (105 . lispy-tab-hydra/lispy-tab-and-exit)
+ (kp-subtract . hydra--negative-argument)
+ (kp-9 . hydra--digit-argument)
+ (kp-8 . hydra--digit-argument)
+ (kp-7 . hydra--digit-argument)
+ (kp-6 . hydra--digit-argument)
+ (kp-5 . hydra--digit-argument)
+ (kp-4 . hydra--digit-argument)
+ (kp-3 . hydra--digit-argument)
+ (kp-2 . hydra--digit-argument)
+ (kp-1 . hydra--digit-argument)
+ (kp-0 . hydra--digit-argument)
+ (57 . hydra--digit-argument)
+ (56 . hydra--digit-argument)
+ (55 . hydra--digit-argument)
+ (54 . hydra--digit-argument)
+ (53 . hydra--digit-argument)
+ (52 . hydra--digit-argument)
+ (51 . hydra--digit-argument)
+ (50 . hydra--digit-argument)
+ (49 . hydra--digit-argument)
+ (48 . hydra--digit-argument)
+ (45 . hydra--negative-argument)
+ (21 . hydra--universal-argument)))
+ (set
+ (defvar lispy-tab-hydra/hint nil "Dynamic hint for lispy-tab-hydra.")
+ '(format
+ #("Tab: [i]: Tab, [s]: Shifttab." 6 7
+ (face hydra-face-blue)
+ 16 17
+ (face hydra-face-blue))))
+ (defun lispy-tab-hydra/lispy-tab-and-exit nil "Call the head `lispy-tab' in the \"lispy-tab-hydra\" hydra.
+
+The heads for the associated hydra are:
+
+\"i\": `lispy-tab',
+\"s\": `lispy-shifttab'
+
+The body can be accessed via `lispy-tab-hydra/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'lispy-tab-hydra/body)
+ (progn
+ (setq this-command 'lispy-tab)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-tab))))
+ (defun lispy-tab-hydra/lispy-shifttab-and-exit nil "Call the head `lispy-shifttab' in the \"lispy-tab-hydra\" hydra.
+
+The heads for the associated hydra are:
+
+\"i\": `lispy-tab',
+\"s\": `lispy-shifttab'
+
+The body can be accessed via `lispy-tab-hydra/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'lispy-tab-hydra/body)
+ (progn
+ (setq this-command 'lispy-shifttab)
+ (hydra--call-interactively-remap-maybe
+ (function lispy-shifttab))))
+ (defun lispy-tab-hydra/body nil "Call the body in the \"lispy-tab-hydra\" hydra.
+
+The heads for the associated hydra are:
+
+\"i\": `lispy-tab',
+\"s\": `lispy-shifttab'
+
+The body can be accessed via `lispy-tab-hydra/body'."
+ (interactive)
+ (require 'hydra)
+ (hydra-default-pre)
+ (let
+ ((hydra--ignore nil))
+ ;; Unfortunate, but this ignore has to be manually placed here
+ ;; after macroexpanding.
+ (ignore hydra--ignore)
+ (hydra-keyboard-quit)
+ (setq hydra-curr-body-fn 'lispy-tab-hydra/body))
+ (hydra-idle-message 0.3 lispy-tab-hydra/hint 'lispy-tab-hydra)
+ (hydra-set-transient-map lispy-tab-hydra/keymap
+ (lambda nil
+ (hydra-keyboard-quit)
+ nil)
+ nil)
+ (setq prefix-arg current-prefix-arg))))
+
+;; ------------------------------- HYDRA ---------------------------------------
+
+(defun evil-collection-lispy-action-then-next-sexp (lispy-action)
+ "Return function that triggers LISPY-ACTION and then moves to next sexp."
+ (defalias (intern (format "%S-then-next-sexp" lispy-action))
+ (lambda ()
+ (interactive)
+ (call-interactively lispy-action)
+ (unless (or (lispy-left-p)
+ (lispy-right-p)
+ (and (lispy-bolp)
+ (or (looking-at lispy-outline-header)
+ (looking-at lispy-outline))))
+ (call-interactively #'lispy-down)))))
+
+(defun evil-collection-lispy-delete (arg)
+ "Copy and delete current sexp.
+Passes ARG to `lispy-delete' or `lispy-delete-back'.
+
+Copy of `noc:lispy-delete'."
+ (interactive "p")
+ (cond ((or (lispy-left-p)
+ (region-active-p))
+ (lispy-new-copy)
+ (lispy-delete arg))
+ ((lispy-right-p)
+ (lispy-new-copy)
+ (lispy-delete-backward arg))))
+
+(defvar evil-collection-lispy-mode-map-special
+ (let ((map (make-sparse-keymap)))
+ (lispy-define-key map
+ ";" (evil-collection-lispy-action-then-next-sexp
+ 'lispy-comment))
+
+ ;; navigation
+ (lispy-define-key map "l" 'lispy-right)
+ (lispy-define-key map "h" 'lispy-left)
+ (lispy-define-key map "f" 'lispy-ace-paren
+ :override '(cond ((bound-and-true-p view-mode)
+ (View-quit)))) ;; `lispy-flow' -> w
+ (lispy-define-key map "j" 'lispy-down)
+ (lispy-define-key map "k" 'lispy-up)
+
+ (lispy-define-key map
+ "d" (evil-collection-lispy-action-then-next-sexp
+ 'evil-collection-lispy-delete)) ;; `lispy-different' -> o
+
+ (lispy-define-key map "o" 'lispy-different) ;; `lispy-other-mode' -> Q
+ (lispy-define-key map "p" 'lispy-paste) ;; `lispy-eval-other-window' -> P
+ (lispy-define-key map "P" 'lispy-eval-other-window) ;; `lispy-paste' -> p
+ (lispy-define-key map "y" 'lispy-new-copy) ;; `lispy-occur' -> /
+ (lispy-define-key map "z" 'lispy-view) ;; `lispy-mark-list' -> v
+
+ ;; outline
+ (lispy-define-key map "J" 'lispy-join) ;; `lispy-outline-next'
+ (lispy-define-key map "K" 'lispy-describe) ;; `lispy-outline-prev'
+ (lispy-define-key map "L" 'lispy-outline-goto-child)
+
+ ;; Paredit transformations
+ (lispy-define-key map ">" 'lispy-slurp-or-barf-right) ;; `lispy-slurp'
+ (lispy-define-key map "<" 'lispy-slurp-or-barf-left) ;; `lispy-barf'
+
+ ;; FIXME: This doesn't work for me for some reason...
+ (lispy-define-key map "/" 'lispy-occur) ;; `lispy-x' -> q
+
+ (lispy-define-key map "r" 'lispy-raise)
+ (lispy-define-key map "R" 'lispy-raise-some)
+
+ (lispy-define-key map "+" 'lispy-join) ;; Hmnn this can be something else.
+
+ ;; more transformations
+ (lispy-define-key map "C" 'lispy-convolute)
+ (lispy-define-key map "X" 'lispy-convolute-left)
+ (lispy-define-key map "w" 'lispy-move-up)
+ (lispy-define-key map "s" 'lispy-move-down)
+ (lispy-define-key map "O" 'lispy-oneline)
+ (lispy-define-key map "M" 'lispy-alt-multiline)
+ (lispy-define-key map "S" 'lispy-stringify)
+
+ ;; marking
+ (lispy-define-key map "a" 'lispy-ace-symbol
+ :override '(cond ((looking-at lispy-outline)
+ (lispy-meta-return))))
+ (lispy-define-key map "H" 'lispy-ace-symbol-replace)
+
+ ;; dialect-specific
+ (lispy-define-key map "e" 'lispy-eval)
+ (lispy-define-key map "E" 'lispy-eval-and-insert)
+
+ ;; Hmnn, not sure why there's no `lispy-end-of-defun'.
+ ;; `end-of-defun' doesn't work quite right yet. It exits the list
+ ;; which would exit lispy state.
+ (lispy-define-key map "G" 'end-of-defun) ;; `lispy-goto-local' -> gl
+ (lispy-define-key map "g" 'g-knight/body) ;; `lispy-goto' -> gd
+
+ (lispy-define-key map "A" 'evil-collection-lispy-insert-at-end-of-list) ;; `lispy-beginning-of-defun' -> gg
+ (lispy-define-key map "I" 'evil-collection-lispy-insert-at-beginning-of-list) ;; `lispy-shifttab' -> zs
+
+ (lispy-define-key map "F" 'lispy-follow t)
+ (lispy-define-key map "D" 'pop-tag-mark)
+ (lispy-define-key map "_" 'lispy-underscore)
+
+ ;; miscellanea
+ (define-key map (kbd "SPC") 'lispy-space)
+ (lispy-define-key map "TAB" 'lispy-tab-hydra/body) ;; `lh-knight/body' -> g
+
+ (lispy-define-key map "N" 'lispy-narrow)
+ (lispy-define-key map "W" 'lispy-widen)
+ (lispy-define-key map "c" 'lispy-clone)
+ (lispy-define-key map "u" 'lispy-undo)
+
+ (lispy-define-key map "q" 'lispy-x) ;; `lispy-ace-paren' -> f
+ (lispy-define-key map "Q" 'lispy-other-mode) ;; `lispy-ace-char' -> t
+ (lispy-define-key map "v" 'lispy-mark-list) ;; `lispy-view' -> z
+ (lispy-define-key map "t" 'lispy-ace-char) ;; `lispy-teleport' -> T
+ (lispy-define-key map "n" 'lispy-flow) ;; `lispy-new-copy' -> y
+ (lispy-define-key map "b" 'lispy-back)
+
+ (lispy-define-key map "B" 'lispy-ediff-regions)
+ (lispy-define-key map "x" 'lispy-splice) ;; `lispy-x' -> q
+
+ (lispy-define-key map "Z" 'lispy-edebug-stop)
+ (lispy-define-key map "V" 'lispy-visit)
+ (lispy-define-key map "-" 'lispy-ace-subword)
+ (lispy-define-key map "." 'lispy-repeat)
+ (lispy-define-key map "~" 'lispy-tilde)
+ ;; digit argument
+ (mapc (lambda (x) (lispy-define-key map (format "%d" x) 'digit-argument))
+ (number-sequence 0 9))
+
+ ;; additional
+ (lispy-define-key map "T" 'lispy-teleport
+ :override '(cond ((looking-at lispy-outline)
+ (end-of-line))))
+ (lispy-define-key map "]" 'lispy-forward)
+ (lispy-define-key map "[" 'lispy-backward)
+ (lispy-define-key map "{" 'lispy-brackets)
+
+ ;; Experimental
+ (lispy-define-key map "C-J" 'lispy-outline-next)
+ (lispy-define-key map "C-K" 'lispy-outline-prev)
+ (lispy-define-key map "^" 'lispy-splice-sexp-killing-backward)
+ (lispy-define-key map "$" 'lispy-splice-sexp-killing-forward)
+ (lispy-define-key map "M-j" 'lispy-move-down) ;; `lispy-split'
+ (lispy-define-key map "M-k" 'lispy-move-up) ;; `lispy-kill-sentence'
+ map)
+ "`evil' flavored `lispy' bindings when in special state.")
+
+(defvar evil-collection-lispy-mode-map (make-sparse-keymap)
+ "`evil' flavored `lispy-mode' bindings.")
+
+(defun evil-collection-lispy-set-key-theme (theme)
+ "Set `lispy-mode-map' for according to THEME.
+THEME is a list of choices: \='special', \='lispy', \='paredit', \='evilcp',
+ \='c-digits', \='special-evil', \='evil'.
+
+This is an exact copy of `lispy-set-key-theme' except with the additions of
+ \='special-evil' and \='evil' themes."
+ (setq lispy-mode-map
+ (make-composed-keymap
+ (delq nil
+ (list
+ (when (memq 'special-evil theme) evil-collection-lispy-mode-map-special)
+ (when (memq 'evil theme) evil-collection-lispy-mode-map)
+ (when (memq 'special theme) lispy-mode-map-special)
+ (when (memq 'lispy theme) lispy-mode-map-lispy)
+ (when (memq 'paredit theme) lispy-mode-map-paredit)
+ (when (memq 'parinfer theme) lispy-mode-map-parinfer)
+ (when (memq 'evilcp theme) lispy-mode-map-evilcp)
+ (when (memq 'c-digits theme) lispy-mode-map-c-digits)
+ (when (memq 'oleh theme) lispy-mode-map-oleh)))))
+ (setcdr
+ (assq 'lispy-mode minor-mode-map-alist)
+ lispy-mode-map))
+
+;;;###autoload
+(defun evil-collection-lispy-setup ()
+ "Set up `evil' bindings for `lispy'."
+ (advice-add 'lispy-set-key-theme :override 'evil-collection-lispy-set-key-theme)
+ (lispy-set-key-theme '(special-evil evil))
+ (evil-collection-define-key 'normal 'evil-collection-lispy-mode-map
+ ;; Instead of inheriting, explicitly define keys from `lispy-mode-map-base'.
+ ;; navigation.
+ ;; Commented out define-keys are from the original map that we're not using.
+ ;; -- Begin Inheritance
+ ;; (define-key map (kbd "C-a") 'lispy-move-beginning-of-line)
+ ;; (define-key map (kbd "C-e") 'lispy-move-end-of-line)
+ (kbd "M-n") 'lispy-left
+ ;; killing
+ ;; (define-key map (kbd "C-k") 'lispy-kill)
+ (kbd "M-d") 'lispy-kill-word
+ (kbd "M-DEL") 'lispy-backward-kill-word
+ ;; misc
+ "(" 'lispy-parens
+ ";" 'lispy-comment
+ ;; (kbd "M-q") 'lispy-fill
+ ;; (define-key map (kbd "C-j") 'lispy-newline-and-indent)
+ ;; (define-key map (kbd "RET") 'lispy-newline-and-indent-plain)
+ ;; tags
+ "gd" 'lispy-goto-symbol
+ (kbd "C-t") 'pop-tag-mark
+ ;; -- End Inheritance.
+
+ (kbd "M-)") 'lispy-wrap-round
+ (kbd "M-s") 'lispy-splice
+ (kbd "M-<up>") 'lispy-splice-sexp-killing-backward
+ (kbd "M-<down>") 'lispy-splice-sexp-killing-forward
+ (kbd "M-r") 'lispy-raise-sexp
+ (kbd "M-R") 'lispy-raise-some
+ (kbd "M-C") 'lispy-convolute-sexp
+ (kbd "M-S") 'lispy-split
+ (kbd "M-J") 'lispy-join
+ "]" 'lispy-forward
+ "[" 'lispy-backward
+ (kbd "M-(") 'lispy-wrap-round
+ (kbd "M-{") 'lispy-wrap-braces
+ (kbd "M-}") 'lispy-wrap-braces
+ "<" 'lispy-slurp-or-barf-left
+ ">" 'lispy-slurp-or-barf-right
+ (kbd "M-y") 'lispy-new-copy
+ (kbd "<C-return>") 'lispy-open-line
+ (kbd "<M-return>") 'lispy-meta-return
+ (kbd "M-k") 'lispy-move-up
+ (kbd "M-j") 'lispy-move-down
+ (kbd "M-o") 'lispy-string-oneline
+ (kbd "M-p") 'lispy-clone
+ (kbd "M-d") 'evil-collection-lispy-delete))
+
+(provide 'evil-collection-lispy)
+;;; evil-collection-lispy.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/lms/evil-collection-lms.el b/.config/emacs/lisp/evil-collection/modes/lms/evil-collection-lms.el
new file mode 100644
index 0000000..19ebf37
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/lms/evil-collection-lms.el
@@ -0,0 +1,404 @@
+;;; evil-collection-lms.el --- Evil bindings for lms.el -*- lexical-binding: t -*-
+;; Copyright (C) 2021-2023 Edgar Vincent
+
+;; Author: Edgar Vincent <e-v@posteo.net>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "25.1"))
+;; Keywords: evil, multimedia, music, logitechmediaserver, squeezebox
+
+;; This file is not part of GNU Emacs.
+;;
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for lms.el.
+;;
+;;; Code:
+(require 'lms nil t)
+(require 'evil-collection)
+
+(defvar lms-ui-docs)
+(defvar lms-ui-playing-now-mode-map)
+(defvar lms-ui-players-mode-map)
+(defvar lms-ui-playlist-mode-map)
+(defvar lms-ui-track-info-mode-map)
+(defvar lms-ui-tracks-list-mode-map)
+(defvar lms--ui-editing-p)
+(defvar lms--ui-pl-tracks)
+
+(declare-function lms-ui-playing-now-refresh "lms")
+
+(defconst evil-collection-lms-maps '(lms-ui-players-mode-map
+ lms-ui-playing-now-mode-map
+ lms-ui-playlist-mode-map
+ lms-ui-track-info-mode-map
+ lms-ui-tracks-list-mode-map
+ lms-ui-year-album-artist-list-mode-map))
+
+(defconst evil-collection-lms-modes '(lms-players-mode
+ lms-ui-playing-now-mode
+ lms-ui-track-info-mode
+ lms-ui-players-mode
+ lms-ui-playlist-mode
+ lms-ui-tracks-list-mode
+ lms-ui-year-album-artist-list-mode))
+
+(defun evil-collection-lms-ui-track-info-mode-quit ()
+ "Exit `lms-ui-track-info-mode'."
+ (interactive)
+ (kill-buffer "*LMS: Track Information*")
+ (lms-ui-playing-now-refresh))
+
+(defun evil-collection-lms-ui-players-mode-quit ()
+ "Exit `lms-ui-players-mode'."
+ (interactive)
+ (kill-buffer (format "*LMS: Players*"))
+ (lms-ui-playing-now-refresh))
+
+(defun evil-collection-lms-ui-playlist-mode-quit ()
+ "Exit `lms-ui-playlist-mode'."
+ (interactive)
+ (kill-buffer (format "*LMS: Playlist [%d tracks]*" (length lms--ui-pl-tracks)))
+ (lms-ui-playing-now-refresh))
+
+(defun evil-collection-lms-ui-tracks-list-mode-quit ()
+ "Exit `lms-ui-tracks-list-mode'."
+ (interactive)
+ (kill-buffer)
+ (lms-ui-playing-now-refresh))
+
+(defalias 'evil-collection-lms-ui-year-album-artist-list-mode-quit
+ 'evil-collection-lms-ui-tracks-list-mode-quit
+ "Exit lms-ui-tracks-list-mode.")
+
+(defun evil-collection-lms-goto-line (count)
+ "Move the point to line COUNT. By default the penultimate line."
+ (interactive "P")
+ (evil-goto-line count)
+ (unless count
+ (forward-line -1)))
+
+(defun evil-collection-lms-next-line ()
+ "Move the point to the next line, except if it is at the end of the buffer."
+ (interactive)
+ (forward-line 1)
+ (when (eobp) (forward-line -1)))
+
+(defun evil-collection-lms-ui-playing-now ()
+ "Modify the *LMS: Playing Now* buffer to reflect evil keybinding changes."
+ (setq-local buffer-read-only nil)
+ (setq lms--ui-editing-p t)
+ (while (search-forward-regexp "Press 'h' for help" nil 'noerror)
+ (replace-match "")
+ (insert (propertize "Press 'gh' or 'g?' for help" 'face '(variable-pitch (:height 0.85 :slant italic :foreground "gray40")))))
+ (setq-local buffer-read-only t)
+ (setq lms--ui-editing-p nil))
+
+(defvar evil-collection-lms-ui-docs
+ "#+TITLE: lms.el Documentation
+#+AUTHOR: Iñigo Serna
+#+DATE: 2020/06/14
+
+* Introduction
+This is an *emacs* frontend to interact with Squeezebox Server / Logitech Media Server.
+Released under GPL version 3 license or later.
+
+It requires emacs version 25 or higher.
+
+More information on what a *squeezebox controller* is at https://inigo.katxi.org/blog/2017/07/31/lms_el.html.
+
+Quick instructions: customize some basic parameters such as 'lms-url' and run it with *lms* or *lms-ui*.
+From there, you could read complete documentation after pressing *gh* or *g?*.
+You can also run 'emacsclient -e \"(lms-float)\"' to display an independent small frame.
+
+Package should appear in [[https://melpa.org][MELPA repository]], and the code is in [[https://hg.serna.eu/emacs/lms][the code repository]] as well.
+
+* Features
+This is Squeezebox controller, i.e. a program which can handle your local music library.
+
+Some of the features:
+- Display song: title, artist, album, year, cover…
+- Play, pause, stop, select next / previous song
+- Control players: select player, power on/off, volume, repeat and shuffle modes
+- Playlist control: list, select song, delete track, clear
+- Show track information and change rating
+
+It is not aimed to be a complete controller, as it can't - and won't - manage external sources such us BBC, Deezer, Pandora, Spotify, or TuneIn Radio.
+
+* Configuration
+There are some parameters you could customize:
+|--------------------------+-----------------------------------------------+------------------------------------|
+| Parameter | Description | Default |
+|--------------------------+-----------------------------------------------+------------------------------------|
+| lms-url | Logitech Media Server hostname or ip and port | http://lms_server:9000 |
+| lms-default-player | Name of default player | nil (1) |
+| lms-ui-cover-width | Cover image width | 500 (2) |
+| lms-ui-update-interval | Time in seconds between UI updates | 1 (3) |
+| lms-number-recent-albums | Number of recent albums to show | 25 |
+| lms-number-random-albums | Number of random albums to show | 25 |
+| lms-number-random-songs | Number of random songs to show | 50 |
+| lms-set-rating-function | Function to use to set song rating | lms--set-rating-with-trackstat (4) |
+|--------------------------+-----------------------------------------------+------------------------------------|
+Notes:
+(1) If *lms-default-player* is not defined or a player with that name does not exist, it will ask for one at start.
+(2) It's recomendable not to change *lms-ui-cover-width*.
+(3) Note that small values in *lms-ui-update-interval* could freeze your Emacs use while refreshing window.
+(4) LMS does not have any means to set the rating of a song by itself, so it depends on an external plugin.
+ TrackStat (function *lms--set-rating-with-trackstat*) is a popular one, and RatingsLight (function *lms--set-rating-with-ratingslight*) is another option.
+** Faces
+The colors and font attributes of text can be customized in some views:
+|----------------------------+-------------------------------+---------------------|
+| Face name | Description | Default |
+|----------------------------+-------------------------------+---------------------|
+| lms-playing-face | Playing symbol | DarkTurquoise, bold |
+| lms-title-face | Song title | SlateGray, italic |
+| lms-artist-face | Artist | RosyBrown, bold |
+| lms-year-face | Song year | SteelBlue |
+| lms-album-face | Album | CadetBlue |
+| lms-tracknum-face | Track number | gray40 |
+| lms-duration-face | Song duration | gray60 |
+| lms-players-selected-face | Selected icon in players list | SteelBlue |
+| lms-players-isplaying-face | Isplaying in players list | RosyBrown |
+| lms-players-name-face | Player name in players list | CadetBlue |
+| lms-players-model-face | Player model in players list | SlateGray |
+| lms-players-playerid-face | Player id in players list | gray60 |
+| lms-players-ip-face | Player IP in players list | gray40 |
+| lms-players-power-face | Ispower in players list | Maroon |
+|----------------------------+-------------------------------+---------------------|
+
+* Playing now
+Main window showing information about current track and player status.
+The actions triggered by pressing keys refer to the current track.
+** Key bindings
+|-----------------+--------------------------------|
+| Ctrl-p | select player |
+| t | change player power state |
+| R | change track rating |
+| Ctrl-= | set volume |
+| x, <enter> | toggle play/pause |
+| p | play |
+| s | stop playing |
+| Ctrl-k, <left> | play previous song in playlist |
+| Ctrl-j, <right> | play next song in playlist |
+| m | toggle mute volume |
+| +, = | volume up +5 |
+| - | volume down -5 |
+| r | cycle repeat mode |
+| S | cycle shuffle mode |
+| gr | update window contents |
+| i | display track information |
+| P | display playlist |
+| T | show all albums by artist |
+| L | show all tracks of album |
+| Y | show all albums of this year |
+| M | browse music libray |
+| gh, g? | show this documentation |
+| q | quit LMS |
+|-----------------+--------------------------------|
+
+* Track information
+Display track information.
+Previous/next track only works when *Track information* window was called from a list, but not from *Playing now*.
+** Key bindings
+|-----------------+-------------------------|
+| R | change track rating |
+| Ctrl-k, <left> | show previous track |
+| Ctrl-j, <right> | show next track |
+| gh, g? | show this documentation |
+| q | close window |
+|-----------------+-------------------------|
+
+* Players list
+Players list.
+** Key bindings
+|--------------------+--------------------------------|
+| k, <up>, j, <down> | move cursor |
+| <enter> | select player and close window |
+| x | toggle player play/pause |
+| t | toggle player power state |
+| gh, g? | show this documentation |
+| q | close window |
+|--------------------+--------------------------------|
+
+* Playlist
+Playlist view.
+The actions triggered by pressing keys refer to the track under cursor.
+** Key bindings
+|--------------------+------------------------------------|
+| k, <up>, j, <down> | move cursor |
+| <enter> | play track |
+| i | show track information |
+| C | jump to current track |
+| d, <delete> | remove track from playlist |
+| c c | clear playlist |
+| c u | remove tracks from start to cursor |
+| c f | remove tracks from cursor to end |
+| u | update window contents |
+| A | show all albums by artist |
+| T | show all tracks of album |
+| Y | show all albums of this year |
+| gh, g? | show this documentation |
+| q | close window |
+|--------------------+------------------------------------|
+
+* Year - Album - Artist list
+View all albums of an artist, sorted by date/year.
+The actions triggered by pressing keys refer to the album under cursor.
+** Key bindings
+|--------------------+------------------------------|
+| k, <up>, j, <down> | move cursor |
+| <enter>, a | show all tracks of album |
+| A | show all albums by artist |
+| Y | show all albums of this year |
+| p | add album to playlist |
+| gh, g? | show this documentation |
+| q | close window |
+|--------------------+------------------------------|
+
+* Tracks list
+View list of tracks.
+The actions triggered by pressing keys refer to the track under cursor.
+** Key bindings
+|--------------------+------------------------------|
+| j, <up>, k, <down> | move cursor |
+| <enter>, i | display track information |
+| A | show all albums by artist |
+| Y | show all albums of this year |
+| p | add song to playlist |
+| P | add all songs to playlist |
+| gh, g? | show this documentation |
+| q | close window |
+|--------------------+------------------------------|
+"
+ "LMS documentation.")
+
+;;;###autoload
+(defun evil-collection-lms-setup ()
+ "Set up `evil' bindings for `lms'."
+
+ (dolist (map evil-collection-lms-maps)
+ (evil-collection-inhibit-insert-state map))
+
+ (dolist (mode evil-collection-lms-modes)
+ (evil-set-initial-state mode 'normal))
+
+ (evil-collection-define-key 'normal 'lms-ui-playing-now-mode-map
+ "t" 'lms-ui-playing-now-change-player-power-state
+ (kbd "C-p") 'lms-ui-playing-now-players-list
+ "R" 'lms-ui-playing-now-change-rating
+ (kbd "C-=") 'lms-ui-playing-now-set-volume
+ (kbd "RET") 'lms-ui-playing-now-play-pause
+ "x" 'lms-ui-playing-now-play-pause
+ "p" 'lms-ui-playing-now-play
+ "s" 'lms-ui-playing-now-stop
+ (kbd "C-j") 'lms-ui-playing-now-next
+ (kbd "<right>") 'lms-ui-playing-now-next
+ (kbd "C-k") 'lms-ui-playing-now-prev
+ (kbd "<left>") 'lms-ui-playing-now-prev
+ "+" 'lms-ui-playing-now-volume-up
+ "=" 'lms-ui-playing-now-volume-up
+ "-" 'lms-ui-playing-now-volume-down
+ "m" 'lms-ui-playing-now-volume-mute
+ "r" 'lms-ui-playing-now-cycle-repeat
+ "S" 'lms-ui-playing-now-cycle-shuffle
+ "gr" 'lms-ui-playing-now-refresh
+ "i" 'lms-ui-playing-now-show-track-info
+ "P" 'lms-ui-playing-now-show-playlist
+ "T" 'lms-ui-playing-now-album-tracks-list
+ "A" 'lms-ui-playing-now-artist-albums-list
+ "Y" 'lms-ui-playing-now-year-albums-list
+ "M" 'lms-ui-playing-now-browse-music-library
+ "g?" 'lms-ui-playing-now-help
+ "gh" 'lms-ui-playing-now-help
+ "q" 'lms-ui-playing-now-quit)
+
+ (evil-collection-define-key 'normal 'lms-ui-track-info-mode-map
+ "R" 'lms-ui-track-info-change-rating
+ (kbd "C-k") 'lms-ui-track-info-prev
+ (kbd "<left>") 'lms-ui-track-info-prev
+ (kbd "C-j") 'lms-ui-track-info-next
+ (kbd "<right>") 'lms-ui-track-info-next
+ "g?" 'lms-ui-playing-now-help
+ "gh" 'lms-ui-playing-now-help
+ "q" 'evil-collection-lms-ui-track-info-mode-quit)
+
+ (evil-collection-define-key 'normal 'lms-ui-players-mode-map
+ [remap evil-goto-line] 'evil-collection-lms-goto-line
+ [remap end-of-defun] 'evil-collection-lms-goto-line
+ [remap evil-forward-paragraph] 'evil-collection-lms-goto-line
+ [remap evil-next-line] 'evil-collection-lms-next-line
+ (kbd "RET") 'lms-ui-players-select
+ "x" 'lms-ui-players-playpause
+ "t" 'lms-ui-players-toggle-power
+ "g?" 'lms-ui-playing-now-help
+ "gh" 'lms-ui-playing-now-help
+ "q" 'evil-collection-lms-ui-players-mode-quit)
+
+ (evil-collection-define-key 'normal 'lms-ui-playlist-mode-map
+ [remap evil-goto-line] 'evil-collection-lms-goto-line
+ [remap end-of-defun] 'evil-collection-lms-goto-line
+ [remap evil-forward-paragraph] 'evil-collection-lms-goto-line
+ [remap evil-next-line] 'evil-collection-lms-next-line
+ (kbd "RET") 'lms-ui-playlist-play
+ "i" 'lms-ui-playlist-track-info
+ "C" 'lms-ui-playlist-jump-to-current
+ "d" 'lms-ui-playlist-delete-track
+ (kbd "<delete>") 'lms-ui-playlist-delete-track
+ "cc" 'lms-ui-playlist-clear
+ "ct" 'lms-ui-playlist-clear-until-track
+ "cf" 'lms-ui-playlist-clear-from-track
+ "u" 'lms-ui-playlist
+ "A" 'lms-ui-playlist-artist-albums-list
+ "T" 'lms-ui-playlist-album-tracks-list
+ "Y" 'lms-ui-playlist-year-albums-list
+ "g?" 'lms-ui-playing-now-help
+ "gh" 'lms-ui-playing-now-help
+ "q" 'evil-collection-lms-ui-playlist-mode-quit)
+
+ (evil-collection-define-key 'normal 'lms-ui-tracks-list-mode-map
+ [remap evil-goto-line] 'evil-collection-lms-goto-line
+ [remap end-of-defun] 'evil-collection-lms-goto-line
+ [remap evil-forward-paragraph] 'evil-collection-lms-goto-line
+ [remap evil-next-line] 'evil-collection-lms-next-line
+ "i" 'lms-ui-tl-track-info
+ (kbd "RET") 'lms-ui-tl-track-info
+ "p" 'lms-ui-tl-to-playlist
+ "P" 'lms-ui-tl-all-to-playlist
+ "Y" 'lms-ui-tl-by-year
+ "A" 'lms-ui-tl-by-artist
+ "g?" 'lms-ui-playing-now-help
+ "gh" 'lms-ui-playing-now-help
+ "q" 'evil-collection-lms-ui-tracks-list-mode-quit)
+
+ (evil-collection-define-key 'normal 'lms-ui-year-album-artist-list-mode-map
+ [remap evil-goto-line] 'evil-collection-lms-goto-line
+ [remap end-of-defun] 'evil-collection-lms-goto-line
+ [remap evil-forward-paragraph] 'evil-collection-lms-goto-line
+ [remap evil-next-line] 'evil-collection-lms-next-line
+ "Y" 'lms-ui-yaal-by-year
+ "A" 'lms-ui-yaal-by-artist
+ (kbd "RET") 'lms-ui-yaal-by-album
+ "a" 'lms-ui-yaal-by-album
+ "p" 'lms-ui-yaal-to-playlist
+ "g?" 'lms-ui-playing-now-help
+ "gh" 'lms-ui-playing-now-help
+ "q" 'evil-collection-lms-ui-year-album-artist-list-mode-quit)
+
+ ;; Reflect help keybinding changes in the lms.el UI.
+ (advice-add 'lms-ui-playing-now :after 'evil-collection-lms-ui-playing-now)
+ (setq lms-ui-docs evil-collection-lms-ui-docs))
+
+(provide 'evil-collection-lms)
+;;; evil-collection-lms.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/log-edit/README.org b/.config/emacs/lisp/evil-collection/modes/log-edit/README.org
new file mode 100644
index 0000000..6046f21
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/log-edit/README.org
@@ -0,0 +1,17 @@
+* log-edit
+
+ Evil bindings for =log-edit-mode=, the VC commit-message buffer.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------------------+-----------+-------------------|
+ | =log-edit-done= | =C-c C-c= | =ZZ= (remap) |
+ | =log-edit-kill-buffer= | =C-c C-k= | =ZQ= (remap) |
+ | =log-edit-mode-help= | =C-c ?= | =g?= |
+ | =log-edit-next-comment= | =M-n= | =]]=, =gj=, =C-j= |
+ | =log-edit-previous-comment= | =M-p= | =[[=, =gk= |
+ | =quit-window= | n/a | =ZZ=, =ZQ= |
+
+ The remaps target =evil-save-and-close=, =evil-save-modified-and-close=,
+ and =evil-quit= so =:wq= / =:q= behave correctly.
diff --git a/.config/emacs/lisp/evil-collection/modes/log-edit/evil-collection-log-edit.el b/.config/emacs/lisp/evil-collection/modes/log-edit/evil-collection-log-edit.el
new file mode 100644
index 0000000..3d774c0
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/log-edit/evil-collection-log-edit.el
@@ -0,0 +1,57 @@
+;;; evil-collection-log-edit.el --- Evil bindings for log-edit -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>, Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, log-edit, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for log-edit.
+
+;;; Code:
+(require 'evil-collection)
+(require 'log-edit nil t)
+
+(defvar log-edit-mode-map)
+
+(defconst evil-collection-log-edit-maps '(log-edit-mode-map))
+
+;;;###autoload
+(defun evil-collection-log-edit-setup ()
+ "Set up `evil' bindings for `log-edit'."
+ (evil-collection-define-key nil 'log-edit-mode-map
+ [remap evil-save-and-close] 'log-edit-done
+ [remap evil-save-modified-and-close] 'log-edit-done
+ [remap evil-quit] 'log-edit-kill-buffer)
+
+ (evil-collection-define-key 'normal 'log-edit-mode-map
+ "g?" 'log-edit-mode-help
+ "]]" 'log-edit-next-comment
+ "[[" 'log-edit-previous-comment
+ "gj" 'log-edit-next-comment
+ "gk" 'log-edit-previous-comment
+ (kbd "C-j") 'log-edit-next-comment
+ (kbd "C-k") 'log-edit-next-comment
+
+ "ZQ" 'quit-window
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-log-edit)
+;;; evil-collection-log-edit.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/log-view/README.org b/.config/emacs/lisp/evil-collection/modes/log-view/README.org
new file mode 100644
index 0000000..c8363f4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/log-view/README.org
@@ -0,0 +1,20 @@
+* log-view
+
+ Evil bindings for =log-view-mode= (VC log buffers for git, hg, svn, etc.).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------------+--------------+-----------------|
+ | =log-view-toggle-entry-display= | =RET=, =TAB= | =TAB= |
+ | =log-view-diff= | =d=, === | =RET=, =d=, === |
+ | =log-view-diff-changeset= | =D= | =D= |
+ | =log-view-toggle-mark-entry= | =m= | =m= |
+ | =log-view-modify-change-comment= | =e= | =c= |
+ | =log-view-annotate-version= | =a= | =a= |
+ | =log-view-find-revision= | =f= | =F= |
+ | =log-view-msg-next= | =n=, =TAB= | =gj=, =]]= |
+ | =log-view-msg-prev= | =p= | =gk=, =[[= |
+ | =log-view-file-next= | n/a | =C-j= |
+ | =log-view-file-prev= | n/a | =C-k= |
+ | =quit-window= | =q= | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/log-view/evil-collection-log-view.el b/.config/emacs/lisp/evil-collection/modes/log-view/evil-collection-log-view.el
new file mode 100644
index 0000000..fbd7520
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/log-view/evil-collection-log-view.el
@@ -0,0 +1,63 @@
+;;; evil-collection-log-view.el --- Bindings for `log-view' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `log-view'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'log-view)
+
+(defconst evil-collection-log-view-maps '(log-view-mode-map))
+
+;;;###autoload
+(defun evil-collection-log-view-setup ()
+ "Set up `evil' bindings for `log-view'."
+
+ ;; Currently vc has these various log-view modes
+ (evil-set-initial-state 'vc-hg-log-view-mode 'normal)
+ (evil-set-initial-state 'vc-git-log-view-mode 'normal)
+ (evil-set-initial-state 'vc-svn-log-view-mode 'normal)
+
+ (evil-collection-define-key 'normal 'log-view-mode-map
+ "q" 'quit-window
+ (kbd "TAB") 'log-view-toggle-entry-display
+ "m" 'log-view-toggle-mark-entry
+ "c" 'log-view-modify-change-comment
+ (kbd "RET") 'log-view-diff
+ "d" 'log-view-diff
+ "=" 'log-view-diff
+ "D" 'log-view-diff-changeset
+ "a" 'log-view-annotate-version
+ "F" 'log-view-find-revision
+ "gj" 'log-view-msg-next
+ "gk" 'log-view-msg-prev
+ "]]" 'log-view-msg-next
+ "[[" 'log-view-msg-prev
+ (kbd "C-j") 'log-view-file-next
+ (kbd "C-k") 'log-view-file-prev))
+
+(provide 'evil-collection-log-view)
+;;; evil-collection-log-view.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/lsp-ui-imenu/evil-collection-lsp-ui-imenu.el b/.config/emacs/lisp/evil-collection/modes/lsp-ui-imenu/evil-collection-lsp-ui-imenu.el
new file mode 100644
index 0000000..473169a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/lsp-ui-imenu/evil-collection-lsp-ui-imenu.el
@@ -0,0 +1,47 @@
+;;; evil-collection-lsp-ui-imenu.el --- Bindings for `lsp-ui-imenu-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: Felix Dick <felix.dick@web.de>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, lsp-ui-imenu, convenience
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `lsp-ui-imenu-mode'.
+
+;;; Code:
+(require 'lsp-ui-imenu nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-lsp-ui-imenu-mode-maps '(lsp-ui-imenu-mode-map))
+
+;;;###autoload
+(defun evil-collection-lsp-ui-imenu-setup ()
+ "Set up `evil' bindings for `lsp-ui-imenu'."
+ (evil-set-initial-state 'lsp-ui-imenu-mode 'normal)
+ (evil-collection-define-key 'normal 'lsp-ui-imenu-mode-map
+ (kbd "C-k") 'lsp-ui-imenu--prev-kind
+ (kbd "C-j") 'lsp-ui-imenu--next-kind
+ (kbd "q") 'lsp-ui-imenu--kill
+ (kbd "RET") 'lsp-ui-imenu--view
+ (kbd "<M-return>") 'lsp-ui-imenu--visit))
+
+(provide 'evil-collection-lsp-ui-imenu)
+;;; evil-collection-lsp-ui-imenu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/lua-mode/README.org b/.config/emacs/lisp/evil-collection/modes/lua-mode/README.org
new file mode 100644
index 0000000..922ca73
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/lua-mode/README.org
@@ -0,0 +1,18 @@
+* lua-mode
+
+ Evil bindings for [[https://github.com/immerrr/lua-mode][lua-mode]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------+-----------+------|
+ | =lua-search-documentation= | =C-c C-f= | =K= |
+ | =run-lua= | | =gz= |
+
+ Also installs a hook that sets =evil-shift-width= to =lua-indent-level=
+ in =lua-mode= buffers.
+
+** New commands
+
+ - =evil-collection-lua-mode-set-evil-shift-width= — sync
+ =evil-shift-width= with =lua-indent-level= (added to =lua-mode-hook=).
diff --git a/.config/emacs/lisp/evil-collection/modes/lua-mode/evil-collection-lua-mode.el b/.config/emacs/lisp/evil-collection/modes/lua-mode/evil-collection-lua-mode.el
new file mode 100644
index 0000000..1345fe7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/lua-mode/evil-collection-lua-mode.el
@@ -0,0 +1,50 @@
+;;; evil-collection-lua-mode.el --- Bindings for `lua-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `lua-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'lua-mode nil t)
+
+(defvar lua-indent-level)
+(defconst evil-collection-lua-mode-maps '(lua-mode-map))
+
+(defun evil-collection-lua-mode-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `lua-indent-level'."
+ (setq-local evil-shift-width lua-indent-level))
+
+;;;###autoload
+(defun evil-collection-lua-mode-setup ()
+ "Set up `evil' bindings for `lua-mode'."
+ (add-hook 'lua-mode-hook #'evil-collection-lua-mode-set-evil-shift-width)
+
+ (evil-collection-define-key 'normal 'lua-mode-map
+ "K" 'lua-search-documentation
+ "gz" 'run-lua))
+
+(provide 'evil-collection-lua-mode)
+;;; evil-collection-lua-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/macrostep/README.org b/.config/emacs/lisp/evil-collection/modes/macrostep/README.org
new file mode 100644
index 0000000..0a0f543
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/macrostep/README.org
@@ -0,0 +1,13 @@
+* macrostep
+
+ Evil bindings for [[https://github.com/emacsorphanage/macrostep][macrostep]], the interactive macro expander.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------+--------------+-------------|
+ | =macrostep-expand= | =e= | =e= |
+ | =macrostep-collapse= | =c= | =u= |
+ | =macrostep-collapse-all= | =C-c C-c= | =q= |
+ | =macrostep-next-macro= | =n=, =TAB= | =gj=, =C-j= |
+ | =macrostep-prev-macro= | =p=, =M-TAB= | =gk=, =C-k= |
diff --git a/.config/emacs/lisp/evil-collection/modes/macrostep/evil-collection-macrostep.el b/.config/emacs/lisp/evil-collection/modes/macrostep/evil-collection-macrostep.el
new file mode 100644
index 0000000..58ff339
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/macrostep/evil-collection-macrostep.el
@@ -0,0 +1,52 @@
+;;; evil-collection-macrostep.el --- Evil Integration for Macrostep -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, macrostep, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `macrostep-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'macrostep nil t)
+
+(defconst evil-collection-macrostep-maps '(macrostep-keymap))
+
+;;;###autoload
+(defun evil-collection-macrostep-setup ()
+ "Set up `evil' bindings for `macrostep'."
+ ;; Keymaps don't seem to be populated on first try.
+ ;; Force `evil' to normalize keymaps.
+ (add-hook 'macrostep-mode-hook #'evil-normalize-keymaps)
+
+ (evil-collection-define-key 'normal 'macrostep-keymap
+ "q" 'macrostep-collapse-all
+ "e" 'macrostep-expand
+ "u" 'macrostep-collapse
+ "gj" 'macrostep-next-macro
+ "gk" 'macrostep-prev-macro
+ (kbd "C-j") 'macrostep-next-macro
+ (kbd "C-k") 'macrostep-prev-macro))
+
+(provide 'evil-collection-macrostep)
+;;; evil-collection-macrostep.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/magit-repos/README.org b/.config/emacs/lisp/evil-collection/modes/magit-repos/README.org
new file mode 100644
index 0000000..babd311
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit-repos/README.org
@@ -0,0 +1,17 @@
+* magit-repos
+
+ Evil bindings for [[https://magit.vc/][magit-repos]] (=magit-list-repositories=).
+
+ Initial state for =magit-repolist-mode= is set to =normal=.
+
+** Key bindings
+
+*** magit-repolist-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |---------------------------+----------+-------|
+ | =magit-repolist-mark= | =m= | =m= |
+ | =magit-repolist-unmark= | =u= | =u= |
+ | =magit-repolist-fetch= | =f= | =f= |
+ | =magit-repolist-status= | =RET= | =RET= |
+ | =magit-list-repositories= | =g= | =gr= |
diff --git a/.config/emacs/lisp/evil-collection/modes/magit-repos/evil-collection-magit-repos.el b/.config/emacs/lisp/evil-collection/modes/magit-repos/evil-collection-magit-repos.el
new file mode 100644
index 0000000..6bd91ec
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit-repos/evil-collection-magit-repos.el
@@ -0,0 +1,49 @@
+;;; evil-collection-magit-repos.el --- Bindings for magit-repos -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2016, 2021 Justin Burkett
+
+;; Author: Justin Burkett <justin@burkett.cc>
+;; Maintainer: Justin Burkett <justin@burkett.cc>
+;; James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; Package-Requires: ((emacs "26.3") (evil "1.2.3") (magit "2.6.0"))
+;; Homepage: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for magit-repos.
+
+;;; Code:
+(require 'evil-collection)
+(require 'magit-repos nil t)
+
+(defvar magit-repolist-mode-map)
+(defconst evil-collection-magit-repos-maps '(magit-repolist-mode-map))
+
+;;;###autoload
+(defun evil-collection-magit-repos-setup ()
+ "Set up `evil' bindings for `magit-repos'."
+ (evil-set-initial-state 'magit-repolist-mode 'normal)
+ (evil-collection-define-key 'normal 'magit-repolist-mode-map
+ "m" 'magit-repolist-mark
+ "u" 'magit-repolist-unmark
+ "f" 'magit-repolist-fetch
+ (kbd "RET") 'magit-repolist-status
+ (kbd "gr") 'magit-list-repositories)
+ (add-hook 'magit-repolist-mode-hook 'evil-normalize-keymaps))
+
+(provide 'evil-collection-magit-repos)
+;;; evil-collection-magit-repos.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/magit-section/README.org b/.config/emacs/lisp/evil-collection/modes/magit-section/README.org
new file mode 100644
index 0000000..807238d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit-section/README.org
@@ -0,0 +1,47 @@
+* magit-section
+
+ Evil bindings for [[https://github.com/magit/magit][magit-section]], the foldable section UI used by magit, forge,
+ and several other packages.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------------+-----------+-----------|
+ | =magit-section-toggle= | =TAB= | =TAB= |
+ | =magit-section-cycle= | =C-<tab>= | =C-<tab>= |
+ | =magit-section-cycle= | =M-<tab>= | =M-<tab>= |
+ | =magit-section-cycle-global= | =backtab= | =backtab= |
+ | =magit-section-up= | =^= | =gh= |
+ | =magit-section-backward= | =p= | =C-k= |
+ | =magit-section-forward= | =n= | =C-j= |
+ | =magit-section-backward-sibling= | =M-p= | =gk=, =[= |
+ | =magit-section-forward-sibling= | =M-n= | =gj=, =]= |
+ | =magit-section-show-level-1= | =1= | =1= |
+ | =magit-section-show-level-2= | =2= | =2= |
+ | =magit-section-show-level-3= | =3= | =3= |
+ | =magit-section-show-level-4= | =4= | =4= |
+ | =magit-section-show-level-1-all= | =M-1= | =M-1= |
+ | =magit-section-show-level-2-all= | =M-2= | =M-2= |
+ | =magit-section-show-level-3-all= | =M-3= | =M-3= |
+ | =magit-section-show-level-4-all= | =M-4= | =M-4= |
+
+ When =evil-collection-magit-section-use-z-for-folds= is non-nil, the
+ following vim-style fold bindings replace the =M-<digit>= variants:
+
+ | Command | Evil |
+ |----------------------------------+------|
+ | =magit-section-show-level-1-all= | =z1= |
+ | =magit-section-show-level-2-all= | =z2= |
+ | =magit-section-show-level-3-all= | =z3= |
+ | =magit-section-show-level-4-all= | =z4= |
+ | =magit-section-show-level-4-all= | =zr= |
+ | =magit-section-toggle= | =za= |
+ | =magit-section-show= | =zo= |
+ | =magit-section-show-children= | =zO= |
+ | =magit-section-hide= | =zc= |
+ | =magit-section-hide-children= | =zC= |
+
+** Customization
+
+ - =evil-collection-magit-section-use-z-for-folds= - When non-nil, use =z= as
+ a prefix for vim-style fold commands. The stash popup then moves to =Z=.
diff --git a/.config/emacs/lisp/evil-collection/modes/magit-section/evil-collection-magit-section.el b/.config/emacs/lisp/evil-collection/modes/magit-section/evil-collection-magit-section.el
new file mode 100644
index 0000000..2310393
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit-section/evil-collection-magit-section.el
@@ -0,0 +1,91 @@
+;;; evil-collection-magit-section.el --- Bindings for magit-section -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for magit-section.
+
+;;; Code:
+(require 'evil-collection)
+(require 'magit-section nil t)
+
+(defvar magit-section-mode-map)
+(defconst evil-collection-magit-section-maps '(magit-section-mode-map))
+
+(defcustom evil-collection-magit-section-use-z-for-folds nil
+ "When non nil, use \"z\" as a prefix for common vim fold commands, such as
+ - z1 Reset visibility to level 1 for all sections
+ - z2 Reset visibility to level 2 for all sections
+ - z3 Reset visibility to level 3 for all sections
+ - z4 Reset visibility to level 4 for all sections
+ - za Toggle a section
+ - zo Show section
+ - zO Show sections recursively
+ - zc Hide section
+ - zC Hide sections recursively
+ - zr Same as z4.
+
+When this option is enabled, the stash popup is available on \"Z\"."
+ :group 'magit
+ :type 'boolean)
+
+(defun evil-collection-magit-section-setup ()
+ "Set up `evil' bindings for magit-section."
+ (if evil-collection-magit-section-use-z-for-folds
+ (evil-collection-define-key 'normal 'magit-section-mode-map
+ "z1" 'magit-section-show-level-1-all
+ "z2" 'magit-section-show-level-2-all
+ "z3" 'magit-section-show-level-3-all
+ "z4" 'magit-section-show-level-4-all
+ "za" 'magit-section-toggle
+ "zc" 'magit-section-hide
+ "zC" 'magit-section-hide-children
+ "zo" 'magit-section-show
+ "zO" 'magit-section-show-children
+ "zr" 'magit-section-show-level-4-all)
+ (evil-collection-define-key 'normal 'magit-section-mode-map
+ (kbd "M-1") 'magit-section-show-level-1-all
+ (kbd "M-2") 'magit-section-show-level-2-all
+ (kbd "M-3") 'magit-section-show-level-3-all
+ (kbd "M-4") 'magit-section-show-level-4-all))
+
+ (evil-collection-define-key 'normal 'magit-section-mode-map
+ (kbd "TAB") 'magit-section-toggle
+ [C-tab] 'magit-section-cycle
+ [M-tab] 'magit-section-cycle
+ ;; [backtab] is the most portable binding for Shift+Tab.
+ [backtab] 'magit-section-cycle-global
+ "gh" 'magit-section-up
+ (kbd "C-k") 'magit-section-backward
+ (kbd "C-j") 'magit-section-forward
+ "gk" 'magit-section-backward-sibling
+ "[" 'magit-section-backward-sibling
+ "gj" 'magit-section-forward-sibling
+ "]" 'magit-section-forward-sibling
+ (kbd "1") 'magit-section-show-level-1
+ (kbd "2") 'magit-section-show-level-2
+ (kbd "3") 'magit-section-show-level-3
+ (kbd "4") 'magit-section-show-level-4))
+
+(provide 'evil-collection-magit-section)
+;;; evil-collection-magit-section.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/magit-todos/README.org b/.config/emacs/lisp/evil-collection/modes/magit-todos/README.org
new file mode 100644
index 0000000..17a94d1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit-todos/README.org
@@ -0,0 +1,32 @@
+* magit-todos
+
+ Evil bindings for [[https://github.com/alphapapa/magit-todos][magit-todos]].
+
+ Setup clears =j= and =k= on the todos section maps (older =magit-todos=
+ versions bound them, blocking evil's vertical motion through todos
+ sections) and adds a jump key on =magit-status=.
+
+** Key bindings
+
+*** magit-todos-section-map / magit-todos-item-section-map
+
+ | Key | Original | Evil |
+ |-----+------------------------------------+---------|
+ | =j= | =magit-todos-...= (older versions) | unbound |
+ | =k= | =magit-todos-...= (older versions) | unbound |
+
+ The current upstream uses =B= / =b= on these maps (branch list set
+ commit / toggle); those are untouched.
+
+*** magit-status-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |-----------------------------+----------+------|
+ | =magit-todos-jump-to-todos= | =j T= | =gT= |
+
+ Bound only when =magit-todos-mode= is enabled.
+
+** Notes
+
+ =magit-todos-mode= emits a warning about the =jT= key when these
+ rebindings take effect. Setup advises the mode to silence that warning.
diff --git a/.config/emacs/lisp/evil-collection/modes/magit-todos/evil-collection-magit-todos.el b/.config/emacs/lisp/evil-collection/modes/magit-todos/evil-collection-magit-todos.el
new file mode 100644
index 0000000..891904b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit-todos/evil-collection-magit-todos.el
@@ -0,0 +1,62 @@
+;;; evil-collection-magit-todos.el --- Bindings for `magit-todos' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: Fredrik Bergroth <fbergroth@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `magit-todos'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'magit-todos nil t)
+
+(defconst evil-collection-magit-todos-maps '(magit-todos-section-map
+ magit-todos-item-section-map
+ magit-status-mode-map))
+
+(defun evil-collection-magit-todos-setup-jump-key ()
+ "Add keybinding to jump to todos section."
+ (evil-collection-define-key 'normal 'magit-status-mode-map
+ "gT" (and (bound-and-true-p magit-todos-mode) 'magit-todos-jump-to-todos)))
+
+(defun evil-collection-magit-todos-supress-warning (func &rest args)
+ "Supress the jT keybinding warning."
+ (cl-letf* (((symbol-function 'message) #'ignore))
+ (apply func args)))
+
+;;;###autoload
+(defun evil-collection-magit-todos-setup ()
+ "Set up `evil' bindings for `magit-todos'."
+ ;; magit-todos binds jT and k which prevents evil users from stepping into the section
+ (dolist (key '("j" "k"))
+ (evil-collection-define-key nil 'magit-todos-section-map key nil)
+ (evil-collection-define-key nil 'magit-todos-item-section-map key nil))
+
+ ;; No need to tell me that jT isn't bound
+ (advice-add 'magit-todos-mode :around 'evil-collection-magit-todos-supress-warning)
+
+ (add-hook 'magit-todos-mode-hook 'evil-collection-magit-todos-setup-jump-key))
+
+
+(provide 'evil-collection-magit-todos)
+;;; evil-collection-magit-todos.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/magit/README.org b/.config/emacs/lisp/evil-collection/modes/magit/README.org
new file mode 100644
index 0000000..c20db58
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit/README.org
@@ -0,0 +1,212 @@
+* Black magic
+
+ This library configures Magit and Evil to play well with each other. For some
+ background see [[https://github.com/justbur/evil-magit/issues/1][Issue #1]].
+
+ *Note*: I intend to track the latest commits to the master branch of the [[https://github.com/magit/magit][magit
+ repo]], meaning the keybindings here are potentially ahead of the last stable
+ release of magit. Once the code in evil-collection-magit stabilizes, I may switch to
+ primarily tracking the stable release of magit and secondarily track the latest
+ commits to master. Any help is welcomed.
+
+* Recent Changes (most recent first)
+
+ 1. [2019-09-04] Don't use =evil-next-visual-line= and
+ =evil=previous-visual-line=. See [[https://github.com/emacs-evil/evil-magit/issues/70][Issue #70]].
+ 1. [2019-06-16] Added =evil-collection-magit-stage-untracked-file-with-intent= at
+ =I=. See [[https://github.com/emacs-evil/evil-magit/issues/67][Issue #67]].
+ 2. [2019-02-15] Added =forge-dispatch= at =@=.
+ 3. [2018-05-22] Added =evil-collection-magit-use-z-for-folds=. See docstring for more
+ information.
+ 4. [2018-03-13] Added basic evil support for =magit-list-repositories=.
+ 5. [2016-07-27] Moved submodules popup to ' and added the new subtree popup at
+ ". This is not mnemonic in any way but easy to reach and keeps the two keys
+ together.
+ 6. [2016-03-24] Moved =magit-diff-less-context= to = to fix conflict with
+ moved revert.
+ 7. [2016-03-21] Moved revert commands from =o= and =O= to =-= and
+ =_=. Rationale is that you are subtracting a commit. This makes room for
+ =o= and =O= to be reset and the new reset popup command. Think of resetting
+ to an "old" state. =¯\_(ツ)_/¯=
+ 8. Added =evil-collection-magit-want-horizontal-movement=. Use =h= and =l= for movement
+ like vim, moving =h= to =H=, =l= to =L=, and =L= to =C-l=.
+ 9. Added =evil-collection-magit-toggle-text-mode= on =C-t=. This is a quick way to enter
+ text mode in a magit buffer, which allows arbitrary movement, copying, etc.
+ Use =C-t= to return to the previous magit mode.
+ 10. When =evil-collection-magit-use-y-for-yank= is non nil, =C-w= will prefix the evil
+ window switching functions from magit buffers.
+ 11. =evil-collection-magit-use-y-for-yank= is now the default. It has worked well for me so
+ far, and I've had good feedback, but please let me know if you see issues.
+ You can use the original behavior with =(setq evil-collection-magit-use-y-for-yank
+ nil)=. See the table below for a summary of differences.
+
+
+* Installation and Use
+
+ Evil and Magit are both required. After requiring those packages, the following
+ will setup the new key bindings for you.
+
+ #+BEGIN_SRC emacs-lisp
+ ;; optional: this is the evil state that evil-collection-magit will use
+ ;; (setq evil-collection-magit-state 'normal)
+ ;; optional: disable additional bindings for yanking text
+ ;; (setq evil-collection-magit-use-y-for-yank nil)
+ (evil-collection-init)
+ #+END_SRC emacs-lisp
+
+** Note on Evil usage
+
+ This package assumes that you either use the global variant of evil mode (e.g.,
+ through =(evil-mode 1)=), or at least have =evil-local-mode= (the local variant)
+ enabled in the magit buffers you want these bindings to take effect in. When
+ evil is disabled in a magit buffer, this package will not affect the default key
+ bindings (with one minor exception).
+
+** Note on =evil-collection-magit-use-y-for-yank=
+
+ =evil-collection-magit-use-y-for-yank= enables evil's visual state for linewise selection,
+ and as a consequnce =y= will yank text from the buffer.
+
+ With this enabled which it is by default evil-collection-magit uses =v= and =V= to select
+ by line. Selection in magit occurs linewise, so this choice is to avoid
+ confusion that might arise if someone thought they could stage part of a line
+ with =v= for example.
+
+** Text mode
+
+ Text mode can be toggled with =evil-collection-magit-toggle-text-mode= (triggered with
+ =C-t= or =\=). This takes nearly any magit buffer out of the related magit mode
+ and puts it into =text-mode=. This allows free movement in the buffer using the
+ standard evil movement and selection commands, making it easy to for example
+ copy arbitrary text in the buffer. It also effectively prevents magit keys from
+ shadowing evil ones, so =f= runs =evil-find-char= instead of
+ =magit-fetch-popup=, allowing all vim related movement commands to be used in
+ magit buffers. You can think of this if you like as another state for evil-collection-magit
+ to be in.
+
+ Several requests have been made to allow selecting and copying arbitrary text in
+ the magit buffers, but there are many conflicts between evil bindings and magit
+ bindings and there is no elegant solution to this problem in my opinion. Text
+ mode is the best that I have come up with.
+
+* Key Bindings
+
+ The basic key binding scheme for evil-collection-magit (EM) is described in the following
+ tables. Blank columns indicate that the key is carried over from the left.
+
+ | Category | Default | EM w/o yank opt | w/ yank opt (default) | w/ horiz move | w/ folds |
+ |------------------------+---------+------------------------+-----------------------+---------------+----------|
+ | cherry pick | =a/A= | | | | |
+ | branch | =b= | | | | |
+ | bisect | =B= | | | | |
+ | commit | =c= | | | | |
+ | diff | =d/D= | | | | |
+ | ediff | =e/E= | | | | |
+ | fetch | =f= | | | | |
+ | pull | =F= | | | | |
+ | refresh | =g= | =gr/gR= (=g= in popup) | | | |
+ | help | =h/?= | | | =H/?= | |
+ | ignore | =i/I= | | | | |
+ | intent to stage | =I= | | | | |
+ | jump | =j= | =g= | | | |
+ | delete | =k= | =x= | | | |
+ | untrack | =K= | =X= | | | |
+ | log | =l/L= | | | =L/C-l= | |
+ | merge | =m= | | | | |
+ | remote | =M= | | | | |
+ | next section | =n= | =C-j= | | | |
+ | next section sibling | =M-n= | =M-j=, =gj=, or =]= | | | |
+ | submodule | =o= | ' | | | |
+ | subtree | =O= | " | | | |
+ | prev section | =p= | =C-k= | | | |
+ | prev section sibling | =M-p= | =M-k=, =gk=, or =[= | | | |
+ | push | =P= | =P= or =p= | | | |
+ | quit | =q= | =q= or =ESC= | | | |
+ | rebase | =r= | | | | |
+ | rename | =R= | | | | |
+ | stage | =s/S= | | | | |
+ | tag | =t= | | | | |
+ | notes | =T= | | | | |
+ | unstage | =u/U= | | | | |
+ | revert | =v/V= | =-/_= | | | |
+ | am | =w= | | | | |
+ | patch | =W= | | | | |
+ | reset | =x/X= | =o/O= | | | |
+ | show-refs | =y= | | =yr= (=y= in popup) | | |
+ | cherry | =Y= | | | | |
+ | worktree | =Z/%= | | | | =%= |
+ | stash | =z/Z= | | | | =Z= |
+ | git-cmd | =:= | =¦= | | | |
+ | run | =!= | | | | |
+ | forge | =@= | | | | |
+ | diff less/more context | =-/+= | = / + | | | |
+ | copy section info | =C-w= | | =ys= | | |
+ | copy buffer info | =M-w= | | =yb= | | |
+
+** New Commands
+
+ | Command | EM w/o yank opt | EM w/ yank opt (default) | w/ horiz move |
+ |----------------------------------------+--------------------------+--------------------------+---------------|
+ | evil-goto-line | =G= | | |
+ | evil-next-visual-line | =j= | | |
+ | evil-previous-visual-line | =k= | | |
+ | evil-backward-char | under =M-x= | | =h= |
+ | evil-forward-char | under =M-x= | | =l= |
+ | evil-search-next | =n= | | |
+ | evil-search-previous | =N= | | |
+ | set-mark-command | =v= or =V= | =C-SPC= | |
+ | evil-visual-line | under =M-x= | =v= or =V= | |
+ | evil-ex | =:= | | |
+ | evil-search-forward | =/= | | |
+ | evil-scroll-page-up | =C-b= | | |
+ | evil-scroll-down | =C-d= | | |
+ | evil-scroll-page-down | =C-f= | | |
+ | evil-scroll-up | =C-u= (if =C-u= scrolls) | | |
+ | evil-emacs-state | =C-z= | | |
+ | evil-yank-line | under =M-x= | =yy= | |
+ | evil-window-map | under =M-x= | =C-w= | |
+ | evil-collection-magit-toggle-text-mode | =C-t/\= | | |
+
+
+ Any other bindings are meant to be consistent with these.
+
+ Use =evil-collection-magit-revert= to revert changes made by evil-collection-magit to the default
+ evil+magit behavior.
+
+** To add other common evil commands
+
+ Some may want =?= to search backward instead of launching the popup which is
+ also bound to =h=. To get this behavior, add the following line after
+ =(evil-collection-init)= in your configuration.
+
+ #+BEGIN_SRC emacs-lisp
+(evil-define-key evil-collection-magit-state magit-mode-map "?" 'evil-search-backward)
+ #+END_SRC
+
+ Most (but not all) magit bindings are in =magit-mode-map=, so other commands can
+ be bound in this way too.
+
+** To remove commands
+
+ Typically, to prevent evil-collection-magit from overriding the default behavior with evil
+ and magit loaded, you should bind the respective key to =nil= after loading
+ evil-collection-magit. For example, to make =escape= behave as default:
+
+ #+BEGIN_SRC emacs-lisp
+(evil-define-key* evil-collection-magit-state magit-mode-map [escape] nil)
+ #+END_SRC
+
+* Known Conflicts
+
+ These are the third-party packages that conflict with these bindings and will
+ probably need to be disabled in magit buffers for evil-collection-magit to work properly.
+
+ 1. [[https://github.com/hlissner/evil-snipe][evil-snipe]]
+ 2. [[https://github.com/syl20bnr/evil-escape][evil-escape]] with [[https://github.com/justbur/evil-magit/issues/4][certain escape sequences]]
+
+* Disclaimer
+
+ Given the complexity of magit key bindings combined with the complexity of git
+ itself, it is possible that there are some rough edges where the current binding
+ is not the expected one in a buffer. It will be very helpful for you to report
+ any such instances.
diff --git a/.config/emacs/lisp/evil-collection/modes/magit/evil-collection-magit.el b/.config/emacs/lisp/evil-collection/modes/magit/evil-collection-magit.el
new file mode 100644
index 0000000..533eae0
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/magit/evil-collection-magit.el
@@ -0,0 +1,747 @@
+;;; evil-collection-magit.el --- Evil-based key bindings for magit -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2015-2016, 2021 Justin Burkett
+
+;; Author: Justin Burkett <justin@burkett.cc>
+;; Maintainer: Justin Burkett <justin@burkett.cc>
+;; James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; Package-Requires: ((emacs "26.3") (evil "1.2.3") (magit "2.6.0"))
+;; Homepage: https://github.com/emacs-evil/evil-collection
+;; Version: 0.4.1
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This library configures Magit and Evil to play well with each
+;; other. For some background see https://github.com/magit/evil-magit/issues/1.
+
+;; See the README at
+;; https://github.com/emacs-evil/evil-collection/tree/master/modes/magit
+;; for a table describing the key binding changes.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'magit nil t)
+
+(defvar magit-blame-mode-map)
+(defvar magit-blame-read-only-mode-map)
+(defvar magit-blob-mode-map)
+(defvar magit-cherry-mode-map)
+(defvar magit-diff-mode-map)
+(defvar magit-file-section-map)
+(defvar magit-hunk-section-map)
+(defvar magit-log-mode-map)
+(defvar magit-log-read-revs-map)
+(defvar magit-log-select-mode-map)
+(defvar magit-process-mode-map)
+(defvar magit-reflog-mode-map)
+(defvar magit-refs-mode-map)
+(defvar magit-status-mode-map)
+(defvar magit-submodule-list-mode-map)
+
+(defconst evil-collection-magit-maps
+ '(evil-collection-magit-toggle-text-minor-mode-map
+ magit-log-mode-map ; -> parent: `magit-mode-map'
+ magit-status-mode-map ; -> parent: `magit-mode-map'
+ magit-blame-mode-map
+ magit-blame-read-only-mode-map
+ magit-blob-mode-map
+ magit-submodule-list-mode-map ; -> parent: `magit-repolist-mode-map'
+ magit-mode-map))
+
+(defcustom evil-collection-magit-use-y-for-yank t
+ "When non nil (Default is t),
+replace \"y\" for `magit-show-refs' with
+\"yy\" for `evil-collection-magit-yank-whole-line',
+\"ys\" for `magit-copy-section-value',
+\"yb\" for `magit-copy-buffer-revision' and
+\"yr\" for `magit-show-refs'.
+This keeps \"y\" for `magit-show-refs',
+in the help popup (`magit-dispatch')."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-magit-want-horizontal-movement nil
+ "When non nil, use \"h\" and \"l\" for horizontal movement in
+most magit buffers. The old \"h\" for help is moved to \"H\" and
+similarly for the old \"l\" for the log popup. The old \"L\" is
+then put on \"C-l\"."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-magit-use-z-for-folds nil
+ "When non nil, use \"z\" as a prefix for common vim fold commands, such as
+ - z1 Reset visibility to level 1 for all sections
+ - z2 Reset visibility to level 2 for all sections
+ - z3 Reset visibility to level 3 for all sections
+ - z4 Reset visibility to level 4 for all sections
+ - za Toggle a section
+ - zo Show section
+ - zO Show sections recursively
+ - zc Hide section
+ - zC Hide sections recursively
+ - zr Same as z4.
+
+When this option is enabled, the stash popup is available on \"Z\"."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-magit-use-v-for-visual-line nil
+ "When non nil, use \"v\" for `evil-visual-line' (old behavior).
+When nil (default), \"v\" uses `evil-visual-char'."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-magit-use-$-for-end-of-line t
+ "When non nil, use \"$\" for `evil-end-of-line'.
+
+Move `magit-process-buffer' to \"`\"."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-magit-use-0-for-beginning-of-line t
+ "When non nil, use \"0\" for `evil-beginning-of-line'.
+
+Move `magit-diff-default-context' to \"~\"."
+ :group 'magit
+ :type 'boolean)
+
+(defcustom evil-collection-magit-state (if evil-collection-magit-use-y-for-yank 'normal 'motion)
+ "State to use for most magit buffers."
+ :group 'magit
+ :type 'symbol)
+
+;; without this set-mark-command activates visual-state which is just annoying
+;; and introduces possible bugs
+(defun evil-collection-magit-remove-visual-activate-hook ()
+ (when (derived-mode-p 'magit-mode)
+ (remove-hook 'activate-mark-hook 'evil-visual-activate-hook t)))
+(add-hook 'evil-local-mode-hook 'evil-collection-magit-remove-visual-activate-hook)
+
+(defun evil-collection-magit-maybe-deactivate-mark ()
+ "Deactivate mark if region is active. Used for ESC binding."
+ (interactive)
+ (when (region-active-p) (deactivate-mark)))
+
+(defvar evil-collection-magit-emacs-to-default-state-modes
+ '(git-commit-mode)
+ "Modes that should be in the default evil state.")
+
+(defvar evil-collection-magit-emacs-to-evil-collection-magit-state-modes
+ '(git-rebase-mode
+ magit-mode
+ magit-cherry-mode
+ magit-diff-mode
+ magit-log-mode
+ magit-log-select-mode
+ magit-process-mode
+ magit-reflog-mode
+ magit-refs-mode
+ magit-revision-mode
+ magit-stash-mode
+ magit-stashes-mode
+ magit-status-mode)
+ "Modes that switch from Emacs state to `evil-collection-magit-state'.")
+
+(defvar evil-collection-magit-default-to-evil-collection-magit-state-modes
+ '(magit-blob-mode
+ magit-gitflow-mode)
+ "Modes that switch from default state to `evil-collection-magit-state'.")
+
+(defvar evil-collection-magit-untouched-modes
+ ;; TODO do something here
+ '(git-popup-mode
+ magit-blame-mode
+ magit-blame-read-only-mode)
+ "Modes whose evil states are unchanged.")
+
+(defvar evil-collection-magit-ignored-modes
+ '(git-commit-major-mode
+ magit-auto-revert-mode
+ magit-blame-put-keymap-before-view-mode
+ magit-diff-mode
+ magit-merge-preview-mode
+ transient-resume-mode
+ magit-rebase-mode
+ magit-wip-after-save-mode
+ magit-wip-after-save-local-mode-major-mode
+ magit-wip-after-save-local-mode
+ magit-wip-after-apply-mode
+ magit-wip-before-change-mode
+ magit-wip-initial-backup-mode
+ magit-wip-mode
+ ;; gh
+ magit-gh-pulls-mode
+ ;; git-gutter
+ git-gutter-mode
+ git-gutter-mode-major-mode
+ git-gutter+-commit-mode
+ git-gutter+-mode
+ git-gutter+-enable-fringe-display-mode
+ git-gutter+-enable-default-display-mode)
+ "Currently ignored modes. They are collected here for testing purposes.")
+
+(defun evil-collection-magit-set-initial-states ()
+ "Set the initial state for relevant modes."
+ (dolist (mode (append evil-collection-magit-emacs-to-evil-collection-magit-state-modes
+ evil-collection-magit-default-to-evil-collection-magit-state-modes))
+ (evil-set-initial-state mode evil-collection-magit-state))
+ (dolist (mode evil-collection-magit-emacs-to-default-state-modes)
+ (evil-set-initial-state mode evil-default-state)))
+
+(defun evil-collection-magit-revert-initial-states ()
+ "Revert the initial state for modes to their values before
+evil-collection-magit was loaded."
+ (dolist (mode (append evil-collection-magit-emacs-to-evil-collection-magit-state-modes
+ evil-collection-magit-emacs-to-default-state-modes))
+ (evil-set-initial-state mode 'emacs))
+ (dolist (mode evil-collection-magit-default-to-evil-collection-magit-state-modes)
+ (evil-set-initial-state mode evil-default-state)))
+
+(defvar evil-collection-magit-section-maps
+ '(magit-branch-section-map
+ magit-commit-section-map
+ magit-commit-message-section-map
+ magit-error-section-map
+ magit-file-section-map
+ magit-hunk-section-map
+ magit-module-commit-section-map
+ magit-remote-section-map
+ magit-staged-section-map
+ magit-stash-section-map
+ magit-stashes-section-map
+ magit-tag-section-map
+ magit-unpulled-section-map
+ magit-unpushed-section-map
+ magit-unstaged-section-map
+ magit-untracked-section-map
+
+ ;; new ones that I haven't looked at yet
+ magit-button-section-map
+ magit-commitbuf-section-map
+ magit-diff-section-map
+ magit-diffbuf-section-map
+ magit-diffstat-section-map
+ magit-headers-section-map
+ magit-log-section-map
+ magit-message-section-map
+ ;; FIXME: deal with new bindings in this one
+ magit-module-section-map
+ magit-modules-section-map
+ magit-processbuf-section-map
+ magit-process-section-map
+ magit-pulls-section-map
+ magit-unmerged-section-map
+ magit-status-section-map
+ magit-worktree-section-map)
+ "All magit section maps. For testing purposes only at the moment.")
+
+;; Old way of excluding newlines
+;; (when evil-collection-magit-use-y-for-yank
+;; (dolist (map evil-collection-magit-section-maps)
+;; (when (and map (keymapp (symbol-value map)))
+;; (map-keymap
+;; (lambda (_ def)
+;; (when (commandp def)
+;; (evil-set-command-property def :exclude-newline t)))
+;; (symbol-value map)))))
+
+(defvar evil-collection-magit-in-visual-pre-command)
+
+(defun evil-collection-magit--around-visual-pre-command (orig-func &rest args)
+ (let ((evil-collection-magit-in-visual-pre-command t))
+ (apply orig-func args)))
+
+(defun evil-collection-magit--filter-args-visual-expand-region (arglist)
+ ;; pretend that the command has the :exclude-newline property by rewriting the
+ ;; EXCLUDE-NEWLINE arg to this function
+ (cons (or (car arglist)
+ (and (bound-and-true-p evil-collection-magit-in-visual-pre-command)
+ (eq (evil-visual-type) 'line)
+ (derived-mode-p 'magit-mode)))
+ ;; shouldn't be necessary, but this will prevent it from failing if an
+ ;; arg is added.
+ (cdr arglist)))
+
+(when (and (fboundp 'advice-add) evil-collection-magit-use-y-for-yank)
+ (advice-add 'evil-visual-pre-command
+ :around #'evil-collection-magit--around-visual-pre-command)
+ (advice-add 'evil-visual-expand-region
+ :filter-args #'evil-collection-magit--filter-args-visual-expand-region))
+
+;; keep visual state for magit-section movement commands
+(dolist (cmd '(magit-section-forward-sibling
+ magit-section-forward
+ magit-section-backward-sibling
+ magit-section-backward
+ magit-section-up))
+ (evil-set-command-property cmd :keep-visual t))
+
+(defvar evil-collection-magit-mode-map-bindings
+ (let ((states (if evil-collection-magit-use-y-for-yank
+ `(,evil-collection-magit-state visual)
+ `(,evil-collection-magit-state))))
+ (append
+ `((,states magit-mode-map "g")
+ (,states magit-mode-map "\C-j" magit-section-forward "n")
+ (,states magit-mode-map "\M-j" magit-section-forward-sibling "M-n")
+ (,states magit-mode-map "gj" magit-section-forward-sibling "M-n")
+ (,states magit-mode-map "]" magit-section-forward-sibling "M-n")
+ (,states magit-mode-map "\C-k" magit-section-backward "p")
+ (,states magit-mode-map "\M-k" magit-section-backward-sibling "M-p")
+ (,states magit-mode-map "gk" magit-section-backward-sibling "M-p")
+ (,states magit-mode-map "[" magit-section-backward-sibling "M-p")
+ (,states magit-mode-map "gr" magit-refresh "g")
+ (,states magit-mode-map "gR" magit-refresh-all "G")
+ (,states magit-mode-map "x" magit-delete-thing "k")
+ (,states magit-mode-map "X" magit-file-untrack "K")
+ (,states magit-mode-map "-" magit-revert-no-commit "v")
+ (,states magit-mode-map "_" magit-revert "V")
+ (,states magit-mode-map "p" magit-push "P")
+ (,states magit-mode-map "o" magit-reset-quickly "x")
+ (,states magit-mode-map "O" magit-reset "X")
+ (,states magit-mode-map "|" magit-git-command ":")
+ (,states magit-mode-map "'" magit-submodule "o")
+ (,states magit-mode-map "\"" magit-subtree "O")
+ (,states magit-mode-map "=" magit-diff-less-context "-")
+ (,states magit-mode-map "j" evil-next-line)
+ (,states magit-mode-map "k" evil-previous-line)
+ (,states magit-mode-map "gg" evil-goto-first-line)
+ (,states magit-mode-map "G" evil-goto-line)
+ (,states magit-mode-map "\C-d" evil-scroll-down)
+ (,states magit-mode-map "\C-f" evil-scroll-page-down)
+ (,states magit-mode-map "\C-b" evil-scroll-page-up)
+ (,states magit-mode-map ":" evil-ex)
+ (,states magit-mode-map "q" magit-mode-bury-buffer)
+
+ ;; these are to fix the priority of the log mode map and the magit mode map
+ ;; FIXME: Conflict between this and revert. Revert seems more important here
+ ;; (,states magit-log-mode-map "-" magit-log-half-commit-limit "-")
+ (,states magit-log-mode-map "=" magit-log-toggle-commit-limit "=")
+
+ ;; https://github.com/emacs-evil/evil-collection/issues/406
+ ;; Use kbd here for S-SPC and S-DEL so evil-collection-define-key can
+ ;; parse definition correctly;.
+ (,states magit-mode-map ,(kbd "S-SPC") magit-diff-show-or-scroll-up "SPC")
+ (,states magit-mode-map ,(kbd "S-DEL") magit-diff-show-or-scroll-down "DEL")
+
+ ((,evil-collection-magit-state) magit-mode-map ,(kbd evil-toggle-key) evil-emacs-state))
+
+ (if (eq evil-search-module 'evil-search)
+ `((,states magit-mode-map "/" evil-ex-search-forward)
+ (,states magit-mode-map "n" evil-ex-search-next)
+ (,states magit-mode-map "N" evil-ex-search-previous)
+ (,states magit-blame-read-only-mode-map "n" evil-ex-search-next)
+ (,states magit-blame-read-only-mode-map "N" evil-ex-search-previous))
+ `((,states magit-mode-map "/" evil-search-forward)
+ (,states magit-mode-map "n" evil-search-next)
+ (,states magit-mode-map "N" evil-search-previous)
+ (,states magit-blame-read-only-mode-map "n" evil-search-next)
+ (,states magit-blame-read-only-mode-map "N" evil-search-previous)))
+
+ `((,states magit-status-mode-map "gz" magit-jump-to-stashes)
+ (,states magit-status-mode-map "gt" magit-jump-to-tracked)
+ (,states magit-status-mode-map "gn" magit-jump-to-untracked)
+ (,states magit-status-mode-map "gu" magit-jump-to-unstaged)
+ (,states magit-status-mode-map "gs" magit-jump-to-staged)
+ (,states magit-status-mode-map "gfu" magit-jump-to-unpulled-from-upstream)
+ (,states magit-status-mode-map "gfp" magit-jump-to-unpulled-from-pushremote)
+ (,states magit-status-mode-map "gpu" magit-jump-to-unpushed-to-upstream)
+ (,states magit-status-mode-map "gpp" magit-jump-to-unpushed-to-pushremote)
+ (,states magit-status-mode-map "gh" magit-section-up "^")
+ (,states magit-diff-mode-map "gd" magit-jump-to-diffstat-or-diff "j")
+ ((visual) magit-diff-mode-map "y" magit-copy-section-value)
+ ;; NOTE This is now transient-map and the binding is C-g.
+ ;; ((emacs) magit-popup-mode-map "<escape>" "q")
+ )
+
+ (when evil-collection-magit-want-horizontal-movement
+ `((,states magit-mode-map "H" magit-dispatch "h")
+ (,states magit-mode-map "L" magit-log "l")
+ (,states magit-mode-map "\C-l" magit-log-refresh "L")
+ (,states magit-mode-map "h" evil-backward-char)
+ (,states magit-mode-map "l" evil-forward-char)))
+
+ (when evil-want-C-u-scroll
+ `((,states magit-mode-map "\C-u" evil-scroll-up)))
+
+ (if evil-collection-magit-use-y-for-yank
+ `((,states magit-mode-map "v" ,(if evil-collection-magit-use-v-for-visual-line
+ 'evil-visual-line
+ 'evil-visual-char))
+ (,states magit-mode-map "V" evil-visual-line)
+ (,states magit-mode-map "\C-w" evil-window-map)
+ (,states magit-mode-map "y")
+ (,states magit-mode-map "yy" evil-collection-magit-yank-whole-line)
+ (,states magit-mode-map "yr" magit-show-refs "y")
+ (,states magit-mode-map "ys" magit-copy-section-value "C-w")
+ (,states magit-mode-map "yb" magit-copy-buffer-revision "M-w")
+ ((visual) magit-mode-map "y" magit-copy-section-value))
+ `((,states magit-mode-map "v" set-mark-command)
+ (,states magit-mode-map "V" set-mark-command)
+ (,states magit-mode-map ,(kbd "<escape>") evil-collection-magit-maybe-deactivate-mark)))
+
+ (when evil-collection-magit-use-$-for-end-of-line
+ `((,states magit-mode-map "$" evil-end-of-line)
+ (,states magit-mode-map "`" magit-process-buffer)))
+
+ (when evil-collection-magit-use-0-for-beginning-of-line
+ `((,states magit-mode-map "0" evil-beginning-of-line)
+ (,states magit-mode-map "~" magit-diff-default-context)))
+
+ (when evil-collection-magit-use-z-for-folds
+ `((,states magit-mode-map "Z" magit-stash)
+ (,states magit-mode-map "z")
+ (,states magit-mode-map "z1" magit-section-show-level-1-all)
+ (,states magit-mode-map "z2" magit-section-show-level-2-all)
+ (,states magit-mode-map "z3" magit-section-show-level-3-all)
+ (,states magit-mode-map "z4" magit-section-show-level-4-all)
+ (,states magit-mode-map "za" magit-section-toggle)
+ (,states magit-mode-map "zc" magit-section-hide)
+ (,states magit-mode-map "zC" magit-section-hide-children)
+ (,states magit-mode-map "zo" magit-section-show)
+ (,states magit-mode-map "zO" magit-section-show-children)
+ (,states magit-mode-map "zr" magit-section-show-level-4-all)))))
+ "evil-collection-magit bindings for major modes. Each element of this list
+takes the form
+
+\(EVIL-STATE MAGIT-MAP NEW-KEY DEF ORIG-KEY\).
+
+ORIG-KEY is only used for testing purposes, and
+denotes the original magit key for this command.")
+
+(dolist (binding evil-collection-magit-mode-map-bindings)
+ (when binding
+ (dolist (state (nth 0 binding))
+ (evil-collection-define-key
+ state (nth 1 binding) (nth 2 binding) (nth 3 binding)))))
+
+(defvar evil-collection-magit-minor-mode-map-bindings
+ `(((,evil-collection-magit-state visual) magit-blob-mode-map "gj" magit-blob-next "n")
+ ((,evil-collection-magit-state visual) magit-blob-mode-map "gk" magit-blob-previous "p")
+ ((,evil-collection-magit-state visual) git-commit-mode-map "\M-k" git-commit-prev-message "M-p")
+ ((,evil-collection-magit-state visual) git-commit-mode-map "gk" git-commit-prev-message "M-p")
+ ((,evil-collection-magit-state visual) git-commit-mode-map "\M-j" git-commit-next-message "M-n")
+ ((,evil-collection-magit-state visual) git-commit-mode-map "gj" git-commit-next-message "M-n")
+ ((normal) magit-blame-read-only-mode-map "j" evil-next-line)
+ ((normal) magit-blame-read-only-mode-map "\C-j" magit-blame-next-chunk "n")
+ ((normal) magit-blame-read-only-mode-map "gj" magit-blame-next-chunk "n")
+ ((normal) magit-blame-read-only-mode-map "gJ" magit-blame-next-chunk-same-commit "N")
+ ((normal) magit-blame-read-only-mode-map "k" evil-previous-line)
+ ((normal) magit-blame-read-only-mode-map "\C-k" magit-blame-previous-chunk "p")
+ ((normal) magit-blame-read-only-mode-map "gk" magit-blame-previous-chunk "p")
+ ((normal) magit-blame-read-only-mode-map "gK" magit-blame-previous-chunk-same-commit "P"))
+ "evil-collection-magit bindings for minor modes. Each element of
+this list takes the form
+
+\(EVIL-STATE MAGIT-MAP NEW-KEY DEF ORIG-KEY)\.
+
+ORIG-KEY is only used for testing purposes, and
+denotes the original magit key for this command.")
+
+(dolist (binding evil-collection-magit-minor-mode-map-bindings)
+ (when binding
+ (dolist (state (nth 0 binding))
+ ;; TODO: Maybe switch to `evil-define-minor-mode-key'
+ (evil-collection-define-key
+ state (nth 1 binding) (nth 2 binding) (nth 3 binding)))))
+
+;; Make relevant maps into overriding maps so that they shadow the global evil
+;; maps by default
+(dolist (map (list magit-mode-map
+ magit-cherry-mode-map
+ magit-mode-map
+ magit-blob-mode-map
+ magit-diff-mode-map
+ magit-log-mode-map
+ magit-log-select-mode-map
+ magit-reflog-mode-map
+ magit-status-mode-map
+ magit-log-read-revs-map
+ magit-process-mode-map
+ magit-refs-mode-map))
+ (evil-make-overriding-map map (if evil-collection-magit-use-y-for-yank
+ 'all
+ evil-collection-magit-state)))
+
+(evil-make-overriding-map magit-blame-read-only-mode-map 'normal)
+
+(eval-after-load 'magit-gh-pulls
+ `(evil-make-overriding-map magit-gh-pulls-mode-map ',evil-collection-magit-state))
+
+;; Need to refresh evil keymaps when blame/blob mode is entered.
+(add-hook 'magit-blame-mode-hook 'evil-normalize-keymaps)
+(add-hook 'magit-blob-mode-hook 'evil-normalize-keymaps)
+
+
+(evil-set-initial-state 'magit-submodule-list-mode 'normal)
+(evil-collection-define-key 'normal 'magit-submodule-list-mode-map
+ (kbd "RET") 'magit-repolist-status
+ (kbd "gr") 'magit-list-submodules)
+(add-hook 'magit-submodule-list-mode-hook 'evil-normalize-keymaps)
+
+
+(eval-after-load 'git-rebase
+ `(progn
+ ;; for the compiler
+ (defvar git-rebase-mode-map)
+ (defvar evil-collection-magit-rebase-commands-w-descriptions
+ ;; nil in the first element means don't bind here
+ '(("p" git-rebase-pick "pick = use commit")
+ ("r" git-rebase-reword "reword = use commit, but edit the commit message")
+ ("e" git-rebase-edit "edit = use commit, but stop for amending")
+ ("s" git-rebase-squash "squash = use commit, but meld into previous commit")
+ ("f" git-rebase-fixup "fixup = like \"squash\", but discard this commit's log message")
+ ("x" git-rebase-exec "exec = run command (the rest of the line) using shell")
+ ("d" git-rebase-kill-line "drop = remove commit" "k")
+ ("u" git-rebase-undo "undo last change")
+ ("ZZ" with-editor-finish "tell Git to make it happen")
+ ("ZQ" with-editor-cancel "tell Git that you changed your mind, i.e. abort")
+ ("k" evil-previous-line "move point to previous line" "p")
+ ("j" evil-next-line "move point to next line" "n")
+ ("M-k" git-rebase-move-line-up "move the commit at point up" "\M-p")
+ ("M-j" git-rebase-move-line-down "move the commit at point down" "\M-n")
+ (nil git-rebase-show-commit "show the commit at point in another buffer")))
+
+ (dolist (cmd evil-collection-magit-rebase-commands-w-descriptions)
+ (when (car cmd)
+ (evil-collection-define-key evil-collection-magit-state 'git-rebase-mode-map
+ (kbd (car cmd)) (nth 1 cmd))))
+
+ (evil-make-overriding-map git-rebase-mode-map evil-collection-magit-state)
+
+ (defun evil-collection-magit-add-rebase-messages ()
+ "Remove evil-state annotations and reformat git-rebase buffer."
+ (goto-char (point-min))
+ (let ((inhibit-read-only t)
+ (state-regexp (format "<%s-state> " evil-collection-magit-state))
+ (aux-map (evil-get-auxiliary-keymap git-rebase-mode-map evil-collection-magit-state)))
+ (save-excursion
+ (save-match-data
+ (goto-char (point-min))
+ (when (and (boundp 'git-rebase-show-instructions)
+ git-rebase-show-instructions
+ (re-search-forward
+ (concat "^" (regexp-quote comment-start) "\\s-+p, pick") nil t))
+ (goto-char (line-beginning-position))
+ (flush-lines (concat "^" (regexp-quote comment-start) ".+ = "))
+ (dolist (cmd evil-collection-magit-rebase-commands-w-descriptions)
+ (insert
+ (format "%s %-8s %s\n"
+ comment-start
+ (if (and (car cmd)
+ (eq (nth 1 cmd)
+ (lookup-key aux-map (kbd (car cmd)))))
+ (car cmd)
+ (replace-regexp-in-string
+ state-regexp ""
+ (substitute-command-keys
+ (format "\\[%s]" (nth 1 cmd)))))
+ (nth 2 cmd)))))))))
+ (remove-hook 'git-rebase-mode-hook 'git-rebase-mode-show-keybindings)
+ (add-hook 'git-rebase-mode-hook 'evil-collection-magit-add-rebase-messages t)))
+
+;; section maps: evil's auxiliary maps don't work here, because these maps are
+;; text overlays
+
+(defun evil-collection-magit-stage-untracked-file-with-intent ()
+ "Call `magit-stage-untracked' with optional arg."
+ (interactive)
+ (when (and (derived-mode-p 'magit-mode)
+ (magit-apply--get-selection)
+ (eq (magit-diff-type) 'untracked))
+ (magit-stage-untracked t)))
+
+(defcustom evil-collection-magit-visit-worktree-file-on-return t
+ "When non-nil (default), RET visits the file in the worktree
+\(`magit-diff-visit-worktree-file') and S-<return> visits the file
+in the current diff context (`magit-diff-visit-file').
+
+When nil, the bindings are swapped: RET uses `magit-diff-visit-file'
+and S-<return> uses `magit-diff-visit-worktree-file'."
+ :group 'magit
+ :type 'boolean)
+
+(defvar evil-collection-magit-original-section-bindings
+ `((,(copy-keymap magit-file-section-map) "\C-j" magit-diff-visit-worktree-file)
+ (,(copy-keymap magit-hunk-section-map) "\C-j" magit-diff-visit-worktree-file))
+ "For testing purposes only. The original magit keybindings that
+evil-collection-magit affects.")
+
+(defun evil-collection-magit-adjust-section-bindings ()
+ "Adjust bindings in section maps for evil-collection-magit."
+ (define-key magit-file-section-map "I"
+ 'evil-collection-magit-stage-untracked-file-with-intent)
+ (define-key magit-file-section-map "\C-j" nil) ; breaking change
+ (define-key magit-hunk-section-map "\C-j" nil) ; breaking change
+ (let ((return-cmd (if evil-collection-magit-visit-worktree-file-on-return
+ 'magit-diff-visit-worktree-file
+ 'magit-diff-visit-file))
+ (s-return-cmd (if evil-collection-magit-visit-worktree-file-on-return
+ 'magit-diff-visit-file
+ 'magit-diff-visit-worktree-file)))
+ (define-key magit-file-section-map (kbd "RET") return-cmd)
+ (define-key magit-hunk-section-map (kbd "RET") return-cmd)
+ (define-key magit-file-section-map (kbd "S-<return>") s-return-cmd)
+ (define-key magit-hunk-section-map (kbd "S-<return>") s-return-cmd)))
+
+(defun evil-collection-magit-revert-section-bindings ()
+ "Revert changed bindings in section maps generated by evil-collection-magit."
+ (define-key magit-file-section-map "I" nil)
+ (define-key magit-file-section-map "\C-j" 'magit-diff-visit-file-worktree)
+ (define-key magit-hunk-section-map "\C-j" 'magit-diff-visit-file-worktree)
+ (define-key magit-file-section-map (kbd "RET") 'magit-diff-visit-file)
+ (define-key magit-hunk-section-map (kbd "RET") 'magit-diff-visit-file)
+ (define-key magit-file-section-map (kbd "S-<return>") nil)
+ (define-key magit-hunk-section-map (kbd "S-<return>") nil))
+
+;; Popups
+
+(defvar evil-collection-magit-dispatch-popup-backup
+ (copy-tree (get 'magit-dispatch 'transient--layout) t))
+(defvar evil-collection-magit-popup-keys-changed nil)
+
+(defvar evil-collection-magit-popup-changes
+ (append
+ (when evil-collection-magit-use-z-for-folds
+ '((magit-dispatch "Z" "%" magit-worktree)
+ (magit-dispatch "z" "Z" magit-stash)))
+ (when evil-collection-magit-want-horizontal-movement
+ '((magit-dispatch "L" "C-l" magit-log-refresh)
+ (magit-dispatch "l" "L" magit-log)))
+ '((magit-branch "x" "X" magit-branch-reset)
+ (magit-branch "k" "x" magit-branch-delete)
+ (magit-dispatch "o" "'" magit-submodule)
+ (magit-dispatch "O" "\"" magit-subtree)
+ (magit-dispatch "V" "_" magit-revert)
+ (magit-dispatch "X" "O" magit-reset)
+ (magit-dispatch "v" "-" magit-reverse)
+ (magit-dispatch "k" "x" magit-discard)
+ (magit-remote "k" "x" magit-remote-remove)
+ ;; FIXME: how to properly handle a popup with a key that appears twice (in
+ ;; `transient-define-prefix' definition)? Currently we rely on:
+ ;; 1. first call to `evil-collection-magit-change-popup-key' changes the first "V"
+ ;; entry of `magit-revert' (the first entry in `transient-define-prefix'
+ ;; definition of `magit-revert'), second call changes the second "V".
+ ;; 2. the remapping here are in the same order as in `magit-revert'
+ ;; definition
+ (magit-revert "V" "_" magit-revert-and-commit)
+ (magit-revert "V" "_" magit-sequencer-continue)
+ (magit-tag "k" "x" magit-tag-delete)))
+ "Changes to popup keys")
+
+(defun evil-collection-magit-change-popup-key (popup from to &rest _args)
+ "Wrap `magit-change-popup-key'."
+ (transient-suffix-put popup from :key to))
+
+(defun evil-collection-magit-adjust-popups ()
+ "Adjust popup keys to match evil-collection-magit."
+ (unless evil-collection-magit-popup-keys-changed
+ (dolist (change evil-collection-magit-popup-changes)
+ (apply #'evil-collection-magit-change-popup-key change))
+ (setq evil-collection-magit-popup-keys-changed t)))
+
+(defun evil-collection-magit-revert-popups ()
+ "Revert popup keys changed by evil-collection-magit."
+ (put 'magit-dispatch 'transient--layout evil-collection-magit-dispatch-popup-backup)
+ (setq evil-collection-magit-popup-keys-changed nil))
+
+;;;###autoload
+(defun evil-collection-magit-init ()
+ "This function completes the setup of evil-collection-magit. It is called
+automatically when evil-collection-magit-setup is called.. The only reason to
+use this function is if you've called `evil-collection-magit-revert' and wish
+to go back to evil-collection-magit behavior."
+ (interactive)
+ (evil-collection-magit-adjust-section-bindings)
+ (evil-collection-magit-adjust-popups)
+ (evil-collection-magit-set-initial-states))
+
+;;;###autoload
+(defun evil-collection-magit-revert ()
+ "Revert changes by evil-collection-magit that affect default evil+magit behavior."
+ (interactive)
+ (evil-collection-magit-revert-section-bindings)
+ (evil-collection-magit-revert-popups)
+ (evil-collection-magit-revert-initial-states)
+ (message "evil-collection-magit reverted"))
+
+(define-minor-mode evil-collection-magit-toggle-text-minor-mode
+ "Minor mode used to enabled toggle key in `text-mode' after
+using `evil-collection-magit-toggle-text-mode'"
+ :keymap (make-sparse-keymap))
+
+(evil-collection-define-key 'normal
+ 'evil-collection-magit-toggle-text-minor-mode-map
+ "\C-t" 'evil-collection-magit-toggle-text-mode
+ "\\" 'evil-collection-magit-toggle-text-mode)
+(evil-collection-define-key evil-collection-magit-state 'magit-mode-map
+ "\C-t" 'evil-collection-magit-toggle-text-mode
+ "\\" 'evil-collection-magit-toggle-text-mode)
+(evil-collection-define-key evil-collection-magit-state 'git-rebase-mode-map
+ "\C-t" 'evil-collection-magit-toggle-text-mode
+ "\\" 'evil-collection-magit-toggle-text-mode)
+
+(defvar evil-collection-magit-last-mode nil
+ "Used to store last magit mode before entering text mode using
+`evil-collection-magit-toggle-text-mode'.")
+
+(defun evil-collection-magit-toggle-text-mode ()
+ "Switch to `text-mode' and back from magit buffers."
+ (interactive)
+ (cond ((derived-mode-p 'magit-mode 'git-rebase-mode)
+ (setq evil-collection-magit-last-mode major-mode)
+ (message "Switching to text-mode")
+ (text-mode)
+ (read-only-mode -1)
+ (evil-collection-magit-toggle-text-minor-mode 1)
+ (evil-normalize-keymaps))
+ ((and (eq major-mode 'text-mode)
+ (functionp evil-collection-magit-last-mode))
+ (message "Switching to %s" evil-collection-magit-last-mode)
+ (evil-collection-magit-toggle-text-minor-mode -1)
+ (evil-normalize-keymaps)
+ (funcall evil-collection-magit-last-mode)
+ (magit-refresh)
+ (evil-change-state evil-collection-magit-state))
+ (t
+ (user-error "evil-collection-magit-toggle-text-mode unexpected state"))))
+
+(evil-define-operator evil-collection-magit-yank-whole-line
+ (beg end type register yank-handler)
+ "Yank whole line."
+ :motion evil-line-or-visual-line
+ (interactive "<R><x>")
+ (evil-yank beg end type register yank-handler))
+
+;;;###autoload
+(defun evil-collection-magit-setup ()
+ "Set up `evil' bindings for `magit'."
+
+ (evil-collection-define-key 'normal 'magit-blame-mode-map
+ "q" 'magit-blame-quit)
+ (evil-collection-define-key 'normal 'magit-blame-read-only-mode-map
+ "q" 'magit-blame-quit)
+
+ (evil-collection-magit-init))
+
+;;; evil-collection-magit.el ends soon
+(provide 'evil-collection-magit)
+;; Local Variables:
+;; indent-tabs-mode: nil
+;; End:
+;;; evil-collection-magit.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/man/README.org b/.config/emacs/lisp/evil-collection/modes/man/README.org
new file mode 100644
index 0000000..70ca48c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/man/README.org
@@ -0,0 +1,22 @@
+* man
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Man-Page.html][Man]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------------+----------------+-----------------|
+ | =scroll-up-command= | =SPC= | =SPC= |
+ | =scroll-down-command= | =DEL=, =S-SPC= | =S-SPC= |
+ | =forward-button= | =TAB= | =TAB= |
+ | =backward-button= | =S-TAB= | =S-TAB= |
+ | =Man-next-manpage= | =M-n= | =]]=, =gj= |
+ | =Man-previous-manpage= | =M-p= | =[[=, =gk= |
+ | =Man-next-section= | =n= | =C-j= |
+ | =Man-previous-section= | =p= | =C-k= |
+ | =man= | =m= | =gm= |
+ | =Man-goto-section= | =g= | =gd= |
+ | =Man-follow-manual-reference= | =r= | =gR= |
+ | =Man-goto-see-also-section= | =s= | =gs= |
+ | =Man-update-manpage= | =u= | =gr= |
+ | =quit-window= | =q= | =q=, =ZQ=, =ZZ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/man/evil-collection-man.el b/.config/emacs/lisp/evil-collection/modes/man/evil-collection-man.el
new file mode 100644
index 0000000..a4eddd0
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/man/evil-collection-man.el
@@ -0,0 +1,68 @@
+;;; evil-collection-man.el --- Evil bindings for Man-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, man, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `man'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'man)
+
+(defconst evil-collection-man-maps '(Man-mode-map))
+
+;;;###autoload
+(defun evil-collection-man-setup ()
+ "Set up `evil' bindings for `man'."
+ (evil-set-initial-state 'Man-mode 'normal)
+ (evil-collection-define-key 'normal 'Man-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+
+ (kbd "]]") 'Man-next-manpage
+ (kbd "[[") 'Man-previous-manpage
+ (kbd "gj") 'Man-next-manpage
+ (kbd "gk") 'Man-previous-manpage
+ (kbd "C-j") 'Man-next-section
+ (kbd "C-k") 'Man-previous-section
+
+ ;; goto
+ "gm" 'man
+ "gd" 'Man-goto-section ; TODO: "gd" does not match the rationale of "go to definition". Change?
+ "gR" 'Man-follow-manual-reference ; TODO: Make this match Info-follow-reference?
+ "gs" 'Man-goto-see-also-section
+
+ ;; refresh
+ "gr" 'Man-update-manpage
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'quit-window
+ "ZZ" 'quit-window))
+
+(provide 'evil-collection-man)
+;;; evil-collection-man.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/markdown-mode/README.org b/.config/emacs/lisp/evil-collection/modes/markdown-mode/README.org
new file mode 100644
index 0000000..8c93de5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/markdown-mode/README.org
@@ -0,0 +1,14 @@
+* markdown-mode
+
+ Basic evil bindings for [[https://github.com/jrblevin/markdown-mode][markdown-mode]]. Not intended to supersede
+ [[https://github.com/Somelauw/evil-markdown][evil-markdown]].
+
+** Key bindings (normal state)
+
+ | Command | Original | Evil |
+ |-------------------------------+-------------+-------------|
+ | =markdown-backward-paragraph= | =M-{= | ={= |
+ | =markdown-forward-paragraph= | =M-}= | =}= |
+ | =markdown-cycle= | =TAB= | =TAB= |
+ | =markdown-shifttab= | =<backtab>= | =<backtab>= |
+ | =markdown-do= | =C-c C-d= | =RET= |
diff --git a/.config/emacs/lisp/evil-collection/modes/markdown-mode/evil-collection-markdown-mode.el b/.config/emacs/lisp/evil-collection/modes/markdown-mode/evil-collection-markdown-mode.el
new file mode 100644
index 0000000..83f24a6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/markdown-mode/evil-collection-markdown-mode.el
@@ -0,0 +1,50 @@
+;;; evil-collection-markdown-mode.el --- Evil bindings for markdown-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Evil basic bindings for markdown-mode. It's NOT intended to supersede
+;; `evil-markdown'.
+;;
+
+;;; Code:
+(require 'evil-collection)
+(require 'markdown-mode nil t)
+
+(defconst evil-collection-markdown-mode-maps '(markdown-mode-map))
+
+;;;###autoload
+(defun evil-collection-markdown-mode-setup ()
+ "Set up `evil' bindings for `markdown-mode'."
+ (evil-collection-define-key 'normal 'markdown-mode-map
+ "{" 'markdown-backward-paragraph
+ "}" 'markdown-forward-paragraph
+ [tab] 'markdown-cycle
+ [S-tab] 'markdown-shifttab
+ ;; `evil-markdown' doesn't bind but spacemacs does.
+ (kbd "RET") 'markdown-do))
+
+(provide 'evil-collection-markdown-mode)
+;;; evil-collection-markdown-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/message/README.org b/.config/emacs/lisp/evil-collection/modes/message/README.org
new file mode 100644
index 0000000..3ef74ce
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/message/README.org
@@ -0,0 +1,18 @@
+* message
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/message/index.html][message-mode]], the Gnus / mail composition buffer.
+
+ Initial state is insert. Normal-state =Z= bindings provide quick send / kill
+ without leaving the keyboard home row.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------+-----------+------|
+ | =message-send-and-exit= | =C-c C-c= | =ZZ= |
+ | =message-kill-buffer= | =C-c C-k= | =ZQ= |
+ | =message-dont-send= | =C-c C-d= | =ZD= |
+ | =mml-attach-file= | =C-c C-a= | =ZF= |
+
+ All other =C-c= prefix bindings (goto-field, insert-signature, attach, etc.)
+ remain at their upstream keys.
diff --git a/.config/emacs/lisp/evil-collection/modes/message/evil-collection-message.el b/.config/emacs/lisp/evil-collection/modes/message/evil-collection-message.el
new file mode 100644
index 0000000..3adc543
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/message/evil-collection-message.el
@@ -0,0 +1,46 @@
+;;; evil-collection-message.el --- Bindings for `message' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 jessy836
+
+;; Author: jessy836 <netocenusa@gmail.com>
+;; Maintainer: jessy836 <netocenusa@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for message.
+
+;;; Code:
+(require 'evil-collection)
+(require 'message nil t)
+
+(defvar message-mode-map)
+(defconst evil-collection-message-maps '(message-mode-map))
+
+;;;###autoload
+(defun evil-collection-message-setup ()
+ "Set up `evil' bindings for `message-mode'."
+ (evil-set-initial-state 'message-mode 'insert)
+ (evil-collection-define-key 'normal 'message-mode-map
+ "ZZ" 'message-send-and-exit
+ "ZQ" 'message-kill-buffer
+ "ZD" 'message-dont-send
+ "ZF" 'mml-attach-file))
+
+(provide 'evil-collection-message)
+;;; evil-collection-message.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/minesweeper/evil-collection-minesweeper.el b/.config/emacs/lisp/evil-collection/modes/minesweeper/evil-collection-minesweeper.el
new file mode 100644
index 0000000..1792948
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/minesweeper/evil-collection-minesweeper.el
@@ -0,0 +1,53 @@
+;;; evil-collection-minesweeper.el --- Bindings for `minesweeper' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025 StrawberryTea
+
+;; Author: StrawberryTea
+;; Maintainer: StrawberryTea <look@strawberrytea.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, games
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;; Bindings for `minesweeper'.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'minesweeper nil t)
+
+(defconst evil-collection-minesweeper-maps '(minesweeper-mode-map))
+
+;;;###autoload
+(defun evil-collection-minesweeper-setup ()
+ "Set up `evil' bindings for `minesweeper'."
+ (evil-set-initial-state 'minesweeper-mode 'normal)
+ (evil-collection-define-key 'normal 'minesweeper-mode-map
+ "RET" 'minesweeper-choose
+ "m" 'minesweeper-toggle-mark
+ "c" 'minesweeper-choose-around
+ "s" 'minesweeper-toggle-show-neighbors
+ "j" 'minesweeper-next-line
+ "h" 'minesweeper-backward-char
+ "l" 'minesweeper-forward-char
+ "$" 'minesweeper-move-end-of-field
+ "e" 'minesweeper-move-end-of-field))
+
+(provide 'evil-collection-minesweeper)
+
+;;; evil-collection-minesweeper.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/minibuffer/README.org b/.config/emacs/lisp/evil-collection/modes/minibuffer/README.org
new file mode 100644
index 0000000..30121f6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/minibuffer/README.org
@@ -0,0 +1,47 @@
+* minibuffer
+
+ Evil bindings for the minibuffer and =evil-ex= prompt.
+
+ The minibuffer has no major mode, so the package hooks =minibuffer-setup-hook=
+ to enter insert state on open.
+
+** Affected keymaps
+
+ - =minibuffer-local-map=
+ - =minibuffer-local-ns-map=
+ - =minibuffer-local-completion-map=
+ - =minibuffer-local-must-match-map=
+ - =minibuffer-local-isearch-map=
+ - =evil-ex-search-keymap=
+ - =evil-ex-completion-map=
+
+** Key bindings
+
+ Normal-state bindings added to every map above.
+
+ | Command | Key |
+ |----------------------------------------+------------|
+ | =evil-collection-change-in-minibuffer= | =c= |
+ | =abort-recursive-edit= | =<escape>= |
+ | =exit-minibuffer= | =RET= |
+
+ Extra bindings on =evil-ex-completion-map= for history navigation:
+
+ | Command | State | Key |
+ |-------------------------------------+--------+------------|
+ | =previous-complete-history-element= | insert | =C-p= |
+ | =next-complete-history-element= | insert | =C-n= |
+ | =previous-history-element= | normal | =C-p= |
+ | =next-history-element= | normal | =C-n= |
+ | =abort-recursive-edit= | normal | =<escape>= |
+
+** New commands
+
+ | Command | Key | |
+ |----------------------------------------+-----+--------------------------------------------------------------------------------------|
+ | =evil-collection-change-in-minibuffer= | =c= | =evil-change= variant that avoids inserting a stray newline when the buffer had none |
+
+** Notes
+
+ - =evil-echo-state= is locally disabled so the minibuffer prompt is not
+ overwritten by the state indicator.
diff --git a/.config/emacs/lisp/evil-collection/modes/minibuffer/evil-collection-minibuffer.el b/.config/emacs/lisp/evil-collection/modes/minibuffer/evil-collection-minibuffer.el
new file mode 100644
index 0000000..ed81b9c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/minibuffer/evil-collection-minibuffer.el
@@ -0,0 +1,85 @@
+;;; evil-collection-minibuffer.el --- Evil bindings for the minibuffer -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, minibuffer, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for the minibuffer.
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-minibuffer-maps '(minibuffer-local-map
+ minibuffer-local-ns-map
+ minibuffer-local-completion-map
+ minibuffer-local-must-match-map
+ minibuffer-local-isearch-map
+ evil-ex-search-keymap
+ evil-ex-completion-map))
+
+(defun evil-collection-minibuffer-insert ()
+ "Switch to insert state.
+
+This function is meant to be hooked in the minibuffer:
+
+ (add-hook \='minibuffer-setup-hook \='evil-collection-minibuffer-insert)
+
+`evil-set-initial-state' can not be used for the minibuffer since
+it does not have a mode."
+ (set (make-local-variable 'evil-echo-state) nil)
+ ;; (evil-set-initial-state 'mode 'insert) is the evil-proper
+ ;; way to do this, but the minibuffer doesn't have a mode.
+ ;; The alternative is to create a minibuffer mode (here), but
+ ;; then it may conflict with other packages' if they do the same.
+ (evil-insert 1))
+
+(evil-define-operator evil-collection-change-in-minibuffer
+ (beg end type register yank-handler delete-func)
+ "A version of `evil-change' that won't insert a new line on buffers without one."
+ (interactive "<R><x><y>")
+ ;; If there was no new line before the change, there should be none after.
+ ;; Delete any new line that might have been inserted and ignore an error if
+ ;; one wasn't.
+ (let ((new-inserted (and (eq type 'line) (/= ?\n (char-before end)))))
+ (evil-change beg end type register yank-handler delete-func)
+ (when new-inserted (ignore-errors (delete-char 1)))))
+
+;;;###autoload
+(defun evil-collection-minibuffer-setup ()
+ "Initialize minibuffer for `evil'."
+ ;; https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-from-Minibuffer.html
+ (dolist (map evil-collection-minibuffer-maps)
+ (evil-collection-define-key 'normal map "c" 'evil-collection-change-in-minibuffer)
+ (evil-collection-define-key 'normal map (kbd "<escape>") 'abort-recursive-edit)
+ (evil-collection-define-key 'normal map (kbd "RET") 'exit-minibuffer))
+
+ (add-hook 'minibuffer-setup-hook 'evil-collection-minibuffer-insert)
+ ;; Because of the above minibuffer-setup-hook, some evil-ex bindings need be reset.
+ (evil-collection-define-key 'normal 'evil-ex-completion-map (kbd "<escape>") 'abort-recursive-edit)
+ (evil-collection-define-key 'insert 'evil-ex-completion-map (kbd "C-p") 'previous-complete-history-element)
+ (evil-collection-define-key 'insert 'evil-ex-completion-map (kbd "C-n") 'next-complete-history-element)
+ (evil-collection-define-key 'normal 'evil-ex-completion-map (kbd "C-p") 'previous-history-element)
+ (evil-collection-define-key 'normal 'evil-ex-completion-map (kbd "C-n") 'next-history-element))
+
+(provide 'evil-collection-minibuffer)
+;;; evil-collection-minibuffer.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/monky/evil-collection-monky.el b/.config/emacs/lisp/evil-collection/modes/monky/evil-collection-monky.el
new file mode 100644
index 0000000..5c87d7a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/monky/evil-collection-monky.el
@@ -0,0 +1,129 @@
+;;; evil-collection-monky.el --- Bindings for `monky' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `monky'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'monky nil t)
+
+(defconst evil-collection-monky-maps '(monky-mode-map
+ monky-status-mode-map
+ monky-log-mode-map
+ monky-blame-mode-map
+ monky-branches-mode-map
+ monky-commit-mode-map
+ monky-queue-mode-map
+ monky-log-edit-mode-map))
+
+;;;###autoload
+(defun evil-collection-monky-setup ()
+ "Set up `evil' bindings for `monky'."
+ (evil-set-initial-state 'monky-mode 'normal)
+ (add-hook 'monky-mode-hook 'evil-normalize-keymaps)
+ (add-hook 'monky-status-mode-hook 'evil-normalize-keymaps)
+
+ (evil-collection-define-key 'normal 'monky-mode-map
+ "]]" 'monky-goto-next-section
+ "gj" 'monky-goto-next-section
+ (kbd "C-j") 'monky-goto-next-section
+ "[[" 'monky-goto-previous-section
+ "gk" 'monky-goto-previous-section
+ (kbd "C-k") 'monky-goto-previous-section
+ (kbd "RET") 'monky-visit-item
+ (kbd "TAB") 'monky-toggle-section
+ (kbd "SPC") 'monky-show-item-or-scroll-up
+ (kbd "DEL") 'monky-show-item-or-scroll-down
+ "gr" 'monky-refresh
+ "`" 'monky-display-process
+ "!" 'monky-hg-command
+ "Ll" 'monky-log-current-branch
+ "La" 'monky-log-all
+ "LL" 'monky-log-all
+ "Lr" 'monky-log-revset
+ "b" 'monky-branches
+ "Q" 'monky-queue
+ "q" 'monky-quit-window)
+
+ (evil-collection-define-key 'normal 'monky-status-mode-map
+ "s" 'monky-stage-item
+ "S" 'monky-stage-all
+ "u" 'monky-unstage-item
+ "U" 'monky-unstage-all
+ "a" 'monky-commit-amend
+ "c" 'monky-log-edit
+ "e" 'monky-ediff-item
+ "Y" 'monky-bookmark-create
+ "C" 'monky-checkout
+ "M" 'monky-merge
+ "B" 'monky-backout
+ "P" 'monky-push
+ "F" 'monky-pull
+ "x" 'monky-discard-item
+ "m" 'monky-resolve-item
+ "K" 'monky-unresolve-item ;; Not the best...
+ "o" 'monky-reset-tip
+ "A" 'monky-addremove-all
+ "R" 'monky-rollback)
+
+ (evil-collection-define-key 'normal 'monky-log-mode-map
+ "+" 'monky-log-show-more-entries
+ "b" 'monky-checkout-item ;; Like `magit-branch'.
+ "m" 'monky-merge-item ;; Like `magit-merge'.
+ "B" 'monky-backout-item
+ "i" 'monky-qimport-item)
+
+ (evil-collection-define-key 'normal 'monky-branches-mode-map
+ "b" 'monky-checkout-item ;; Like `magit-branch'.
+ "m" 'monky-merge-item ;; Like `magit-merge'.
+ )
+
+ ;; FIXME: Haven't used this mode yet so not sure if these are appropriate...
+ (evil-collection-define-key 'normal 'monky-queue-mode-map
+ "u" 'monky-qpop-item
+ "U" 'monky-qpop-all
+ "s" 'monky-qpush-item
+ "S" 'monky-qpush-all
+ "r" 'monky-qrefresh
+ "R" 'monky-qrename-item
+ "k" 'monky-qremove-item
+ "N" 'monky-qnew
+ "f" 'monky-qfinish-item
+ "F" 'monky-qfinish-applied
+ "d" 'monky-qfold-item
+ "G" 'monky-qguard-item
+ "o" 'monky-qreorder
+ "A" 'monky-addremove-all)
+
+ (evil-collection-define-key 'normal 'monky-log-edit-mode-map
+ (kbd "C-c C-c") 'monky-log-edit-commit
+ [remap evil-save-and-close] 'monky-log-edit-commit
+ [remap evil-save-modified-and-close] 'monky-log-edit-commit
+ (kbd "C-c C-k") 'monky-log-edit-cancel-log-message
+ [remap evil-quit] 'monky-log-edit-cancel-log-message))
+
+(provide 'evil-collection-monky)
+;;; evil-collection-monky.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/mpc/README.org b/.config/emacs/lisp/evil-collection/modes/mpc/README.org
new file mode 100644
index 0000000..8416a2a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mpc/README.org
@@ -0,0 +1,44 @@
+* mpc
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Music.html][mpc-mode]], the Emacs front-end to the Music Player Daemon.
+
+** Key bindings
+
+ Bindings applied to =mpc-mode-map=.
+
+ | Command | Original | Evil |
+ |---------------------------------+----------+--------------|
+ | =evil-collection-mpc-move-down= | n/a | =C-j= |
+ | =evil-collection-mpc-move-up= | n/a | =C-k= |
+ | =mpc-toggle-play= | =s= | =t= |
+ | =mpc-stop= | n/a | =T= |
+ | =mpc-toggle-repeat= | n/a | =r= |
+ | =mpc-toggle-shuffle= | n/a | =s= |
+ | =mpc-toggle-consume= | n/a | =c= |
+ | =mpc-playlist= | n/a | =gp= |
+ | =mpc-playlist-add= | n/a | =a= |
+ | =mpc-next= | =>= | =J= |
+ | =mpc-prev= | =<= | =K= |
+ | =mpc-play-at-point= | n/a | =x= |
+ | =mpc-play= | n/a | =X= |
+ | =mpc-select= | =RET= | =RET= |
+ | =mpc-select-toggle= | =S-RET= | =S-<return>= |
+ | =mpc-select-extend= | n/a | =C-<return>= |
+ | =mpc-goto-playing-song= | =o= | =go= |
+ | =mpc-describe-song= | n/a | =gd= |
+ | =mpc-pause= | =p= | =p= |
+ | =mpc-resume= | n/a | =P= |
+ | =mpc-seek-current= | =g= | =gs= |
+ | =mpc-tagbrowser= | n/a | =gb= |
+ | =mpc-songs-search= | n/a | =g/= |
+ | =mpc-songs-kill-search= | n/a | =g_= |
+ | =mpc-update= | n/a | =gR= |
+ | =mpc-playlist-delete= | n/a | =D= |
+ | =mpc-quit= | =q= | =q= |
+
+** New commands
+
+ | Command | Key | |
+ |---------------------------------+-------+----------------------------------------|
+ | =evil-collection-mpc-move-down= | =C-j= | move cursor down and call =mpc-select= |
+ | =evil-collection-mpc-move-up= | =C-k= | move cursor up and call =mpc-select= |
diff --git a/.config/emacs/lisp/evil-collection/modes/mpc/evil-collection-mpc.el b/.config/emacs/lisp/evil-collection/modes/mpc/evil-collection-mpc.el
new file mode 100644
index 0000000..94f3a9b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mpc/evil-collection-mpc.el
@@ -0,0 +1,80 @@
+;;; evil-collection-mpc.el --- Bindings for `mpc-mode' -*- lexical-binding: t -*-
+;; Copyright (C) 2021, 2022 pspiagicw
+
+;; Author: pspiagicw <pspiagicw@gmail.com>
+;; Maintainer: pspiagicw <pspiagicw@gmail.com>
+;; pspiagicw <pspiagicw@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, mpc, processes , mpd
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `mpc-mode'.
+
+;;; Code:
+(require 'mpc)
+(require 'evil-collection)
+
+(defconst evil-collection-mpc-mode-maps '(mpc-mode-map))
+
+(defun evil-collection-mpc-move-down ()
+ "Move the cursor down along with selecting the element."
+ (interactive)
+ (evil-next-visual-line)
+ (mpc-select))
+
+(defun evil-collection-mpc-move-up ()
+ "Move the cursor up along with selecting the element."
+ (interactive)
+ (evil-previous-visual-line)
+ (mpc-select))
+
+;;;###autoload
+(defun evil-collection-mpc-setup ()
+ "Setup up `evil' bindings for `mpc-mode'."
+ (evil-collection-define-key 'normal 'mpc-mode-map
+ (kbd "C-j") 'evil-collection-mpc-move-down
+ (kbd "C-k") 'evil-collection-mpc-move-up
+ "t" 'mpc-toggle-play
+ "T" 'mpc-stop
+ "r" 'mpc-toggle-repeat
+ "s" 'mpc-toggle-shuffle
+ "c" 'mpc-toggle-consume
+ "gp" 'mpc-playlist
+ "a" 'mpc-playlist-add
+ "J" 'mpc-next
+ "K" 'mpc-prev
+ "x" 'mpc-play-at-point
+ "X" 'mpc-play
+ (kbd "RET") 'mpc-select
+ (kbd "S-<return>") 'mpc-select-toggle
+ (kbd "C-<return>") 'mpc-select-extend
+ "go" 'mpc-goto-playing-song
+ "gd" 'mpc-describe-song
+ "p" 'mpc-pause
+ "P" 'mpc-resume
+ "gs" 'mpc-seek-current
+ "gb" 'mpc-tagbrowser
+ "g/" 'mpc-songs-search
+ "g_" 'mpc-songs-kill-search
+ "gd" 'mpc-songs-jump-to
+ "gR" 'mpc-update
+ "D" 'mpc-playlist-delete
+ "q" 'mpc-quit))
+
+(provide 'evil-collection-mpc)
+;;; evil-collection-mpc.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/mpdel/evil-collection-mpdel.el b/.config/emacs/lisp/evil-collection/modes/mpdel/evil-collection-mpdel.el
new file mode 100644
index 0000000..d842899
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mpdel/evil-collection-mpdel.el
@@ -0,0 +1,96 @@
+;;; evil-collection-mpdel.el --- Evil bindings for mpdel -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Ruoyu Feng
+
+;; Author: Ruoyu Feng <mail@vonfry.name>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.4
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools, mpd
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for mpdel.
+
+;;; Code:
+
+(require 'mpdel nil t)
+(require 'evil-collection)
+
+(defvar mpdel-core-map)
+
+(defconst evil-collection-mpdel-maps '(mpdel-core-map))
+
+(defconst evil-collection-mpdel-modes '(mpdel-browser-mode mpdel-playlist-mode
+ mpdel-song-mode mpdel-browser-mode
+ mpdel-playlist-current-playlist-mode
+ mpdel-playlist-stored-playlist-mode))
+
+;;;###autoload
+(defun evil-collection-mpdel-setup ()
+ "Set up `evil' bindings for `mpdel'."
+
+ (evil-collection-set-readonly-bindings 'mpdel-core-map)
+ (dolist (mode evil-collection-mpdel-modes)
+ (evil-set-initial-state mode 'normal))
+ (evil-collection-define-key 'normal 'mpdel-core-map
+ "p" 'libmpdel-playback-play-pause
+ "{" 'libmpdel-playback-previous
+ "}" 'libmpdel-playback-next
+ "a" 'mpdel-core-add-to-current-playlist
+ "A" 'mpdel-core-add-to-stored-playlist
+ "r" 'mpdel-core-replace-current-playlist
+ "R" 'mpdel-core-replace-stored-playlist
+ "i" 'mpdel-core-insert-current-playlist
+ "gD" 'mpdel-core-dired
+ "gA" 'mpdel-core-open-artists
+ "gL" 'mpdel-core-open-stored-playlists
+ "ss" 'mpdel-core-search-by-title
+ "sl" 'mpdel-core-search-by-album
+ "sr" 'mpdel-core-search-by-artist
+ "gp" 'navigel-open-parent
+ "j" 'evil-next-line
+ "k" 'evil-previous-line
+ "+" 'mpdel-core-volume-increase
+ "-" 'mpdel-core-volume-decrease
+ "C" 'libmpdel-connect-profile
+
+ "gb" 'mpdel-browser-open
+
+ "go" 'mpdel-song-open
+ "gr" 'mpdel-song-refresh
+ "I" 'mpdel-song-play
+ "q" 'mpdel-song-quit-window
+
+ ">s" 'mpdel-song-small-increment
+ ">n" 'mpdel-song-normal-increment
+ ">l" 'mpdel-song-large-increment
+ "<s" 'mpdel-song-small-decrement
+ "<n" 'mpdel-song-normal-decrement
+ "<l" 'mpdel-song-large-decrement
+
+ "gl" 'mpdel-playlist-open
+ "(" 'mpdel-playlist-move-up
+ ")" 'mpdel-playlist-move-down
+ "w" 'mpdel-playlist-save
+ "P" 'mpdel-playlist-play)
+
+ (evil-collection-define-key 'normal 'mpdel-tablist-mode-map
+ "D" 'tablist-do-delete))
+
+(provide 'evil-collection-mpdel)
+;;; evil-collection-mpdel.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/mpdired/evil-collection-mpdired.el b/.config/emacs/lisp/evil-collection/modes/mpdired/evil-collection-mpdired.el
new file mode 100644
index 0000000..5cf14cd
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mpdired/evil-collection-mpdired.el
@@ -0,0 +1,85 @@
+;;; evil-collection-mpdired.el --- Evil bindings for mpdired -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 Ruoyu Feng
+
+;; Author: Ruoyu Feng <mail@vonfry.name>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: evil, tools, mpd
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for mpdired.
+
+;;; Code:
+
+(require 'mpdired nil t)
+(require 'evil-collection)
+
+(defvar mpdired-core-map)
+
+(defconst evil-collection-mpdired-maps '(mpdired-mode-map))
+
+(defconst evil-collection-mpdired-modes '(mpdired-mode-map))
+
+;;;###autoload
+(defun evil-collection-mpdired-setup ()
+ "Set up `evil' bindings for `mpdired'."
+
+ (evil-collection-set-readonly-bindings 'mpdired-mode-map)
+ (dolist (mode evil-collection-mpdired-modes)
+ (evil-set-initial-state mode 'normal))
+
+ (evil-collection-define-key 'normal 'mpdired-mode-map
+ "j" 'mpdired-next-line
+ "k" 'mpdired-previous-line
+ (kbd "RET") 'mpdired-enter
+ "^" 'mpdired-goto-parent
+ "." 'mpdired-goto-current-song
+ "o" 'mpdired-toggle-view
+ "gr" 'mpdired-update
+ "gR" 'mpdired-db-update
+ "J" 'mpdired-next-internal
+ "K" 'mpdired-previous-internal
+ "a" 'mpdired-add
+ "d" 'mpdired-flag-at-point
+ "x" 'mpdired-execute
+ "D" 'mpdired-delete
+ "p" 'mpdired-pause-internal
+ (kbd "SPC") 'mpdired-pause-internal
+ "gv" 'mpdired-set-volume-internal
+ "ss" 'mpdired-stop
+ "sR" 'mpdired-toggle-repeat
+ "sr" 'mpdired-toggle-random
+ "sS" 'mpdired-toggle-single
+ "sc" 'mpdired-toggle-consume
+ "gc" 'mpdired-playlist-create
+ "ga" 'mpdired-playlist-append
+ "m" 'mpdired-mark-at-point
+ "M" 'mpdired-change-marks
+ "u" 'mpdired-unmark-at-point
+ "U" 'mpdired-unmark-all-marks
+ "t" 'mpdired-toggle-marks
+ "T" 'mpdired-previous-unmark
+ "%d" 'mpdired-flag-files-regexp
+ "%m" 'mpdired-mark-files-regexp
+ "%i" 'mpdired-put-order-at-point
+ "%r" 'mpdired-reset-order-index))
+
+(provide 'evil-collection-mpdired)
+;;; evil-collection-mpdired.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/mu4e-conversation/evil-collection-mu4e-conversation.el b/.config/emacs/lisp/evil-collection/modes/mu4e-conversation/evil-collection-mu4e-conversation.el
new file mode 100644
index 0000000..8d72bc1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mu4e-conversation/evil-collection-mu4e-conversation.el
@@ -0,0 +1,75 @@
+;;; evil-collection-mu4e-conversation.el --- Evil bindings for mu4e-conversation -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt <mail@ambrevar.xyz>
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "24.4") (evil "1.2.10"))
+;; Keywords: evil, mu4e, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for mu4e-conversation.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'mu4e-conversation nil t)
+
+(defconst evil-collection-mu4e-conversation-maps '(mu4e-conversation-map
+ mu4e-conversation-thread-map))
+
+(defvar evil-collection-mu4e-conversation--local-map-p nil
+ "Non-nil if last position was on a local-map property.")
+
+(defun evil-collection-mu4e-conversation--switch ()
+ "Re-compute the bindings if point has moved between the thread
+ area and the composition area."
+ (let ((local-map-here (get-text-property (point) 'local-map)))
+ (when (or (and evil-collection-mu4e-conversation--local-map-p
+ (not local-map-here))
+ (and (not evil-collection-mu4e-conversation--local-map-p)
+ local-map-here))
+ (evil-normalize-keymaps))
+ (setq evil-collection-mu4e-conversation--local-map-p local-map-here)))
+
+(defun evil-collection-mu4e-conversation--update-local-map ()
+ (setq evil-collection-mu4e-conversation--local-map-p (get-text-property (point) 'local-map))
+ (evil-normalize-keymaps)
+ (add-hook 'post-command-hook 'evil-collection-mu4e-conversation--switch nil t))
+
+;;;###autoload
+(defun evil-collection-mu4e-conversation-setup ()
+ "Set up `evil' bindings for `mu4e-conversation'."
+ ;; Evil does not update its current keymap state when it the point hits a
+ ;; local-map property is used. See
+ ;; https://github.com/emacs-evil/evil/issues/301. Thus we force the update
+ ;; with a technique similar to what `org~mu4e-mime-switch-headers-or-body'
+ ;; does.
+ (add-hook 'mu4e-conversation-hook 'evil-collection-mu4e-conversation--update-local-map)
+ (evil-collection-define-key 'normal 'mu4e-conversation-map
+ " " 'evil-scroll-page-down
+ (kbd "S-SPC") 'evil-scroll-page-up
+ "[[" 'mu4e-conversation-previous-message
+ "]]" 'mu4e-conversation-next-message
+ "zv" 'mu4e-conversation-toggle-view
+ "za" 'mu4e-conversation-toggle-hide-cited
+ "q" 'mu4e-conversation-quit))
+
+(provide 'evil-collection-mu4e-conversation)
+;;; evil-collection-mu4e-conversation.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e-1.8.el b/.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e-1.8.el
new file mode 100644
index 0000000..eab3a63
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e-1.8.el
@@ -0,0 +1,435 @@
+;;; evil-collection-mu4e.el --- Evil bindings for mu4e -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2018 Joris Engbers
+;; Copyright (C) 2018 Pierre Neidhardt <mail@ambrevar.xyz>
+
+;; Author: Joris Engbers <info@jorisengbers.nl>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.9
+;; Package-Requires: ((emacs "24.4") (evil "1.2.10"))
+;; Keywords: evil, mu4e, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil keybindings for mu4e that make sense for Evil users. The following
+;; keybindings are defined:
+;;
+;; General commands:
+;; | Commmand | evil-mu4e | Alternative |
+;; |--------------------------+-----------+-------------|
+;; | Jump to maildir | J | |
+;; | Update | u | |
+;; | Compose message | cc | C |
+;; | Kill update mail process | x | |
+
+;; Commands for header-mode and view-mode:
+;; | Command | evil-mu4e | Alternative |
+;; |---------------------------------+-----------+-------------|
+;; | Next message | C-j | |
+;; | Previous message | C-k | |
+;; | Mark the current thread as read | T | |
+;; | Compose message | cc | C |
+;; | Compose edit** | ce | E |
+;; | Compose forward** | cf | F |
+;; | Compose reply | cr | R |
+;; | Change sorting*** | o | O |
+;; | Rerun search | gr | |
+;; | Toggle include related | zr | |
+;; | Toggle threading | zt | |
+;; | Toggle hide cited | za | |
+;; | Skip duplicates | zd | |
+;; | Show log | gl | |
+;; | Select other view | gv | |
+;; | Save attachement(s) | p | |
+;; | Save url | yu | |
+;; | Go to url | gx | |
+;; | Fetch url | gX | |
+;;
+;; - * denotes only in header-mode
+;; - ** denotes Alternative only in header-mode
+;; - *** denotes Alternative only in view-mode
+;;
+;;; Code:
+
+(require 'evil-collection)
+(require 'mu4e nil t)
+
+(declare-function mu4e--main-action-str "mu4e-main")
+(declare-function mu4e--main-view-queue "mu4e-main")
+(declare-function mu4e--longest-of-maildirs-and-bookmarks "mu4e-main")
+(declare-function mu4e--longest-of-maildirs-and-bookmarks "mu4e-main")
+(declare-function mu4e--maildirs-with-query "mu4e-folders")
+(defvar mu4e--server-props)
+(defvar mu4e-main-hide-fully-read)
+
+(defun evil-collection-mu4e--main-action-str (&rest args)
+ "Wrapper for `mu4e--main-action-str' to maintain compatibility
+with older release versions of `mu4e.'"
+ (apply (if (fboundp 'mu4e~main-action-str)
+ #'mu4e~main-action-str
+ #'mu4e--main-action-str)
+ args))
+
+(defun evil-collection-mu4e--main-view-queue (&rest args)
+ "Wrapper for `mu4e--main-view-queue' to maintain compatibility
+with older release versions of `mu4e.'"
+ (apply (if (fboundp 'mu4e~main-view-queue)
+ #'mu4e~main-view-queue
+ #'mu4e--main-view-queue)
+ args))
+
+(defvar smtpmail-send-queued-mail)
+(defvar smtpmail-queue-dir)
+
+(defconst evil-collection-mu4e-maps '(mu4e-main-mode-map
+ mu4e-headers-mode-map
+ mu4e-view-mode-map
+ mu4e-compose-mode-map))
+
+
+
+(defun evil-collection-mu4e-set-state ()
+ "Set the appropriate initial state of all mu4e modes."
+ (dolist (mode '(mu4e-main-mode
+ mu4e-headers-mode
+ mu4e-view-mode
+ mu4e-org-mode))
+ (evil-set-initial-state mode 'normal))
+ (evil-set-initial-state 'mu4e-compose-mode 'insert))
+
+;; When using org-mu4e, the above leads to an annoying behaviour, because
+;; switching from message body to header activates mu4e-compose-mode, thus
+;; putting the user into insert-state. The below code, together with the hooks
+;; set in evil-collection-mu4e-setup fixes this issue.
+(defun evil-collection-mu4e-org-set-header-to-normal-mode ()
+ (evil-set-initial-state 'mu4e-compose-mode 'normal))
+
+(defun evil-collection-mu4e-org-set-header-to-insert-mode ()
+ (evil-set-initial-state 'mu4e-compose-mode 'insert))
+
+
+;;; Define bindings
+
+;; TODO: Inhibit insert-state functions as per Evil Collection.
+(defvar evil-collection-mu4e-mode-normal-map-bindings
+ `((mu4e-main-mode-map
+ "J" mu4e~headers-jump-to-maildir
+ "j" next-line
+ "k" previous-line
+ "u" mu4e-update-mail-and-index
+ "gr" revert-buffer
+ "b" mu4e-search-bookmark
+ "B" mu4e-search-bookmark-edit
+ "N" mu4e-news
+ ";" mu4e-context-switch
+ "H" mu4e-display-manual
+ "C" mu4e-compose-new
+ "cc" mu4e-compose-new
+ "x" mu4e-kill-update-mail
+ "A" mu4e-about
+ "f" smtpmail-send-queued-mail
+ "m" mu4e--main-toggle-mail-sending-mode
+ "s" mu4e-search
+ "q" mu4e-quit)
+
+ (mu4e-headers-mode-map
+ "q" mu4e~headers-quit-buffer
+ "J" mu4e~headers-jump-to-maildir
+ "C" mu4e-compose-new
+ "E" mu4e-compose-edit
+ "F" mu4e-compose-forward
+ "R" mu4e-compose-reply
+ "cc" mu4e-compose-new
+ "ce" mu4e-compose-edit
+ "cf" mu4e-compose-forward
+ "cr" mu4e-compose-reply
+ "o" mu4e-headers-change-sorting
+ "j" mu4e-headers-next
+ "k" mu4e-headers-prev
+ "gr" mu4e-search-rerun
+ "b" mu4e-search-bookmark
+ "B" mu4e-search-bookmark-edit
+ ";" mu4e-context-switch
+ ,(kbd "RET") mu4e-headers-view-message
+ "/" mu4e-search-narrow
+ "s" mu4e-search
+ "S" mu4e-search-edit
+ "x" mu4e-mark-execute-all
+ "a" mu4e-headers-action
+ "*" mu4e-headers-mark-for-something ; TODO: Don't override evil-seach-word-forward?
+ "&" mu4e-headers-mark-custom
+ "A" mu4e-headers-mark-for-action
+ "m" mu4e-headers-mark-for-move
+ "r" mu4e-headers-mark-for-refile
+ "D" mu4e-headers-mark-for-delete
+ "d" mu4e-headers-mark-for-trash
+ "=" mu4e-headers-mark-for-untrash
+ "u" mu4e-headers-mark-for-unmark
+ "U" mu4e-mark-unmark-all
+ "?" mu4e-headers-mark-for-unread
+ "!" mu4e-headers-mark-for-read
+ "%" mu4e-headers-mark-pattern
+ "+" mu4e-headers-mark-for-flag
+ "-" mu4e-headers-mark-for-unflag
+ "[[" mu4e-headers-prev-unread
+ "]]" mu4e-headers-next-unread
+ "gk" mu4e-headers-prev-unread
+ "gj" mu4e-headers-next-unread
+ "\C-j" mu4e-headers-next
+ "\C-k" mu4e-headers-prev
+ "zr" mu4e-headers-toggle-include-related
+ "zt" mu4e-headers-toggle-threading
+ "zd" mu4e-headers-toggle-skip-duplicates
+ "gl" mu4e-show-log
+ "gv" mu4e-select-other-view
+ "T" (lambda ()
+ (interactive)
+ (mu4e-headers-mark-thread nil '(read))))
+
+ (mu4e-compose-mode-map
+ "gg" mu4e-compose-goto-top
+ "G" mu4e-compose-goto-bottom
+ "ZD" message-dont-send
+ "ZF" mml-attach-file
+ "ZQ" mu4e-message-kill-buffer
+ "ZZ" message-send-and-exit)
+
+ (mu4e-view-mode-map
+ " " mu4e-view-scroll-up-or-next
+ [tab] shr-next-link
+ [backtab] shr-previous-link
+ "q" mu4e~view-quit-buffer
+ "gx" mu4e-view-go-to-url
+ "gX" mu4e-view-fetch-url
+ "C" mu4e-compose-new
+ "H" mu4e-view-toggle-html
+ ;; "E" mu4e-compose-edit
+ ;; "F" mu4e-compose-forward
+ "R" mu4e-compose-reply
+ "cc" mu4e-compose-new
+ "ce" mu4e-compose-edit
+ "cf" mu4e-compose-forward
+ "cr" mu4e-compose-reply
+ "p" mu4e-view-save-attachments
+ "O" mu4e-headers-change-sorting
+ "A" mu4e-view-mime-part-action ; Since 1.6, uses gnus view by default
+ "a" mu4e-view-action
+ "J" mu4e~headers-jump-to-maildir
+ "[[" mu4e-view-headers-prev-unread
+ "]]" mu4e-view-headers-next-unread
+ "gk" mu4e-view-headers-prev-unread
+ "gj" mu4e-view-headers-next-unread
+ "\C-j" mu4e-view-headers-next
+ "\C-k" mu4e-view-headers-prev
+ "x" mu4e-view-marked-execute
+ "&" mu4e-view-mark-custom
+ "*" mu4e-view-mark-for-something ; TODO: Don't override "*".
+ "m" mu4e-view-mark-for-move
+ "r" mu4e-view-mark-for-refile
+ "D" mu4e-view-mark-for-delete
+ "d" mu4e-view-mark-for-trash
+ "=" mu4e-view-mark-for-untrash
+ "u" mu4e-view-unmark
+ "U" mu4e-view-unmark-all
+ "?" mu4e-view-mark-for-unread
+ "!" mu4e-view-mark-for-read
+ "%" mu4e-view-mark-pattern
+ "+" mu4e-view-mark-for-flag
+ "-" mu4e-view-mark-for-unflag
+ "zr" mu4e-headers-toggle-include-related
+ "zt" mu4e-headers-toggle-threading
+ "za" mu4e-view-toggle-hide-cited
+ "gl" mu4e-show-log
+ "s" mu4e-view-search-edit
+ "|" mu4e-view-pipe
+ "." mu4e-view-raw-message
+ ,(kbd "C--") mu4e-headers-split-view-shrink
+ ,(kbd "C-+") mu4e-headers-split-view-grow
+ "T" (lambda ()
+ (interactive)
+ (mu4e-headers-mark-thread nil '(read)))
+ ,@(when evil-want-C-u-scroll
+ '("\C-u" evil-scroll-up))))
+ "All evil-mu4e bindings for evil normal mode.")
+
+ (defvar evil-collection-mu4e-mode-visual-map-bindings
+ `((mu4e-headers-mode-map
+ "*" mu4e-headers-mark-for-something
+ "A" mu4e-headers-mark-for-action
+ "m" mu4e-headers-mark-for-move
+ "r" mu4e-headers-mark-for-refile
+ "D" mu4e-headers-mark-for-delete
+ "d" mu4e-headers-mark-for-trash
+ "=" mu4e-headers-mark-for-untrash
+ "u" mu4e-headers-mark-for-unmark
+ "?" mu4e-headers-mark-for-unread
+ "!" mu4e-headers-mark-for-read
+ "+" mu4e-headers-mark-for-flag
+ "-" mu4e-headers-mark-for-unflag)
+
+ (mu4e-compose-mode-map
+ "gg" mu4e-compose-goto-top
+ "G" mu4e-compose-goto-bottom))
+ "All evil-mu4e bindings for evil visual mode.")
+
+(defun evil-collection-mu4e-set-bindings ()
+ "Set the bindings."
+ ;; WARNING: With lexical binding, lambdas from `mapc' and `dolist' become
+ ;; closures in which we must use `evil-define-key*' instead of
+ ;; `evil-define-key'.
+ (dolist (binding evil-collection-mu4e-mode-normal-map-bindings)
+ (apply #'evil-collection-define-key 'normal binding))
+ (dolist (binding evil-collection-mu4e-mode-visual-map-bindings)
+ (apply #'evil-collection-define-key 'visual binding))
+ (evil-set-command-property 'mu4e-compose-goto-bottom :keep-visual t)
+ (evil-set-command-property 'mu4e-compose-goto-top :keep-visual t)
+
+ ;; yu
+ (evil-collection-define-operator-key 'yank 'mu4e-view-mode-map
+ "u" 'mu4e-view-save-url))
+
+
+;;; Update mu4e-main-view
+;;; To avoid confusion the main-view is updated to show the keys that are in use
+;;; for evil-mu4e.
+
+(defvar evil-collection-mu4e-begin-region-basic "\n Basics"
+ "The place where to start overriding Basic section.")
+
+(defvar evil-collection-mu4e-end-region-basic "a new message\n"
+ "The place where to end overriding Basic section.")
+
+(defvar evil-collection-mu4e-new-region-basic
+ (concat (evil-collection-mu4e--main-action-str "\t* [J]ump to some maildir\n" 'mu4e-jump-to-maildir)
+ (evil-collection-mu4e--main-action-str "\t* enter a [s]earch query\n" 'mu4e-search)
+ (evil-collection-mu4e--main-action-str "\t* [C]ompose a new message\n" 'mu4e-compose-new))
+ "Define the evil-mu4e Basic region.")
+
+(defvar evil-collection-mu4e-begin-region-misc "\n Misc"
+ "The place where to start overriding Misc section.")
+
+(defvar evil-collection-mu4e-end-region-misc "q]uit"
+ "The place where to end overriding Misc section.")
+
+(defun evil-collection-mu4e-new-region-misc ()
+ "Define the evil-mu4e Misc region."
+ (concat
+ (evil-collection-mu4e--main-action-str "\t* [;]Switch focus\n" 'mu4e-context-switch)
+ (evil-collection-mu4e--main-action-str "\t* [u]pdate email & database\n"
+ 'mu4e-update-mail-and-index)
+
+ ;; show the queue functions if `smtpmail-queue-dir' is defined
+ (if (file-directory-p smtpmail-queue-dir)
+ (evil-collection-mu4e--main-view-queue)
+ "")
+ "\n"
+
+ (evil-collection-mu4e--main-action-str "\t* [N]ews\n" 'mu4e-news)
+ (evil-collection-mu4e--main-action-str "\t* [A]bout mu4e\n" 'mu4e-about)
+ (evil-collection-mu4e--main-action-str "\t* [H]elp\n" 'mu4e-display-manual)
+ (evil-collection-mu4e--main-action-str "\t* [q]uit\n" 'mu4e-quit)))
+
+(defvar evil-collection-mu4e-begin-region-maildir "\n Maildirs"
+ "The place where to end overriding Maildirs section.")
+
+(defvar evil-collection-mu4e-end-region-maildir "\n\n Misc"
+ "The place where to end overriding Maildirs section.")
+
+(defun evil-collection-mu4e-new-region-maildir ()
+ "Define the evil-mu4e Maildirs region."
+ (concat
+ ;; minorly edited version of mu4e--main-bookmarks mu4e-main.el
+ (cl-loop with mds = (mu4e--maildirs-with-query)
+ with longest = (mu4e--longest-of-maildirs-and-bookmarks)
+ with queries = (plist-get mu4e--server-props :queries)
+ for m in mds
+ for key = (string (plist-get m :key))
+ for name = (plist-get m :name)
+ for query = (plist-get m :query)
+ for qcounts = (and (stringp query)
+ (cl-loop for q in queries
+ when (string=
+ (decode-coding-string
+ (plist-get q :query)
+ 'utf-8 t)
+ query)
+ collect q))
+ for unread = (and qcounts (plist-get (car qcounts) :unread))
+ when (not (plist-get m :hide))
+ when (not (and mu4e-main-hide-fully-read (eq unread 0)))
+ concat (concat
+ ;; menu entry
+ (evil-collection-mu4e--main-action-str
+ (concat "\t* [J" key "] " name)
+ (concat "J" key))
+ ;; append all/unread numbers, if available.
+ (if qcounts
+ (let ((unread (plist-get (car qcounts) :unread))
+ (count (plist-get (car qcounts) :count)))
+ (format
+ "%s (%s/%s)"
+ (make-string (- longest (string-width name)) ? )
+ (propertize (number-to-string unread)
+ 'face 'mu4e-header-key-face)
+ count))
+ "")
+ "\n"))
+(propertize "\n Misc" 'face 'mu4e-title-face)))
+
+(defun evil-collection-mu4e-replace-region (new-region start end)
+ "Replace region between START and END with NEW-REGION.
+START end END end are regular expressions."
+ ;; move to start of region
+ (goto-char (point-min))
+ (re-search-forward start)
+
+ ;; insert new headings
+ (insert "\n\n")
+ (insert new-region)
+ ;; Delete text until end of region.
+ (let ((start-point (point))
+ (end-point (re-search-forward end)))
+ (delete-region start-point end-point)))
+
+(defun evil-collection-mu4e-update-main-view ()
+ "Update `Basic', `Maildir', and `Misc' regions to reflect the new keybindings."
+ (evil-collection-mu4e-replace-region evil-collection-mu4e-new-region-basic
+ evil-collection-mu4e-begin-region-basic
+ evil-collection-mu4e-end-region-basic)
+ (evil-collection-mu4e-replace-region (evil-collection-mu4e-new-region-misc)
+ evil-collection-mu4e-begin-region-misc
+ evil-collection-mu4e-end-region-misc)
+ (evil-collection-mu4e-replace-region (evil-collection-mu4e-new-region-maildir)
+ evil-collection-mu4e-begin-region-maildir
+ evil-collection-mu4e-end-region-maildir))
+
+
+;;; Initialize evil-collection-mu4e
+
+;;;###autoload
+(defun evil-collection-mu4e-setup ()
+ "Initialize evil-mu4e if necessary.
+If mu4e-main-mode is in evil-state-motion-modes, initialization
+is already done earlier."
+ (evil-collection-mu4e-set-state)
+ (evil-collection-mu4e-set-bindings)
+ (add-hook 'mu4e-main-mode-hook 'evil-collection-mu4e-update-main-view)
+ (add-hook 'org-mode-hook #'evil-collection-mu4e-org-set-header-to-normal-mode)
+ (add-hook 'mu4e-compose-pre-hook #'evil-collection-mu4e-org-set-header-to-insert-mode))
+
+(provide 'evil-collection-mu4e)
+;;; evil-collection-mu4e.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e.el b/.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e.el
new file mode 100644
index 0000000..3f22cd2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/mu4e/evil-collection-mu4e.el
@@ -0,0 +1,344 @@
+;;; evil-collection-mu4e.el --- Evil bindings for mu4e -*- lexical-binding: t -*-
+
+;; Copyright (C) 2015-2018 Joris Engbers
+;; Copyright (C) 2018 Pierre Neidhardt <mail@ambrevar.xyz>
+
+;; Author: Joris Engbers <info@jorisengbers.nl>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.9
+;; Package-Requires: ((emacs "24.4") (evil "1.2.10"))
+;; Keywords: evil, mu4e, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil keybindings for mu4e that make sense for Evil users. The following
+;; keybindings are defined:
+;;
+;; General commands:
+;; | Commmand | evil-mu4e | Alternative |
+;; |--------------------------+-----------+-------------|
+;; | Jump to maildir | J | |
+;; | Update | u | |
+;; | Compose message | cc | C |
+;; | Kill update mail process | x | |
+
+;; Commands for header-mode and view-mode:
+;; | Command | evil-mu4e | Alternative |
+;; |---------------------------------+-----------+-------------|
+;; | Next message | C-j | |
+;; | Previous message | C-k | |
+;; | Mark the current thread as read | T | |
+;; | Compose message | cc | C |
+;; | Compose edit** | ce | E |
+;; | Compose forward** | cf | F |
+;; | Compose reply | cr | R |
+;; | Change sorting*** | o | O |
+;; | Rerun search | gr | |
+;; | Toggle include related | zr | |
+;; | Toggle threading | zt | |
+;; | Toggle hide cited | za | |
+;; | Skip duplicates | zd | |
+;; | Show log | gl | |
+;; | Select other view | gv | |
+;; | Save attachement(s) | p | |
+;; | Save url | yu | |
+;; | Go to url | gx | |
+;; | Fetch url | gX | |
+;;
+;; - * denotes only in header-mode
+;; - ** denotes Alternative only in header-mode
+;; - *** denotes Alternative only in view-mode
+;;
+;;; Code:
+
+(require 'evil-collection)
+(require 'message)
+(require 'mu4e nil t)
+
+(defvar mu4e-mu-version)
+(declare-function evil-collection-mu4e-set-bindings "evil-collection-mu4e")
+(declare-function evil-collection-mu4e-set-state "evil-collection-mu4e")
+(declare-function mu4e-headers-mark-thread "mu4e-headers")
+
+(if (version< mu4e-mu-version "1.10")
+ (require 'evil-collection-mu4e
+ (expand-file-name "modes/mu4e/evil-collection-mu4e-1.8" evil-collection-base-dir))
+
+
+ (defconst evil-collection-mu4e-maps '(mu4e-main-mode-map
+ mu4e-headers-mode-map
+ mu4e-view-mode-map
+ mu4e-compose-mode-map
+ mu4e-search-minor-mode-map
+ mu4e-thread-mode-map))
+
+ (defun evil-collection-mu4e-set-state ()
+ "Set the appropriate initial state of all mu4e modes."
+ (dolist (mode '(mu4e-main-mode
+ mu4e-headers-mode
+ mu4e-view-mode
+ mu4e-org-mode))
+ (evil-set-initial-state mode 'normal))
+ (evil-set-initial-state 'mu4e-compose-mode 'insert))
+
+ ;; These functions were removed from mu4e 1.12.0, specifically this commit:
+ ;; https://github.com/djcb/mu/commit/85bfe763362b95935a3967f6585e14b3f9890a70
+ ;; They were also re-added in version 1.12.2.
+ (when (and (version<= "1.12.0" mu4e-mu-version)
+ (version< mu4e-mu-version "1.12.2"))
+ (defun mu4e-compose-goto-top ()
+ "Go to the beginning of the message or buffer.
+Go to the beginning of the message or, if already there, go to the
+beginning of the buffer."
+ (interactive)
+ (let ((old-position (point)))
+ (message-goto-body)
+ (when (= (point) old-position)
+ (goto-char (point-min)))))
+
+ (defun mu4e-compose-goto-bottom ()
+ "Go to the end of the message or buffer.
+Go to the end of the message (before signature) or, if already there, go to the
+end of the buffer."
+ (interactive)
+ (let ((old-position (point))
+ (message-position (save-excursion (message-goto-body) (point))))
+ (goto-char (point-max))
+ (when (re-search-backward message-signature-separator message-position t)
+ (forward-line -1))
+ (when (= (point) old-position)
+ (goto-char (point-max))))))
+
+ ;; When using org-mu4e, the above leads to an annoying behaviour, because
+ ;; switching from message body to header activates mu4e-compose-mode, thus
+ ;; putting the user into insert-state. The below code, together with the hooks
+ ;; set in evil-collection-mu4e-setup fixes this issue.
+ (defun evil-collection-mu4e-org-set-header-to-normal-mode ()
+ "Set initial state in `mu4e-compose-mode' to \='normal."
+ (evil-set-initial-state 'mu4e-compose-mode 'normal))
+
+ (defun evil-collection-mu4e-org-set-header-to-insert-mode ()
+ "Set initial state in `mu4e-compose-mode' to \='insert."
+ (evil-set-initial-state 'mu4e-compose-mode 'insert))
+
+ (defun evil-collection-mu4e-mark-thread-as-read ()
+ (interactive)
+ (mu4e-headers-mark-thread nil '(read)))
+
+ (defvar evil-collection-mu4e-mode-normal-map-bindings
+ `((mu4e-main-mode-map
+ "J" mu4e~headers-jump-to-maildir
+ "j" next-line
+ "k" previous-line
+ "u" mu4e-update-mail-and-index
+ "gr" revert-buffer
+ "b" mu4e-search-bookmark
+ "B" mu4e-search-bookmark-edit
+ "N" mu4e-news
+ ";" mu4e-context-switch
+ "H" mu4e-display-manual
+ "C" mu4e-compose-new
+ "cc" mu4e-compose-new
+ "x" mu4e-kill-update-mail
+ "A" mu4e-about
+ "f" smtpmail-send-queued-mail
+ "m" mu4e--main-toggle-mail-sending-mode
+ "s" mu4e-search
+ "q" mu4e-quit
+ "Q" mu4e-search-query)
+
+ (mu4e-headers-mode-map
+ "q" mu4e~headers-quit-buffer
+ "J" mu4e~headers-jump-to-maildir
+ "C" mu4e-compose-new
+ "E" mu4e-compose-edit
+ "F" mu4e-compose-forward
+ "R" mu4e-compose-reply
+ "cc" mu4e-compose-new
+ "ce" mu4e-compose-edit
+ "cf" mu4e-compose-forward
+ "cr" mu4e-compose-reply
+ "cw" mu4e-compose-wide-reply
+ "W" mu4e-compose-wide-reply
+ "o" mu4e-headers-change-sorting
+ "j" mu4e-headers-next
+ "k" mu4e-headers-prev
+ "gr" mu4e-search-rerun
+ "b" mu4e-search-bookmark
+ "B" mu4e-search-bookmark-edit
+ ";" mu4e-context-switch
+ ,(kbd "RET") mu4e-headers-view-message
+ "/" mu4e-search-narrow
+ "s" mu4e-search
+ "S" mu4e-search-edit
+ "x" mu4e-mark-execute-all
+ "a" mu4e-headers-action
+ "*" mu4e-headers-mark-for-something ; TODO: Don't override evil-seach-word-forward?
+ "&" mu4e-headers-mark-custom
+ "A" mu4e-headers-mark-for-action
+ "m" mu4e-headers-mark-for-move
+ "r" mu4e-headers-mark-for-refile
+ "D" mu4e-headers-mark-for-delete
+ "d" mu4e-headers-mark-for-trash
+ "=" mu4e-headers-mark-for-untrash
+ "u" mu4e-headers-mark-for-unmark
+ "U" mu4e-mark-unmark-all
+ "?" mu4e-headers-mark-for-unread
+ "!" mu4e-headers-mark-for-read
+ "%" mu4e-headers-mark-pattern
+ "+" mu4e-headers-mark-for-flag
+ "-" mu4e-headers-mark-for-unflag
+ "[[" mu4e-headers-prev-unread
+ "]]" mu4e-headers-next-unread
+ "}" mu4e-headers-next-thread
+ "{" mu4e-headers-prev-thread
+ "gk" mu4e-headers-prev-unread
+ "gj" mu4e-headers-next-unread
+ "\C-j" mu4e-headers-next
+ "\C-k" mu4e-headers-prev
+ "t" mu4e-headers-toggle-property
+ "zr" mu4e-headers-toggle-include-related
+ "zt" mu4e-headers-toggle-threading
+ "zd" mu4e-headers-toggle-skip-duplicates
+ "gl" mu4e-show-log
+ "gv" mu4e-select-other-view
+ "T" evil-collection-mu4e-mark-thread-as-read
+ "Q" mu4e-search-query)
+
+ (mu4e-compose-mode-map
+ "gg" mu4e-compose-goto-top
+ "G" mu4e-compose-goto-bottom
+ "ZD" message-dont-send
+ "ZF" mml-attach-file
+ "ZQ" ,(function-get 'mu4e-user-agent 'abortfunc)
+ "ZZ" ,(function-get 'mu4e-user-agent 'sendfunc))
+
+ (mu4e-search-minor-mode-map
+ "J" mu4e-search-maildir)
+
+ (mu4e-thread-mode-map
+ [S-left] mu4e-thread-goto-root
+ [tab] mu4e-thread-fold-toggle
+ [C-tab] mu4e-thread-fold-toggle-goto-next
+ [backtab] mu4e-thread-fold-toggle-all)
+
+ (mu4e-view-mode-map
+ " " mu4e-view-scroll-up-or-next
+ [tab] forward-button
+ [backtab] backward-button
+ "q" mu4e-view-quit
+ "gx" mu4e-view-go-to-url
+ "gX" mu4e-view-fetch-url
+ "C" mu4e-compose-new
+ "H" mu4e-view-toggle-html
+ ;; "E" mu4e-compose-edit
+ ;; "F" mu4e-compose-forward
+ "R" mu4e-compose-reply
+ "cc" mu4e-compose-new
+ "ce" mu4e-compose-edit
+ "cf" mu4e-compose-forward
+ "cr" mu4e-compose-reply
+ "cw" mu4e-compose-wide-reply
+ "p" mu4e-view-save-attachments
+ "O" mu4e-headers-change-sorting
+ "A" mu4e-view-mime-part-action ; Since 1.6, uses gnus view by default
+ "a" mu4e-view-action
+ "J" mu4e~headers-jump-to-maildir
+ "[[" mu4e-view-headers-prev-unread
+ "]]" mu4e-view-headers-next-unread
+ "gk" mu4e-view-headers-prev-unread
+ "gj" mu4e-view-headers-next-unread
+ "\C-j" mu4e-view-headers-next
+ "\C-k" mu4e-view-headers-prev
+ "x" mu4e-view-marked-execute
+ "&" mu4e-view-mark-custom
+ "*" mu4e-view-mark-for-something ; TODO: Don't override "*".
+ "m" mu4e-view-mark-for-move
+ "r" mu4e-view-mark-for-refile
+ "D" mu4e-view-mark-for-delete
+ "d" mu4e-view-mark-for-trash
+ "=" mu4e-view-mark-for-untrash
+ "u" mu4e-view-unmark
+ "U" mu4e-view-unmark-all
+ "?" mu4e-view-mark-for-unread
+ "!" mu4e-view-mark-for-read
+ "%" mu4e-view-mark-pattern
+ "+" mu4e-view-mark-for-flag
+ "-" mu4e-view-mark-for-unflag
+ "zr" mu4e-headers-toggle-include-related
+ "zt" mu4e-headers-toggle-threading
+ "za" mu4e-view-toggle-hide-cited
+ "gl" mu4e-show-log
+ "s" mu4e-view-search-edit
+ "|" mu4e-view-pipe
+ "." mu4e-view-raw-message
+ ,(kbd "C--") mu4e-headers-split-view-shrink
+ ,(kbd "C-+") mu4e-headers-split-view-grow
+ ,@(when evil-want-C-u-scroll
+ '("\C-u" evil-scroll-up))))
+ "All evil-mu4e bindings for evil normal mode.")
+
+ (defvar evil-collection-mu4e-mode-visual-map-bindings
+ `((mu4e-headers-mode-map
+ "*" mu4e-headers-mark-for-something
+ "A" mu4e-headers-mark-for-action
+ "m" mu4e-headers-mark-for-move
+ "r" mu4e-headers-mark-for-refile
+ "D" mu4e-headers-mark-for-delete
+ "d" mu4e-headers-mark-for-trash
+ "=" mu4e-headers-mark-for-untrash
+ "u" mu4e-headers-mark-for-unmark
+ "?" mu4e-headers-mark-for-unread
+ "!" mu4e-headers-mark-for-read
+ "+" mu4e-headers-mark-for-flag
+ "-" mu4e-headers-mark-for-unflag)
+
+ (mu4e-compose-mode-map
+ "gg" mu4e-compose-goto-top
+ "G" mu4e-compose-goto-bottom))
+ "All evil-mu4e bindings for evil visual mode.")
+
+ (defun evil-collection-mu4e-set-bindings ()
+ "Set the bindings."
+ ;; WARNING: With lexical binding, lambdas from `mapc' and `dolist' become
+ ;; closures in which we must use `evil-define-key*' instead of
+ ;; `evil-define-key'.
+ (dolist (binding evil-collection-mu4e-mode-normal-map-bindings)
+ (apply #'evil-collection-define-key 'normal binding))
+ (dolist (binding evil-collection-mu4e-mode-visual-map-bindings)
+ (apply #'evil-collection-define-key 'visual binding))
+ (evil-set-command-property 'mu4e-compose-goto-bottom :keep-visual t)
+ (evil-set-command-property 'mu4e-compose-goto-top :keep-visual t)
+
+ ;; yu
+ (evil-collection-define-operator-key 'yank 'mu4e-view-mode-map
+ "u" 'mu4e-view-save-url))
+
+
+
+
+ (defun evil-collection-mu4e-setup ()
+ "Initialize evil-mu4e if necessary.
+If `mu4e-main-mode' is in `evil-state-motion-modes', initialization
+is already done earlier."
+ (evil-collection-mu4e-set-state)
+ (evil-collection-mu4e-set-bindings))
+
+ (add-hook 'mu4e-thread-mode-hook #'evil-normalize-keymaps)
+
+ (provide 'evil-collection-mu4e))
+;;; evil-collection-mu4e.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/neotree/evil-collection-neotree.el b/.config/emacs/lisp/evil-collection/modes/neotree/evil-collection-neotree.el
new file mode 100644
index 0000000..7961306
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/neotree/evil-collection-neotree.el
@@ -0,0 +1,101 @@
+;;; evil-collection-neotree.el --- Evil bindings for neotree -*- lexical-binding: t; no-byte-compile: t; -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Maximiliano Sandoval <msandova@protonmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, neotree, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `neotree'
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'neotree nil t)
+
+(declare-function neotree-make-executor "neotree.el")
+(defconst evil-collection-neotree-maps '(neotree-mode-map))
+
+;;;###autoload
+(defun evil-collection-neotree-setup ()
+ "Set up `evil' bindings for `neotree'."
+
+ (evil-set-initial-state 'neotree-mode 'normal) ;; Neotree start in normal by default.
+
+ (evil-collection-define-key 'normal 'neotree-mode-map
+
+ (kbd "RET") (neotree-make-executor
+ :file-fn 'neo-open-file
+ :dir-fn 'neo-open-dir)
+ (kbd "<tab>") (neotree-make-executor
+ :dir-fn 'neo-open-dir)
+ "z" (neotree-make-executor
+ :dir-fn 'neo-open-dir)
+ "ZZ" 'quit-window
+ "gd" (neotree-make-executor
+ :dir-fn 'neo-open-dired)
+ "gD" (neotree-make-executor
+ :dir-fn 'neo-open-dired)
+ "go" (neotree-make-executor
+ :file-fn 'neo-open-file
+ :dir-fn 'neo-open-dir)
+ "gO" 'neotree-quick-look
+ "gr" 'neotree-refresh
+ "q" 'neotree-hide
+ "H" 'neotree-hidden-file-toggle
+ "gh" 'neotree-hidden-file-toggle
+ (kbd "C-k") 'neotree-select-up-node
+ "gk" 'neotree-select-up-node
+ "[[" 'neotree-select-up-node
+ (kbd "C-j") 'neotree-select-down-node
+ "gj" 'neotree-select-down-node
+ "]]" 'neotree-select-down-node
+ "gv" 'neotree-open-file-in-system-application
+ "c" 'neotree-create-node
+ "y" 'neotree-copy-node
+ "r" 'neotree-rename-node
+ "R" 'neotree-change-root
+ "d" 'neotree-delete-node
+ "J" 'neotree-dir
+ "+" 'neotree-stretch-toggle
+ "=" 'neotree-stretch-toggle
+ "ge" 'neotree-enter
+ "j" 'neotree-next-line
+ "k" 'neotree-previous-line
+
+ ;; Unchanged keybings.
+ "a" (neotree-make-executor
+ :file-fn 'neo-open-file-ace-window)
+ "|" (neotree-make-executor
+ :file-fn 'neo-open-file-vertical-split)
+ "-" (neotree-make-executor
+ :file-fn 'neo-open-file-horizontal-split)
+ "S" 'neotree-select-previous-sibling-node
+ "s" 'neotree-select-next-sibling-node
+ (kbd "C-c C-c") 'neotree-change-root
+ (kbd "C-x 1") 'neotree-empty-fn
+ (kbd "C-x 2") 'neotree-empty-fn
+ (kbd "C-x 3") 'neotree-empty-fn
+ (kbd "C-x C-f") 'find-file-other-window
+ (kbd "C-c C-f") 'find-file-other-window))
+
+(provide 'evil-collection-neotree)
+;;; evil-collection-neotree.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/newsticker/README.org b/.config/emacs/lisp/evil-collection/modes/newsticker/README.org
new file mode 100644
index 0000000..4c73530
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/newsticker/README.org
@@ -0,0 +1,56 @@
+* newsticker
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/newsticker/index.html][newsticker]], the built-in RSS / Atom reader.
+
+** Key bindings
+
+*** newsticker-mode-map (plainview)
+
+ | Command | Original | Evil |
+ |---------------------------------------------+----------+------|
+ | =newsticker-previous-feed= | =F= | =gk= |
+ | =newsticker-next-feed= | =f= | =gj= |
+ | =newsticker-mark-item-at-point-as-read= | =o= | =r= |
+ | =newsticker-mark-item-at-point-as-immortal= | =i= | =i= |
+ | =newsticker-show-old-items= | =s O= | =o= |
+ | =newsticker-hide-old-items= | =h O= | =O= |
+ | =newsticker-buffer-force-update= | =U= | =gr= |
+ | =newsticker-get-all-news= | =G= | =gR= |
+ | =newsticker-close-buffer= | =q= | =q= |
+
+*** newsticker-treeview-mode-map
+
+ | Command | Original | Evil |
+ |-------------------------------------------------+--------------+--------------|
+ | =newsticker-treeview-prev-feed= | =F= | =[[= |
+ | =newsticker-treeview-next-feed= | =f= | =]]= |
+ | =newsticker-treeview-next-item= | =n= | =M-j= |
+ | =newsticker-treeview-prev-item= | =p= | =M-k= |
+ | =newsticker-treeview-next-new-or-immortal-item= | =N= | =gj= |
+ | =newsticker-treeview-prev-new-or-immortal-item= | =P= | =gk= |
+ | =newsticker-treeview-next-page= | =SPC= | =SPC= |
+ | =newsticker-treeview-jump= | =j= | =J= |
+ | =newsticker-treeview-mark-item-old= | =o= | =o= |
+ | =newsticker-treeview-mark-list-items-old= | =O= | =O= |
+ | =newsticker-treeview-toggle-item-immortal= | =i= | =i= |
+ | =newsticker-treeview-browse-url-item= | =b= | =b= |
+ | =newsticker-treeview-browse-url= | =v= | =B= |
+ | =newsticker-group-add-group= | =M-a= | =A= |
+ | =newsticker-group-delete-group= | =M-d= | =D= |
+ | =newsticker-group-rename-group= | =M-r= | =R= |
+ | =newsticker-treeview-save= | =s= | =S= |
+ | =newsticker-group-move-feed= | =M-m= | =M-m= |
+ | =newsticker-group-shift-feed-down= | =M-<down>= | =M-<down>= |
+ | =newsticker-group-shift-feed-up= | =M-<up>= | =M-<up>= |
+ | =newsticker-group-shift-group-down= | =M-S-<down>= | =M-S-<down>= |
+ | =newsticker-group-shift-group-up= | =M-S-<up>= | =M-S-<up>= |
+ | =newsticker-treeview-update= | =u= | =gr= |
+ | =newsticker-get-all-news= | =G= | =gR= |
+ | =newsticker-treeview-quit= | =q= | =q= |
+
+** Notes
+
+ - In the treeview list buffer, =C-m= / =C-j= are bound to
+ =newsticker-treeview-show-item= via text-property keymap, which has higher
+ precedence than the major-mode map. Use =M-j= / =M-k= for next / previous
+ item navigation.
diff --git a/.config/emacs/lisp/evil-collection/modes/newsticker/evil-collection-newsticker.el b/.config/emacs/lisp/evil-collection/modes/newsticker/evil-collection-newsticker.el
new file mode 100644
index 0000000..9397a44
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/newsticker/evil-collection-newsticker.el
@@ -0,0 +1,116 @@
+;;; evil-collection-newsticker.el --- Evil bindings for newsticker -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, newsticker, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for newsticker.
+
+;;; Code:
+(require 'evil-collection)
+(require 'newsticker)
+
+(defconst evil-collection-newsticker-maps '(newsticker-mode-map))
+
+;;;###autoload
+(defun evil-collection-newsticker-setup ()
+ "Set up `evil' bindings for `newsticker'."
+ ;; plainview
+ (evil-set-initial-state 'newsticker-mode 'normal)
+ (evil-collection-define-key 'normal 'newsticker-mode-map
+ ;; move
+ "gk" 'newsticker-previous-feed
+ "gj" 'newsticker-next-feed
+
+ ;; mark
+ "r" 'newsticker-mark-item-at-point-as-read
+ "i" 'newsticker-mark-item-at-point-as-immortal
+
+ ;; show/hide
+ "o" 'newsticker-show-old-items
+ "O" 'newsticker-hide-old-items
+
+ ;; refresh
+ "gr" 'newsticker-buffer-force-update
+ "gR" 'newsticker-get-all-news
+
+ ;; quit
+ "q" 'newsticker-close-buffer)
+
+ ;; treeview
+ (evil-set-initial-state 'newsticker-treeview-list-mode 'normal)
+ (evil-collection-define-key 'normal 'newsticker-treeview-list-mode-map
+ [down-mouse-3] 'newsticker-treeview-list-menu)
+
+ (evil-set-initial-state 'newsticker-treeview-item-mode 'normal)
+ (evil-collection-define-key 'normal 'newsticker-treeview-item-mode-map
+ [down-mouse-3] 'newsticker-treeview-item-menu)
+
+ (evil-set-initial-state 'newsticker-treeview-mode 'normal)
+ (evil-collection-define-key 'normal 'newsticker-treeview-mode-map
+ ;; move
+ "[[" 'newsticker-treeview-prev-feed
+ "]]" 'newsticker-treeview-next-feed
+ ;; The items in Newsticker List buffer has a particular keymap by text
+ ;; property, where CR (C-m) and LF (C-j) are bound to
+ ;; `newsticker-treeview-show-item'. According to the keymap precedence page,
+ ;; the text property based keymap has a higher priority.
+ ;;
+ ;; Eval (info "(elisp)Searching Keymaps") if you have interests.
+ ;;
+ ;; Use M-j/M-k instead.
+ (kbd "M-j") 'newsticker-treeview-next-item
+ (kbd "M-k") 'newsticker-treeview-prev-item
+ "gj" 'newsticker-treeview-next-new-or-immortal-item
+ "gk" 'newsticker-treeview-prev-new-or-immortal-item
+ (kbd "SPC") 'newsticker-treeview-next-page
+ "J" 'newsticker-treeview-jump
+
+ ;; mark
+ "o" 'newsticker-treeview-mark-item-old
+ "O" 'newsticker-treeview-mark-list-items-old
+ "i" 'newsticker-treeview-toggle-item-immortal
+
+ "b" 'newsticker-treeview-browse-url-item
+ "B" 'newsticker-treeview-browse-url
+
+ ;; group
+ "A" 'newsticker-group-add-group
+ "D" 'newsticker-group-delete-group
+ "R" 'newsticker-group-rename-group
+ "S" 'newsticker-treeview-save
+ (kbd "M-m") 'newsticker-group-move-feed
+ (kbd "<M-down>") 'newsticker-group-shift-feed-down
+ (kbd "<M-up>") 'newsticker-group-shift-feed-up
+ (kbd "<M-S-down>") 'newsticker-group-shift-group-down
+ (kbd "<M-S-up>") 'newsticker-group-shift-group-up
+
+ ;; refresh
+ "gr" 'newsticker-treeview-update
+ "gR" 'newsticker-get-all-news
+
+ ;; quit
+ "q" 'newsticker-treeview-quit))
+
+(provide 'evil-collection-newsticker)
+;;; evil-collection-newsticker.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/notmuch/README.org b/.config/emacs/lisp/evil-collection/modes/notmuch/README.org
new file mode 100644
index 0000000..ea5fa4e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/notmuch/README.org
@@ -0,0 +1,142 @@
+* notmuch
+
+ Evil bindings for [[https://notmuchmail.org/][notmuch]].
+
+** notmuch-common-keymap
+
+ Inherited by all notmuch buffer maps. Single-letter commands are relocated
+ under the =g= prefix.
+
+ | Command | Original | Evil |
+ |----------------------------------------+----------+-----------|
+ | =notmuch-help= | =?= | =g?= |
+ | =notmuch-bury-or-kill-this-buffer= | =q= | =q= |
+ | =notmuch-search= | =s= | =s= |
+ | =notmuch-tree= | =z= | =S= |
+ | =notmuch-mua-new-mail= | =m= | =C=, =cc= |
+ | =notmuch-refresh-this-buffer= | =g=, === | =gr= |
+ | =notmuch-refresh-all-buffers= | =M-== | =gA= |
+ | =notmuch-poll-and-refresh-this-buffer= | =G= | =gR= |
+ | =notmuch-jump-search= | =j= | =J= |
+
+** notmuch-show-mode-map
+
+ | Command | Original | Evil |
+ |---------------------------------------------------------+-----------+-------------|
+ | =notmuch-show-next-open-message= | =n= | =gj= |
+ | =notmuch-show-previous-open-message= | =p= | =gk= |
+ | =notmuch-show-next-message= | =N= | =]]=, =C-j= |
+ | =notmuch-show-previous-message= | =P= | =[[=, =C-k= |
+ | =notmuch-show-next-thread-show= | =M-n= | =M-j= |
+ | =notmuch-show-previous-thread-show= | =M-p= | =M-k= |
+ | =notmuch-show-archive-message-then-next-or-next-thread= | =a= | =a= |
+ | =notmuch-show-archive-thread-then-next= | =A= | =A= |
+ | =notmuch-show-archive-thread-then-exit= | =X= | =X= |
+ | =notmuch-show-archive-message-then-next-or-exit= | =x= | =x= |
+ | =notmuch-show-reply-sender= | =r= | =cr= |
+ | =notmuch-show-reply= | =R= | =cR= |
+ | =notmuch-show-forward-message= | =f= | =cf= |
+ | =notmuch-show-filter-thread= | =l= | =S= |
+ | =notmuch-show-save-attachments= | =w= | =p= |
+ | =notmuch-show-toggle-visibility-headers= | =h= | =H= |
+ | =notmuch-tag-jump= | =k= | =K= |
+ | =notmuch-show-tag-all= | =*= | =*= |
+ | =notmuch-show-add-tag= | =+= | =+= |
+ | =notmuch-show-remove-tag= | =-= | =-= |
+ | =notmuch-show-toggle-message= | =RET= | =RET= |
+ | =notmuch-show-toggle-thread-indentation= | =<= | =<= |
+ | =notmuch-show-next-button= | =TAB= | =TAB= |
+ | =notmuch-show-previous-button= | =backtab= | =backtab= |
+ | =notmuch-show-pipe-message= | =\vert= | =\vert= |
+ | =notmuch-show-stash-map= | =c= | =ys= |
+ | =notmuch-show-part-map= | =.= | =.= |
+ | =notmuch-tree-from-show-current-query= | =Z= | =zv= |
+ | =goto-address-at-point= | n/a | =gd= |
+ | =evil-collection-notmuch-show-toggle-delete= | n/a | =d= |
+ | =evil-collection-notmuch-show-toggle-flagged= | n/a | === |
+
+** notmuch-tree-mode-map
+
+ | Command | Original | Evil |
+ |--------------------------------------------------+----------+-----------|
+ | =notmuch-tree-next-matching-message= | =n= | =gj= |
+ | =notmuch-tree-prev-matching-message= | =p= | =gk= |
+ | =notmuch-tree-next-message= | =N= | =]]= |
+ | =notmuch-tree-prev-message= | =P= | =[[= |
+ | =notmuch-tree-next-thread= | =M-n= | =C-j= |
+ | =notmuch-tree-prev-thread= | =M-p= | =C-k= |
+ | =notmuch-tree-archive-message-then-next= | =a= | =a= |
+ | =notmuch-tree-archive-thread-then-next= | =A= | =A= |
+ | =notmuch-tree-archive-thread-then-exit= | =X= | (default) |
+ | =notmuch-tree-archive-message-then-next-or-exit= | =x= | (default) |
+ | =notmuch-show-reply-sender= | =r= | =cr= |
+ | =notmuch-show-reply= | =R= | =cR= |
+ | =notmuch-tree-filter= | =l= | (default) |
+ | =notmuch-tree-to-tree= | =z= | =s= |
+ | =notmuch-search-from-tree-current-query= | =S= | =zv= |
+ | =notmuch-show-save-attachments= | =w= | (default) |
+ | =notmuch-tag-jump= | =k= | =K= |
+ | =notmuch-tree-tag-thread= | =*= | =*= |
+ | =notmuch-tree-add-tag= | =+= | =+= |
+ | =notmuch-tree-remove-tag= | =-= | =-= |
+ | =notmuch-tree-show-message= | =RET= | =RET= |
+ | =notmuch-tree-resume-message= | =e= | =e= |
+ | =notmuch-show-pipe-message= | =\vert= | =\vert= |
+ | =evil-collection-notmuch-tree-toggle-delete= | n/a | =d= |
+ | =evil-collection-notmuch-tree-toggle-unread= | n/a | =!= |
+ | =evil-collection-notmuch-tree-toggle-flagged= | n/a | === |
+
+** notmuch-search-mode-map
+
+ | Command | Original | Evil |
+ |-------------------------------------------------+----------+------------|
+ | =notmuch-search-next-thread= | =n= | =j= (evil) |
+ | =notmuch-search-previous-thread= | =p= | =k= (evil) |
+ | =notmuch-search-archive-thread= | =a= | =a= |
+ | =notmuch-search-reply-to-thread-sender= | =r= | =cr= |
+ | =notmuch-search-reply-to-thread= | =R= | =cR= |
+ | =notmuch-search-filter= | =l= | =S= |
+ | =notmuch-search-filter-by-tag= | =t= | =t= |
+ | =notmuch-search-toggle-order= | =o= | =o= |
+ | =notmuch-tag-jump= | =k= | =K= |
+ | =notmuch-search-tag-all= | =*= | =*= |
+ | =notmuch-search-add-tag= | =+= | =+= |
+ | =notmuch-search-remove-tag= | =-= | =-= |
+ | =notmuch-search-show-thread= | =RET= | =RET= |
+ | =notmuch-tree-from-search-current-query= | =Z= | =zv= |
+ | =notmuch-bury-or-kill-this-buffer= | =x= | =q= |
+ | =notmuch-search-stash-map= | =c= | =ys= |
+ | =compose-mail= | n/a | =cc= |
+ | =compose-mail-other-frame= | n/a | =cC= |
+ | =evil-collection-notmuch-search-toggle-delete= | n/a | =d= |
+ | =evil-collection-notmuch-search-toggle-unread= | n/a | =!= |
+ | =evil-collection-notmuch-search-toggle-flagged= | n/a | === |
+
+** notmuch-hello-mode-map
+
+ | Command | Original | Evil |
+ |-------------------------------------+----------+------------------|
+ | =notmuch-version= | =v= | =g?= |
+ | =widget-forward= | =TAB= | =TAB= |
+ | =widget-backward= | =S-TAB= | =S-TAB=, =C-TAB= |
+ | =evil-collection-notmuch-hello-ret= | n/a | =RET= |
+
+** New commands
+
+ | Command | Key | |
+ |-------------------------------------------------+-------+----------------------------------------------------------------|
+ | =evil-collection-notmuch-show-toggle-delete= | =d= | toggle =evil-collection-notmuch-delete-tag= on current message |
+ | =evil-collection-notmuch-tree-toggle-delete= | =d= | tree variant |
+ | =evil-collection-notmuch-search-toggle-delete= | =d= | search variant |
+ | =evil-collection-notmuch-show-toggle-flagged= | === | toggle =flagged= tag |
+ | =evil-collection-notmuch-tree-toggle-flagged= | === | |
+ | =evil-collection-notmuch-search-toggle-flagged= | === | |
+ | =evil-collection-notmuch-tree-toggle-unread= | =!= | toggle =unread= tag |
+ | =evil-collection-notmuch-search-toggle-unread= | =!= | |
+ | =evil-collection-notmuch-hello-ret= | =RET= | activate widget or button at point |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |--------------------------------------+-------------+------------------------------------------------------------------|
+ | =evil-collection-notmuch-delete-tag= | ="deleted"= | Tag toggled by =d=. Set to ="trash"= for lieer/Gmail-style sync. |
diff --git a/.config/emacs/lisp/evil-collection/modes/notmuch/evil-collection-notmuch.el b/.config/emacs/lisp/evil-collection/modes/notmuch/evil-collection-notmuch.el
new file mode 100644
index 0000000..2256259
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/notmuch/evil-collection-notmuch.el
@@ -0,0 +1,256 @@
+;;; evil-collection-notmuch.el --- Bindings for `notmuch' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools, evil
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `notmuch'.
+
+;;; Code:
+(require 'notmuch nil t)
+(require 'evil-collection)
+
+(defcustom evil-collection-notmuch-delete-tag "deleted"
+ "Tag toggled by the delete bindings (`d') in notmuch modes.
+
+Defaults to \"deleted\" for backwards compatibility with the self-hosted
+notmuch convention where a cron job removes files matching `tag:deleted'.
+
+Set to \"trash\" when syncing with services that map a Trash tag/label
+back to the server (e.g. lieer/Gmail's TRASH label, or an IMAP setup
+that moves trashed messages out of the inbox)."
+ :type 'string
+ :group 'evil-collection-notmuch)
+
+(declare-function notmuch-show-get-tags "notmuch-show")
+(declare-function notmuch-show-tag "notmuch-show")
+(declare-function notmuch-search-get-tags "notmuch")
+(declare-function notmuch-search-tag "notmuch")
+(declare-function notmuch-tree-tag "notmuch-tree")
+
+(declare-function widget-field-at "wid-edit")
+(declare-function widget-field-activate "wid-edit")
+(declare-function widget-button-press "wid-edit")
+
+;; Since all the other maps in `evil-collection-notmuch-maps`
+;; have notmuch-common-keymap as parent
+;; https://git.notmuchmail.org/git?p=notmuch;a=blob;f=emacs/notmuch-hello.el;h=fa31694ff0f79a7f2781849394390a673f75aade;hb=HEAD#l651
+;;
+;; When `evil-collection-setup-hook` runs, if it changes keymaps
+;; using a `dolist` over `evil-collection-notmuch-maps`, then a binding might
+;; see 2 changes at once. To avoid that, notmuch-common-keymap is last
+(defconst evil-collection-notmuch-maps '(notmuch-hello-mode-map
+ notmuch-show-mode-map
+ notmuch-show-part-map
+ notmuch-tree-mode-map
+ notmuch-search-mode-map
+ notmuch-search-stash-map
+ notmuch-common-keymap))
+
+(defun evil-collection-notmuch-toggle-tag (tag mode &optional next-function)
+ "Toggle TAG tag for message in MODE."
+ (let ((get (intern (format "notmuch-%s-get-tags" mode)))
+ (set (intern (format "notmuch-%s-tag" mode)))
+ (next (or next-function (intern (format "notmuch-%s-next-message" mode)))))
+ (funcall set (list (concat (if (member tag (funcall get))
+ "-" "+")
+ tag)))
+ (funcall next)))
+
+(defun evil-collection-notmuch-show-toggle-delete ()
+ "Toggle `evil-collection-notmuch-delete-tag' for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag evil-collection-notmuch-delete-tag "show"))
+
+(defun evil-collection-notmuch-tree-toggle-delete ()
+ "Toggle `evil-collection-notmuch-delete-tag' for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag evil-collection-notmuch-delete-tag "tree"))
+
+(defun evil-collection-notmuch-search-toggle-delete ()
+ "Toggle `evil-collection-notmuch-delete-tag' for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag evil-collection-notmuch-delete-tag "search" 'notmuch-search-next-thread))
+
+(defun evil-collection-notmuch-tree-toggle-unread ()
+ "Toggle unread tag for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag "unread" "tree"))
+
+(defun evil-collection-notmuch-search-toggle-unread ()
+ "Toggle unread tag for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag "unread" "search" 'notmuch-search-next-thread))
+
+(defun evil-collection-notmuch-show-toggle-flagged ()
+ "Toggle flagged tag for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag "flagged" "show"))
+
+(defun evil-collection-notmuch-tree-toggle-flagged ()
+ "Toggle flagged tag for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag "flagged" "tree"))
+
+(defun evil-collection-notmuch-search-toggle-flagged ()
+ "Toggle flagged tag for message."
+ (interactive)
+ (evil-collection-notmuch-toggle-tag "flagged" "search" 'notmuch-search-next-thread))
+
+(defun evil-collection-notmuch-hello-ret ()
+ (interactive)
+ (if (widget-field-at (point))
+ (call-interactively #'widget-field-activate)
+ (call-interactively #'widget-button-press)))
+
+;;;###autoload
+(defun evil-collection-notmuch-setup ()
+ "Set up `evil' bindings for `notmuch'."
+ (evil-collection-inhibit-insert-state 'notmuch-show-mode-map)
+ (evil-collection-inhibit-insert-state 'notmuch-search-mode-map)
+ (evil-collection-inhibit-insert-state 'notmuch-tree-mode-map)
+
+ (evil-set-initial-state 'notmuch-show-mode 'normal)
+ (evil-set-initial-state 'notmuch-search-mode 'normal)
+ (evil-set-initial-state 'notmuch-hello-mode 'normal)
+ (evil-set-initial-state 'notmuch-tree-mode 'normal)
+
+ (evil-collection-define-key 'normal 'notmuch-common-keymap
+ "g?" 'notmuch-help
+ "q" 'notmuch-bury-or-kill-this-buffer
+ "s" 'notmuch-search
+ "S" 'notmuch-tree
+ "C" 'notmuch-mua-new-mail ; like mu4e
+ "cc" 'notmuch-mua-new-mail ; like mu4e
+ "gr" 'notmuch-refresh-this-buffer
+ "gA" 'notmuch-refresh-all-buffers
+ "gR" 'notmuch-poll-and-refresh-this-buffer
+ "J" 'notmuch-jump-search)
+
+ (evil-collection-define-key 'normal 'notmuch-hello-mode-map
+ "g?" 'notmuch-version
+ (kbd "TAB") 'widget-forward
+ (kbd "RET") 'evil-collection-notmuch-hello-ret
+ (kbd "S-TAB") 'widget-backward
+ (kbd "<C-tab>") 'widget-backward)
+
+ (evil-collection-define-key 'normal 'notmuch-show-mode-map
+ "gd" 'goto-address-at-point
+ "p" 'notmuch-show-save-attachments ; like mu4e
+ "A" 'notmuch-show-archive-thread-then-next
+ "S" 'notmuch-show-filter-thread
+ "K" 'notmuch-tag-jump
+ "C" 'notmuch-mua-new-mail ; like mu4e
+ "cc" 'notmuch-mua-new-mail ; like mu4e
+ "cR" 'notmuch-show-reply
+ "cf" 'notmuch-show-forward-message
+ "X" 'notmuch-show-archive-thread-then-exit
+ "zv" 'notmuch-tree-from-show-current-query ; like mu4e-conversation
+ "<" 'notmuch-show-toggle-thread-indentation
+ "a" 'notmuch-show-archive-message-then-next-or-next-thread
+ "d" 'evil-collection-notmuch-show-toggle-delete
+ "=" 'evil-collection-notmuch-show-toggle-flagged
+ "H" 'notmuch-show-toggle-visibility-headers
+ "gj" 'notmuch-show-next-open-message
+ "gk" 'notmuch-show-previous-open-message
+ "]]" 'notmuch-show-next-message
+ "[[" 'notmuch-show-previous-message
+ (kbd "C-j") 'notmuch-show-next-message
+ (kbd "C-k") 'notmuch-show-previous-message
+ (kbd "M-j") 'notmuch-show-next-thread-show
+ (kbd "M-k") 'notmuch-show-previous-thread-show
+ "cr" 'notmuch-show-reply-sender
+ (kbd "x") 'notmuch-show-archive-message-then-next-or-exit
+ "|" 'notmuch-show-pipe-message
+ "*" 'notmuch-show-tag-all
+ "-" 'notmuch-show-remove-tag
+ "+" 'notmuch-show-add-tag
+ (kbd "TAB") 'notmuch-show-next-button
+ (kbd "<backtab>") 'notmuch-show-previous-button
+ (kbd "RET") 'notmuch-show-toggle-message
+ "." 'notmuch-show-part-map)
+
+ (evil-collection-define-key 'normal 'notmuch-tree-mode-map
+ "g?" 'notmuch-help
+ "q" 'notmuch-tree-quit
+ "S" 'notmuch-tree-to-search
+ "C" 'notmuch-mua-new-mail ; like mu4e
+ "cc" 'notmuch-mua-new-mail ; like mu4e
+ "J" 'notmuch-jump-search
+ "zv" 'notmuch-search-from-tree-current-query ; like mu4e-conversation
+ "cr" 'notmuch-show-reply-sender ; like mu4e
+ "cR" 'notmuch-show-reply
+ "d" 'evil-collection-notmuch-tree-toggle-delete
+ "!" 'evil-collection-notmuch-tree-toggle-unread
+ "=" 'evil-collection-notmuch-tree-toggle-flagged
+ "K" 'notmuch-tag-jump
+ (kbd "RET") 'notmuch-tree-show-message
+ [mouse-1] 'notmuch-tree-show-message
+ "A" 'notmuch-tree-archive-thread-then-next
+ "a" 'notmuch-tree-archive-message-then-next
+ "s" 'notmuch-tree-to-tree
+ "gj" 'notmuch-tree-next-matching-message
+ "gk" 'notmuch-tree-prev-matching-message
+ "]]" 'notmuch-tree-next-message
+ "[[" 'notmuch-tree-prev-message
+ (kbd "C-k") 'notmuch-tree-prev-thread
+ (kbd "C-j") 'notmuch-tree-next-thread
+ "|" 'notmuch-show-pipe-message
+ "-" 'notmuch-tree-remove-tag
+ "+" 'notmuch-tree-add-tag
+ "*" 'notmuch-tree-tag-thread
+ "e" 'notmuch-tree-resume-message)
+
+ (dolist (state '(normal visual))
+ (evil-collection-define-key state 'notmuch-search-mode-map
+ "cC" 'compose-mail-other-frame
+ "J" 'notmuch-jump-search
+ "S" 'notmuch-search-filter
+ "K" 'notmuch-tag-jump
+ "o" 'notmuch-search-toggle-order
+ "zv" 'notmuch-tree-from-search-current-query
+ "*" 'notmuch-search-tag-all
+ "a" 'notmuch-search-archive-thread
+ "cc" 'compose-mail ; like mu4e
+ "d" 'evil-collection-notmuch-search-toggle-delete
+ "!" 'evil-collection-notmuch-search-toggle-unread
+ "=" 'evil-collection-notmuch-search-toggle-flagged
+ "q" 'notmuch-bury-or-kill-this-buffer
+ "cr" 'notmuch-search-reply-to-thread-sender
+ "cR" 'notmuch-search-reply-to-thread
+ "t" 'notmuch-search-filter-by-tag
+ [mouse-1] 'notmuch-search-show-thread
+ "-" 'notmuch-search-remove-tag
+ "+" 'notmuch-search-add-tag
+ (kbd "RET") 'notmuch-search-show-thread))
+
+ ;; ys
+ (evil-collection-define-operator-key 'yank 'notmuch-search-mode-map
+ "s" 'notmuch-search-stash-map)
+
+ ;; ys
+ (evil-collection-define-operator-key 'yank 'notmuch-show-mode-map
+ "s" 'notmuch-show-stash-map))
+
+(provide 'evil-collection-notmuch)
+;;; evil-collection-notmuch.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/nov/evil-collection-nov.el b/.config/emacs/lisp/evil-collection/modes/nov/evil-collection-nov.el
new file mode 100644
index 0000000..aa1d86d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/nov/evil-collection-nov.el
@@ -0,0 +1,67 @@
+;;; evil-collection-nov.el --- Bindings for `nov' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, epub
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for`nov'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'nov nil t)
+
+(defvar nov-mode-map)
+
+(defconst evil-collection-nov-maps '(nov-mode-map))
+
+;;;###autoload
+(defun evil-collection-nov-setup ()
+ "Set up `evil' bindings for `nov'."
+ (evil-collection-define-key 'normal 'nov-mode-map
+ "gr" 'nov-render-document
+ "s" 'nov-view-source
+ "S" 'nov-view-content-source
+ "g?" 'nov-display-metadata
+ "gj" 'nov-next-document
+ (kbd "C-j") 'nov-next-document
+ (kbd "M-j") 'nov-next-document
+ "]]" 'nov-next-document
+ "gk" 'nov-previous-document
+ (kbd "C-k") 'nov-previous-document
+ (kbd "M-k") 'nov-previous-document
+ "[[" 'nov-previous-document
+
+ "t" 'nov-goto-toc
+ "i" 'nov-goto-toc
+ (kbd "RET") 'nov-browse-url
+ (kbd "<follow-link>") 'mouse-face
+ (kbd "<mouse-2>") 'nov-browse-url
+ (kbd "TAB") 'shr-next-link
+ (kbd "M-TAB") 'shr-previous-link
+ (kbd "<backtab>") 'shr-previous-link
+ (kbd "SPC") 'nov-scroll-up
+ (kbd "S-SPC") 'nov-scroll-down
+ (kbd "DEL") 'nov-scroll-down))
+
+(provide 'evil-collection-nov)
+;;; evil-collection-nov.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/omnisharp/evil-collection-omnisharp.el b/.config/emacs/lisp/evil-collection/modes/omnisharp/evil-collection-omnisharp.el
new file mode 100644
index 0000000..e032782
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/omnisharp/evil-collection-omnisharp.el
@@ -0,0 +1,44 @@
+;;; evil-collection-omnisharp.el --- Evil bindings for omnisharp -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Omair Majid
+
+;; Author: Omair Majid <omajid@redhat.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, omnisharp, convenience
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Omnisharp.
+
+;;; Code:
+(require 'omnisharp nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-omnisharp-maps '(omnisharp-mode-map))
+
+;;;###autoload
+(defun evil-collection-omnisharp-setup ()
+ "Set up `evil' bindings for `omnisharp'."
+ (evil-collection-define-key '(normal visual) 'omnisharp-mode-map
+ "gd" 'omnisharp-go-to-definition
+ "gR" 'omnisharp-reload-solution
+ "K" 'omnisharp-current-type-documentation))
+
+(provide 'evil-collection-omnisharp)
+;;; evil-collection-omnisharp.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/org-agenda/evil-collection-org-agenda.el b/.config/emacs/lisp/evil-collection/modes/org-agenda/evil-collection-org-agenda.el
new file mode 100644
index 0000000..8d17f22
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/org-agenda/evil-collection-org-agenda.el
@@ -0,0 +1,147 @@
+;;; evil-collection-org-agenda.el --- Evil bindings for org-agenda -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 Ashish Panigrahi
+
+;; Author: Ashish Panigrahi <public@ashishpanigrahi.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, org, org-agenda, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil basic bindings for `org-agenda-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'org-agenda nil t)
+
+(defconst evil-collection-org-agenda-maps '(org-agenda-mode-map))
+
+(declare-function org-agenda-next-line "org-agenda")
+(declare-function org-agenda-previous-line "org-agenda")
+(declare-function org-agenda-next-item "org-agenda")
+(declare-function org-agenda-previous-item "org-agenda")
+(declare-function org-agenda-forward-block "org-agenda")
+(declare-function org-agenda-backward-block "org-agenda")
+(declare-function org-agenda-goto "org-agenda")
+(declare-function org-agenda-switch-to "org-agenda")
+(declare-function org-agenda-show "org-agenda")
+(declare-function org-agenda-quit "org-agenda")
+(declare-function org-agenda-exit "org-agenda")
+(declare-function org-agenda-redo "org-agenda")
+(declare-function org-agenda-redo-all "org-agenda")
+(declare-function org-agenda-later "org-agenda")
+(declare-function org-agenda-earlier "org-agenda")
+(declare-function org-agenda-goto-today "org-agenda")
+(declare-function org-agenda-goto-date "org-agenda")
+(declare-function org-agenda-day-view "org-agenda")
+(declare-function org-agenda-week-view "org-agenda")
+(declare-function org-agenda-month-view "org-agenda")
+(declare-function org-agenda-year-view "org-agenda")
+(declare-function org-agenda-todo "org-agenda")
+(declare-function org-agenda-schedule "org-agenda")
+(declare-function org-agenda-deadline "org-agenda")
+(declare-function org-agenda-set-tags "org-agenda")
+(declare-function org-agenda-priority "org-agenda")
+(declare-function org-agenda-refile "org-agenda")
+(declare-function org-agenda-archive "org-agenda")
+(declare-function org-agenda-kill "org-agenda")
+(declare-function org-agenda-add-note "org-agenda")
+(declare-function org-agenda-open-link "org-agenda")
+(declare-function org-agenda-filter-by-tag "org-agenda")
+(declare-function org-agenda-filter-remove-all "org-agenda")
+(declare-function org-agenda-clock-in "org-agenda")
+(declare-function org-agenda-clock-out "org-agenda")
+(declare-function org-agenda-clock-cancel "org-agenda")
+(declare-function org-agenda-clock-goto "org-agenda")
+(declare-function org-agenda-bulk-mark "org-agenda")
+(declare-function org-agenda-bulk-unmark "org-agenda")
+(declare-function org-agenda-bulk-action "org-agenda")
+(declare-function org-save-all-org-buffers "org")
+
+;;;###autoload
+(defun evil-collection-org-agenda-setup ()
+ "Set up `evil' bindings for `org-agenda'."
+ (evil-set-initial-state 'org-agenda-mode 'normal)
+ (evil-collection-set-readonly-bindings 'org-agenda-mode-map)
+
+ (evil-collection-define-key 'normal 'org-agenda-mode-map
+ ;; Motion
+ "j" 'org-agenda-next-line
+ "k" 'org-agenda-previous-line
+ "gj" 'org-agenda-next-item
+ "gk" 'org-agenda-previous-item
+ (kbd "C-j") 'org-agenda-next-item
+ (kbd "C-k") 'org-agenda-previous-item
+ "]]" 'org-agenda-forward-block
+ "[[" 'org-agenda-backward-block
+
+ ;; Open / visit
+ (kbd "RET") 'org-agenda-switch-to
+ [tab] 'org-agenda-goto
+ (kbd "TAB") 'org-agenda-goto
+ (kbd "SPC") 'org-agenda-show
+ "go" 'org-agenda-open-link
+
+ ;; Quit / refresh
+ "q" 'org-agenda-quit
+ "ZZ" 'org-agenda-quit
+ "ZQ" 'org-agenda-exit
+ "x" 'org-agenda-exit
+ "gr" 'org-agenda-redo
+ "gR" 'org-agenda-redo-all
+ "S" 'org-save-all-org-buffers
+
+ ;; Date navigation
+ "L" 'org-agenda-later
+ "H" 'org-agenda-earlier
+ "." 'org-agenda-goto-today
+ "J" 'org-agenda-goto-date
+ "vd" 'org-agenda-day-view
+ "vw" 'org-agenda-week-view
+ "vm" 'org-agenda-month-view
+ "vy" 'org-agenda-year-view
+
+ ;; Entry actions
+ "t" 'org-agenda-todo
+ "s" 'org-agenda-schedule
+ "d" 'org-agenda-deadline
+ "T" 'org-agenda-set-tags
+ "p" 'org-agenda-priority
+ "r" 'org-agenda-refile
+ "A" 'org-agenda-archive
+ "D" 'org-agenda-kill
+ "n" 'org-agenda-add-note
+
+ ;; Filtering
+ "f" 'org-agenda-filter-by-tag
+ "F" 'org-agenda-filter-remove-all
+
+ ;; Clocking
+ "I" 'org-agenda-clock-in
+ "O" 'org-agenda-clock-out
+ "X" 'org-agenda-clock-cancel
+ "gJ" 'org-agenda-clock-goto
+
+ ;; Bulk actions
+ "m" 'org-agenda-bulk-mark
+ "u" 'org-agenda-bulk-unmark
+ "B" 'org-agenda-bulk-action))
+
+(provide 'evil-collection-org-agenda)
+;;; evil-collection-org-agenda.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/org-present/evil-collection-org-present.el b/.config/emacs/lisp/evil-collection/modes/org-present/evil-collection-org-present.el
new file mode 100644
index 0000000..745db01
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/org-present/evil-collection-org-present.el
@@ -0,0 +1,65 @@
+;;; evil-collection-org-present.el --- Bindings for `org-present' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Carla Cao
+
+;; Author: Carla Cao <ccao001@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, minimalist, presentation
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for`org-present'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'org-present nil t)
+
+(defconst evil-collection-org-present-maps '(org-present-mode-keymap))
+
+;;;###autoload
+(defun evil-collection-org-present-setup ()
+ "Set up `evil' bindings for `org-present'."
+ (evil-collection-define-key 'normal 'org-present-mode-keymap
+ "J" 'org-present-next
+ "K" 'org-present-prev
+ "gj" 'org-present-next
+ "gk" 'org-present-prev
+ "]]" 'org-present-next
+ "[[" 'org-present-prev
+ (kbd "SPC") 'org-present-next
+ (kbd "S-SPC") 'org-present-prev
+ (kbd "C-j") 'org-present-next
+ (kbd "M-j") 'org-present-next
+ (kbd "C-k") 'org-present-prev
+ (kbd "M-k") 'org-present-prev
+ "zi" 'org-present-big
+ "zo" 'org-present-small
+ "+" 'org-present-big
+ "=" 'org-present-big
+ "-" 'org-present-small
+ "q" 'org-present-quit
+ "ZQ" 'org-present-quit
+ "ZZ" 'org-present-quit
+ "r" 'org-present-read-only
+ "gw" 'org-present-read-write
+ "gg" 'org-present-beginning
+ "G" 'org-present-end))
+
+(provide 'evil-collection-org-present)
+;;; evil-collection-org-present.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/org-roam/evil-collection-org-roam.el b/.config/emacs/lisp/evil-collection/modes/org-roam/evil-collection-org-roam.el
new file mode 100644
index 0000000..11acb38
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/org-roam/evil-collection-org-roam.el
@@ -0,0 +1,56 @@
+;;; evil-collection-org-roam.el --- Bindings for `org-roam' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for org-roam.
+
+;;; Code:
+(require 'evil-collection)
+(require 'org-roam nil t)
+
+(defvar org-roam-mode-map)
+(defconst evil-collection-org-roam-maps '(org-roam-grep-map
+ org-roam-mode-map
+ org-roam-node-map
+ org-roam-preview-map))
+
+(defun evil-collection-org-roam-setup ()
+ "Set up `evil' bindings for org-roam."
+ (evil-collection-define-key 'normal 'org-roam-mode-map
+ [C-return] 'org-roam-buffer-visit-thing
+ (kbd "C-m") 'org-roam-buffer-visit-thing
+ [remap revert-buffer] 'org-roam-buffer-refresh
+ "gr" 'org-roam-buffer-refresh)
+
+ (evil-collection-define-key 'normal 'org-roam-node-map
+ [remap org-roam-buffer-visit-thing] 'org-roam-node-visit)
+
+ (evil-collection-define-key 'normal 'org-roam-preview-map
+ [remap org-roam-buffer-visit-thing] 'org-roam-preview-visit)
+
+ (evil-collection-define-key 'normal 'org-roam-grep-map
+ [remap org-roam-buffer-visit-thing] 'org-roam-grep-visit))
+
+(provide 'evil-collection-org-roam)
+;;; evil-collection-org-roam.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/org/README.org b/.config/emacs/lisp/evil-collection/modes/org/README.org
new file mode 100644
index 0000000..42f9b25
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/org/README.org
@@ -0,0 +1,46 @@
+* org
+
+ Basic Evil bindings for [[https://orgmode.org/][org-mode]]. Not intended to supersede
+ [[https://github.com/Somelauw/evil-org-mode][evil-org-mode]] — only a handful of
+ overrides that align Org with Evil motion idioms.
+
+** Key bindings
+
+*** org-mode-map (normal)
+
+ | Command | Original | Evil |
+ |----------------+----------+-----------|
+ | =org-cycle= | =TAB= | =<tab>= |
+ | =org-shifttab= | =S-TAB= | =<S-tab>= |
+
+*** org-mode-map (motion)
+
+ | Command | Original | Evil |
+ |--------------------------+----------+------|
+ | =org-backward-paragraph= | n/a | ={= |
+ | =org-forward-paragraph= | n/a | =}= |
+ | =org-backward-sentence= | n/a | =(= |
+ | =org-forward-sentence= | n/a | =)= |
+
+*** org-capture-mode-map (normal)
+
+ | Command | Original | Evil |
+ |------------------------+-----------+------|
+ | =org-capture-finalize= | =C-c C-c= | =ZZ= |
+ | =org-capture-kill= | =C-c C-k= | =ZQ= |
+ | =org-capture-refile= | =C-c C-w= | =ZR= |
+
+*** org-read-date-minibuffer-local-map
+
+ Calendar navigation in the date prompt:
+
+ | Command | Key |
+ |-------------------------------+-------|
+ | =org-calendar-backward-day= | =M-h= |
+ | =org-calendar-forward-day= | =M-l= |
+ | =org-calendar-backward-week= | =M-k= |
+ | =org-calendar-forward-week= | =M-j= |
+ | =org-calendar-backward-month= | =M-H= |
+ | =org-calendar-forward-month= | =M-L= |
+ | =org-calendar-backward-year= | =M-K= |
+ | =org-calendar-forward-year= | =M-J= |
diff --git a/.config/emacs/lisp/evil-collection/modes/org/evil-collection-org.el b/.config/emacs/lisp/evil-collection/modes/org/evil-collection-org.el
new file mode 100644
index 0000000..5973bb2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/org/evil-collection-org.el
@@ -0,0 +1,87 @@
+;;; evil-collection-org.el --- Evil bindings for org -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, org, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil basic bindings for org-mode. It's NOT intended to supersede
+;; `evil-org-mode'.
+;;
+
+;;; Code:
+(require 'evil-collection)
+(require 'org nil t)
+
+
+(defconst evil-collection-org-maps '(org-mode-map
+ org-capture-mode-map
+ org-read-date-minibuffer-local-map))
+
+(declare-function org-shifttab "org")
+(declare-function org-backward-paragraph "org")
+(declare-function org-forward-paragraph "org")
+(declare-function org-backward-sentence "org")
+(declare-function org-forward-sentence "org")
+(declare-function org-capture-finalize "org-capture")
+(declare-function org-capture-kill "org-capture")
+(declare-function org-capture-refile "org-capture")
+
+(declare-function org-calendar-forward-day "org")
+(declare-function org-calendar-backward-day "org")
+(declare-function org-calendar-forward-week "org")
+(declare-function org-calendar-backward-week "org")
+(declare-function org-calendar-forward-month "org")
+(declare-function org-calendar-backward-month "org")
+(declare-function org-calendar-forward-year "org")
+(declare-function org-calendar-backward-year "org")
+(declare-function org-defkey "org")
+
+;;;###autoload
+(defun evil-collection-org-setup ()
+ "Set up `evil' bindings for `org'."
+ (evil-collection-define-key 'normal 'org-mode-map
+ [tab] 'org-cycle
+ [S-tab] 'org-shifttab)
+
+ (evil-collection-define-key 'motion 'org-mode-map
+ "{" 'org-backward-paragraph
+ "}" 'org-forward-paragraph
+ "(" 'org-backward-sentence
+ ")" 'org-forward-sentence)
+
+ (evil-collection-define-key 'normal 'org-capture-mode-map
+ "ZZ" 'org-capture-finalize
+ "ZQ" 'org-capture-kill
+ "ZR" 'org-capture-refile)
+
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-l") #'org-calendar-forward-day)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-h") #'org-calendar-backward-day)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-j") #'org-calendar-forward-week)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-k") #'org-calendar-backward-week)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-L") #'org-calendar-forward-month)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-H") #'org-calendar-backward-month)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-J") #'org-calendar-forward-year)
+ (org-defkey org-read-date-minibuffer-local-map (kbd "M-K") #'org-calendar-backward-year))
+
+(provide 'evil-collection-org)
+;;; evil-collection-org.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/osx-dictionary/evil-collection-osx-dictionary.el b/.config/emacs/lisp/evil-collection/modes/osx-dictionary/evil-collection-osx-dictionary.el
new file mode 100644
index 0000000..8c18ef2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/osx-dictionary/evil-collection-osx-dictionary.el
@@ -0,0 +1,47 @@
+;;; evil-collection-osx-dictionary.el --- Evil bindings for osx-dictionary -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, osx-dictionary, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for osx-dictionary.
+
+;;; Code:
+(require 'evil-collection)
+(require 'osx-dictionary nil t)
+
+(defconst evil-collection-osx-dictionary-maps '(osx-dictionary-mode-map))
+
+;;;###autoload
+(defun evil-collection-osx-dictionary-setup ()
+ "Set up `evil' bindings for `osx-dictionary'."
+ (evil-set-initial-state 'osx-dictionary-mode 'normal)
+
+ (evil-collection-define-key 'normal 'osx-dictionary-mode-map
+ "q" 'osx-dictionary-quit
+ "s" 'osx-dictionary-search-input
+ "o" 'osx-dictionary-open-dictionary.app
+ "r" 'osx-dictionary-read-word))
+
+(provide 'evil-collection-osx-dictionary)
+;;; evil-collection-osx-dictionary.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/outline/README.org b/.config/emacs/lisp/evil-collection/modes/outline/README.org
new file mode 100644
index 0000000..e79174b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/outline/README.org
@@ -0,0 +1,39 @@
+* outline
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html][outline-mode]].
+
+ Folding sticks to Evil's =z= namespace, augmenting the defaults =zO=, =za=,
+ =zc=, =zm=, =zo=, =zr= with outline-specific commands.
+
+** Key bindings
+
+ Bindings applied to =outline-mode-map= in normal state.
+
+ | Command | Original | Evil |
+ |------------------------------------+-----------+--------------------|
+ | =outline-hide-body= | =C-c C-t= | =zB= |
+ | =outline-hide-entry= | =C-c C-c= | =zE= |
+ | =outline-show-entry= | =C-c C-e= | =ze= |
+ | =outline-hide-leaves= | =C-c C-l= | =zl= |
+ | =outline-show-branches= | =C-c C-k= | =zK= |
+ | =outline-show-children= | =C-c TAB= | =zk= |
+ | =outline-hide-other= | =C-c C-o= | =zp= |
+ | =outline-up-heading= | =C-c C-u= | =zu= |
+ | =outline-previous-visible-heading= | =C-c C-p= | =[[= |
+ | =outline-next-visible-heading= | =C-c C-n= | =]]= |
+ | =outline-backward-same-level= | =C-c C-b= | =C-k=, =gk= |
+ | =outline-forward-same-level= | =C-c C-f= | =C-j=, =gj= |
+ | =outline-promote= | =C-c C-<= | =M-h= |
+ | =outline-demote= | =C-c C->= | =M-l= |
+ | =outline-move-subtree-up= | =C-c C-^= | =M-k= |
+ | =outline-move-subtree-down= | =C-c C-v= | =M-j= |
+ | =outline-insert-heading= | =C-c RET= | =M-<return>= |
+ | =outline-show-all= | =C-c C-a= | =<backtab>= (opt.) |
+ | =outline-toggle-children= | =C-c TAB= | =<tab>= (opt.) |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |--------------------------------------------------+---------+--------------------------------------------------------------------------------------------|
+ | =evil-collection-outline-bind-tab-p= | =nil= | Bind =<tab>= / =<backtab>= to outline cycling (off by default to avoid clashing with Org). |
+ | =evil-collection-outline-enable-in-minor-mode-p= | =t= | Inherit the same bindings in =outline-minor-mode= via auxiliary keymap parenting. |
diff --git a/.config/emacs/lisp/evil-collection/modes/outline/evil-collection-outline.el b/.config/emacs/lisp/evil-collection/modes/outline/evil-collection-outline.el
new file mode 100644
index 0000000..856387e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/outline/evil-collection-outline.el
@@ -0,0 +1,116 @@
+;;; evil-collection-outline.el --- Evil bindings for outline-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, outline, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for outline-mode.
+
+;;; Code:
+(require 'evil-collection)
+(require 'outline)
+
+(defcustom evil-collection-outline-bind-tab-p nil
+ "Enable <tab>-based bindings in Outline mode.
+
+Unless you have Evil bindings set up for Org mode, Org will
+preserve the Emacs-state <tab> keys in Org mode. Set this option
+to t if you want to inherit the <tab>-based bindings from Outline
+mode."
+ :group 'evil-collection-outline
+ :type 'boolean)
+
+(defcustom evil-collection-outline-enable-in-minor-mode-p t
+ "Enable Outline mode bindings in Outline minor mode.
+
+To override individual bindings, modify the minor mode keymap.
+For example, \"zB\" is bound to `outline-hide-body' in Outline
+mode. To turn off this specific binding in Outline minor mode,
+you can do:
+
+ (evil-define-minor-mode-key \='normal \='outline-minor-mode \"zB\" nil)"
+ :group 'evil-collection-outline
+ :type 'boolean)
+
+(defconst evil-collection-outline-maps '(outline-mode-map))
+
+;;;###autoload
+(defun evil-collection-outline-setup ()
+ "Set up `evil' bindings for `outline'."
+ (evil-set-initial-state 'outline-mode 'normal)
+ (when evil-collection-outline-bind-tab-p
+ (evil-collection-define-key 'normal 'outline-mode-map
+ (kbd "<backtab>") 'outline-show-all ; Also "z r" by default
+ (kbd "<tab>") 'outline-toggle-children)) ; Also "z a" by default
+ (evil-collection-define-key 'normal 'outline-mode-map
+ ;; folding
+ ;; Evil default keys:
+ ;; zO: Show recursively for current branch only.
+ ;; za: Toggle first level like outline-toggle-children.
+ ;; zc: Hide complete subtree.
+ ;; zm: Show only root notes.
+ ;; zo: Show current node like "za".
+ ;; zr: Show everything.
+ ;; "ze" 'outline-hide-entry
+ ;; "zE" 'outline-show-entry
+ ;; "zl" 'outline-hide-leaves
+ ;; "zb" 'outline-show-branches
+ ;; "zo" 'outline-hide-other
+ "zB" 'outline-hide-body ; Hide all bodies, Emacs has "C-c C-t".
+ "zE" 'outline-hide-entry ; Hide current body, Emacs has "C-c C-c".
+ "ze" 'outline-show-entry ; Show current body only, not subtree, reverse of outline-hide-entry, Emacs has "C-c C-e".
+ "zl" 'outline-hide-leaves ; Like `outline-hide-body' but for current subtree only, Emacs has "C-c C-l".
+ "zK" 'outline-show-branches ; Show all children recursively but no body. Emacs has "C-c C-k".
+ "zk" 'outline-show-children ; Direct children only unlike `outline-show-branches', and no content unlike `outline-show-entry' and `outline-toggle-children'. Emacs has "C-c TAB".
+ "zu" 'outline-up-heading
+
+ "zp" 'outline-hide-other ; Hide all nodes and bodies except current body. Emacs has "C-c C-o".
+ ;; outline-hide-sublevels ; q ; Is it any different from `outline-hide-body'?
+ ;; outline-hide-subtree ; Emacs has "C-c C-d", Evil has default "zc".
+ ;; outline-show-subtree ; Emacs has "C-c C-s", Evil has default "zO".
+
+ ;; TODO: To mark subtree ("C-c @"), we would need to define a tree object.
+
+ ;; motion
+ "[[" 'outline-previous-visible-heading
+ "]]" 'outline-next-visible-heading
+ (kbd "C-k") 'outline-backward-same-level
+ (kbd "C-j") 'outline-forward-same-level
+ "gk" 'outline-backward-same-level
+ "gj" 'outline-forward-same-level
+
+ (kbd "M-h") 'outline-promote ; Org-mode has "M-<left>", Evil-org has "M-h"
+ (kbd "M-j") 'outline-move-subtree-down ; Org-mode has "M-<down>", Evil-org has "M-j"
+ (kbd "M-k") 'outline-move-subtree-up ; Org-mode has "M-<up>", Evil-org has "M-k"
+ (kbd "M-l") 'outline-demote ; Org-mode has "M-<right>", Evil-org has "M-l"
+
+ (kbd "M-<return>") 'outline-insert-heading) ; Org-mode has "M-<return>"
+
+ ;; Enable bindings in Outline minor mode if requested
+ (when evil-collection-outline-enable-in-minor-mode-p
+ (let* ((minor-map (evil-get-minor-mode-keymap 'normal 'outline-minor-mode))
+ (major-map (evil-get-auxiliary-keymap outline-mode-map 'normal)))
+ (set-keymap-parent minor-map major-map))))
+
+(provide 'evil-collection-outline)
+;;; evil-collection-outline.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ovpn-mode/evil-collection-ovpn-mode.el b/.config/emacs/lisp/evil-collection/modes/ovpn-mode/evil-collection-ovpn-mode.el
new file mode 100644
index 0000000..ca6ec04
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ovpn-mode/evil-collection-ovpn-mode.el
@@ -0,0 +1,56 @@
+;;; evil-collection-ovpn-mode.el --- Bindings for `ovpn-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025 Vitor Leal
+
+;; Author: Vitor Leal <hello@vitorl.com>
+;; Maintainer: Vitor Leal <hello@vitorl.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for ovpn-mode.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ovpn-mode nil t)
+
+(defvar ovpn-mode-map)
+(defconst evil-collection-ovpn-mode-maps '(ovpn-mode-map))
+
+;;;###autoload
+(defun evil-collection-ovpn-mode-setup ()
+ "Set up `evil' bindings for `ovpn-mode'."
+ (evil-collection-define-key 'normal 'ovpn-mode-map
+ "s" 'ovpn-mode-start-vpn
+ "n" 'ovpn-mode-start-vpn-with-namespace
+ "q" 'ovpn-mode-stop-vpn
+ "r" 'ovpn-mode-restart-vpn
+ "i" 'ovpn-mode-info-vpn
+ "$" 'ovpn-mode-buffer-vpn
+ "o" 'ovpn-mode-edit-vpn
+ "~" 'ovpn-mode-dir-filter
+ "d" 'ovpn-mode-dir-set
+ "a" 'ovpn-mode-active
+ "J" 'ovpn-mode-ipv6-linux-toggle
+ "T" 'ovpn-mode-spawn-term-in-namespace
+ "B" 'ovpn-mode-spawn-browser-in-namespace
+ "ZZ" 'quit-window
+ "ZQ" 'evil-quit))
+
+(provide 'evil-collection-ovpn-mode)
+;;; evil-collection-ovpn-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/p-search/evil-collection-p-search.el b/.config/emacs/lisp/evil-collection/modes/p-search/evil-collection-p-search.el
new file mode 100644
index 0000000..346a5ed
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/p-search/evil-collection-p-search.el
@@ -0,0 +1,85 @@
+;;; evil-collection-p-search.el --- Bindings for `p-search' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "29.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for p-search.
+
+;;; Code:
+(require 'evil-collection)
+(require 'p-search nil t)
+
+(defvar p-search-mode-map)
+(defconst evil-collection-p-search-maps '(p-search-mode-map))
+
+(defvar evil-collection-p-search-mode-map (make-sparse-keymap))
+
+;; The normal `p-search-mode-map' calls (suppress-keymap map t)
+;; which makes some of the evil bindings get to to 'ignore too
+;; for some reason. Use a separate minor mode to avoid all of that.
+(define-minor-mode evil-collection-p-search-mode
+ "A minor mode to attach to `p-search' results"
+ :group 'evil-collection-p-search-mode
+ :keymap evil-collection-p-search-mode-map
+ :lighter nil)
+
+(defun evil-collection-p-search-setup ()
+ "Set up `evil' bindings for p-search."
+ (add-hook 'p-search-mode-hook 'evil-collection-p-search-mode)
+
+ (evil-collection-define-key 'normal 'evil-collection-p-search-mode-map
+ "a" 'p-search-add-dwim
+ "E" 'p-search-edit-dwim
+ "C" 'p-search-add-candidate-generator
+ "gr" 'p-search-refresh-buffer
+ "gR" 'p-search-hard-refresh-buffer
+ ;; (keymap-set map "i" #'p-search-importance)
+ "x" 'p-search-kill-entity-at-point
+ "gj" 'p-search-next-item
+ (kbd "C-j") 'p-search-next-item
+ "]]" 'p-search-next-item
+ "o" 'p-search-observe
+ "gk" 'p-search-prev-item
+ (kbd "C-k") 'p-search-prev-item
+ "[[" 'p-search-prev-item
+ ;; (keymap-set map "r" #'p-search-reinstantiate-prior)
+ "P" 'p-search-add-prior
+ "+" 'p-search-increase-preview-size
+ "-" 'p-search-decrease-preview-size
+ (kbd "<tab>") 'p-search-toggle-section
+ (kbd "<return>") 'p-search-find-document
+ "gv" 'p-search-view-document
+ "go" 'p-search-view-document
+ (kbd "C-o") 'p-search-display-document
+ "gO" 'p-search-display-document
+ "q" 'p-search-quit
+ ;; (keymap-set map "C-o" #'p-search-display-file)
+ ;; (keymap-set map "1" #'p-search-show-level-1)
+ ;; (keymap-set map "2" #'p-search-show-level-2)
+ ;; (keymap-set map "3" #'p-search-show-level-3)
+ "Jg" 'p-search-jump-candidate-generators
+ "Jp" 'p-search-jump-priors
+ "Jr" 'p-search-jump-results))
+
+(provide 'evil-collection-p-search)
+;;; evil-collection-p-search.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/p4/evil-collection-p4.el b/.config/emacs/lisp/evil-collection/modes/p4/evil-collection-p4.el
new file mode 100644
index 0000000..69d7892
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/p4/evil-collection-p4.el
@@ -0,0 +1,123 @@
+;;; evil-collection-p4.el --- Evil bindings for P4 -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, p4, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for P4.
+
+;;; Code:
+(require 'p4 nil t)
+(require 'evil-collection)
+
+(defvar p4-basic-mode-map)
+(defvar p4-basic-list-mode-map)
+(defvar p4-opened-list-mode-map)
+(defvar p4-status-list-mode-map)
+(defvar p4-filelog-mode-map)
+(defvar p4-diff-mode-map)
+(defvar p4-annotate-mode-map)
+
+(defconst evil-collection-p4-maps '(p4-basic-mode-map
+ p4-basic-list-mode-map
+ p4-opened-list-mode-map
+ p4-status-list-mode-map
+ p4-filelog-mode-map
+ p4-diff-mode-map
+ p4-annotate-mode-map))
+
+;;;###autoload
+(defun evil-collection-p4-setup ()
+ "Set up `evil' bindings for `p4'."
+ (evil-set-initial-state 'p4-basic-mode 'normal)
+ (evil-set-initial-state 'p4-basic-list-mode 'normal)
+ (evil-set-initial-state 'p4-opened-list-mode-map 'normal)
+ (evil-set-initial-state 'p4-status-list-mode-map 'normal)
+ (evil-set-initial-state 'p4-filelog-mode-map 'normal)
+ (evil-set-initial-state 'p4-diff-mode-map 'normal)
+ (evil-set-initial-state 'p4-annotate-mode-map 'normal)
+
+ (evil-collection-define-key 'normal 'p4-basic-mode-map
+ [mouse-1] 'p4-buffer-mouse-clicked
+ "k" 'evil-previous-line
+ "j" 'evil-next-line
+ (kbd "C-j") 'p4-forward-active-link
+ (kbd "C-k") 'p4-backward-active-link
+ (kbd "RET") 'p4-buffer-commands
+ "q" 'quit-window
+ "gr" 'revert-buffer
+ "]]" 'p4-scroll-down-1-window
+ "[[" 'p4-scroll-up-1-window
+ "gg" 'p4-top-of-buffer
+ "G" 'p4-bottom-of-buffer
+ "=" 'delete-other-windows)
+
+ (evil-collection-define-key 'normal 'p4-basic-list-mode-map
+ (kbd "RET") 'p4-basic-list-activate)
+
+ (evil-collection-define-key 'normal 'p4-opened-list-mode-map
+ "R" 'p4-revert
+ "T" 'p4-opened-list-type
+ "C" 'p4-opened-list-change)
+
+ (evil-collection-define-key 'normal 'p4-status-list-mode-map
+ (kbd "RET") 'p4-status-list-activate)
+
+ (evil-collection-define-key 'normal 'p4-filelog-mode-map
+ "d" 'p4-diff2
+ "gf" 'p4-find-file-other-window
+ "S" 'p4-filelog-short-format
+ "L" 'p4-filelog-long-format
+ " " 'p4-scroll-up-1-window
+ "gg" 'p4-top-of-buffer
+ "G" 'p4-bottom-of-buffer
+ "=" 'p4-delete-other-windows
+ "]]" 'p4-goto-next-change
+ "[[" 'p4-goto-prev-change
+ (kbd "C-j") 'p4-goto-next-change
+ (kbd "C-k") 'p4-goto-prev-change)
+
+ (evil-collection-define-key 'normal 'p4-diff-mode-map
+ "]]" 'diff-hunk-next
+ (kbd "C-j") 'diff-hunk-next
+ (kbd "M-j") 'diff-file-next
+ "[[" 'diff-hunk-prev
+ (kbd "C-k") 'diff-hunk-prev
+ (kbd "M-k") 'diff-file-prev
+ "\t" 'diff-hunk-next
+ [backtab] 'diff-hunk-prev
+ "}" 'diff-file-next
+ "{" 'diff-file-prev
+ "\C-m" 'p4-buffer-commands
+ [mouse-2] 'p4-buffer-commands
+ "gb" 'p4-buffer-commands)
+
+ (evil-collection-define-key 'normal 'p4-annotate-mode-map
+ "]]" 'p4-next-change-rev-line
+ "[[" 'p4-prev-change-rev-line
+ (kbd "C-j") 'p4-next-change-rev-line
+ (kbd "C-k") 'p4-prev-change-rev-line
+ "L" 'p4-toggle-line-wrap))
+
+(provide 'evil-collection-p4)
+;;; evil-collection-p4.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/package-menu/README.org b/.config/emacs/lisp/evil-collection/modes/package-menu/README.org
new file mode 100644
index 0000000..c001fc5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/package-menu/README.org
@@ -0,0 +1,22 @@
+* package-menu
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Package-Menu.html][package-menu-mode]].
+
+ Standard read-only motion bindings are installed via
+ =evil-collection-set-readonly-bindings=.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------------+----------+------|
+ | =package-menu-mark-install= | =i= | =i= |
+ | =package-menu-mark-upgrades= | =U= | =U= |
+ | =package-menu-mark-delete= | =d= | =d= |
+ | =package-menu-mark-unmark= | =u= | =u= |
+ | =package-menu-execute= | =x= | =x= |
+ | =package-menu-describe-package= | =RET= | =g?= |
+ | =revert-buffer= | =g=, =r= | =gr= |
+ | =package-browse-url= (Emacs 28+) | =w= | =B= |
+
+ The =/=-prefixed filter commands, =H= (hide), =(= (toggle-hiding), =~=, =b=
+ (report-bug), =S= (sort), and other defaults remain at their upstream keys.
diff --git a/.config/emacs/lisp/evil-collection/modes/package-menu/evil-collection-package-menu.el b/.config/emacs/lisp/evil-collection/modes/package-menu/evil-collection-package-menu.el
new file mode 100644
index 0000000..40a8f38
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/package-menu/evil-collection-package-menu.el
@@ -0,0 +1,60 @@
+;;; evil-collection-package-menu.el --- Evil bindings for package-menu -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, package-menu, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil integration for `package-menu-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'package)
+
+(defconst evil-collection-package-menu-maps '(package-menu-mode-map))
+
+;;;###autoload
+(defun evil-collection-package-menu-setup ()
+ "Set up `evil' bindings for `package-menu'."
+ (evil-set-initial-state 'package-menu-mode 'normal)
+ (evil-collection-set-readonly-bindings 'package-menu-mode-map)
+ (evil-collection-define-key 'normal 'package-menu-mode-map
+ "i" 'package-menu-mark-install
+ "U" 'package-menu-mark-upgrades
+ "d" 'package-menu-mark-delete
+ "gr" 'revert-buffer
+
+ ;; undo
+ "u" 'package-menu-mark-unmark
+
+ ;; execute
+ "x" 'package-menu-execute
+
+ "g?" 'package-menu-describe-package)
+
+ ;; It's introduced since Emacs 28.
+ (when (fboundp 'package-browse-url)
+ (evil-collection-define-key 'normal 'package-menu-mode-map
+ "B" 'package-browse-url)))
+
+(provide 'evil-collection-package-menu)
+;;; evil-collection-package-menu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/pass/evil-collection-pass.el b/.config/emacs/lisp/evil-collection/modes/pass/evil-collection-pass.el
new file mode 100644
index 0000000..02457d3
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/pass/evil-collection-pass.el
@@ -0,0 +1,102 @@
+;;; evil-collection-pass.el --- Evil bindings for pass-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, pass, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `pass-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'pass nil t)
+
+(defvar pass-mode-map)
+
+(declare-function pass--display-keybinding "pass")
+
+(defconst evil-collection-pass-maps '(pass-mode-map))
+
+(defvar evil-collection-pass-command-to-label
+ '((pass-copy-field . "yf")
+ (pass-copy-username . "yn")
+ (pass-copy-url . "yu"))
+ "Alist holding labels to be used in `pass' header.")
+
+(defun evil-collection-pass-display-keybinding (f &rest args)
+ "A version of `pass--display-keybinding' that handles displaying
+keybindings listed in `evil-collection-pass-command-to-label'."
+ (if (alist-get (car args) evil-collection-pass-command-to-label)
+ (insert
+ (format
+ "%8s %-13s \t "
+ (format "%s"
+ (propertize
+ (format
+ "<%s>"
+ (alist-get (car args)
+ evil-collection-pass-command-to-label))
+ 'face 'font-lock-constant-face))
+ (cadr args)))
+ (apply f args)))
+
+;;;###autoload
+(defun evil-collection-pass-setup ()
+ "Set up `evil' bindings for `pass-mode'."
+
+ (advice-add 'pass--display-keybinding
+ :around 'evil-collection-pass-display-keybinding)
+
+ (evil-collection-define-operator-key 'yank 'pass-mode-map
+ "f" 'pass-copy-field
+ "n" 'pass-copy-username
+ "u" 'pass-copy-url)
+
+ ;; https://github.com/NicolasPetton/pass/pull/47
+ (when (fboundp 'pass-edit)
+ (evil-collection-define-key 'normal 'pass-mode-map
+ "E" 'pass-edit))
+
+ (evil-collection-define-key 'normal 'pass-mode-map
+ "gj" 'pass-next-entry
+ "gk" 'pass-prev-entry
+ (kbd "C-j") 'pass-next-entry
+ (kbd "C-k") 'pass-prev-entry
+ (kbd "]]") 'pass-next-directory
+ (kbd "[[") 'pass-prev-directory
+ "d" 'pass-kill
+ "x" 'pass-kill
+ "s" 'isearch-forward
+ "J" 'pass-goto-entry
+ "g?" 'describe-mode
+ "gr" 'pass-update-buffer
+ "i" 'pass-insert
+ "I" 'pass-insert-generated
+ "Y" 'pass-copy
+ "r" 'pass-rename
+ "R" 'pass-rename
+ "o" 'pass-otp-options
+ (kbd "RET") 'pass-view
+ "q" 'pass-quit))
+
+(provide 'evil-collection-pass)
+;;; evil-collection-pass.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/pdf/evil-collection-pdf.el b/.config/emacs/lisp/evil-collection/modes/pdf/evil-collection-pdf.el
new file mode 100644
index 0000000..8555e43
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/pdf/evil-collection-pdf.el
@@ -0,0 +1,320 @@
+;;; evil-collection-pdf.el --- Evil bindings for pdf-tools -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2024 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, pdf, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for pdf-tools.
+
+;;; Code:
+(require 'evil-collection)
+(require 'pdf-tools nil t)
+(require 'pdf-view nil t)
+(require 'pdf-history nil t)
+
+(defconst evil-collection-pdf-maps '(pdf-view-mode-map
+ pdf-history-minor-mode-map
+ pdf-outline-buffer-mode-map
+ pdf-occur-buffer-mode-map))
+
+(declare-function pdf-view-last-page "pdf-view")
+(declare-function pdf-view-first-page "pdf-view")
+(declare-function pdf-view-goto-page "pdf-view")
+(declare-function pdf-view-previous-line-or-previous-page "pdf-view")
+(declare-function pdf-view-next-line-or-next-page "pdf-view")
+(declare-function pdf-view-assert-active-region "pdf-view")
+(declare-function pdf-view-active-region-text "pdf-view")
+(declare-function pdf-view-deactivate-region "pdf-view")
+(declare-function pdf-history-forward "pdf-history")
+(declare-function pdf-history-backward "pdf-history")
+
+(defvar pdf-view-mode-map)
+(defvar pdf-history-minor-mode-map)
+(defvar pdf-outline-buffer-mode-map)
+(defvar pdf-occur-buffer-mode-map)
+
+(defun evil-collection-pdf-view-goto-page (&optional page)
+ "`evil' wrapper around `pdf-view-last-page'."
+ (interactive "P")
+ (if page
+ (pdf-view-goto-page page)
+ (let ((hscroll (window-hscroll)))
+ (pdf-view-last-page)
+ (image-eob)
+ (image-set-window-hscroll hscroll))))
+
+(defun evil-collection-pdf-view-goto-first-page (&optional page)
+ "`evil' wrapper around `pdf-view-first-page'."
+ (interactive "P")
+ (if page
+ (pdf-view-goto-page page)
+ (let ((hscroll (window-hscroll)))
+ (pdf-view-first-page)
+ (image-bob)
+ (image-set-window-hscroll hscroll))))
+
+(defun evil-collection-pdf-jump-forward (&optional count)
+ "Wrap `pdf-history-forward' with `evil'.
+
+Consider COUNT."
+ (interactive "P")
+ (pdf-history-forward (or count 1)))
+
+(defun evil-collection-pdf-jump-backward (&optional count)
+ "Wrap `pdf-history-backward' with `evil'.
+
+Consider COUNT."
+ (interactive "P")
+ (pdf-history-backward (or count 1)))
+
+(defun evil-collection-pdf-yank ()
+ "Save the text of the active region into the currently selected register."
+ (interactive)
+ (pdf-view-assert-active-region)
+ (let ((txt (pdf-view-active-region-text))
+ (reg evil-this-register))
+ (pdf-view-deactivate-region)
+ (evil-set-register
+ (or reg ?\")
+ (mapconcat #'identity txt nil))))
+
+(defun evil-collection-pdf-disable-visual-mode ()
+ "Don't enter visual-mode when the mark is activated.
+Rationale: pdf-view allows using the region to select text within the pdf,
+but evil-mode does not know how to do this. It selects entire pdf images
+instead, which is useless and counterintuitive."
+ (add-hook 'evil-local-mode-hook
+ (lambda () (remove-hook
+ 'activate-mark-hook
+ 'evil-visual-activate-hook
+ t))
+ nil t))
+
+;;;###autoload
+(defun evil-collection-pdf-setup ()
+ "Set up `evil' bindings for `pdf-view'."
+ (evil-collection-inhibit-insert-state 'pdf-view-mode-map)
+ (evil-set-initial-state 'pdf-view-mode 'normal)
+ (evil-collection-define-key 'normal 'pdf-view-mode-map
+ ;; motion
+ (kbd "RET") 'image-next-line
+ "j" 'pdf-view-next-line-or-next-page
+ "k" 'pdf-view-previous-line-or-previous-page
+ (kbd "SPC") 'pdf-view-scroll-up-or-next-page
+ (kbd "S-SPC") 'pdf-view-scroll-down-or-previous-page
+ (kbd "<delete>") 'pdf-view-scroll-down-or-previous-page
+ (kbd "C-f") 'pdf-view-scroll-up-or-next-page
+ (kbd "C-b") 'pdf-view-scroll-down-or-previous-page
+ "]]" 'pdf-view-next-page-command
+ "[[" 'pdf-view-previous-page-command
+ (kbd "C-j") 'pdf-view-next-page-command
+ (kbd "C-k") 'pdf-view-previous-page-command
+ "gj" 'pdf-view-next-page-command
+ "gk" 'pdf-view-previous-page-command
+ (kbd "<next>") 'forward-page
+ (kbd "<prior>") 'backward-page
+ (kbd "<down>") 'pdf-view-next-line-or-next-page
+ (kbd "<up>") 'pdf-view-previous-line-or-previous-page
+ "gg" 'evil-collection-pdf-view-goto-first-page
+ "G" 'evil-collection-pdf-view-goto-page
+
+ ;; mark
+ "'" 'pdf-view-jump-to-register
+ "m" 'pdf-view-position-to-register
+
+ ;; zoom
+ "+" 'pdf-view-enlarge
+ "zi" 'pdf-view-enlarge
+ "=" 'pdf-view-enlarge
+ "-" 'pdf-view-shrink
+ "zo" 'pdf-view-shrink
+ "0" 'pdf-view-scale-reset
+ "z0" 'pdf-view-scale-reset
+
+ "f" 'pdf-links-isearch-link
+ "F" 'pdf-links-action-perform
+ "h" 'image-backward-hscroll
+ "^" 'image-bol
+ "$" 'image-eol
+ "l" 'image-forward-hscroll
+
+ "H" 'pdf-view-fit-height-to-window ; evil-image has "H"
+ "P" 'pdf-view-fit-page-to-window
+ "W" 'pdf-view-fit-width-to-window ; evil-image has "W"
+
+ ;; refresh
+ "gr" 'revert-buffer
+
+ (kbd "<C-down-mouse-1>") 'pdf-view-mouse-extend-region
+ (kbd "<M-down-mouse-1>") 'pdf-view-mouse-set-region-rectangle
+ (kbd "<down-mouse-1>") 'pdf-view-mouse-set-region
+
+ (kbd "C-c C-c") 'doc-view-mode
+ (kbd "C-c <tab>") 'pdf-view-extract-region-image
+
+ "sb" 'pdf-view-set-slice-from-bounding-box
+ "sm" 'pdf-view-set-slice-using-mouse
+ "sr" 'pdf-view-reset-slice
+
+ ;; goto
+ "gl" 'pdf-view-goto-label
+
+ ;; search
+ (kbd "M-s o") 'pdf-occur ; TODO: More Evil bindings?
+
+ "/" 'isearch-forward
+ "?" 'isearch-backward
+ "n" 'isearch-repeat-forward
+ "N" 'isearch-repeat-backward
+
+ "zd" 'pdf-view-dark-minor-mode
+ "zm" 'pdf-view-midnight-minor-mode
+ "zp" 'pdf-view-printer-minor-mode
+
+ "o" 'pdf-outline
+
+ ;; quit
+ "q" 'quit-window
+ "Q" 'kill-current-buffer
+ "ZQ" 'kill-current-buffer
+ "ZZ" 'quit-window)
+
+
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'normal 'pdf-view-mode-map
+ (kbd "C-d") 'pdf-view-scroll-up-or-next-page))
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'normal 'pdf-view-mode-map
+ (kbd "C-u") 'pdf-view-scroll-down-or-previous-page))
+
+ (add-hook 'pdf-view-mode-hook #'evil-collection-pdf-disable-visual-mode)
+
+ (evil-collection-define-key 'normal 'pdf-view-mode-map
+ "y" 'evil-collection-pdf-yank)
+
+ (evil-collection-inhibit-insert-state 'pdf-history-minor-mode-map)
+ (evil-set-initial-state 'pdf-history-minor-mode 'normal)
+ (evil-collection-define-key 'normal 'pdf-history-minor-mode-map
+ ;; history forward / backward
+ (kbd "C-i") 'evil-collection-pdf-jump-forward
+ (kbd "C-o") 'evil-collection-pdf-jump-backward)
+
+ (evil-collection-inhibit-insert-state 'pdf-outline-buffer-mode-map)
+ (evil-set-initial-state 'pdf-outline-buffer-mode 'normal)
+ (evil-collection-define-key 'normal 'pdf-outline-buffer-mode-map
+ ;; open
+ (kbd "RET") 'pdf-outline-follow-link-and-quit
+ (kbd "S-<return>") 'pdf-outline-follow-link
+ (kbd "M-<return>") 'pdf-outline-display-link
+ "go" 'pdf-outline-follow-link
+ "." 'pdf-outline-move-to-current-page
+ (kbd "SPC") 'pdf-outline-select-pdf-window
+
+ "G" 'pdf-outline-end-of-buffer
+ "^" 'pdf-outline-up-heading
+ "<" 'pdf-outline-up-heading ; TODO: Don't set this by default?
+
+ "zf" 'pdf-outline-follow-mode ; Helm has "C-c C-f" in Emacs state.
+
+ (kbd "<tab>") 'outline-toggle-children
+ (kbd "<backtab>") 'pdf-outline-toggle-subtree
+
+ ;; quit
+ (kbd "C-w q") 'pdf-outline-quit-and-kill ; TODO: Do we need to set this? I think not.
+ "q" 'quit-window
+ "ZQ" 'quit-window
+ "ZZ" 'pdf-outline-quit-and-kill)
+
+ (evil-collection-inhibit-insert-state 'pdf-occur-buffer-mode-map)
+ (evil-set-initial-state 'pdf-occur-buffer-mode 'normal)
+ (evil-collection-define-key 'normal 'pdf-occur-buffer-mode-map
+ ;; open
+ (kbd "RET") 'pdf-occur-goto-occurrence
+ (kbd "S-<return>") 'pdf-occur-view-occurrence
+ (kbd "SPC") 'pdf-occur-view-occurrence
+ "gd" 'pdf-occur-goto-occurrence
+ "gD" 'pdf-occur-view-occurrence
+
+ "A" 'pdf-occur-tablist-gather-documents
+ "D" 'pdf-occur-tablist-do-delete
+
+ ;; sort
+ "o" 'tabulated-list-sort
+ "O" 'tablist-sort ; TODO: Do we need this?
+
+ ;; refresh
+ "G" 'tablist-revert
+
+ "K" 'pdf-occur-abort-search
+
+ ;; mark
+ "*m" 'tablist-mark-forward
+ "m" 'tablist-mark-forward
+ "~" 'tablist-toggle-marks
+ "u" 'tablist-unmark-forward
+ "U" 'tablist-unmark-all-marks
+ "*!" 'tablist-unmark-all-marks
+ "*c" 'tablist-change-marks
+ "*n" 'tablist-mark-items-numeric
+ "*r" 'tablist-mark-items-regexp
+ "%" 'tablist-mark-items-regexp
+
+ "a" 'tablist-flag-forward
+
+ ;; "f" 'tablist-find-entry ; TODO: Equivalent to 'pdf-occur-goto-occurrence?
+ "r" 'pdf-occur-revert-buffer-with-args
+ "d" 'tablist-do-kill-lines
+ "x" 'pdf-occur-tablist-do-flagged-delete
+ (kbd "<delete>") 'tablist-unmark-backward
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<backtab>") 'tablist-backward-column
+ (kbd "C-c C-e") 'tablist-export-csv
+
+ [remap evil-first-non-blank] 'tablist-move-to-major-column
+ [remap evil-next-line] 'tablist-next-line
+ [remap evil-previous-line] 'tablist-previous-line
+
+ ;; filter
+ ;; TODO: See if overriding "/" is a good idea.
+ "/!" 'tablist-negate-filter
+ "//" 'tablist-display-filter
+ "/=" 'tablist-push-equal-filter
+ "/C" 'tablist-clear-filter
+ "/D" 'tablist-delete-named-filter
+ "/a" 'tablist-push-named-filter
+ "/d" 'tablist-deconstruct-named-filter
+ "/e" 'tablist-edit-filter
+ "/n" 'tablist-push-numeric-filter
+ "/p" 'tablist-pop-filter
+ "/r" 'tablist-push-regexp-filter
+ "/s" 'tablist-name-current-filter
+ "/t" 'tablist-toggle-first-filter-logic
+ "/z" 'tablist-suspend-filter
+
+ ;; quit
+ "q" 'tablist-quit
+ "ZQ" 'tablist-quit
+ "ZZ" 'tablist-quit))
+
+(provide 'evil-collection-pdf)
+;;; evil-collection-pdf.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/popup/README.org b/.config/emacs/lisp/evil-collection/modes/popup/README.org
new file mode 100644
index 0000000..4409b19
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/popup/README.org
@@ -0,0 +1,12 @@
+* popup
+
+ Evil bindings for [[https://github.com/auto-complete/popup-el][popup.el]] menus.
+
+** Key bindings
+
+*** popup-menu-keymap
+
+ | Command | Original | Evil |
+ |------------------+----------+-------|
+ | =popup-next= | =C-n= | =C-j= |
+ | =popup-previous= | =C-p= | =C-k= |
diff --git a/.config/emacs/lisp/evil-collection/modes/popup/evil-collection-popup.el b/.config/emacs/lisp/evil-collection/modes/popup/evil-collection-popup.el
new file mode 100644
index 0000000..67ea70a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/popup/evil-collection-popup.el
@@ -0,0 +1,44 @@
+;;; evil-collection-popup.el --- Bindings for `popup' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `popup'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'popup nil t)
+
+(defconst evil-collection-popup-maps '(popup-menu-keymap))
+
+;;;###autoload
+(defun evil-collection-popup-setup ()
+ "Set up `evil' bindings for `popup'."
+ (defvar popup-menu-keymap)
+ (evil-collection-define-key nil 'popup-menu-keymap
+ (kbd "C-j") 'popup-next
+ (kbd "C-k") 'popup-previous))
+
+(provide 'evil-collection-popup)
+;;; evil-collection-popup.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/proced/README.org b/.config/emacs/lisp/evil-collection/modes/proced/README.org
new file mode 100644
index 0000000..5789230
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/proced/README.org
@@ -0,0 +1,33 @@
+* proced
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Processes.html][proced]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------------------+----------+----------|
+ | =proced-refine= | =RET= | =RET= |
+ | =proced-mark= | =m=, =d= | =m= |
+ | =proced-mark-all= | =M= | =*=, =M= |
+ | =proced-unmark-all= | =U= | =U= |
+ | =proced-toggle-marks= | =t= | =~= |
+ | =proced-mark-children= | =C= | =c=, =C= |
+ | =proced-mark-parents= | =P= | =p=, =P= |
+ | =proced-unmark-backward= | =DEL= | =DEL= |
+ | =evil-scroll-down= | n/a | =SPC= |
+ | =evil-scroll-up= | n/a | =S-SPC= |
+ | =proced-toggle-tree= | =T= | =zt= |
+ | =proced-undo= | n/a | =u= |
+ | =proced-omit-processes= | =o= | =O= |
+ | =proced-send-signal= | =k=, =x= | =x= |
+ | =proced-filter-interactive= | =f= | =s= |
+ | =proced-format-interactive= | =F= | =S= |
+ | =proced-sort-start= | =s s= | =oo= |
+ | =proced-sort-interactive= | =s S= | =oO= |
+ | =proced-sort-pcpu= | =s c= | =oc= |
+ | =proced-sort-pmem= | =s m= | =om= |
+ | =proced-sort-pid= | =s p= | =op= |
+ | =proced-sort-time= | =s t= | =ot= |
+ | =proced-sort-user= | =s u= | =ou= |
+ | =proced-renice= | =r= | =r= |
+ | =revert-buffer= | n/a | =gr= |
diff --git a/.config/emacs/lisp/evil-collection/modes/proced/evil-collection-proced.el b/.config/emacs/lisp/evil-collection/modes/proced/evil-collection-proced.el
new file mode 100644
index 0000000..8723cd8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/proced/evil-collection-proced.el
@@ -0,0 +1,88 @@
+;;; evil-collection-proced.el --- Evil bindings for proced -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, proced, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for proced.
+
+;;; Code:
+(require 'evil-collection)
+(require 'proced)
+
+(defconst evil-collection-proced-maps '(proced-mode-map))
+
+;;;###autoload
+(defun evil-collection-proced-setup ()
+ "Set up `evil' bindings for `proced'."
+ (evil-collection-set-readonly-bindings 'proced-mode-map)
+ (evil-set-initial-state 'proced-mode 'normal)
+ (evil-collection-define-key 'normal 'proced-mode-map
+ (kbd "RET") 'proced-refine
+
+ ;; mark
+ ;; TODO: Implement a proced-toggle-mark?
+ "m" 'proced-mark ; Mentioned in documentation, should be followed.
+ "*" 'proced-mark-all
+ "M" 'proced-mark-all
+ "U" 'proced-unmark-all
+ "~" 'proced-toggle-marks
+ "c" 'proced-mark-children
+ "C" 'proced-mark-children ; Emacs has "C"
+ "p" 'proced-mark-parents
+ "P" 'proced-mark-parents ; Emacs has "P"
+ (kbd "<delete>") 'proced-unmark-backward
+
+ ;; motion
+ ;; TODO: Implement beginning-of-buffer / end-of-buffer.
+ (kbd "SPC") 'evil-scroll-down
+ (kbd "S-SPC") 'evil-scroll-up
+
+ "zt" 'proced-toggle-tree
+
+ "u" 'proced-undo
+
+ "O" 'proced-omit-processes ; TODO: Change default binding?
+
+ "x" 'proced-send-signal ; Emacs has "k" and "x", "k" is mentioned in documentation
+
+ ;; filter
+ "s" 'proced-filter-interactive ; Refers to "[s]elect", Emacs has "f" mentioned in documentation.
+ "S" 'proced-format-interactive
+
+ ;; sort
+ "oo" 'proced-sort-start ; Refers to "[o]rder", Emacs has "s" mentioned in documentation.
+ "oO" 'proced-sort-interactive
+ "oc" 'proced-sort-pcpu
+ "om" 'proced-sort-pmem
+ "op" 'proced-sort-pid
+ "ot" 'proced-sort-time
+ "ou" 'proced-sort-user
+
+ "r" 'proced-renice
+
+ ;; refresh
+ "gr" 'revert-buffer))
+
+(provide 'evil-collection-proced)
+;;; evil-collection-proced.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/process-menu/README.org b/.config/emacs/lisp/evil-collection/modes/process-menu/README.org
new file mode 100644
index 0000000..c82676c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/process-menu/README.org
@@ -0,0 +1,18 @@
+* process-menu
+
+ Evil bindings for =process-menu-mode= (=M-x list-processes=).
+
+ Read-only motion / quit bindings come from
+ =evil-collection-set-readonly-bindings= and are not repeated below.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------------+----------+---------|
+ | =process-menu-delete-process= | =d= | =D= |
+ | =tabulated-list-sort= | =S= | =S= |
+ | =forward-button= | n/a | =TAB= |
+ | =backward-button= | n/a | =S-TAB= |
+ | =evil-scroll-down= | n/a | =SPC= |
+ | =evil-scroll-up= | n/a | =S-SPC= |
+ | =revert-buffer= | n/a | =gr= |
diff --git a/.config/emacs/lisp/evil-collection/modes/process-menu/evil-collection-process-menu.el b/.config/emacs/lisp/evil-collection/modes/process-menu/evil-collection-process-menu.el
new file mode 100644
index 0000000..af5ce21
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/process-menu/evil-collection-process-menu.el
@@ -0,0 +1,54 @@
+;;; evil-collection-process-menu.el --- Evil bindings for process-menu-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, process, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for process-menu-mode (M-x list-processes).
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-process-menu-maps '(process-menu-mode-map))
+
+;;;###autoload
+(defun evil-collection-process-menu-setup ()
+ "Set up `evil' bindings for `list-processes'."
+ (evil-collection-set-readonly-bindings 'process-menu-mode-map)
+ (evil-collection-define-key 'normal 'process-menu-mode-map
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+
+ "S" 'tabulated-list-sort
+ "D" 'process-menu-delete-process
+
+ ;; motion
+ ;; TODO: Implement beginning-of-buffer / end-of-buffer.
+ (kbd "SPC") 'evil-scroll-down
+ (kbd "S-SPC") 'evil-scroll-up
+
+ ;; refresh
+ "gr" 'revert-buffer))
+
+(provide 'evil-collection-process-menu)
+;;; evil-collection-process-menu.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/prodigy/evil-collection-prodigy.el b/.config/emacs/lisp/evil-collection/modes/prodigy/evil-collection-prodigy.el
new file mode 100644
index 0000000..18f28f9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/prodigy/evil-collection-prodigy.el
@@ -0,0 +1,86 @@
+;;; evil-collection-prodigy.el --- Evil bindings for prodigy -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, prodigy, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `prodigy'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'prodigy nil t)
+
+(defconst evil-collection-prodigy-maps '(prodigy-mode-map
+ prodigy-view-mode-map))
+
+;;;###autoload
+(defun evil-collection-prodigy-setup ()
+ "Set up `evil' bindings for `prodigy'."
+ (evil-collection-define-key 'normal 'prodigy-mode-map
+ ;; quit
+ "q" 'quit-window
+
+ "j" 'prodigy-next
+ "k" 'prodigy-prev
+ "gg" 'prodigy-first
+ "G" 'prodigy-last
+
+ ;; mark
+ "m" 'prodigy-mark
+ "*t" 'prodigy-mark-tag
+ "M" 'prodigy-mark-all
+ "u" 'prodigy-unmark
+ "*T" 'prodigy-unmark-tag
+ "U" 'prodigy-unmark-all
+
+ "s" 'prodigy-start
+ "S" 'prodigy-stop
+
+ ;; refresh
+ "gr" 'prodigy-restart
+
+ "`" 'prodigy-display-process
+ (kbd "RET") 'prodigy-browse
+ "it" 'prodigy-add-tag-filter
+ "in" 'prodigy-add-name-filter
+ "I" 'prodigy-clear-filters
+ "Jm" 'prodigy-jump-magit
+ "Jd" 'prodigy-jump-file-manager
+
+ "gj" 'prodigy-next-with-status
+ "gk" 'prodigy-prev-with-status
+ (kbd "C-j") 'prodigy-next-with-status
+ (kbd "C-k") 'prodigy-prev-with-status
+ (kbd "Y") 'prodigy-copy-cmd)
+
+ (evil-collection-define-key 'normal 'prodigy-view-mode-map
+ "s" 'prodigy-start
+ "S" 'prodigy-stop
+ "gr" 'prodigy-restart
+ "r" 'prodigy-restart
+ "c" 'prodigy-view-clear-buffer
+ (kbd "C-l") 'prodigy-view-clear-buffer
+ "x" 'prodigy-view-clear-buffer))
+
+(provide 'evil-collection-prodigy)
+;;; evil-collection-prodigy.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/profiler/README.org b/.config/emacs/lisp/evil-collection/modes/profiler/README.org
new file mode 100644
index 0000000..79bd707
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/profiler/README.org
@@ -0,0 +1,25 @@
+* profiler
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Profiling.html][profiler]].
+
+** Key bindings
+
+ Bindings added to =profiler-report-mode-map= in normal state.
+
+ | Command | Original | Evil |
+ |--------------------------------------------+------------+---------------------|
+ | =profiler-report-next-entry= | =n= | =j= |
+ | =profiler-report-previous-entry= | =p= | =k= |
+ | =profiler-report-toggle-entry= | =RET=, =i= | =TAB= |
+ | =profiler-report-find-entry= | =f=, =j= | =RET= |
+ | =profiler-report-describe-entry= | =d= | =i= |
+ | =profiler-report-render-calltree= | =C= | =c= |
+ | =profiler-report-render-reversed-calltree= | =B= | =C= |
+ | =profiler-report-ascending-sort= | =A= | =o= |
+ | =profiler-report-descending-sort= | =D= | =O= |
+ | =profiler-report-compare-profile= | === | === |
+ | =scroll-up-command= | n/a | =SPC= |
+ | =scroll-down-command= | n/a | =S-SPC=, =<delete>= |
+ | =revert-buffer= | n/a | =gr= |
+ | =quit-window= | n/a | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/profiler/evil-collection-profiler.el b/.config/emacs/lisp/evil-collection/modes/profiler/evil-collection-profiler.el
new file mode 100644
index 0000000..ce0c6ff
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/profiler/evil-collection-profiler.el
@@ -0,0 +1,71 @@
+;;; evil-collection-profiler.el --- Evil bindings for profiler -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, profiler, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `profiler'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'profiler)
+
+(defconst evil-collection-profiler-maps '(profiler-report-mode-map))
+
+;;;###autoload
+(defun evil-collection-profiler-setup ()
+ "Set up `evil' bindings for `profiler'."
+ (evil-set-initial-state 'profiler-report-mode 'normal)
+
+ (evil-collection-define-key 'normal 'profiler-report-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<delete>") 'scroll-down-command
+ "j" 'profiler-report-next-entry
+ "k" 'profiler-report-previous-entry
+
+ (kbd "<tab>") 'profiler-report-toggle-entry
+
+ ;; sort
+ "o" 'profiler-report-ascending-sort
+ "O" 'profiler-report-descending-sort
+
+ "c" 'profiler-report-render-calltree
+ "C" 'profiler-report-render-reversed-calltree
+ "i" 'profiler-report-describe-entry
+ "=" 'profiler-report-compare-profile
+
+ ;; open
+ (kbd "RET") 'profiler-report-find-entry
+
+ ;; refresh
+ "gr" 'revert-buffer
+
+ ;; quit
+ "q" 'quit-window
+ "ZQ" 'evil-quit
+ "ZZ" 'quit-windw))
+
+(provide 'evil-collection-profiler)
+;;; evil-collection-profiler.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/python/README.org b/.config/emacs/lisp/evil-collection/modes/python/README.org
new file mode 100644
index 0000000..1daae7e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/python/README.org
@@ -0,0 +1,17 @@
+* python
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Python.html][python-mode]].
+
+** Key bindings
+
+ Applied to =python-mode-map=, =python-ts-mode-map=, and
+ =python-base-mode-map= in normal state.
+
+ | Command | Original | Evil |
+ |--------------------------------+-----------+------|
+ | =python-shell-switch-to-shell= | =C-c C-z= | =gz= |
+
+** Notes
+
+ - =evil-shift-width= is set to =python-indent-offset= on
+ =python-mode-hook= and =python-ts-mode-hook=.
diff --git a/.config/emacs/lisp/evil-collection/modes/python/evil-collection-python.el b/.config/emacs/lisp/evil-collection/modes/python/evil-collection-python.el
new file mode 100644
index 0000000..c71395e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/python/evil-collection-python.el
@@ -0,0 +1,52 @@
+;;; evil-collection-python.el --- Bindings for `python' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `python'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'python)
+
+(defconst evil-collection-python-maps '(python-mode-map
+ python-ts-mode-map
+ python-base-mode-map))
+
+(defun evil-collection-python-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `python-indent-offset'."
+ (setq-local evil-shift-width python-indent-offset))
+
+;;;###autoload
+(defun evil-collection-python-setup ()
+ "Set up `evil' bindings for `python'."
+ (dolist (hook '(python-mode-hook python-ts-mode-hook))
+ (add-hook hook #'evil-collection-python-set-evil-shift-width))
+
+ (dolist (kmap evil-collection-python-maps)
+ (evil-collection-define-key 'normal kmap
+ "gz" 'python-shell-switch-to-shell)))
+
+(provide 'evil-collection-python)
+;;; evil-collection-python.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/quickrun/evil-collection-quickrun.el b/.config/emacs/lisp/evil-collection/modes/quickrun/evil-collection-quickrun.el
new file mode 100644
index 0000000..af27992
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/quickrun/evil-collection-quickrun.el
@@ -0,0 +1,42 @@
+;;; evil-collection-quickrun.el --- Bindings for `quickrun' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, quickrun
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `quickrun'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'quickrun nil t)
+
+(defconst evil-collection-quickrun-maps '(quickrun--mode-map))
+
+;;;###autoload
+(defun evil-collection-quickrun-setup ()
+ "Set up `evil' bindings for `quickrun'.."
+ (evil-collection-define-key 'normal 'quickrun--mode-map
+ "q" 'quit-window))
+
+(provide 'evil-collection-quickrun)
+;;; evil-collection-quickrun.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/racer/evil-collection-racer.el b/.config/emacs/lisp/evil-collection/modes/racer/evil-collection-racer.el
new file mode 100644
index 0000000..7283669
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/racer/evil-collection-racer.el
@@ -0,0 +1,48 @@
+;;; evil-collection-racer.el --- Bindings for `racer' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, rust, tools, evil
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `racer'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'racer nil t)
+
+(defconst evil-collection-racer-maps '(racer-mode-map
+ racer-help-mode-map))
+
+;;;###autoload
+(defun evil-collection-racer-setup ()
+ "Set up `evil' bindings for `racer'."
+ (evil-collection-define-key 'normal 'racer-mode-map
+ "gd" 'racer-find-definition
+ (kbd "C-t") 'pop-tag-mark
+ "K" 'racer-describe)
+
+ (evil-collection-define-key 'normal 'racer-help-mode-map
+ "q" 'quit-window))
+
+(provide 'evil-collection-racer)
+;;; evil-collection-racer.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/racket-describe/evil-collection-racket-describe.el b/.config/emacs/lisp/evil-collection/modes/racket-describe/evil-collection-racket-describe.el
new file mode 100644
index 0000000..a7d24e1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/racket-describe/evil-collection-racket-describe.el
@@ -0,0 +1,45 @@
+;;; evil-collection-racket-describe.el --- Bindings for `racket-describe' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Andre Goderich
+
+;; Author: Andre Goderich <yuhsien77@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `racket-describe'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'racket-describe nil t)
+
+(defconst evil-collection-racket-describe-maps '(racket-describe-mode-map))
+
+;;;###autoload
+(defun evil-collection-racket-describe-setup ()
+ "Set up `evil' bindings for `racket-describe'."
+ (evil-collection-inhibit-insert-state 'racket-describe-mode-map)
+ (evil-set-initial-state 'racket-describe-mode 'normal)
+ (evil-collection-define-key 'normal 'racket-describe-mode-map
+ "q" 'quit-window
+ "g?" 'describe-mode))
+
+(provide 'evil-collection-racket-describe)
+;;; evil-collection-racket-describe.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/reader/evil-collection-reader.el b/.config/emacs/lisp/evil-collection/modes/reader/evil-collection-reader.el
new file mode 100644
index 0000000..3fc3187
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/reader/evil-collection-reader.el
@@ -0,0 +1,162 @@
+;;; evil-collection-reader.el --- Evil bindings for `reader' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025 Icy-Thought
+
+;; Author: Icy-Thought
+;; Maintainer: Icy-Thought <icy-thought@pm.me>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, reader
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Emacs `reader'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'reader nil t)
+
+(declare-function reader-first-page "reader")
+(declare-function reader-last-page "reader")
+(declare-function reader-goto-page "reader")
+(declare-function reader-close-doc "reader")
+(declare-function reader-outline-show "reader")
+(declare-function reader-presentation-mode "reader")
+(declare-function reader-rotate-counter-clockwise "reader")
+(declare-function reader-rotate-clockwise "reader")
+(declare-function reader-fit-to-width "reader")
+(declare-function reader-fit-to-height "reader")
+(declare-function reader-mwheel-shrink-size "reader")
+(declare-function reader-shrink-size "reader")
+(declare-function reader-mwheel-enlarge-size "reader")
+(declare-function reader-enlarge-size "reader")
+(declare-function reader-scroll-left-most "reader")
+(declare-function reader-scroll-right-most "reader")
+(declare-function reader-scroll-left "reader")
+(declare-function reader-scroll-right "reader")
+(declare-function reader-scroll-up-or-prev-page "reader")
+(declare-function reader-scroll-down-or-next-page "reader")
+(declare-function reader-scroll-down-screen "reader")
+(declare-function reader-scroll-up-screen "reader")
+(declare-function reader-mwheel-scroll-right "reader")
+(declare-function reader-mwheel-scroll-left "reader")
+(declare-function reader-mwheel-scroll-down "reader")
+(declare-function reader-mwheel-scroll-up "reader")
+(declare-function reader-scroll-down-or-next-page "reader")
+(declare-function reader-scroll-up-or-prev-page "reader")
+(declare-function reader-previous-page "reader")
+(declare-function reader-next-page "reader")
+
+(declare-function reader-outline-visit-page "reader")
+(declare-function reader-outline-select-doc-window "reader")
+
+(defvar reader-mode-map)
+(defvar reader-outline-mode-map)
+
+(defun evil-collection-reader-goto-first-page (&optional page)
+ "Navigates to `page' X or jump to the FIRST PAGE of the document."
+ (interactive "P")
+ (if page
+ (reader-goto-page page)
+ (reader-first-page)))
+
+(defun evil-collection-reader-goto-page (&optional page)
+ "Navigates to `page' X or jump to the LAST PAGE of the document.
+`evil' wrapper around `reader-last-page'."
+ (interactive "P")
+ (if page
+ (reader-goto-page page)
+ (reader-last-page)))
+
+(defconst evil-collection-reader-maps
+ '(reader-mode-map reader-outline-mode-map))
+
+;;;###autoload
+(defun evil-collection-reader-setup ()
+ "Set up `evil' bindings for `reader'."
+ (evil-collection-set-readonly-bindings 'reader-mode-map)
+
+ ;; Refresh reader-mode bindings
+ (add-hook 'reader-mode-hook #'evil-normalize-keymaps)
+ (add-hook 'reader-outline-mode-hook #'evil-normalize-keymaps)
+
+ (evil-collection-define-key 'normal 'reader-mode-map
+ "n" #'reader-next-page
+ "p" #'reader-previous-page
+ "k" #'reader-scroll-up-or-prev-page
+ "j" #'reader-scroll-down-or-next-page
+ [remap next] #'reader-scroll-down-or-next-page
+ [remap previous] #'reader-scroll-up-or-prev-page
+ [remap evil-next-line] #'reader-scroll-down-or-next-page
+ [remap evil-previous-line] #'reader-scroll-up-or-prev-page
+
+ "<wheel-up>" #'reader-mwheel-scroll-up
+ "<wheel-down>" #'reader-mwheel-scroll-down
+ "S-<wheel-up>" #'reader-mwheel-scroll-left
+ "S-<wheel-down>" #'reader-mwheel-scroll-right
+
+ "C-b" #'reader-scroll-up-screen
+ "C-f" #'reader-scroll-down-screen
+ [remap scroll-down-command] #'reader-scroll-up-screen
+ [remap scroll-up-command] #'reader-scroll-down-screen
+
+ "SPC" #'reader-scroll-down-or-next-page
+ "DEL" #'reader-scroll-up-or-prev-page
+ "S-SPC" #'reader-scroll-up-or-prev-page
+
+ "l" #'reader-scroll-right
+ "h" #'reader-scroll-left
+ [remap forward-char] #'reader-scroll-right
+ [remap backward-char] #'reader-scroll-left
+
+ "$" #'reader-scroll-right-most
+ "^" #'reader-scroll-left-most
+ [remap move-end-of-line] #'reader-scroll-right-most
+ [remap move-beginning-of-line] #'reader-scroll-left-most
+
+ "gg" #'evil-collection-reader-goto-first-page
+ "G" #'evil-collection-reader-goto-page
+ [remap beginning-of-buffer] #'reader-first-page
+ [remap end-of-buffer] #'reader-last-page
+ [remap goto-line] #'reader-goto-page
+
+ ;; "0" #'evil-collections-reader-reset-zoom
+ "=" #'reader-enlarge-size
+ "+" #'reader-enlarge-size
+ "C-<wheel-up>" #'reader-mwheel-enlarge-size
+ "-" #'reader-shrink-size
+ "C-<wheel-down>" #'reader-mwheel-shrink-size
+
+ "H" #'reader-fit-to-height
+ "W" #'reader-fit-to-width
+
+ "r" #'reader-rotate-clockwise
+ "R" #'reader-rotate-counter-clockwise
+
+ "<f5>" #'reader-presentation-mode
+ "o" #'reader-outline-show
+ "Q" #'reader-close-doc)
+
+ (evil-collection-define-key 'normal 'reader-outline-mode-map
+ "p" #'previous-line
+ "n" #'next-line
+ "o" #'reader-outline-select-doc-window
+ "q" #'quit-window
+ "RET" #'reader-outline-visit-page
+ "M-RET" #'reader-outline-visit-page))
+
+(provide 'evil-collection-reader)
+;;; evil-collection-reader.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/realgud/evil-collection-realgud.el b/.config/emacs/lisp/evil-collection/modes/realgud/evil-collection-realgud.el
new file mode 100644
index 0000000..a8462ae
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/realgud/evil-collection-realgud.el
@@ -0,0 +1,103 @@
+;;; evil-collection-realgud.el --- Bindings for `realgud' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, realgud
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `realgud'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'realgud nil t)
+
+(defconst evil-collection-realgud-maps '(realgud:shortkey-mode-map))
+
+;;;###autoload
+(defun evil-collection-realgud-setup ()
+ "Set up `evil' bindings for `realgud'."
+ ;; This one is to represent `realgud-populate-src-buffer-map-plain'.
+ (evil-collection-define-key 'normal 'realgud:shortkey-mode-map
+ "b" 'realgud:cmd-break
+ "D" 'realgud:cmd-delete
+ "X" 'realgud:cmd-clear
+ "-" 'realgud:cmd-disable
+ "+" 'realgud:cmd-enable
+ "T" 'realgud:cmd-backtrace
+ "f" 'realgud:cmd-finish
+ "n" 'realgud:cmd-next
+ "q" 'realgud:cmd-quit
+ "Q" 'realgud:cmd-kill
+ "r" 'realgud:cmd-restart
+ "R" 'realgud:cmd-restart
+ "s" 'realgud:cmd-step
+ "i" 'realgud:cmd-step
+ "!" 'realgud:cmd-shell
+
+ ;; (evil-collection-define-key nil map [M-down] 'realgud-track-hist-newer)
+ ;; (evil-collection-define-key nil map [M-kp-2] 'realgud-track-hist-newer)
+ ;; (evil-collection-define-key nil map [M-up] 'realgud-track-hist-older)
+ ;; (evil-collection-define-key nil map [M-kp-8] 'realgud-track-hist-older)
+ ;; (evil-collection-define-key nil map [M-kp-up] 'realgud-track-hist-older)
+ ;; (evil-collection-define-key nil map [M-kp-down] 'realgud-track-hist-newer)
+ ;; (evil-collection-define-key nil map [M-print] 'realgud-track-hist-older)
+ ;; (evil-collection-define-key nil map [M-S-down] 'realgud-track-hist-newest)
+ ;; (evil-collection-define-key nil map [M-S-up] 'realgud-track-hist-oldest)
+ )
+
+ (evil-collection-define-key 'normal 'realgud:shortkey-mode-map
+ (kbd "C-x C-q") 'realgud-short-key-mode
+ "1" 'realgud-goto-arrow1
+ "2" 'realgud-goto-arrow2
+ "3" 'realgud-goto-arrow3
+ "4" 'realgud:goto-loc-hist-4
+ "5" 'realgud:goto-loc-hist-5
+ "6" 'realgud:goto-loc-hist-6
+ "7" 'realgud:goto-loc-hist-7
+ "8" 'realgud:goto-loc-hist-8
+ "9" 'realgud:goto-loc-hist-9
+ "b" 'realgud:cmd-break
+ "J" 'realgud:cmd-jump
+ "c" 'realgud:cmd-continue
+ "e" 'realgud:cmd-eval-dwim
+ "E" 'realgud:cmd-eval-at-point
+ "U" 'realgud:cmd-until
+ "H" 'realgud:cmd-until-here
+ [mouse-2] 'realgud:tooltip-eval
+ [left-fringe mouse-1] 'realgud-cmds--mouse-add-remove-bp
+ [left-margin mouse-1] 'realgud-cmds--mouse-add-remove-bp
+ ">" 'realgud:cmd-newer-frame
+ "<" 'realgud:cmd-older-frame
+ "d" 'realgud:cmd-newer-frame
+ "u" 'realgud:cmd-older-frame
+ "gR" 'realgud-recenter-arrow ;; FIXME: Hmnn!
+ "C" 'realgud-window-cmd-undisturb-src
+ "g?" 'realgud:cmdbuf-info-describe
+ "S" 'realgud-window-src-undisturb-cmd
+ "R" 'realgud:cmd-restart
+ "gr" 'realgud:cmd-restart
+ "!" 'realgud:cmd-shell)
+
+ (add-hook 'realgud-short-key-mode-hook #'evil-normalize-keymaps))
+
+(provide 'evil-collection-realgud)
+;;; evil-collection-realgud.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/reftex/README.org b/.config/emacs/lisp/evil-collection/modes/reftex/README.org
new file mode 100644
index 0000000..d6f1d49
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/reftex/README.org
@@ -0,0 +1,75 @@
+* reftex
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/reftex/index.html][reftex-mode]].
+
+** Key bindings
+
+*** reftex-select-shared-map
+
+ Used by =reftex-select-label-mode= and =reftex-select-bib-mode= (initial
+ state: normal).
+
+ | Command | Original | Evil |
+ |------------------------------------------+----------+-------------------|
+ | =reftex-select-next= | =n= | =j= |
+ | =reftex-select-previous= | =p= | =k= |
+ | =reftex-select-next-heading= | n/a | =]]=, =gj=, =C-j= |
+ | =reftex-select-previous-heading= | n/a | =[[=, =gk=, =C-k= |
+ | =reftex-select-accept= | =RET= | =RET= |
+ | =reftex-select-callback= | =SPC= | =go= |
+ | =reftex-select-show-insertion-point= | =.= | =gO= |
+ | =reftex-select-read-label= | n/a | =TAB= |
+ | =reftex-select-quit= | =q= | =q=, =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+ | =reftex-select-help= | =?= | =g?= |
+ | =reftex-select-jump= | n/a | =J= |
+ | =reftex-select-cycle-ref-style-forward= | n/a | =r= |
+ | =reftex-select-cycle-ref-style-backward= | n/a | =R= |
+ | =reftex-select-mark= | n/a | =m= |
+ | =reftex-select-unmark= | n/a | =u= |
+
+ The keys =gr=, =c=, =s=, =x=, =X=, =S=, =o=, =O= dispatch back to
+ reftex's underlying =throw= protocol so the original selection actions
+ (rescan, reuse, switch label type, ref grouping, external xr, BibTeX
+ export) still work.
+
+*** reftex-toc-mode-map
+
+ Initial state: normal.
+
+ | Command | Original | Evil |
+ |-----------------------------------+-----------+------------|
+ | =reftex-toc-next= | =n= | =j= |
+ | =reftex-toc-previous= | =p= | =k= |
+ | =reftex-toc-view-line= | =SPC= | =go=, =gO= |
+ | =reftex-toc-goto-line-and-hide= | =RET= | =RET= |
+ | =reftex-toc-goto-line= | =TAB= | =TAB= |
+ | =reftex-toc-show-help= | =?= | =g?=, =?= |
+ | =reftex-toc-quit= | =q= | =q= |
+ | =reftex-toc-quit-and-kill= | =k= | =ZZ= |
+ | =evil-quit= | n/a | =ZQ= |
+ | =reftex-toc-rescan= | =r= | =gr= |
+ | =reftex-toc-Rescan= | =R= | =gR= |
+ | =reftex-toc-toggle-labels= | =l= | =l= |
+ | =reftex-toc-toggle-index= | =i= | =i= |
+ | =reftex-toc-toggle-context= | =c= | =c= |
+ | =reftex-toc-toggle-file-boundary= | =F= | =F= |
+ | =reftex-toc-rename-label= | =M-%= | =rl= |
+ | =reftex-toc-display-index= | =C-c >= | =zi= |
+ | =reftex-toc-external= | =x= | =x= |
+ | =reftex-toc-show-calling-point= | =.= | =.= |
+ | =reftex-toc-jump= | =z= | =J= |
+ | =reftex-toc-previous-heading= | =C-c C-p= | =[[= |
+ | =reftex-toc-next-heading= | =C-c C-n= | =]]= |
+ | =reftex-toc-promote= | =<= | =>= |
+ | =reftex-toc-demote= | =>= | =<= |
+ | =reftex-toc-toggle-follow= | =f= | =f= |
+
+ Note: =>= and =<= are swapped relative to upstream so that =>= promotes
+ and =<= demotes; this matches the visual outline-shift direction.
+
+** Notes
+
+ - =reftex-select-label-prompt=, =reftex-citation-prompt=,
+ =reftex-select-label-help=, =reftex-citation-help=, and
+ =reftex-toc-help= are rewritten to advertise the evil keys.
diff --git a/.config/emacs/lisp/evil-collection/modes/reftex/evil-collection-reftex.el b/.config/emacs/lisp/evil-collection/modes/reftex/evil-collection-reftex.el
new file mode 100644
index 0000000..274753f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/reftex/evil-collection-reftex.el
@@ -0,0 +1,174 @@
+;;; evil-collection-reftex.el --- Bindings for `reftex' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Maximiliano Sandoval <msandova@protonmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, reftex, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `reftex-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'reftex-ref nil t)
+(require 'reftex-ref nil t)
+(require 'reftex-cite nil t)
+(require 'reftex-toc nil t)
+
+(defconst evil-collection-reftex-maps '(reftex-select-shared-map
+ reftex-toc-mode-map))
+
+;; original code can be found in reftex-ref.el
+(setq reftex-select-label-prompt
+ "Select: [RET]select [j]next [k]previous [gr]escan [go]context [q]uit [g?]help")
+
+;; original code can be found in reftex-cite.el
+(setq reftex-citation-prompt
+ "Select: [RET]select [j]next [k]previous [q]uit [g?]help")
+
+;; original at reftex-ref.el
+(setq reftex-select-label-help
+ " j / k Go to next/previous label (Cursor motion works as well)
+ [ / ] Go to previous/next section heading.
+ c Reuse last referenced label.
+ J Jump to a specific section, e.g. '3 J' jumps to section 3.
+ s Switch label type.
+ gr Reparse document.
+ go / gO Show context / Show insertion point.
+ S Switch to label menu of external document (with LaTeX package `xr').
+ r / R Toggle \\ref <-> \\vref / Rotate \\ref <=> \\fref <=> \\Fref.
+ TAB Enter a label with completion.
+ m / M Mark/unmark entry.
+ x / X Put all marked entries into one/many \\ref commands.
+ q / RET Quit without referencing / Accept current label.")
+
+;; code can be found in reftex-cite.el
+(setq reftex-citation-help
+ " j / k Go to next/previous entry (Cursor motion works as well).
+ go / gO Show citation / Show insertion point.
+ q Quit without inserting \\cite macro into buffer.
+ TAB Enter citation key with completion.
+ RET Accept current entry and create \\cite macro.
+ m / M Mark/Unmark the entry.
+ o / O Create BibTeX file with all marked / unmarked entries.
+ X / X Put all (marked) entries into one/many \\cite commands.")
+
+(setq reftex-toc-help
+ " AVAILABLE KEYS IN TOC BUFFER
+ ============================
+ j / k next-line / previous-line
+ go Show the corresponding location of the LaTeX document.
+ TAB Goto the location and keep the TOC window.
+ RET Goto the location and hide the TOC window (also on mouse-2).
+ < / > Promote / Demote section, or all sections in region.
+ zi Display Index. With prefix arg, restrict index to current section.
+ q / ZZ Hide/Kill *toc* buffer, return to position of reftex-toc command.
+ l i c F Toggle display of [l]abels, [i]ndex, [c]ontext, [F]ile borders.
+ f Toggle follow mode
+ gr / gR Reparse the LaTeX document / Reparse entire LaTeX document.
+ . In other window, show position from where `reftex-toc' was called.
+ rl Global search and replace to rename label at point.
+ x Switch to TOC of external document (with LaTeX package `xr').
+ J Jump to a specific section (e.g. '3 J' goes to section 3).")
+
+;;;###autoload
+(defun evil-collection-reftex-setup ()
+ "Set up `evil' bindings for `reftex'."
+
+ (evil-set-initial-state 'reftex-select-label-mode 'normal)
+ (evil-set-initial-state 'reftex-select-bib-mode 'normal)
+
+ (evil-collection-define-key 'normal 'reftex-select-shared-map
+ "j" 'reftex-select-next
+ "k" 'reftex-select-previous
+ (kbd "]]") 'reftex-select-next-heading
+ (kbd "[[") 'reftex-select-previous-heading
+ (kbd "gj") 'reftex-select-next-heading
+ (kbd "gk") 'reftex-select-previous-heading
+ (kbd "C-j") 'reftex-select-next-heading
+ (kbd "C-k") 'reftex-select-previous-heading
+ (kbd "RET") 'reftex-select-accept
+ "go" 'reftex-select-callback ;shows the point where the label is
+ "gr" (lambda nil "Press `?' during selection to find out
+ about this key" (interactive) (throw (quote myexit) 114)) ;reftex binds keys in a very arcane way using the number asigned by describe-char, in this case the value of "g" is 114
+ "q" 'reftex-select-quit
+ "ZZ" 'reftex-select-quit
+ "ZQ" 'evil-quit
+ "g?" 'reftex-select-help
+ "c" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 108))
+ "J" 'reftex-select-jump ;; weird binding, using default
+ (kbd "<tab>") 'reftex-select-read-label
+ "s" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 115))
+ "x" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 97))
+ "X" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 65))
+ "S" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 120))
+ "r" 'reftex-select-cycle-ref-style-forward
+ "R" 'reftex-select-cycle-ref-style-backward
+ "gO" 'reftex-select-show-insertion-point
+ "o" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 101))
+ "O" (lambda nil "Press `?' during selection to find out
+ about this key." (interactive) (throw (quote myexit) 69))
+
+ ;; mark
+ "m" 'reftex-select-mark ; TODO: Need a mark toggle function.
+ "u" 'reftex-select-unmark)
+
+ (evil-set-initial-state 'reftex-toc-mode 'normal)
+
+ ;; This one is more involved, in reftex-toc.el, line 267 it shows the prompt
+ ;; string with the keybinds and I don't see any way of changing it to show evil-like binds.
+ (evil-collection-define-key 'normal 'reftex-toc-mode-map
+ "j" 'reftex-toc-next
+ "k" 'reftex-toc-previous
+ "go" 'reftex-toc-view-line
+ "gO" 'reftex-toc-view-line
+ (kbd "RET") 'reftex-toc-goto-line-and-hide
+ (kbd "<tab>") 'reftex-toc-goto-line
+ "g?" 'reftex-toc-show-help
+ "?" 'reftex-toc-show-help
+ "q" 'reftex-toc-quit
+ "ZZ" 'reftex-toc-quit-and-kill
+ "ZQ" 'evil-quit
+ "gr" 'reftex-toc-rescan
+ "gR" 'reftex-toc-Rescan
+ "l" 'reftex-toc-toggle-labels
+ "i" 'reftex-toc-toggle-index
+ "c" 'reftex-toc-toggle-context
+ "F" 'reftex-toc-toggle-file-boundary
+ "rl" 'reftex-toc-rename-label
+ "zi" 'reftex-toc-display-index
+ "x" 'reftex-toc-external
+ "." 'reftex-toc-show-calling-point
+ "J" 'reftex-toc-jump
+ (kbd "[[") 'reftex-toc-previous-heading
+ (kbd "]]") 'reftex-toc-next-heading
+ (kbd ">") 'reftex-toc-promote
+ (kbd "<") 'reftex-toc-demote
+ "f" 'reftex-toc-toggle-follow))
+
+(provide 'evil-collection-reftex)
+;;; evil-collection-reftex.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/replace/README.org b/.config/emacs/lisp/evil-collection/modes/replace/README.org
new file mode 100644
index 0000000..9d85f62
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/replace/README.org
@@ -0,0 +1,34 @@
+* replace
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Other-Repeating-Search.html][occur]] and =occur-edit-mode=.
+
+** Key bindings
+
+*** occur-mode-map
+
+ Initial state: normal.
+
+ | Command | Original | Evil |
+ |-------------------------------------------+-----------+------------------|
+ | =occur-edit-mode= | =e= | =i=, =C-x C-q= |
+ | =occur-mode-goto-occurrence= | =RET= | =RET=, =C-c C-c= |
+ | =occur-mode-goto-occurrence-other-window= | =o= | =go=, =S-RET= |
+ | =occur-mode-display-occurrence= | =C-o= | =M-RET= |
+ | =next-error-no-select= | =n= | =gj=, =C-j= |
+ | =previous-error-no-select= | =p= | =gk=, =C-k= |
+ | =occur-rename-buffer= | =r= | =r= |
+ | =clone-buffer= | =c= | =c= |
+ | =next-error-follow-minor-mode= | =C-c C-f= | =C-c C-f= |
+ | =occur-mode-mouse-goto= | =mouse-2= | =mouse-2= |
+
+*** occur-edit-mode-map
+
+ | Command | Original | Evil |
+ |---------------------------------+-----------+----------------------------------------------|
+ | =occur-cease-edit= | =C-c C-c= | =C-x C-q=, =<escape>=, =ZZ=, =ZQ=, =C-c C-c= |
+ | =occur-mode-display-occurrence= | =C-c C-o= | =C-o= |
+ | =next-error-follow-minor-mode= | =C-c C-f= | =C-c C-f= |
+ | =occur-mode-mouse-goto= | =mouse-2= | =mouse-2= |
+
+ Note: =occur-edit-mode= has no abort command; =ZZ=, =ZQ= and =<escape>=
+ all commit the edit.
diff --git a/.config/emacs/lisp/evil-collection/modes/replace/evil-collection-replace.el b/.config/emacs/lisp/evil-collection/modes/replace/evil-collection-replace.el
new file mode 100644
index 0000000..5dc91e4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/replace/evil-collection-replace.el
@@ -0,0 +1,79 @@
+;;; evil-collection-replace.el --- Evil bindings for `replace' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, occur, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `replace'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'replace nil t)
+
+(defconst evil-collection-replace-maps '(occur-mode-map
+ occur-edit-mode-map))
+
+;;;###autoload
+(defun evil-collection-replace-setup ()
+ "Set up `evil' bindings for `occur'."
+ (evil-set-initial-state 'occur-mode 'normal)
+
+ (evil-collection-define-key 'normal 'occur-mode-map
+ ;; Like `wdired-mode'.
+ (kbd "C-x C-q") 'occur-edit-mode
+ "i" 'occur-edit-mode
+
+ [mouse-2] 'occur-mode-mouse-goto
+ (kbd "C-c C-c") 'occur-mode-goto-occurrence
+
+ ;; open
+ (kbd "RET") 'occur-mode-goto-occurrence
+ (kbd "S-<return>") 'occur-mode-goto-occurrence-other-window
+ (kbd "M-<return>") 'occur-mode-display-occurrence
+ "go" 'occur-mode-goto-occurrence-other-window
+
+ "gj" 'next-error-no-select
+ "gk" 'previous-error-no-select
+ (kbd "C-j") 'next-error-no-select
+ (kbd "C-k") 'previous-error-no-select
+ "r" 'occur-rename-buffer
+ "c" 'clone-buffer
+ (kbd "C-c C-f") 'next-error-follow-minor-mode)
+
+ (evil-collection-define-key 'normal 'occur-edit-mode-map
+ ;; Like `wdired-mode'.
+ (kbd "C-x C-q") 'occur-cease-edit
+
+ ;; Sadly, `occur-edit-mode' has no abort commands supported. ZZ, ZQ and
+ ;; <escape> are same.
+ (kbd "<escape>") 'occur-cease-edit
+ "ZZ" 'occur-cease-edit
+ "ZQ" 'occur-cease-edit
+
+ [mouse-2] 'occur-mode-mouse-goto
+ (kbd "C-c C-c") 'occur-cease-edit
+ (kbd "C-o") 'occur-mode-display-occurrence
+ (kbd "C-c C-f") 'next-error-follow-minor-mode))
+
+(provide 'evil-collection-replace)
+;;; evil-collection-replace.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/restclient/evil-collection-restclient.el b/.config/emacs/lisp/evil-collection/modes/restclient/evil-collection-restclient.el
new file mode 100644
index 0000000..49da419
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/restclient/evil-collection-restclient.el
@@ -0,0 +1,66 @@
+;;; evil-collection-restclient.el --- Bindings for `restclient' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `restclient'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'restclient nil t)
+
+(defconst evil-collection-restclient-maps
+ '(evil-collection-restclient-mode-map
+ restclient-mode-map))
+
+(defvar evil-collection-restclient-mode-map (make-sparse-keymap))
+
+(define-minor-mode evil-collection-restclient-result-mode
+ "A minor mode to attach to `restclient' results"
+ :group 'evil-collection-restclient-mode
+ :keymap evil-collection-restclient-mode-map
+ :lighter nil)
+
+(defun evil-collection-restclient-setup-result-mode ()
+ "Set up `evil-collection-restclient-result-mode'."
+ (evil-collection-restclient-result-mode)
+ (evil-normalize-keymaps))
+
+;;;###autoload
+(defun evil-collection-restclient-setup ()
+ "Set up `evil' bindings for `restclient'."
+ (evil-collection-define-key 'normal 'restclient-mode-map
+ "[[" 'restclient-jump-prev
+ "]]" 'restclient-jump-next)
+ (evil-collection-define-key 'normal 'evil-collection-restclient-mode-map
+ "q" #'quit-window
+ "ZZ" #'quit-window
+ "ZQ" #'evil-quit)
+
+ ;; Enable a separate minor mode so that we can bind keys to it.
+ (add-hook 'restclient-response-loaded-hook
+ #'evil-collection-restclient-setup-result-mode))
+
+(provide 'evil-collection-restclient)
+;;; evil-collection-restclient.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/rg/README.org b/.config/emacs/lisp/evil-collection/modes/rg/README.org
new file mode 100644
index 0000000..677010c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/rg/README.org
@@ -0,0 +1,47 @@
+* rg
+
+ Evil bindings for [[https://github.com/dajva/rg.el][rg.el]] (ripgrep) result buffers.
+
+ Initial state for =rg-mode= is forced to =normal=. Bindings cover
+ =normal=, =motion=, and =visual= states so that evil motion overrides
+ conflicting single-letter rg commands.
+
+** Key bindings
+
+*** normal state
+
+ | Command | Original | Evil |
+ |--------------------------------+-----------+-------------|
+ | =rg-rerun-toggle-case= | =c= | =c= |
+ | =rg-rerun-change-dir= | =d= | =d= |
+ | =rg-rerun-change-files= | =f= | =f= |
+ | =rg-rerun-toggle-ignore= | =i= | =I= |
+ | =rg-rerun-change-regexp= | =r= | =r= |
+ | =rg-rerun-change-literal= | =t= | =t= |
+ | =rg-save-search= | =s= | =s= |
+ | =rg-save-search-as-name= | =S= | =S= |
+ | =rg-menu= | =m= | =m= |
+ | =wgrep-change-to-wgrep-mode= | =e= | =i= |
+ | =next-error-follow-minor-mode= | =C-c C-f= | =F= |
+ | =rg-list-searches= | =L= | =L= |
+ | =rg-back-history= | =C-c <= | =C-p= |
+ | =rg-forward-history= | =C-c >= | =C-n= |
+ | =rg-prev-file= | =M-P= | ={= |
+ | =rg-next-file= | =M-N= | =}= |
+ | =previous-error-no-select= | =p= | =gk=, =C-k= |
+ | =next-error-no-select= | =n= | =gj=, =C-j= |
+ | =evil-forward-word-end= | | =e= |
+ | =evil-forward-char= | | =l= |
+ | =evil-forward-word-begin= | | =w= |
+ | =evil-goto-first-line= | | =gg= |
+ | =rg-recompile= | =g= | =gr= |
+ | =quit-window= | | =q= |
+
+*** motion / visual states
+
+ | Command | Evil |
+ |---------------------------+------|
+ | =evil-forward-word-end= | =e= |
+ | =evil-forward-char= | =l= |
+ | =evil-forward-word-begin= | =w= |
+ | =evil-goto-first-line= | =gg= |
diff --git a/.config/emacs/lisp/evil-collection/modes/rg/evil-collection-rg.el b/.config/emacs/lisp/evil-collection/modes/rg/evil-collection-rg.el
new file mode 100644
index 0000000..af20fb7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/rg/evil-collection-rg.el
@@ -0,0 +1,91 @@
+;;; evil-collection-rg.el --- Evil bindings for rg -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, rg, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for rg.
+
+;;; Code:
+(require 'evil-collection)
+(require 'rg nil t)
+
+(defconst evil-collection-rg-maps '(rg-mode-map))
+
+;;;###autoload
+(defun evil-collection-rg-setup ()
+ "Set up `evil' bindings for `rg'."
+ (evil-set-initial-state 'rg-mode 'normal)
+
+ (evil-collection-define-key 'normal 'rg-mode-map
+ ;; rerun
+ "c" 'rg-rerun-toggle-case
+ "d" 'rg-rerun-change-dir
+ "f" 'rg-rerun-change-files
+ "I" 'rg-rerun-toggle-ignore ;; was i
+ "r" 'rg-rerun-change-regexp
+ "t" 'rg-rerun-change-literal
+
+ ;; save
+ "s" 'rg-save-search
+ "S" 'rg-save-search-as-name
+
+ ;; action
+ "m" 'rg-menu
+ "i" 'wgrep-change-to-wgrep-mode ;; was w/e
+ "F" 'next-error-follow-minor-mode ;; C-c C-f
+ "L" 'rg-list-searches ;; was l
+ (kbd "C-p") 'rg-back-history ;; C-c <
+ (kbd "C-n") 'rg-forward-history ;; C-c >
+
+ ;; navigation
+ "{" 'rg-prev-file
+ "}" 'rg-next-file
+ "gk" 'previous-error-no-select
+ "gj" 'next-error-no-select
+ (kbd "C-k") 'previous-error-no-select
+ (kbd "C-j") 'next-error-no-select
+
+ "e" 'evil-forward-word-end ;; shadows wgrep-change-to-wgrep-mode
+ "l" 'evil-forward-char ;; shadows rg-list-searches
+ "w" 'evil-forward-word-begin ;; shadows wgrep-change-to-wgrep-mode
+ "gg" 'evil-goto-first-line
+ "gr" 'rg-recompile
+
+ ;; quit
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'motion 'rg-mode-map
+ "e" 'evil-forward-word-end ;; shadows wgrep-change-to-wgrep-mode
+ "l" 'evil-forward-char ;; shadows rg-list-searches
+ "w" 'evil-forward-word-begin ;; shadows wgrep-change-to-wgrep-mode
+ "gg" 'evil-goto-first-line)
+
+ (evil-collection-define-key 'visual 'rg-mode-map
+ "e" 'evil-forward-word-end ;; shadows wgrep-change-to-wgrep-mode
+ "l" 'evil-forward-char ;; shadows rg-list-searches
+ "w" 'evil-forward-word-begin ;; shadows wgrep-change-to-wgrep-mode
+ "gg" 'evil-goto-first-line))
+
+(provide 'evil-collection-rg)
+;;; evil-collection-rg.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ripgrep/README.org b/.config/emacs/lisp/evil-collection/modes/ripgrep/README.org
new file mode 100644
index 0000000..bae0b91
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ripgrep/README.org
@@ -0,0 +1,14 @@
+* ripgrep
+
+ Evil bindings for [[https://github.com/nlamirault/ripgrep.el][ripgrep.el]] search result buffers.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------------+-----------+-------------|
+ | =evil-search-next= | | =n= |
+ | =previous-error-no-select= | =p= | =gk=, =C-k= |
+ | =next-error-no-select= | =n= | =gj=, =C-j= |
+ | =compilation-previous-file= | ={= | ={= |
+ | =compilation-next-file= | =}= | =}= |
+ | =wgrep-change-to-wgrep-mode= | =C-c C-p= | =i= |
diff --git a/.config/emacs/lisp/evil-collection/modes/ripgrep/evil-collection-ripgrep.el b/.config/emacs/lisp/evil-collection/modes/ripgrep/evil-collection-ripgrep.el
new file mode 100644
index 0000000..f96398a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ripgrep/evil-collection-ripgrep.el
@@ -0,0 +1,48 @@
+;;; evil-collection-ripgrep.el --- Bindings for `ripgrep' -*- lexical-binding: t -*-
+
+;; Author: Sid Kasivajhula <sid@countvajhula.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `ripgrep'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ripgrep nil t)
+
+(defconst evil-collection-ripgrep-maps '(ripgrep-search-mode-map))
+
+;;;###autoload
+(defun evil-collection-ripgrep-setup ()
+ "Set up `evil' bindings for `ripgrep'."
+ (evil-collection-define-key 'normal 'ripgrep-search-mode-map
+ "n" 'evil-search-next
+ "\C-k" 'previous-error-no-select
+ "\C-j" 'next-error-no-select
+ "gk" 'previous-error-no-select
+ "gj" 'next-error-no-select
+ "{" 'compilation-previous-file
+ "}" 'compilation-next-file
+ "i" 'wgrep-change-to-wgrep-mode))
+
+
+(provide 'evil-collection-ripgrep)
+;;; evil-collection-ripgrep.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/rjsx-mode/evil-collection-rjsx-mode.el b/.config/emacs/lisp/evil-collection/modes/rjsx-mode/evil-collection-rjsx-mode.el
new file mode 100644
index 0000000..fa99f5f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/rjsx-mode/evil-collection-rjsx-mode.el
@@ -0,0 +1,47 @@
+;;; evil-collection-rjsx-mode.el --- Bindings for `rjsx-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, rjsx, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `rjsx-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'rjsx-mode nil t)
+
+(defvar rjsx-mode-map)
+
+(defconst evil-collection-rjsx-maps '(rjsx-mode-map))
+
+;;;###autoload
+(defun evil-collection-rjsx-mode-setup ()
+ "Set up `evil' bindings for `rjsx-mode'."
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'insert 'rjsx-mode-map
+ (kbd "C-d") 'rjsx-delete-creates-full-tag)
+ (evil-collection-define-key 'normal 'rjsx-mode-map
+ (kbd "C-d") 'evil-scroll-down)))
+
+(provide 'evil-collection-rjsx-mode)
+;;; evil-collection-rjsx-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/robe/evil-collection-robe.el b/.config/emacs/lisp/evil-collection/modes/robe/evil-collection-robe.el
new file mode 100644
index 0000000..48480b5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/robe/evil-collection-robe.el
@@ -0,0 +1,45 @@
+;;; evil-collection-robe.el --- Bindings for `robe' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, evil, tools, robe
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `robe'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'robe nil t)
+
+(defconst evil-collection-robe-maps '(robe-mode-map))
+
+;;;###autoload
+(defun evil-collection-robe-setup ()
+ "Set up `evil' bindings for `robe'."
+ (evil-collection-define-key 'normal 'robe-mode-map
+ "gd" 'robe-jump
+ (kbd "C-t") 'pop-tag-mark
+ "K" 'robe-doc
+ "gr" 'robe-rails-refresh))
+
+(provide 'evil-collection-robe)
+;;; evil-collection-robe.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/rtags/evil-collection-rtags.el b/.config/emacs/lisp/evil-collection/modes/rtags/evil-collection-rtags.el
new file mode 100644
index 0000000..009e46d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/rtags/evil-collection-rtags.el
@@ -0,0 +1,141 @@
+;;; evil-collection-rtags.el --- Evil bindings for `rtags' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, rtags, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Evil bindings for `rtags'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'rtags nil t)
+
+(defvar rtags-mode-map)
+(defvar rtags-dependency-tree-mode-map)
+(defvar rtags-references-tree-mode-map)
+(defvar rtags-location-stack-visualize-mode-map)
+
+(defconst evil-collection-rtags-maps '(rtags-mode-map
+ rtags-dependency-tree-mode-map
+ rtags-references-tree-mode-map
+ rtags-location-stack-visualize-mode-map))
+
+;;;###autoload
+(defun evil-collection-rtags-setup ()
+ "Set up `evil' bindings for `rtags'."
+ (evil-set-initial-state 'rtags-mode 'normal)
+ (evil-set-initial-state 'rtags-dependency-tree-mode 'normal)
+ (evil-set-initial-state 'rtags-references-tree-mode 'normal)
+ (evil-set-initial-state 'rtags-location-stack-visualize-mode 'normal)
+
+ (evil-collection-define-key 'normal 'rtags-mode-map
+ ;; open
+ (kbd "RET") 'rtags-select
+ (kbd "S-<return>") 'rtags-select-other-window
+ (kbd "M-<return>") 'rtags-show-in-other-window
+ (kbd "go") 'rtags-select-other-window
+ (kbd "gO") 'rtags-show-in-other-window
+ [mouse-1] 'rtags-select-other-window
+ [mouse-2] 'rtags-select-other-window
+
+ "c" 'rtags-select-caller
+ "C" 'rtags-select-caller-other-window
+ "x" 'rtags-select-and-remove-rtags-buffer
+ "q" 'rtags-call-bury-or-delete)
+
+ (evil-collection-define-key 'normal 'rtags-dependency-tree-mode-map
+ (kbd "<tab>") 'rtags-dependency-tree-toggle-current-expanded
+ "E" 'rtags-dependency-tree-expand-all
+ "c" 'rtags-dependency-tree-collapse-all
+ "-" 'rtags-dependency-tree-collapse-current
+ "+" 'rtags-dependency-tree-expand-current
+ "P" 'rtags-dependency-tree-find-path
+ "gf" 'rtags-dependency-tree-find-path
+
+ "gj" 'rtags-dependency-tree-next-level
+ "gk" 'rtags-dependency-tree-previous-level
+
+ (kbd "C-j") 'rtags-dependency-tree-next-level
+ (kbd "C-k") 'rtags-dependency-tree-previous-level
+ "]]" 'rtags-dependency-tree-next-level
+ "[[" 'rtags-dependency-tree-previous-level
+
+ ;; open
+ (kbd "RET") 'rtags-select
+ (kbd "S-<return>") 'rtags-select-other-window
+ (kbd "M-<return>") 'rtags-show-in-other-window
+ "go" 'rtags-select-other-window
+ "gO" 'rtags-show-in-other-window
+ [mouse-1] 'rtags-select-other-window
+ [mouse-2] 'rtags-select-other-window
+ "s" 'rtags-show-in-other-window
+
+ "x" 'rtags-select-and-remove-rtags-buffer
+ "q" 'rtags-call-bury-or-delete)
+
+ (evil-collection-define-key 'normal 'rtags-references-tree-mode-map
+ (kbd "<tab>") 'rtags-references-tree-toggle-current-expanded
+
+ "E" 'rtags-references-tree-expand-all
+ "c" 'rtags-references-tree-collapse-all
+ "-" 'rtags-references-tree-collapse-current
+ "+" 'rtags-references-tree-expand-current
+
+ "gj" 'rtags-references-tree-next-level
+ "gk" 'rtags-references-tree-previous-level
+
+ (kbd "C-j") 'rtags-references-tree-next-level
+ (kbd "C-k") 'rtags-references-tree-previous-level
+
+ "]]" 'rtags-references-tree-next-level
+ "[[" 'rtags-references-tree-previous-level
+
+ ;; open
+ (kbd "RET") 'rtags-select
+ (kbd "S-<return>") 'rtags-select-other-window
+ (kbd "M-<return>") 'rtags-show-in-other-window
+ "go" 'rtags-select-other-window
+ "gO" 'rtags-show-in-other-window
+ [mouse-1] 'rtags-select-other-window
+ [mouse-2] 'rtags-select-other-window
+ "s" 'rtags-show-in-other-window
+
+ "x" 'rtags-select-and-remove-rtags-buffer
+ "q" 'rtags-call-bury-or-delete)
+
+ (evil-collection-define-key 'normal 'rtags-location-stack-visualize-mode-map
+ ;; open
+ (kbd "RET") 'rtags-select
+ (kbd "S-<return>") 'rtags-select-other-window
+ (kbd "M-<return>") 'rtags-show-in-other-window
+ (kbd "go") 'rtags-select-other-window
+ (kbd "gO") 'rtags-show-in-other-window
+ [mouse-1] 'rtags-select-other-window
+ [mouse-2] 'rtags-select-other-window
+ "s" 'rtags-show-in-other-window
+
+ "x" 'rtags-select-and-remove-rtags-buffer
+ "q" 'rtags-call-bury-or-delete))
+
+(provide 'evil-collection-rtags)
+;;; evil-collection-rtags.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ruby-mode/README.org b/.config/emacs/lisp/evil-collection/modes/ruby-mode/README.org
new file mode 100644
index 0000000..9d81ad8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ruby-mode/README.org
@@ -0,0 +1,9 @@
+* ruby-mode
+
+ Evil support for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Misc-for-Programmers.html][ruby-mode]].
+
+** Notes
+
+ No key bindings are added. =evil-shift-width= is set to
+ =ruby-indent-level= on =ruby-mode-hook= so that =>>= / =<<= reindent by
+ the same amount as ruby-mode itself.
diff --git a/.config/emacs/lisp/evil-collection/modes/ruby-mode/evil-collection-ruby-mode.el b/.config/emacs/lisp/evil-collection/modes/ruby-mode/evil-collection-ruby-mode.el
new file mode 100644
index 0000000..347e6c8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ruby-mode/evil-collection-ruby-mode.el
@@ -0,0 +1,45 @@
+;;; evil-collection-ruby-mode.el --- Bindings for `ruby-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools, ruby
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `ruby-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ruby-mode)
+
+(defconst evil-collection-ruby-mode-maps nil)
+
+(defun evil-collection-ruby-mode-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `ruby-indent-level'."
+ (setq-local evil-shift-width ruby-indent-level))
+
+;;;###autoload
+(defun evil-collection-ruby-mode-setup ()
+ "Set up `evil' bindings for `ruby'."
+ (add-hook 'ruby-mode-hook #'evil-collection-ruby-mode-set-evil-shift-width))
+
+(provide 'evil-collection-ruby-mode)
+;;; evil-collection-ruby-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/scheme/README.org b/.config/emacs/lisp/evil-collection/modes/scheme/README.org
new file mode 100644
index 0000000..c9397ba
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/scheme/README.org
@@ -0,0 +1,17 @@
+* scheme
+
+ Evil bindings for =scheme-mode=.
+
+** Key bindings
+
+ Added to =scheme-mode-map= in normal state.
+
+ | Command | Original | Evil |
+ |-------------------------------+----------+------|
+ | =evil-collection-scheme-repl= | n/a | =gz= |
+
+** New commands
+
+ | Command | Key | |
+ |-------------------------------+------+------------------------------------------------|
+ | =evil-collection-scheme-repl= | =gz= | pop to =*scheme*= buffer and call =run-scheme= |
diff --git a/.config/emacs/lisp/evil-collection/modes/scheme/evil-collection-scheme.el b/.config/emacs/lisp/evil-collection/modes/scheme/evil-collection-scheme.el
new file mode 100644
index 0000000..3d10dd8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/scheme/evil-collection-scheme.el
@@ -0,0 +1,47 @@
+;;; evil-collection-scheme.el --- Evil bindings for scheme -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, lisp, languages
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for scheme.
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-scheme-maps '(scheme-mode-map))
+
+(defun evil-collection-scheme-repl ()
+ "Open the scheme REPL."
+ (interactive)
+ (pop-to-buffer (get-buffer-create "*scheme*"))
+ (call-interactively #'run-scheme))
+
+;;;###autoload
+(defun evil-collection-scheme-setup ()
+ "Set up `evil' bindings for `scheme'."
+ (evil-collection-define-key 'normal 'scheme-mode-map
+ "gz" 'evil-collection-scheme-repl))
+
+(provide 'evil-collection-scheme)
+;;; evil-collection-scheme.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/scroll-lock/README.org b/.config/emacs/lisp/evil-collection/modes/scroll-lock/README.org
new file mode 100644
index 0000000..4b80844
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/scroll-lock/README.org
@@ -0,0 +1,24 @@
+* scroll-lock
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Scrolling.html][scroll-lock-mode]].
+
+** Key bindings
+
+ Standard evil motions are remapped to scroll-lock equivalents so the
+ cursor stays fixed while the buffer scrolls.
+
+ | Command | Remaps from |
+ |--------------------------------------------------+---------------------------|
+ | =evil-collection-scroll-lock-next-line= | =evil-next-line= |
+ | =evil-collection-scroll-lock-previous-line= | =evil-previous-line= |
+ | =evil-collection-scroll-lock-forward-paragraph= | =evil-forward-paragraph= |
+ | =evil-collection-scroll-lock-backward-paragraph= | =evil-backward-paragraph= |
+
+** New commands
+
+ | Command | |
+ |--------------------------------------------------+------------------------------------|
+ | =evil-collection-scroll-lock-next-line= | line-wise scroll down, point fixed |
+ | =evil-collection-scroll-lock-previous-line= | line-wise scroll up, point fixed |
+ | =evil-collection-scroll-lock-forward-paragraph= | paragraph scroll down (=:jump t=) |
+ | =evil-collection-scroll-lock-backward-paragraph= | paragraph scroll up (=:jump t=) |
diff --git a/.config/emacs/lisp/evil-collection/modes/scroll-lock/evil-collection-scroll-lock.el b/.config/emacs/lisp/evil-collection/modes/scroll-lock/evil-collection-scroll-lock.el
new file mode 100644
index 0000000..ae81b10
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/scroll-lock/evil-collection-scroll-lock.el
@@ -0,0 +1,87 @@
+;;; evil-collection-scroll-lock.el --- Bindings for `scroll-lock' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, elisp, lisp
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `scroll-lock'.
+
+;;; Code:
+(require 'scroll-lock)
+(require 'evil-collection)
+
+(declare-function scroll-lock-next-line "scroll-lock")
+(declare-function scroll-lock-previous-line "scroll-lock")
+(declare-function scroll-lock-forward-paragraph "scroll-lock")
+(declare-function scroll-lock-backward-paragraph "scroll-lock")
+
+(defconst evil-collection-scroll-lock-maps '(scroll-lock-mode-map))
+
+(evil-define-motion evil-collection-scroll-lock-next-line (count)
+ "Scroll down COUNT lines keeping point fixed."
+ :type line
+ (let (line-move-visual)
+ (scroll-lock-next-line (or count 1))))
+
+(evil-define-motion evil-collection-scroll-lock-previous-line (count)
+ "Scroll up COUNT lines keeping point fixed."
+ :type line
+ (let (line-move-visual)
+ (scroll-lock-previous-line (or count 1))))
+
+(evil-define-motion evil-collection-scroll-lock-forward-paragraph (count)
+ "Scroll down COUNT paragraphs keeping point fixed."
+ :jump t
+ :type exclusive
+ (evil-signal-at-bob-or-eob count)
+ (scroll-lock-forward-paragraph count)
+ (unless (eobp) (forward-line)))
+
+(evil-define-motion evil-collection-scroll-lock-backward-paragraph (count)
+ "Scroll up COUNT paragraphs keeping point fixed."
+ :jump t
+ :type exclusive
+ (evil-signal-at-bob-or-eob (- (or count 1)))
+ (unless (eobp) (forward-line))
+ (scroll-lock-backward-paragraph count)
+ (unless (bobp) (forward-line -1)))
+
+;;;###autoload
+(defun evil-collection-scroll-lock-setup ()
+ "Set up `evil' bindings for `scroll-lock'."
+ (evil-collection-define-key 'normal 'scroll-lock-mode-map
+ [remap evil-next-line] 'evil-collection-scroll-lock-next-line
+ [remap evil-previous-line] 'evil-collection-scroll-lock-previous-line
+ [remap evil-forward-paragraph]
+ 'evil-collection-scroll-lock-forward-paragraph
+ [remap evil-backward-paragraph]
+ 'evil-collection-scroll-lock-backward-paragraph)
+
+ (evil-add-command-properties
+ #'evil-collection-scroll-lock-forward-paragraph :jump t)
+ (evil-add-command-properties
+ #'evil-collection-scroll-lock-backward-paragraph :jump t)
+
+ (add-hook 'scroll-lock-mode-hook 'evil-normalize-keymaps))
+
+(provide 'evil-collection-scroll-lock)
+;;; evil-collection-scroll-lock.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/selectrum/README.org b/.config/emacs/lisp/evil-collection/modes/selectrum/README.org
new file mode 100644
index 0000000..aafc019
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/selectrum/README.org
@@ -0,0 +1,43 @@
+* selectrum
+
+ Evil bindings for [[https://github.com/radian-software/selectrum][selectrum]], the incremental narrowing UI for the minibuffer.
+
+ Bindings are installed only when =evil-collection-setup-minibuffer= is
+ non-nil.
+
+** Key bindings
+
+*** selectrum-minibuffer-map (insert and normal)
+
+ | Command | Original | Evil |
+ |--------------------------------------+----------+---------|
+ | =selectrum-previous-page= | =M-v= | =C-b= |
+ | =selectrum-next-page= | =C-v= | =C-f= |
+ | =selectrum-submit-exact-input= | =C-j= | =M-RET= |
+ | =selectrum-select-current-candidate= | =RET= | =RET= |
+ | =selectrum-previous-page= | =M-v= | =C-u= |
+ | =selectrum-next-page= | =C-v= | =C-d= |
+
+ =C-u= and =C-d= are added only when =evil-want-C-u-scroll= and
+ =evil-want-C-d-scroll= respectively are non-nil.
+
+*** selectrum-minibuffer-map (insert)
+
+ | Command | Original | Evil |
+ |--------------------------------+----------+-------|
+ | =selectrum-next-candidate= | =C-n= | =C-j= |
+ | =selectrum-previous-candidate= | =C-p= | =C-k= |
+ | =selectrum-next-candidate= | =C-n= | =C-n= |
+ | =selectrum-previous-candidate= | =C-p= | =C-p= |
+
+*** selectrum-minibuffer-map (normal)
+
+ | Command | Original | Evil |
+ |--------------------------------+----------+------|
+ | =selectrum-next-candidate= | n/a | =j= |
+ | =selectrum-previous-candidate= | n/a | =k= |
+ | =selectrum-next-group= | =C-q n= | =gj= |
+ | =selectrum-previous-group= | =C-q p= | =gk= |
+ | =selectrum-goto-beginning= | =M-<= | =gg= |
+ | =selectrum-goto-end= | =M->= | =G= |
+ | =selectrum-kill-ring-save= | =M-w= | =gy= |
diff --git a/.config/emacs/lisp/evil-collection/modes/selectrum/evil-collection-selectrum.el b/.config/emacs/lisp/evil-collection/modes/selectrum/evil-collection-selectrum.el
new file mode 100644
index 0000000..525e33d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/selectrum/evil-collection-selectrum.el
@@ -0,0 +1,72 @@
+;;; evil-collection-selectrum.el --- Evil bindings for Selectrum -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Balaji Sivaraman
+
+;; Author: Balaji Sivaraman <balaji@balajisivaraman.com>
+;; Maintainer: Balaji Sivaraman <balaji@balajisivaraman.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Selectrum.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'selectrum nil t)
+
+(defconst evil-collection-selectrum-maps '(selectrum-minibuffer-map))
+
+;;;###autoload
+(defun evil-collection-selectrum-setup ()
+ "Set up `evil' bindings for `selectrum-mode'."
+
+ (defvar evil-collection-setup-minibuffer)
+ (when evil-collection-setup-minibuffer
+ (evil-collection-define-key '(insert normal) 'selectrum-minibuffer-map
+ (kbd "C-b") 'selectrum-previous-page
+ (kbd "C-f") 'selectrum-next-page
+ (kbd "M-RET") 'selectrum-submit-exact-input
+ (kbd "<return>") 'selectrum-select-current-candidate)
+
+ (evil-collection-define-key 'insert 'selectrum-minibuffer-map
+ (kbd "C-j") 'selectrum-next-candidate
+ (kbd "C-k") 'selectrum-previous-candidate
+ (kbd "C-n") 'selectrum-next-candidate
+ (kbd "C-p") 'selectrum-previous-candidate)
+
+ (evil-collection-define-key 'normal 'selectrum-minibuffer-map
+ (kbd "j") 'selectrum-next-candidate
+ (kbd "k") 'selectrum-previous-candidate
+ (kbd "gj") 'selectrum-next-group
+ (kbd "gk") 'selectrum-previous-group
+ (kbd "G") 'selectrum-goto-end
+ (kbd "gg") 'selectrum-goto-beginning
+ (kbd "gy") 'selectrum-kill-ring-save)
+
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key '(insert normal) 'selectrum-minibuffer-map
+ (kbd "C-u") 'selectrum-previous-page))
+
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key '(insert normal) 'selectrum-minibuffer-map
+ (kbd "C-d") 'selectrum-next-page))))
+
+(provide 'evil-collection-selectrum)
+;;; evil-collection-selectrum.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/sh-script/README.org b/.config/emacs/lisp/evil-collection/modes/sh-script/README.org
new file mode 100644
index 0000000..0d63469
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/sh-script/README.org
@@ -0,0 +1,15 @@
+* sh-script
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell.html][sh-script]] (=sh-mode=).
+
+** Key bindings
+
+ Added to =sh-mode-map= in normal state.
+
+ | Command | Original | Evil |
+ |-----------------+----------+------|
+ | =sh-show-shell= | n/a | =gz= |
+
+** Notes
+
+ - =evil-shift-width= is set to =sh-basic-offset= on =sh-mode-hook=.
diff --git a/.config/emacs/lisp/evil-collection/modes/sh-script/evil-collection-sh-script.el b/.config/emacs/lisp/evil-collection/modes/sh-script/evil-collection-sh-script.el
new file mode 100644
index 0000000..35a7bff
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/sh-script/evil-collection-sh-script.el
@@ -0,0 +1,48 @@
+;;; evil-collection-sh-script.el --- Evil bindings for sh-script -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for sh-script.
+
+;;; Code:
+(require 'evil-collection)
+(require 'sh-script)
+
+(defconst evil-collection-sh-script-maps '(sh-mode-map))
+
+(defun evil-collection-sh-script-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `sh-basic-offset'."
+ (setq-local evil-shift-width sh-basic-offset))
+
+;;;###autoload
+(defun evil-collection-sh-script-setup ()
+ "Set up `evil' bindings for `sh-script'."
+ (add-hook 'sh-mode-hook #'evil-collection-sh-script-set-evil-shift-width)
+
+ (evil-collection-define-key 'normal 'sh-mode-map
+ "gz" 'sh-show-shell))
+
+(provide 'evil-collection-sh-script)
+;;; evil-collection-sh-script.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/shell-maker/evil-collection-shell-maker.el b/.config/emacs/lisp/evil-collection/modes/shell-maker/evil-collection-shell-maker.el
new file mode 100644
index 0000000..710fbf4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/shell-maker/evil-collection-shell-maker.el
@@ -0,0 +1,65 @@
+;;; evil-collection-shell-maker.el --- Bindings for `shell-maker' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2026 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, shell-maker, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `shell-maker'.
+;;;
+;;; These bindings apply to `shell-maker-mode' and any derived mode that
+;;; doesn't override RET / S-RET in its own evil state map (for example,
+;;; `agent-shell-mode' inherits from `shell-maker-mode-map').
+
+;;; Code:
+(require 'evil-collection)
+(require 'shell-maker nil t)
+
+(defgroup evil-collection-shell-maker nil
+ "Evil bindings for `shell-maker'."
+ :group 'evil-collection)
+
+(make-obsolete-variable 'evil-collection-shell-maker-submit-state
+ 'evil-collection-repl-submit-state
+ "evil-collection 0.0.2")
+
+(defconst evil-collection-shell-maker-maps '(shell-maker-mode-map))
+
+
+(defvar shell-maker-mode-map)
+
+;;;###autoload
+(defun evil-collection-shell-maker-setup ()
+ "Set up `evil' bindings for `shell-maker'."
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'shell-maker-mode-map
+ (kbd "RET") 'shell-maker-submit)
+ (evil-collection-define-key newline-state 'shell-maker-mode-map
+ (kbd "RET") 'newline))
+
+ (evil-collection-define-key 'insert 'shell-maker-mode-map
+ (kbd "S-<return>") 'newline)
+ (evil-collection-define-key 'normal 'shell-maker-mode-map
+ (kbd "S-<return>") 'newline))
+
+(provide 'evil-collection-shell-maker)
+;;; evil-collection-shell-maker.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/shortdoc/README.org b/.config/emacs/lisp/evil-collection/modes/shortdoc/README.org
new file mode 100644
index 0000000..ec50145
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/shortdoc/README.org
@@ -0,0 +1,20 @@
+* shortdoc
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Documentation-Groups.html][shortdoc]].
+
+** Key bindings
+
+ Bindings added to =shortdoc-mode-map= in normal state (initial state:
+ normal).
+
+ | Command | Original | Evil |
+ |-----------------------------+----------------+-------------|
+ | =forward-button= | n/a | =TAB= |
+ | =backward-button= | n/a | =<backtab>= |
+ | =shortdoc-next= | =n= | =C-j= |
+ | =shortdoc-previous= | =p= | =C-k= |
+ | =shortdoc-next-section= | =N=, =C-c C-n= | =]]= |
+ | =shortdoc-previous-section= | =P=, =C-c C-p= | =[[= |
+
+ The upstream =n=, =p=, =N=, =P=, =w= keys keep their bindings so they
+ remain available alongside the evil-friendly additions.
diff --git a/.config/emacs/lisp/evil-collection/modes/shortdoc/evil-collection-shortdoc.el b/.config/emacs/lisp/evil-collection/modes/shortdoc/evil-collection-shortdoc.el
new file mode 100644
index 0000000..03e5061
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/shortdoc/evil-collection-shortdoc.el
@@ -0,0 +1,49 @@
+;;; evil-collection-shortdoc.el --- Evil bindings for shortdoc -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; TODO: Update to emacs 28.1 when it's out
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, lisp, help
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for shortdoc.
+
+;;; Code:
+(require 'evil-collection)
+(require 'shortdoc nil t)
+
+(defconst evil-collection-shortdoc-maps '(shortdoc-mode-map))
+
+;;;###autoload
+(defun evil-collection-shortdoc-setup ()
+ "Set up `evil' bindings for `shortdoc'."
+ (evil-set-initial-state 'shortdoc-mode 'normal)
+ (evil-collection-define-key 'normal 'shortdoc-mode-map
+ (kbd "<tab>") 'forward-button
+ (kbd "<backtab>") 'backward-button
+ (kbd "C-k") 'shortdoc-previous
+ (kbd "C-j") 'shortdoc-next
+ "[[" 'shortdoc-previous-section
+ "]]" 'shortdoc-next-section))
+
+(provide 'evil-collection-shortdoc)
+;;; evil-collection-shortdoc.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/simple-mpc/evil-collection-simple-mpc.el b/.config/emacs/lisp/evil-collection/modes/simple-mpc/evil-collection-simple-mpc.el
new file mode 100644
index 0000000..fea1bb0
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/simple-mpc/evil-collection-simple-mpc.el
@@ -0,0 +1,122 @@
+;;; evil-collection-simple-mpc.el --- Bindings for `simple-mpc' -*- lexical-binding: t -*-
+;; Copyright (C) 2022 Joseph Turner
+
+;; Author: Joseph Turner <joseph@breatheoutbreathe.in>
+;; Maintainer: Joseph Turner <joseph@breatheoutbreathe.in>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, simple-mpc, processes, mpd
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `simple-mpc'.
+
+;;; Code:
+(require 'simple-mpc nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-simple-mpc-maps '(simple-mpc-mode-map
+ simple-mpc-query-mode-map
+ simple-mpc-current-playlist-mode-map))
+
+(defun evil-collection-simple-mpc-set-bindings ()
+ "Set up `evil' bindings for `simple-mpc'.
+
+Other modes that are configured:
+`simple-mpc-mode'
+`simple-mpc-query-mode'
+`simple-mpc-current-playlist-mode'"
+ (evil-collection-define-key 'normal 'simple-mpc-mode-map
+ "p" 'simple-mpc-toggle
+ ">" 'simple-mpc-next
+ "<" 'simple-mpc-prev
+ "f" 'simple-mpc-seek-forward
+ "b" 'simple-mpc-seek-backward
+ "s" 'simple-mpc-query
+ "c" 'simple-mpc-view-current-playlist
+ "l" 'simple-mpc-load-playlist
+ "S" 'simple-mpc-shuffle-current-playlist
+ "C" 'simple-mpc-clear-current-playlist
+ "+" 'simple-mpc-increase-volume
+ "-" 'simple-mpc-decrease-volume
+
+ "q" 'simple-mpc-quit
+ "ZQ" 'simple-mpc-quit
+ "ZZ" 'simple-mpc-quit)
+
+ (evil-collection-define-key 'normal 'simple-mpc-current-playlist-mode-map
+ "x" 'simple-mpc-delete
+ "d" 'simple-mpc-delete
+
+ "q" 'simple-mpc-current-playlist-quit
+ "ZQ" 'simple-mpc-current-playlist-quit
+ "ZZ" 'simple-mpc-current-playlist-quit
+
+ "<return>" 'simple-mpc-play-current-line
+ (kbd "RET") 'simple-mpc-play-current-line)
+
+ (evil-collection-define-key 'normal 'simple-mpc-query-mode-map
+ "o" 'simple-mpc-query-sort
+
+ "q" 'simple-mpc-query-quit
+ "ZQ" 'simple-mpc-query-quit
+ "ZZ" 'simple-mpc-query-quit
+
+ "<S-return>" 'simple-mpc-query-add
+ (kbd "M-RET") 'simple-mpc-query-add
+
+ "<return>" 'simple-mpc-query-add-and-play
+ (kbd "RET") 'simple-mpc-query-add-and-play))
+
+(defvar simple-mpc-main-buffer-name "*simple-mpc-main*")
+
+(defun evil-collection-simple-mpc-replace-main-view ()
+ "Update main view to show keys in use with evil mode."
+ (interactive)
+ (when
+ (string= (buffer-name) simple-mpc-main-buffer-name)
+ (read-only-mode -1)
+ (erase-buffer)
+ (insert (propertize "* simple-mpc *\n\n"
+ 'face 'simple-mpc-main-name)
+ (propertize " * controls\n" 'face 'simple-mpc-main-headers)
+ " * [p]lay/pause toggle\n"
+ " * [>] next track\n"
+ " * [<] previous track\n"
+ " * seek [f]orward\n"
+
+ " * seek [b]ackward\n"
+ " * [+] increase volume\n"
+ " * [-] decrease volume\n"
+ (propertize "\n * playlist\n" 'face 'simple-mpc-main-headers)
+ " * view [c]urrent playlist\n"
+ " * [C]lear current playlist\n"
+ " * [S]huffle playlist\n"
+ " * [l]oad playlist\n"
+ " * [s]earch database\n"
+ (propertize "\n * misc\n" 'face 'simple-mpc-main-headers)
+ " * [q]uit")))
+
+;;;###autoload
+(defun evil-collection-simple-mpc-setup ()
+ "Set up simple-mpc bindings and main view."
+ (evil-collection-simple-mpc-set-bindings)
+ (add-hook 'simple-mpc-mode-hook 'evil-collection-simple-mpc-replace-main-view)
+ (add-hook 'simple-mpc-query-mode-hook 'evil-normalize-keymaps)
+ (add-hook 'simple-mpc-current-playlist-mode-hook 'evil-normalize-keymaps))
+
+(provide 'evil-collection-simple-mpc)
+;;; evil-collection-simple-mpc.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/simple/README.org b/.config/emacs/lisp/evil-collection/modes/simple/README.org
new file mode 100644
index 0000000..5cbc496
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/simple/README.org
@@ -0,0 +1,23 @@
+* simple
+
+ Evil bindings for =special-mode-map=, the base keymap shared by many
+ read-only Emacs buffers.
+
+** Key bindings
+
+ Applies =evil-collection-set-readonly-bindings= to =special-mode-map=
+ (standard motion / quit bindings for read-only buffers), then layers:
+
+ | Command | Original | Evil |
+ |-----------------+----------+------|
+ | =revert-buffer= | =g= | =gr= |
+
+ The following upstream single-letter bindings are unset so they do not
+ shadow evil normal-state keys:
+
+ | Key | Was upstream |
+ |-----+------------------|
+ | =g= | =revert-buffer= |
+ | =h= | =describe-mode= |
+ | =?= | =describe-mode= |
+ | =0= | =digit-argument= |
diff --git a/.config/emacs/lisp/evil-collection/modes/simple/evil-collection-simple.el b/.config/emacs/lisp/evil-collection/modes/simple/evil-collection-simple.el
new file mode 100644
index 0000000..9f8b7b6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/simple/evil-collection-simple.el
@@ -0,0 +1,49 @@
+;;; evil-collection-simple.el --- Bindings for `simple' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `simple'
+
+;;; Code:
+(require 'evil-collection)
+(require 'simple)
+
+(defvar special-mode-map)
+
+(defconst evil-collection-simple-maps '(special-mode-map))
+
+;;;###autoload
+(defun evil-collection-simple-setup ()
+ "Set up `evil' bindings for `simple'."
+ (evil-collection-set-readonly-bindings 'special-mode-map)
+ (evil-collection-define-key nil 'special-mode-map
+ "g" nil
+ "gr" 'revert-buffer
+ "h" nil
+ "?" nil
+ "0" nil))
+
+(provide 'evil-collection-simple)
+;;; evil-collection-simple.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/slime/evil-collection-slime.el b/.config/emacs/lisp/evil-collection/modes/slime/evil-collection-slime.el
new file mode 100644
index 0000000..f89af6f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/slime/evil-collection-slime.el
@@ -0,0 +1,222 @@
+;;; evil-collection-slime.el --- Evil bindings for `slime' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, slime, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `slime-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'slime nil t)
+
+(defvar slime-parent-map)
+(defvar sldb-mode-map)
+(defvar slime-inspector-mode-map)
+(defvar slime-mode-map)
+(defvar slime-popup-buffer-mode-map)
+(defvar slime-thread-control-mode-map)
+(defvar slime-xref-mode-map)
+
+(defconst evil-collection-slime-maps '(slime-parent-map
+ sldb-mode-map
+ slime-inspector-mode-map
+ slime-mode-map
+ slime-popup-buffer-mode-map
+ slime-thread-control-mode-map
+ slime-xref-mode-map))
+
+(defun evil-collection-slime-last-sexp (command &rest args)
+ "In normal-state or motion-state, last sexp ends at point."
+ (if (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p)))
+ (save-excursion
+ (unless (or (eobp) (eolp)) (forward-char))
+ (apply command args))
+ (apply command args)))
+
+;;;###autoload
+(defun evil-collection-slime-setup ()
+ "Set up `evil' bindings for `slime'."
+ (unless evil-move-beyond-eol
+ (advice-add 'slime-eval-last-expression :around 'evil-collection-slime-last-sexp)
+ (advice-add 'slime-pprint-eval-last-expression :around 'evil-collection-slime-last-sexp)
+ (advice-add 'slime-eval-print-last-expression :around 'evil-collection-slime-last-sexp)
+ (advice-add 'slime-eval-last-expression-in-repl
+ :around 'evil-collection-slime-last-sexp))
+
+ (evil-set-initial-state 'sldb-mode 'normal)
+ (evil-set-initial-state 'slime-inspector-mode 'normal)
+ (evil-set-initial-state 'slime-popup-buffer-mode 'normal)
+ (evil-set-initial-state 'slime-thread-control-mode 'normal)
+ (evil-set-initial-state 'slime-xref-mode 'normal)
+
+ (evil-collection-define-key 'normal 'slime-parent-map
+ "gd" 'slime-edit-definition
+ (kbd "C-t") 'slime-pop-find-definition-stack)
+
+ (evil-collection-define-key 'normal 'sldb-mode-map
+ (kbd "RET") 'sldb-default-action
+ [mouse-2] 'sldb-default-action/mouse
+ [follow-link] 'mouse-face
+ "\C-i" 'sldb-cycle
+ "g?" 'describe-mode
+ "S" 'sldb-show-source
+ "e" 'sldb-eval-in-frame
+ "d" 'sldb-pprint-eval-in-frame
+ "D" 'sldb-disassemble
+ "i" 'sldb-inspect-in-frame
+ "gj" 'sldb-down
+ "gk" 'sldb-up
+ (kbd "C-j") 'sldb-down
+ (kbd "C-k") 'sldb-up
+ "]]" 'sldb-details-down
+ "[[" 'sldb-details-up
+ (kbd "M-j") 'sldb-details-down
+ (kbd "M-k") 'sldb-details-up
+ "gg" 'sldb-beginning-of-backtrace
+ "G" 'sldb-end-of-backtrace
+ "t" 'sldb-toggle-details
+ "gr" 'sldb-restart-frame
+ "I" 'sldb-invoke-restart-by-name
+ "R" 'sldb-return-from-frame
+ "c" 'sldb-continue
+ "s" 'sldb-step
+ "n" 'sldb-next
+ "o" 'sldb-out
+ "b" 'sldb-break-on-return
+ "a" 'sldb-abort
+ "q" 'sldb-quit
+ "A" 'sldb-break-with-system-debugger
+ "B" 'sldb-break-with-default-debugger
+ "P" 'sldb-print-condition
+ "C" 'sldb-inspect-condition
+ "g:" 'slime-interactive-eval
+ "0" 'sldb-invoke-restart-0
+ "1" 'sldb-invoke-restart-1
+ "2" 'sldb-invoke-restart-2
+ "3" 'sldb-invoke-restart-3
+ "4" 'sldb-invoke-restart-4
+ "5" 'sldb-invoke-restart-5
+ "6" 'sldb-invoke-restart-6
+ "7" 'sldb-invoke-restart-7
+ "8" 'sldb-invoke-restart-8
+ "9" 'sldb-invoke-restart-9)
+
+ (evil-collection-define-key 'normal 'slime-inspector-mode-map
+ (kbd "RET") 'slime-inspector-operate-on-point
+ [mouse-1] 'slime-inspector-operate-on-click
+ [mouse-2] 'slime-inspector-operate-on-click
+ [mouse-6] 'slime-inspector-pop
+ [mouse-7] 'slime-inspector-next
+ ;; TODO: `slime-inspector-next' and `slime-inspector-pop' should probably
+ ;; just be bound to C-i and C-o.
+ "gk" 'slime-inspector-pop
+ (kbd "C-k") 'slime-inspector-pop
+ "[[" 'slime-inspector-pop
+ (kbd "C-o") 'slime-inspector-pop
+ "gj" 'slime-inspector-next
+ (kbd "C-j") 'slime-inspector-next
+ "]]" 'slime-inspector-next
+ (kbd "C-i") 'slime-inspector-next
+ "K" 'slime-inspector-describe
+ "p" 'slime-inspector-pprint
+ "e" 'slime-inspector-eval
+ "M-p" 'slime-inspector-history
+ "gr" 'slime-inspector-reinspect
+ "gv" 'slime-inspector-toggle-verbose
+ (kbd "<tab>") 'slime-inspector-next-inspectable-object
+ (kbd "C-i") 'slime-inspector-next-inspectable-object
+ (kbd "<S-tab>") 'slime-inspector-previous-inspectable-object ; Emacs translates S-TAB
+ (kbd "<backtab>") 'slime-inspector-previous-inspectable-object ; to BACKTAB on X.
+ "." 'slime-inspector-show-source
+ "gd" 'slime-inspector-show-source
+ "gR" 'slime-inspector-fetch-all
+ "q" 'slime-inspector-quit)
+
+ (evil-collection-define-key 'normal 'slime-mode-map
+ (kbd "K") 'slime-describe-symbol
+ (kbd "C-t") 'slime-pop-find-definition-stack
+ ;; goto
+ "gd" 'slime-edit-definition
+ "gz" 'slime-switch-to-output-buffer)
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'slime-mode-map
+ "gr" 'slime-edit-uses))
+
+ (evil-collection-define-key 'normal 'slime-popup-buffer-mode-map
+ ;; quit
+ "q" 'quit-window
+
+ (kbd "C-t") 'slime-pop-find-definition-stack
+
+ ;; goto
+ "gd" 'slime-edit-definition)
+
+ (evil-collection-inhibit-insert-state 'slime-thread-control-mode-map)
+ (evil-collection-define-key 'normal 'slime-thread-control-mode-map
+ "a" 'slime-thread-attach
+ "d" 'slime-thread-debug
+ "x" 'slime-thread-kill
+ "gr" 'slime-update-threads-buffer)
+
+ (evil-collection-define-key 'normal 'slime-xref-mode-map
+ (kbd "RET") 'slime-goto-xref
+ (kbd "S-<return>") 'slime-goto-xref
+ "go" 'slime-show-xref
+ "gj" 'slime-xref-next-line
+ "gk" 'slime-xref-prev-line
+ (kbd "C-j") 'slime-xref-next-line
+ (kbd "C-k") 'slime-xref-prev-line
+ "]]" 'slime-xref-next-line
+ "[[" 'slime-xref-prev-line
+ "gr" 'slime-recompile-xref
+ "gR" 'slime-recompile-all-xrefs
+ "r" 'slime-xref-retract)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'slime-repl-mode-map
+ (kbd "RET") 'slime-repl-return
+ (kbd "\C-m") 'slime-repl-return
+ [return] 'slime-repl-return)
+ (evil-collection-define-key newline-state 'slime-repl-mode-map
+ (kbd "RET") 'slime-repl-newline-and-indent
+ (kbd "\C-m") 'slime-repl-newline-and-indent
+ [return] 'slime-repl-newline-and-indent))
+
+ (evil-collection-define-key 'normal 'slime-repl-mode-map
+ "gj" 'slime-repl-next-prompt
+ "gk" 'slime-repl-previous-prompt
+ (kbd "C-j") 'slime-repl-next-prompt
+ (kbd "C-k") 'slime-repl-previous-prompt
+ "]]" 'slime-repl-next-prompt
+ "[[" 'slime-repl-previous-prompt
+ (kbd "C-p") 'slime-repl-previous-input
+ (kbd "C-n") 'slime-repl-next-input)
+
+ (add-hook 'slime-popup-buffer-mode-hook #'evil-normalize-keymaps))
+
+(provide 'evil-collection-slime)
+;;; evil-collection-slime.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/sly/evil-collection-sly.el b/.config/emacs/lisp/evil-collection/modes/sly/evil-collection-sly.el
new file mode 100644
index 0000000..0443f2a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/sly/evil-collection-sly.el
@@ -0,0 +1,276 @@
+;;; evil-collection-sly.el --- Evil bindings for `sly' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Pierre Neidhardt
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, sly, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `sly-mode'.
+
+;;; Code:
+;; WARNING: This mirrors evil-collection-slime.el. Keep them in sync!
+
+(require 'evil-collection)
+(require 'sly nil t)
+
+(declare-function sly-last-expression "sly")
+(declare-function sly-eval-print "sly")
+
+(defvar sly-connection-list-mode-map)
+(defvar sly-db-mode-map)
+(defvar sly-inspector-mode-map)
+(defvar sly-mode-map)
+(defvar sly-popup-buffer-mode-map)
+(defvar sly-thread-control-mode-map)
+(defvar sly-trace-dialog-mode-map)
+(defvar sly-stickers--replay-mode-map)
+(defvar sly-xref-mode-map)
+
+(defconst evil-collection-sly-maps '(sly-connection-list-mode-map
+ sly-db-mode-map
+ sly-inspector-mode-map
+ sly-mode-map
+ sly-popup-buffer-mode-map
+ sly-stickers--replay-mode-map
+ sly-thread-control-mode-map
+ sly-trace-dialog-mode-map
+ sly-xref-mode-map))
+
+;; Same as `evil-collection-slime-last-sexp'.
+(defun evil-collection-sly-last-sexp (command &rest args)
+ "In normal-state or motion-state, last sexp ends at point."
+ (if (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p)))
+ (save-excursion
+ (unless (or (eobp) (eolp)) (forward-char))
+ (apply command args))
+ (apply command args)))
+
+(defun evil-collection-sly-eval-print-last-expression (string)
+ "Evaluate sexp before point; print value into the current buffer.
+
+Evil version of `sly-eval-print-last-expression' that accounts for
+`evil-move-beyond-eol'."
+ (interactive
+ (list (progn
+ (when (and (not evil-move-beyond-eol)
+ (or (evil-normal-state-p) (evil-motion-state-p)))
+ (unless (or (eobp) (eolp))
+ (forward-char)))
+ (sly-last-expression))))
+ (insert "\n")
+ (sly-eval-print string))
+
+;;;###autoload
+(defun evil-collection-sly-setup ()
+ "Set up `evil' bindings for `sly'."
+ (unless evil-move-beyond-eol
+ (advice-add 'sly-eval-last-expression :around 'evil-collection-sly-last-sexp)
+ (advice-add 'sly-pprint-eval-last-expression :around 'evil-collection-sly-last-sexp)
+ (advice-add 'sly-mrepl-return :around 'evil-collection-sly-last-sexp)
+ (advice-add 'sly-eval-print-last-expression :override 'evil-collection-sly-eval-print-last-expression))
+
+ (evil-collection-define-key 'normal 'sly-db-mode-map
+ [follow-link] 'mouse-face
+ "\C-i" 'sly-db-cycle
+ "g?" 'describe-mode
+ "S" 'sly-db-show-frame-source
+ "e" 'sly-db-eval-in-frame
+ "d" 'sly-db-pprint-eval-in-frame
+ "D" 'sly-db-disassemble
+ "i" 'sly-db-inspect-in-frame
+ "gj" 'sly-db-down
+ "gk" 'sly-db-up
+ (kbd "C-j") 'sly-db-down
+ (kbd "C-k") 'sly-db-up
+ "]]" 'sly-db-details-down
+ "[[" 'sly-db-details-up
+ (kbd "M-j") 'sly-db-details-down
+ (kbd "M-k") 'sly-db-details-up
+ "gg" 'sly-db-beginning-of-backtrace
+ "G" 'sly-db-end-of-backtrace
+ "t" 'sly-db-toggle-details
+ "gr" 'sly-db-restart-frame
+ "I" 'sly-db-invoke-restart-by-name
+ "R" 'sly-db-return-from-frame
+ "c" 'sly-db-continue
+ "s" 'sly-db-step
+ "n" 'sly-db-next
+ "o" 'sly-db-out
+ "b" 'sly-db-break-on-return
+ "a" 'sly-db-abort
+ "q" 'sly-db-quit
+ "A" 'sly-db-break-with-system-debugger
+ "B" 'sly-db-break-with-default-debugger
+ "P" 'sly-db-print-condition
+ "C" 'sly-db-inspect-condition
+ "g:" 'sly-interactive-eval
+ "0" 'sly-db-invoke-restart-0
+ "1" 'sly-db-invoke-restart-1
+ "2" 'sly-db-invoke-restart-2
+ "3" 'sly-db-invoke-restart-3
+ "4" 'sly-db-invoke-restart-4
+ "5" 'sly-db-invoke-restart-5
+ "6" 'sly-db-invoke-restart-6
+ "7" 'sly-db-invoke-restart-7
+ "8" 'sly-db-invoke-restart-8
+ "9" 'sly-db-invoke-restart-9)
+
+ (evil-collection-define-key 'normal 'sly-inspector-mode-map
+ [mouse-6] 'sly-inspector-pop
+ [mouse-7] 'sly-inspector-next
+ ;; TODO: `sly-inspector-next' and `sly-inspector-pop' should probably
+ ;; just be bound to C-i and C-o.
+ "gk" 'sly-inspector-pop
+ (kbd "C-k") 'sly-inspector-pop
+ "[[" 'sly-inspector-pop
+ (kbd "C-o") 'sly-inspector-pop
+ "gj" 'sly-inspector-next
+ (kbd "C-j") 'sly-inspector-next
+ "]]" 'sly-inspector-next
+ (kbd "C-i") 'sly-inspector-next
+ "K" 'sly-inspector-describe-inspectee
+ "e" 'sly-inspector-eval
+ "M-p" 'sly-inspector-history
+ "gr" 'sly-inspector-reinspect
+ "gv" 'sly-inspector-toggle-verbose
+ (kbd "<tab>") 'forward-button
+ (kbd "C-i") 'forward-button
+ (kbd "<S-tab>") 'backward-button ; Emacs translates S-TAB
+ (kbd "<backtab>") 'backward-button ; to BACKTAB on X.
+ "." 'sly-edit-definition
+ "gd" 'sly-edit-definition
+ "gR" 'sly-inspector-fetch-all
+ "q" 'sly-inspector-quit)
+
+ (evil-collection-define-key 'normal 'sly-mode-map
+ (kbd "K") 'sly-describe-symbol
+ (kbd "C-t") 'sly-pop-find-definition-stack
+ ;; goto
+ "gd" 'sly-edit-definition
+ "gz" 'sly-mrepl)
+
+ (when evil-collection-want-find-usages-bindings
+ (evil-collection-define-key 'normal 'sly-mode-map
+ "gr" 'sly-who-references))
+
+ (evil-collection-define-key 'normal 'sly-popup-buffer-mode-map
+ ;; quit
+ "q" 'quit-window
+
+ (kbd "C-t") 'sly-pop-find-definition-stack
+
+ ;; goto
+ "gd" 'sly-edit-definition)
+
+ (evil-collection-inhibit-insert-state 'sly-thread-control-mode-map)
+ (evil-collection-define-key 'normal 'sly-thread-control-mode-map
+ "a" 'sly-thread-attach
+ "d" 'sly-thread-debug
+ "x" 'sly-thread-kill
+ "gr" 'sly-update-threads-buffer)
+
+ (evil-collection-define-key 'normal 'sly-xref-mode-map
+ "q" 'quit-window
+ (kbd "RET") 'sly-xref-goto
+ (kbd "SPC") 'sly-xref-show
+ "go" 'sly-show-xref
+ (kbd "<tab>") 'forward-button
+ (kbd "C-i") 'forward-button
+ (kbd "<S-tab>") 'backward-button ; Emacs translates S-TAB
+ (kbd "<backtab>") 'backward-button ; to BACKTAB on X.
+ "gj" 'sly-xref-next-line
+ "gk" 'sly-xref-prev-line
+ (kbd "C-j") 'sly-xref-next-line
+ (kbd "C-k") 'sly-xref-prev-line
+ "]]" 'sly-xref-next-line
+ "[[" 'sly-xref-prev-line
+ "gr" 'sly-recompile-xref
+ "gR" 'sly-recompile-all-xrefs
+ ;; "r" 'sly-xref-retract ; TODO: Equivalent for Sly?
+ )
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'sly-mrepl-mode-map
+ (kbd "RET") 'sly-mrepl-return)
+ (evil-collection-define-key newline-state 'sly-mrepl-mode-map
+ (kbd "RET") 'newline))
+
+ (evil-collection-define-key 'normal 'sly-mrepl-mode-map
+ "gj" 'sly-mrepl-next-prompt
+ "gk" 'sly-mrepl-previous-prompt
+ (kbd "C-j") 'sly-mrepl-next-prompt
+ (kbd "C-k") 'sly-mrepl-previous-prompt
+ "]]" 'sly-mrepl-next-prompt
+ "[[" 'sly-mrepl-previous-prompt
+ (kbd "C-p") 'sly-mrepl-previous-input-or-button
+ (kbd "C-n") 'sly-mrepl-next-input-or-button)
+
+ (evil-collection-define-key 'normal 'sly-trace-dialog-mode-map
+ "q" 'quit-window
+ "gr" 'sly-trace-dialog-fetch-status
+ "gR" 'sly-trace-dialog-fetch-traces)
+
+ (evil-collection-define-key 'normal 'sly-stickers--replay-mode-map
+ ;; The "n", "p", "x", "h" and "q" key are hard-coded in the description, so
+ ;; we need to set them to the expected command.
+ "gg" 'sly-stickers-replay-jump-to-beginning
+ "G" 'sly-stickers-replay-jump-to-end
+ "F" 'sly-stickers-forget
+ "J" 'sly-stickers-replay-next-for-sticker
+ "K" 'sly-stickers-replay-prev-for-sticker
+ "N" 'sly-stickers-replay-next-for-sticker
+ "P" 'sly-stickers-replay-prev-for-sticker
+ "R" 'sly-stickers-replay-reset-ignore-list
+ "zv" 'sly-stickers-replay-toggle-pop-to-stickers
+ "h" 'sly-stickers-replay-toggle-help
+ "g?" 'sly-stickers-replay-toggle-help
+ "gd" 'sly-stickers-replay-jump
+ "j" 'sly-stickers-replay-next
+ "k" 'sly-stickers-replay-prev
+ "n" 'sly-stickers-replay-next
+ "p" 'sly-stickers-replay-prev
+ "q" 'quit-window
+ "go" 'sly-stickers-replay-pop-to-current-sticker
+ "v" 'sly-stickers-replay-pop-to-current-sticker
+ "x" 'sly-stickers-replay-toggle-ignore-sticker
+ "zi" 'sly-stickers-replay-toggle-ignore-sticker
+ "zz" 'sly-stickers-replay-toggle-ignore-zombies)
+
+ (evil-collection-define-key 'normal 'sly-connection-list-mode-map
+ (kbd "<tab>") 'forward-button
+ (kbd "C-i") 'forward-button
+ (kbd "<S-tab>") 'backward-button
+ (kbd "<backtab>") 'backward-button
+ (kbd "RET") 'sly-connection-list-default-action
+ "R" 'sly-restart-connection-at-point
+ "d" 'sly-connection-list-make-default
+ "x" 'sly-quit-connection-at-point
+ "gr" 'sly-update-connection-list
+ "o" 'tabulated-list-sort
+ "q" 'quit-window)
+
+ (add-hook 'sly-popup-buffer-mode-hook #'evil-normalize-keymaps))
+
+(provide 'evil-collection-sly)
+;;; evil-collection-sly.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/smerge-mode/README.org b/.config/emacs/lisp/evil-collection/modes/smerge-mode/README.org
new file mode 100644
index 0000000..44871a7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/smerge-mode/README.org
@@ -0,0 +1,16 @@
+* smerge
+
+ The table below shows the binding changes that are made to smerge-mode.
+
+| Command | Original Binding | evil-collection-smerge |
+|----------------------------+------------------+------------------------|
+| =smerge-next= | =C-c ^ n= | =gj, ]]= |
+| =smerge-prev= | =C-c ^ p= | =gk, [[= |
+| =smerge-keep-all= | =C-c ^ a= | =ga= |
+| =smerge-keep-upper= | =C-c ^ u= | =gu= |
+| =smerge-keep-lower= | =C-c ^ l= | =gl= |
+| =smerge-keep-other= | =C-c ^ o= | =go= |
+| =smerge-keep-mine= | =C-c ^ m= | =gm= |
+| =smerge-combine-with-next= | =C-c ^ C= | =gc= |
+| =smerge-refine= | =C-c ^ R= | =gr= |
+| =smerge-keep-base= | =C-c ^ b= | =gb= |
diff --git a/.config/emacs/lisp/evil-collection/modes/smerge-mode/evil-collection-smerge-mode.el b/.config/emacs/lisp/evil-collection/modes/smerge-mode/evil-collection-smerge-mode.el
new file mode 100644
index 0000000..fa939c5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/smerge-mode/evil-collection-smerge-mode.el
@@ -0,0 +1,54 @@
+;;; evil-collection-smerge-mode.el --- Bindings for `smerge-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 pspiagicw
+
+;; Author: pspiagicw <pspiagicw@gmail.com>
+;; Maintainer: pspiagicw <pspiagicw@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, python, tools, emacs
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `smerge-mode'.
+;;; Code:
+(require 'evil-collection)
+(require 'smerge-mode)
+;;
+
+(defconst evil-collection-smerge-mode-maps '(smerge-mode-map))
+
+;;;###autoload
+(defun evil-collection-smerge-mode-setup ()
+ "Setup up `evil' bindings for `smerge-mode'."
+ (add-hook 'smerge-mode-hook #'evil-normalize-keymaps)
+ (evil-collection-define-key 'normal 'smerge-mode-map
+ "gj" 'smerge-next
+ "]]" 'smerge-next
+ "gk" 'smerge-prev
+ "[[" 'smerge-prev
+ "gr" 'smerge-resolve
+ "ga" 'smerge-keep-all
+ "gu" 'smerge-keep-upper
+ "gl" 'smerge-keep-lower
+ "go" 'smerge-keep-other
+ "gm" 'smerge-keep-mine
+ "gc" 'smerge-combine-with-next
+ "gR" 'smerge-refine
+ "gb" 'smerge-keep-base))
+
+(provide 'evil-collection-smerge-mode)
+;;; evil-collection-smerge-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/snake/README.org b/.config/emacs/lisp/evil-collection/modes/snake/README.org
new file mode 100644
index 0000000..0234ac4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/snake/README.org
@@ -0,0 +1,16 @@
+* snake
+
+ Evil bindings for =snake=, the built-in implementation of the classic arcade game.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------+------------------+-----------|
+ | =snake-move-left= | =<left>=, =C-b= | =h= |
+ | =snake-move-right= | =<right>=, =C-f= | =l= |
+ | =snake-move-down= | =<down>=, =C-n= | =j= |
+ | =snake-move-up= | =<up>=, =C-p= | =k= |
+ | =snake-start-game= | =n= | =gr= |
+ | =snake-pause-game= | =p= | =p= |
+ | =snake-end-game= | =q= | =ZZ= |
+ | =quit-window= | n/a | =q=, =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/snake/evil-collection-snake.el b/.config/emacs/lisp/evil-collection/modes/snake/evil-collection-snake.el
new file mode 100644
index 0000000..f1fc86e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/snake/evil-collection-snake.el
@@ -0,0 +1,50 @@
+;;; evil-collection-snake.el --- Bindings for `snake' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+;; Copyright (C) 2022 Farzin Firouzi
+
+;; Author: Farzin Firouzi <farzineff@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `snake'.
+
+;;; Code:
+(require 'evil-collection)
+
+(defconst evil-collection-snake-maps '(snake-mode-map))
+
+;;;###autoload
+(defun evil-collection-snake-setup ()
+ "Set up `evil' bindings for `snake'."
+ (evil-set-initial-state 'snake-mode 'normal)
+ (evil-collection-define-key 'normal 'snake-mode-map
+ "h" 'snake-move-left
+ "l" 'snake-move-right
+ "j" 'snake-move-down
+ "k" 'snake-move-up
+ "gr" 'snake-start-game
+ "p" 'snake-pause-game
+ "q" 'quit-window
+ "ZQ" 'quit-window
+ "ZZ" 'snake-end-game))
+
+(provide 'evil-collection-snake)
+;;; evil-collection-snake.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/so-long/README.org b/.config/emacs/lisp/evil-collection/modes/so-long/README.org
new file mode 100644
index 0000000..f8ff959
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/so-long/README.org
@@ -0,0 +1,22 @@
+* so-long
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/So-Long.html][so-long]], which mitigates performance problems in buffers with very long lines.
+
+** Key bindings
+
+ Normal and visual state bindings added to =so-long-mode-map=. The defaults
+ make motion respect visual lines, matching how so-long buffers are usually
+ read.
+
+ | Command | Original | Evil |
+ |---------------------------------------+----------+-----------|
+ | =evil-next-visual-line= | n/a | =j= |
+ | =evil-previous-visual-line= | n/a | =k= |
+ | =evil-next-line= | n/a | =gj= |
+ | =evil-previous-line= | n/a | =gk= |
+ | =evil-beginning-of-visual-line= | n/a | =0=, =g0= |
+ | =evil-end-of-visual-line= | n/a | =$= |
+ | =evil-end-of-line= | n/a | =g$= |
+ | =evil-first-non-blank-of-visual-line= | n/a | =^= |
+ | =evil-first-non-blank= | n/a | =g^= |
+ | =end-of-buffer= | n/a | =G= |
diff --git a/.config/emacs/lisp/evil-collection/modes/so-long/evil-collection-so-long.el b/.config/emacs/lisp/evil-collection/modes/so-long/evil-collection-so-long.el
new file mode 100644
index 0000000..81500a7
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/so-long/evil-collection-so-long.el
@@ -0,0 +1,51 @@
+;;; evil-collection-so-long.el --- Bindings for `so-long' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for so-long.
+
+;;; Code:
+(require 'evil-collection)
+(require 'so-long nil t)
+
+(defvar so-long-mode-map)
+(defconst evil-collection-so-long-maps '(so-long-mode-map))
+
+(defun evil-collection-so-long-setup ()
+ "Set up `evil' bindings for so-long."
+ (evil-collection-define-key '(normal visual) 'so-long-mode-map
+ "j" #'evil-next-visual-line
+ "k" #'evil-previous-visual-line
+ "gj" #'evil-next-line
+ "gk" #'evil-previous-line
+ "0" #'evil-beginning-of-visual-line
+ "g0" #'evil-beginning-of-visual-line
+ "$" #'evil-end-of-visual-line
+ "g$" #'evil-end-of-line
+ "^" #'evil-first-non-blank-of-visual-line
+ "g^" #'evil-first-non-blank
+ "G" 'end-of-buffer))
+
+(provide 'evil-collection-so-long)
+;;; evil-collection-so-long.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/speedbar/README.org b/.config/emacs/lisp/evil-collection/modes/speedbar/README.org
new file mode 100644
index 0000000..81a39b4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/speedbar/README.org
@@ -0,0 +1,61 @@
+* speedbar
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/speedbar/index.html][speedbar]], the everything browser sidebar.
+
+** Key bindings
+
+*** speedbar-mode-map
+
+ | Command | Original | Evil |
+ |------------------------------------------+------------+-------|
+ | =speedbar-next= | =n= | =j= |
+ | =speedbar-prev= | =p= | =k= |
+ | =evil-goto-first-line= | n/a | =gg= |
+ | =evil-goto-line= | n/a | =G= |
+ | =speedbar-refresh= | =g= | =gr= |
+ | =speedbar-edit-line= | =RET=, =e= | =RET= |
+ | =speedbar-toggle-line-expansion= | =SPC= | =TAB= |
+ | =speedbar-expand-line= | =+= | =zo= |
+ | =speedbar-expand-line-descendants= | =[= | =zO= |
+ | =speedbar-contract-line= | =-= | =zc= |
+ | =speedbar-contract-line-descendants= | =]= | =zC= |
+ | =speedbar-toggle-show-all-files= | n/a | =a= |
+ | =speedbar-toggle-updates= | =t= | =t= |
+ | =speedbar-toggle-images= | n/a | =i= |
+ | =speedbar-toggle-sorting= | n/a | =o= |
+ | =speedbar-restricted-next= | =M-n= | =M-j= |
+ | =speedbar-restricted-prev= | =M-p= | =M-k= |
+ | =speedbar-forward-list= | =M-C-n= | =]]= |
+ | =speedbar-backward-list= | =M-C-p= | =[[= |
+ | =switch-to-quick-buffers= | =b= | =b= |
+ | =switch-to-files= | =f= | =f= |
+ | =speedbar-change-initial-expansion-list= | n/a | =J= |
+
+*** speedbar-file-key-map
+
+ | Command | Original | Evil |
+ |-------------------------------+----------+----------|
+ | =speedbar-item-byte-compile= | =B= | =B= |
+ | =speedbar-item-copy= | =C= | =C= |
+ | =speedbar-item-delete= | =D= | =D= |
+ | =speedbar-item-info= | =I= | =I= |
+ | =speedbar-item-object-delete= | =O= | =K= |
+ | =speedbar-item-load= | =L= | =L= |
+ | =speedbar-item-rename= | =R= | =R= |
+ | =speedbar-create-directory= | =M= | =+= |
+ | =speedbar-up-directory= | =U= | =^=, =-= |
+
+*** speedbar-buffers-key-map
+
+ | Command | Original | Evil |
+ |---------------------------------+----------+------|
+ | =speedbar-buffer-kill-buffer= | =k= | =K= |
+ | =speedbar-buffer-revert-buffer= | =r= | =gr= |
+
+** New commands
+
+ | Command | Key |
+ |--------------------------------------------------------------+--------------|
+ | =evil-collection-speedbar-switch-to-previous-expansion-list= | =C-p=, =C-n= |
+ | =evil-collection-speedbar-switch-to-quick-buffers= | =b= |
+ | =evil-collection-speedbar-switch-to-files= | =f= |
diff --git a/.config/emacs/lisp/evil-collection/modes/speedbar/evil-collection-speedbar.el b/.config/emacs/lisp/evil-collection/modes/speedbar/evil-collection-speedbar.el
new file mode 100644
index 0000000..5abc28b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/speedbar/evil-collection-speedbar.el
@@ -0,0 +1,110 @@
+;;; evil-collection-speedbar.el --- Evil bindings for speedbar -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, speedbar, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for speedbar.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'speedbar)
+
+(defconst evil-collection-speedbar-maps '(speedbar-mode-map
+ speedbar-file-key-map
+ speedbar-buffers-key-map))
+
+(defun evil-collection-speedbar-switch-to-previous-expansion-list ()
+ "Back to previously used expansion list."
+ (interactive)
+ (speedbar-change-initial-expansion-list speedbar-previously-used-expansion-list-name))
+
+(defun evil-collection-speedbar-switch-to-quick-buffers ()
+ "Switch to quick-buffers expansion list."
+ (interactive)
+ (speedbar-change-initial-expansion-list "quick buffers"))
+
+(defun evil-collection-speedbar-switch-to-files ()
+ "Switch to files expansion list."
+ (interactive)
+ (speedbar-change-initial-expansion-list "files"))
+
+;;;###autoload
+(defun evil-collection-speedbar-setup ()
+ "Set up `evil' bindings for `speedbar'."
+ (evil-set-initial-state 'speedbar-mode 'normal)
+ (evil-collection-define-key 'normal 'speedbar-mode-map
+ "j" 'speedbar-next
+ "k" 'speedbar-prev
+ "gr" 'speedbar-refresh
+ "gg" 'evil-goto-first-line
+ "G" 'evil-goto-line
+
+ ;; Basic tree features
+ (kbd "RET") 'speedbar-edit-line
+ (kbd "TAB") 'speedbar-toggle-line-expansion
+
+ ;; Fold
+ "zo" 'speedbar-expand-line
+ "zO" 'speedbar-expand-line-descendants
+ "zc" 'speedbar-contract-line
+ "zC" 'speedbar-contract-line-descendants
+
+ ;; Toggle
+ "a" 'speedbar-toggle-show-all-files
+ "t" 'speedbar-toggle-updates
+ "i" 'speedbar-toggle-images
+ "o" 'speedbar-toggle-sorting
+
+ ;; Navigation
+ (kbd "M-j") 'speedbar-restricted-next
+ (kbd "M-k") 'speedbar-restricted-prev
+ "]]" 'speedbar-forward-list
+ "[[" 'speedbar-backward-list
+ (kbd "C-p") 'evil-collection-speedbar-switch-to-previous-expansion-list
+ (kbd "C-n") 'evil-collection-speedbar-switch-to-previous-expansion-list
+ "b" 'evil-collection-speedbar-switch-to-quick-buffers
+ "f" 'evil-collection-speedbar-switch-to-files
+ "J" 'speedbar-change-initial-expansion-list)
+
+ (evil-collection-define-key 'normal 'speedbar-file-key-map
+ ;; File based commands
+ "B" 'speedbar-item-byte-compile
+ "C" 'speedbar-item-copy
+ "D" 'speedbar-item-delete
+ "I" 'speedbar-item-info
+ "K" 'speedbar-item-object-delete
+ "L" 'speedbar-item-load
+ "R" 'speedbar-item-rename
+ "+" 'speedbar-create-directory
+ "^" 'speedbar-up-directory
+ "-" 'speedbar-up-directory)
+
+ (evil-collection-define-key 'normal 'speedbar-buffers-key-map
+ ;; Buffer specific keybindings
+ "K" 'speedbar-buffer-kill-buffer
+ "gr" 'speedbar-buffer-revert-buffer))
+
+(provide 'evil-collection-speedbar)
+;;; evil-collection-speedbar.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tab-bar/README.org b/.config/emacs/lisp/evil-collection/modes/tab-bar/README.org
new file mode 100644
index 0000000..70f8f43
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tab-bar/README.org
@@ -0,0 +1,15 @@
+* tab-bar
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Tab-Bars.html][tab-bar]]. Only =tab-switcher-mode-map= (the =M-x tab-switcher= list) is touched; the global =tab-bar-mode= itself has no buffer-local map to rebind.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------+-----------------+-----------------|
+ | =tab-switcher-next-line= | =n=, =SPC= | =j=, =gj= |
+ | =tab-switcher-prev-line= | =p= | =k=, =gk= |
+ | =tab-switcher-delete= | =d=, =k=, =C-k= | =d= |
+ | =tab-switcher-select= | =RET= | =RET= |
+ | =tab-switcher-unmark= | =u= | =u= |
+ | =tab-switcher-execute= | =x= | =x= |
+ | =quit-window= | =q= | =q=, =ZZ=, =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/tab-bar/evil-collection-tab-bar.el b/.config/emacs/lisp/evil-collection/modes/tab-bar/evil-collection-tab-bar.el
new file mode 100644
index 0000000..9e2500c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tab-bar/evil-collection-tab-bar.el
@@ -0,0 +1,59 @@
+;;; evil-collection-tab-bar.el --- Evil bindings for tab-bar -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, tab-bar, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for tab-bar.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'tab-bar nil t)
+
+(defconst evil-collection-tab-bar-maps '(tab-switcher-mode-map))
+
+(defun evil-collection-tab-bar-setup ()
+ "Set up `evil' bindings to `tab-bar'."
+ (evil-set-initial-state 'tab-switcher-mode 'normal)
+ (evil-collection-define-key 'normal 'tab-switcher-mode-map
+ ;; Movement
+ "j" 'tab-switcher-next-line
+ "k" 'tab-switcher-prev-line
+ "gj" 'tab-switcher-next-line
+ "gk" 'tab-switcher-prev-line
+
+ ;; Mark
+ "d" 'tab-switcher-delete
+ (kbd "RET") 'tab-switcher-select
+ "u" 'tab-switcher-unmark
+ "x" 'tab-switcher-execute
+
+ ;; Quit
+ "q" 'quit-window
+ "ZZ" 'quit-window
+ "ZQ" 'quit-window))
+
+(provide 'evil-collection-tab-bar)
+
+;;; evil-collection-tab-bar.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tablist/evil-collection-tablist.el b/.config/emacs/lisp/evil-collection/modes/tablist/evil-collection-tablist.el
new file mode 100644
index 0000000..0781c1c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tablist/evil-collection-tablist.el
@@ -0,0 +1,64 @@
+;;; evil-collection-tablist.el --- Evil bindings for Tablist -*- lexical-binding: t -*-
+
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tablist, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Tablist.
+
+;;; Code:
+(require 'tablist nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-tablist-maps '(tablist-mode-map tablist-minor-mode-map))
+
+(defvar tablist-mode-regexp-map)
+(defvar tablist-mode-mark-map)
+(defvar tablist-mode-filter-map)
+
+;;;###autoload
+(defun evil-collection-tablist-setup ()
+ "Set up `evil' bindings for `tablist'."
+
+ (let ((common-bindings
+ (list
+ "U" 'tablist-unmark-all-marks
+ "g%" tablist-mode-regexp-map
+ "g*" tablist-mode-mark-map
+ "g/" tablist-mode-filter-map
+ "gr" 'tablist-revert
+ "K" 'tablist-do-kill-lines
+ "m" 'tablist-mark-forward
+ "S" 'tablist-sort
+ "t" 'tablist-toggle-marks
+ "u" 'tablist-unmark-forward)))
+
+ (apply #'evil-collection-define-key 'normal 'tablist-mode-map
+ (kbd "RET") 'tablist-find-entry
+ "d" 'tablist-flag-forward
+ "f" 'tablist-find-entry
+ "X" 'tablist-do-delete
+ "x" 'tablist-do-flagged-delete
+ common-bindings)
+
+ (apply #'evil-collection-define-key 'normal 'tablist-minor-mode-map
+ "q" 'tablist-quit
+ common-bindings)))
+
+(provide 'evil-collection-tablist)
+;;; evil-collection-tablist.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tabulated-list/README.org b/.config/emacs/lisp/evil-collection/modes/tabulated-list/README.org
new file mode 100644
index 0000000..f405393
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tabulated-list/README.org
@@ -0,0 +1,20 @@
+* tabulated-list
+
+ Evil bindings for =tabulated-list-mode=, the parent mode behind package menu, process list, bookmark list, and many other list-based buffers.
+
+** Key bindings
+
+ =n= and =p= are unbound so they fall through to evil motion. The default
+ =g= (revert) and =S= (sort) are kept; column commands move under the =g=
+ prefix.
+
+ | Command | Original | Evil |
+ |----------------------------------------+-------------+------|
+ | =tabulated-list-sort= | =S= | =S= |
+ | =tabulated-list-narrow-current-column= | ={= | ={= |
+ | =tabulated-list-widen-current-column= | =}= | =}= |
+ | =tabulated-list-next-column= | =M-<right>= | =gl= |
+ | =tabulated-list-previous-column= | =M-<left>= | =gh= |
+ | =quit-window= | =q= | =q= |
+ | =next-line= (unbound) | =n= | n/a |
+ | =previous-line= (unbound) | =p= | n/a |
diff --git a/.config/emacs/lisp/evil-collection/modes/tabulated-list/evil-collection-tabulated-list.el b/.config/emacs/lisp/evil-collection/modes/tabulated-list/evil-collection-tabulated-list.el
new file mode 100644
index 0000000..081adb5
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tabulated-list/evil-collection-tabulated-list.el
@@ -0,0 +1,54 @@
+;;; evil-collection-tabulated-list.el --- Bindings for `tabulated-list' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Morgan Smith <Morgan.J.Smith@outlook.com>
+
+;; Author: Morgan Smith <Morgan.J.Smith@outlook.com>
+;; Maintainer: Morgan Smith <Morgan.J.Smith@outlook.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `tabulated-list'
+
+;;; Code:
+(require 'evil-collection)
+(require 'tabulated-list)
+
+(defvar tabulated-list-mode-map)
+
+(defconst evil-collection-tabulated-list-maps '(tabulated-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-tabulated-list-setup ()
+ "Set up `evil' bindings for `tabulated-list'."
+
+ (evil-collection-define-key nil 'tabulated-list-mode-map
+ "n" nil
+ "p" nil)
+
+ (evil-set-initial-state 'tabulated-list-mode 'normal)
+ (evil-collection-define-key 'normal 'tabulated-list-mode-map
+ "S" 'tabulated-list-sort
+ "{" 'tabulated-list-narrow-current-column
+ "}" 'tabulated-list-widen-current-column
+ "gl" 'tabulated-list-next-column
+ "gh" 'tabulated-list-previous-column
+ "q" 'quit-window))
+
+(provide 'evil-collection-tabulated-list)
+;;; evil-collection-tabulated-list.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tar-mode/README.org b/.config/emacs/lisp/evil-collection/modes/tar-mode/README.org
new file mode 100644
index 0000000..fbb0da6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tar-mode/README.org
@@ -0,0 +1,27 @@
+* tar-mode
+
+ Evil bindings for =tar-mode=, the built-in tar archive browser.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------------+-----------------------------+--------------------|
+ | =tar-next-line= | =n=, =SPC=, =C-n=, =<down>= | =j=, =gj=, =C-j= |
+ | =tar-previous-line= | =p=, =C-p=, =<up>= | =k=, =gk=, =C-k= |
+ | =beginning-of-buffer= | n/a | =gg= |
+ | =end-of-buffer= | n/a | =G= |
+ | =tar-extract= | =RET=, =e=, =f= | =RET= |
+ | =tar-extract-other-window= | =o=, =E= | =go=, =S-<return>= |
+ | =tar-view= | =v= | =gO=, =M-<return>= |
+ | =tar-flag-deleted= | =d=, =C-d= | =d= |
+ | =tar-rename-entry= | =R= | =r= |
+ | =tar-expunge= | =x= | =x= |
+ | =tar-chmod-entry= | =M= | =M= |
+ | =tar-chgrp-entry= | =G= | =P= |
+ | =tar-chown-entry= | =O= | =O= |
+ | =revert-buffer= | =g= | =gr= |
+ | =tar-new-entry= | =I= | =I= |
+ | =tar-copy= | =C= | =C= |
+ | =tar-unflag= | =u= | =u= |
+ | =tar-clear-modification-flags= | n/a | =U= |
+ | =quit-window= | n/a | =q= |
diff --git a/.config/emacs/lisp/evil-collection/modes/tar-mode/evil-collection-tar-mode.el b/.config/emacs/lisp/evil-collection/modes/tar-mode/evil-collection-tar-mode.el
new file mode 100644
index 0000000..5df995d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tar-mode/evil-collection-tar-mode.el
@@ -0,0 +1,81 @@
+;;; evil-collection-tar-mode.el --- Evil bindings for tar-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 Michael Arndt
+
+;; Author: 0x28
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tar-mode, archive, bindings, files
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Evil bindings for `tar-mode'.
+
+;;; Code:
+(require 'tar-mode)
+(require 'evil-collection)
+
+(defconst evil-collection-tar-mode-maps '(tar-mode-map))
+
+;;;###autoload
+(defun evil-collection-tar-mode-setup ()
+ "Set up `evil' bindings for `tar-mode'."
+ (evil-set-initial-state 'tar-mode 'normal)
+ (evil-collection-define-key 'normal 'tar-mode-map
+ "j" 'tar-next-line
+ "k" 'tar-previous-line
+ (kbd "C-j") 'tar-next-line
+ (kbd "C-k") 'tar-previous-line
+ "gj" 'tar-next-line
+ "gk" 'tar-previous-line
+
+ "gg" 'beginning-of-buffer
+ "G" 'end-of-buffer
+
+ ;; open
+ (kbd "RET") 'tar-extract
+ (kbd "S-<return>") 'tar-extract-other-window
+ (kbd "M-<return>") 'tar-view
+ "go" 'tar-extract-other-window
+ "gO" 'tar-view
+
+ "d" 'tar-flag-deleted
+ "r" 'tar-rename-entry
+ "x" 'tar-expunge
+ "M" 'tar-chmod-entry
+ "P" 'tar-chgrp-entry
+ "O" 'tar-chown-entry
+
+ ;; refresh
+ "gr" 'revert-buffer
+
+ ;; create
+ "I" 'tar-new-entry
+
+ ;; write
+ "C" 'tar-copy
+
+ ;; mark
+ "u" 'tar-unflag
+ "U" 'tar-clear-modification-flags
+
+ ;; quit
+ "q" 'quit-window))
+
+(provide 'evil-collection-tar-mode)
+;;; evil-collection-tar-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/telega/evil-collection-telega.el b/.config/emacs/lisp/evil-collection/modes/telega/evil-collection-telega.el
new file mode 100644
index 0000000..2fcbd00
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/telega/evil-collection-telega.el
@@ -0,0 +1,218 @@
+;;; evil-collection-telega.el --- Evil bindings for telega -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Ruoyu Feng
+
+;; Author: Ruoyu Feng <mail@vonfry.name>
+;; Maintainer: James Nguyen <james@jojojames.com>, Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.6
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, telegram, telega
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for telega.
+
+;;; Code:
+(require 'telega nil t)
+(require 'evil-collection)
+
+(defvar telega-prefix-map)
+(defvar telega-filter-map)
+(defvar telega-sort-map)
+(defvar telega-chatbuf-fastnav-map)
+(defvar telega-describe-map)
+(defvar telega-folder-map)
+(defvar telega-voip-map)
+(defvar telega-root-view-map)
+(defvar telega-root-fastnav-map)
+
+(defconst evil-collection-telega-maps '(telega-root-mode-map
+ telega-chat-mode-map
+ telega-image-mode-map
+ telega-webpage-mode-map
+ telega-user-button-map
+ telega-msg-button-map
+ telega-chat-button-map
+ telega-sticker-button-map))
+
+(defconst evil-collection-telega-modes '(telega-root-mode
+ telega-chat-mode
+ telega-image-mode
+ telega-webpage-mode))
+
+;;;###autoload
+(defun evil-collection-telega-setup ()
+ "Set up `evil' bindings for `telega'."
+ (evil-collection-set-readonly-bindings 'telega-root-mode-map)
+
+ (dolist (mode evil-collection-telega-modes)
+ (evil-set-initial-state mode 'normal))
+
+ (evil-collection-define-key 'normal 'telega-root-mode-map
+ "j" 'evil-next-line
+ "k" 'evil-previous-line
+
+ "ga" telega-prefix-map
+
+ (kbd "<tab>") 'telega-button-forward
+ (kbd "<backtab>") 'telega-button-backward
+
+ "S" telega-sort-map
+ "s" telega-filter-map
+ "_" 'telega-filter-undo
+ "-" 'telega-filter-redo
+
+ "c" 'telega-chat-join-by-link
+ "C" 'telega-chat-create
+ "D" 'telega-chats-filtered-kill-chatbuf
+ "R" 'telega-chats-filtered-toggle-read
+
+ "q" 'bury-buffer
+ "Q" 'telega-kill
+
+ "g?" telega-describe-map
+ "gO" telega-folder-map
+ "gC" telega-voip-map
+ "gV" telega-root-view-map
+ "J" telega-root-fastnav-map
+
+ "gs" 'telega-view-search)
+
+ (evil-collection-define-key 'normal 'telega-chat-mode-map
+ "ga" telega-prefix-map
+ "gA" telega-chatbuf-fastnav-map
+
+ "zz" 'telega-chatbuf-recenter-1
+
+ "^" 'telega-chatbuf-beginning-of-thing
+
+ "g?" 'telega-describe-chat
+
+ "Za" 'telega-chatbuf-attach
+ "Zf" 'telega-chatbuf-attach-media
+ "Zv" 'telega-chatbuf-attach-clipboard
+
+ "s" 'telega-chatbuf-filter
+ "_" 'telega-chatbuf-filter-cancel
+ "S" 'telega-chatbuf-filter-search
+
+ (kbd "<tab>") 'telega-chatbuf-complete-or-next-link
+ (kbd "<backtab>") 'telega-chatbuf-prev-link
+
+ "q" 'quit-window)
+
+ (let* ((submit evil-collection-repl-submit-state)
+ (newline-state (if (eq submit 'normal) 'insert 'normal)))
+ (evil-collection-define-key submit 'telega-chat-mode-map
+ (kbd "RET") 'telega-chatbuf-newline-or-input-send)
+ (evil-collection-define-key newline-state 'telega-chat-mode-map
+ (kbd "RET") 'newline))
+
+ (evil-collection-define-key 'normal 'telega-image-mode-map
+ "ga" telega-prefix-map
+
+ "}" 'telega-image-next
+ "{" 'telega-image-prev
+ "q" 'telega-image-quit)
+
+ (evil-collection-define-key 'normal 'telega-webpage-mode-map
+ "ga" telega-prefix-map
+
+ "gx" 'telega-webpage-browse-url
+ "yy" 'telega-webpage-copy-url
+ "(" 'telega-webpage-history-prev
+ ")" 'telega-webpage-history-next
+ (kbd "<tab>") 'telega-button-forward
+ (kbd "<backtab>") 'telega-button-backward)
+
+ (evil-collection-set-readonly-bindings 'telega-user-button-map)
+ ; We have to set keybinds for emacs instead of normal state because normal
+ ; states takes no effects on buttons and remove the default bindings.
+ ; ref: emacs-evil/evil#1477
+ (evil-collection-define-key nil 'telega-user-button-map
+ "B" nil
+ "K" nil
+ (kbd "DEL") nil
+
+ "g?" 'telega-describe-user
+ "m" 'telega-user-chat-with
+ "D" 'telega-user-block)
+
+ (evil-collection-set-readonly-bindings 'telega-msg-button-map)
+ (evil-collection-define-key nil 'telega-msg-button-map
+ "c" nil
+ "d" nil
+ "e" nil
+ "f" nil
+ "k" nil
+ "l" nil
+ "m" nil
+ "n" nil
+ "p" nil
+ "^" nil
+ (kbd "DEL") nil
+ "*" nil
+
+ "D" 'telega-msg-delete-dwim
+ "dd" 'telega-msg-delete-dwim
+ "i" 'telega-msg-edit
+ "g?" 'telega-describe-message
+ "a" 'telega-msg-mark-toggle
+ (kbd "<tab>") 'telega-button-forward
+ (kbd "<backtab>") 'telega-button-backward
+ "R" 'telega-msg-forward-dwim
+ "r" 'telega-msg-reply
+ "gr" 'telega-msg-open-thread-or-topic
+
+ "Zy" 'telega-msg-copy-text
+ "Zl" 'telega-msg-copy-link
+ "ds" 'telega-msg-ban-sender
+ "ZL" 'telega-msg-redisplay
+ "P" 'telega-msg-pin-toggle
+ "ZR" 'telega-msg-resend
+ "S" 'telega-msg-save
+ "u" 'telega-msg-unmark
+ "U" 'telega-chatbuf-msg-marks-toggle
+ "=" 'telega-msg-diff-edits
+ "s" 'telega-msg-favorite-toggle)
+
+ (evil-collection-set-readonly-bindings 'telega-chat-button-map)
+ (evil-collection-define-key nil 'telega-chat-button-map
+ "i" nil
+ "d" nil
+ "^" nil
+ (kbd "DEL") nil
+
+ "g?" 'telega-describe-chat
+ "a" 'telega-chat-add-member
+ "o" 'telega-chat-set-custom-order
+ "r" 'telega-chat-toggle-read
+ "P" 'telega-chat-toggle-pin
+ "C" 'telega-chat-call
+ "D" 'telega-chat-delete)
+
+ (evil-collection-set-readonly-bindings 'telega-sticker-button-map)
+ (evil-collection-define-key nil 'telega-sticker-button-map
+ "f" nil
+ "*" nil
+ "i" nil
+ "h" nil
+
+ "t" 'telega-sticker-toggle-favorite
+ "g?" 'telega-sticker-help))
+
+(provide 'evil-collection-telega)
+;;; evil-collection-telega.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/term/README.org b/.config/emacs/lisp/evil-collection/modes/term/README.org
new file mode 100644
index 0000000..aa7fcc2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/term/README.org
@@ -0,0 +1,55 @@
+* term
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Terminal-emulator.html][term]] and =ansi-term=, also usable with =multi-term=.
+
+ Insert state corresponds to =term-char-mode=, normal state to =term-line-mode=.
+ When =evil-collection-term-sync-state-and-mode-p= is non-nil the mode and
+ state switch in lockstep.
+
+** Key bindings
+
+*** term-raw-map (insert state)
+
+ Restores raw passthrough for control characters evil otherwise intercepts.
+
+ | Command | Original | Evil |
+ |---------------------------------+-----------+-------------------------------------------------------------------------------------------------------------------------------------|
+ | =term-send-raw= | (default) | =C-a=, =C-b=, =C-d=, =C-e=, =C-f=, =C-k=, =C-l=, =C-n=, =C-o=, =C-p=, =C-q=, =C-r=, =C-s=, =C-t=, =C-u=, =C-v=, =C-w=, =C-y=, =C-z= |
+ | =evil-collection-term-send-tab= | n/a | =<tab>= |
+ | =term-send-eof= | =C-c C-d= | =C-c C-d= |
+ | =term-stop-subjob= | =C-c C-z= | =C-c C-z= |
+
+*** term-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |-----------------------------------------+-----------+------------------------------------------------|
+ | =evil-collection-term-char-mode-insert= | n/a | =C-c C-k= |
+ | =term-paste= | =C-c C-y= | =p= |
+ | =term-previous-prompt= | =C-c C-p= | =[[=, =C-k=, =gk= |
+ | =term-next-prompt= | =C-c C-n= | =]]=, =C-j=, =gj= |
+ | =term-bol= | =C-a= | =^= |
+ | =term-show-maximum-output= | =M-> = | =$= |
+ | =term-send-input= | =RET= | =RET= (in =evil-collection-repl-submit-state=) |
+
+** New commands
+
+ | Command | Description |
+ |------------------------------------------------------+-----------------------------------------------------------|
+ | =evil-collection-term-char-mode-insert= | switch to =term-char-mode= and insert state |
+ | =evil-collection-term-send-tab= | send a literal TAB through =term-send-raw-string= |
+ | =evil-collection-term-escape-stay= | hook that disables backwards cursor on normal-state entry |
+ | =evil-collection-term-sync-state-and-mode= | hook that ties insert/normal to char/line mode |
+ | =evil-collection-term-switch-to-char-mode-on-insert= | default sync function |
+ | =evil-collection-term-char-mode-entry-function= | alternative sync function that only flips at the prompt |
+
+** Customization
+
+ | Variable | Default |
+ |----------------------------------------------+------------------------------------------------------|
+ | =evil-collection-term-sync-state-and-mode-p= | =t= |
+ | =evil-collection-term-sync-state-function= | =evil-collection-term-switch-to-char-mode-on-insert= |
+
+** Integrations
+
+ - =multi-term=: =M-DEL= sends =term-send-backward-kill-word= in both
+ normal state on =term-mode-map= and insert state on =term-raw-map=.
diff --git a/.config/emacs/lisp/evil-collection/modes/term/evil-collection-term.el b/.config/emacs/lisp/evil-collection/modes/term/evil-collection-term.el
new file mode 100644
index 0000000..bc566fb
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/term/evil-collection-term.el
@@ -0,0 +1,170 @@
+;;; evil-collection-term.el --- Evil bindings for term and ansi-term -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, term, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil integration for `term' and `ansi-term'.
+;; This should also work for other terminal emulators such as `multi-term'.
+;;
+;; Switching to normal state will automatically switch to line mode.
+;; Conversely, switching to insert state will automatically switch to char mode.
+
+;;; Code:
+(require 'evil-collection)
+(require 'term)
+
+(defcustom evil-collection-term-sync-state-and-mode-p t
+ "Synchronize insert/normal state with char/line-mode respectively.
+
+When non-nil, going to normal state will automatically switch to
+line-mode. Conversely, going to insert state on the last
+commandline will automatically switch to char-mode.
+
+Warning: This feature is experimental."
+ :group 'evil-collection-term
+ :type 'boolean)
+
+(defcustom evil-collection-term-sync-state-function
+ 'evil-collection-term-switch-to-char-mode-on-insert
+ "Function used when synchronizing insert/normal state with char/line-mode.
+
+This is only used if `evil-collection-term-sync-state-and-mode-p' is true."
+ :group 'evil-collection-term
+ :type 'function)
+
+;; TODO: Rebinding ESC has the drawback that programs like vi cannot use it anymore.
+;; Workaround: switch to Emacs state and double-press ESC.
+;; Otherwise leave ESC to "C-c C-j".
+;; Or bind char-mode ESC to "C-c C-x"?
+
+;; TODO: Add support for normal-state editing.
+
+(defconst evil-collection-term-maps '(term-raw-map
+ term-mode-map))
+
+(defun evil-collection-term-escape-stay ()
+ "Go back to normal state but don't move cursor backwards.
+Moving cursor backwards is the default Vim behavior but
+it is not appropriate in some cases like terminals."
+ (setq-local evil-move-cursor-back nil))
+
+(defun evil-collection-term-char-mode-insert ()
+ "Switch to `term-char-mode' and enter insert state."
+ (interactive)
+ (term-char-mode)
+ (evil-insert-state))
+
+(defun evil-collection-term-char-mode-entry-function ()
+ "Maybe switch to `term-char-mode' on insert state."
+ (when (get-buffer-process (current-buffer))
+ (let (last-prompt)
+ (save-excursion
+ (goto-char (point-max))
+ (when (= (line-beginning-position) (line-end-position))
+ (ignore-errors (backward-char)))
+ (setq last-prompt (max (term-bol nil) (line-beginning-position))))
+ (when (>= (point) last-prompt)
+ (term-char-mode)))))
+
+(defun evil-collection-term-switch-to-char-mode-on-insert ()
+ "Switch to `term-char-mode' on insert state."
+ (when (get-buffer-process (current-buffer))
+ (term-char-mode)))
+
+(defun evil-collection-term-sync-state-and-mode ()
+ "Sync `term-char-mode' and `term-line-mode' with insert and normal state."
+ (add-hook 'evil-insert-state-entry-hook
+ evil-collection-term-sync-state-function nil t)
+ (add-hook 'evil-insert-state-exit-hook 'term-line-mode nil t))
+
+(defun evil-collection-term-send-tab ()
+ "Send tab in term mode."
+ (interactive)
+ (term-send-raw-string "\t"))
+
+;;;###autoload
+(defun evil-collection-term-setup ()
+ "Set up `evil' bindings for `term'."
+ (evil-set-initial-state 'term-mode 'insert)
+ (if evil-collection-term-sync-state-and-mode-p
+ (add-hook 'term-mode-hook 'evil-collection-term-sync-state-and-mode)
+ (remove-hook 'term-mode-hook 'evil-collection-term-sync-state-and-mode))
+
+ (add-hook 'term-mode-hook 'evil-collection-term-escape-stay)
+
+ ;; Evil has some "C-" bindings in insert state that shadow regular terminal
+ ;; bindings. Don't raw-send "C-c" (prefix key) nor "C-h" (help prefix).
+ (evil-collection-define-key 'insert 'term-raw-map
+ (kbd "C-a") 'term-send-raw
+ (kbd "C-b") 'term-send-raw ; Should not be necessary.
+ (kbd "C-d") 'term-send-raw
+ (kbd "C-e") 'term-send-raw
+ (kbd "C-f") 'term-send-raw ; Should not be necessary.
+ (kbd "C-k") 'term-send-raw
+ (kbd "C-l") 'term-send-raw ; Should not be necessary.
+ (kbd "C-n") 'term-send-raw
+ (kbd "C-o") 'term-send-raw
+ (kbd "C-p") 'term-send-raw
+ (kbd "C-q") 'term-send-raw ; Should not be necessary.
+ (kbd "C-r") 'term-send-raw
+ (kbd "C-s") 'term-send-raw ; Should not be necessary.
+ (kbd "C-t") 'term-send-raw
+ (kbd "C-u") 'term-send-raw ; Should not be necessary.
+ (kbd "C-v") 'term-send-raw ; Should not be necessary.
+ (kbd "C-w") 'term-send-raw
+ (kbd "C-y") 'term-send-raw
+ (kbd "C-z") 'term-send-raw
+ (kbd "<tab>") 'evil-collection-term-send-tab ; Should not be necessary.
+ (kbd "C-c C-d") 'term-send-eof
+ (kbd "C-c C-z") 'term-stop-subjob)
+
+ (let* ((submit evil-collection-repl-submit-state))
+ (evil-collection-define-key submit 'term-mode-map
+ (kbd "RET") 'term-send-input))
+
+ (evil-collection-define-key 'normal 'term-mode-map
+ (kbd "C-c C-k") 'evil-collection-term-char-mode-insert
+
+ (kbd "p") 'term-paste
+
+ ;; motion
+ "[[" 'term-previous-prompt
+ "]]" 'term-next-prompt
+ (kbd "C-k") 'term-previous-prompt
+ (kbd "C-j") 'term-next-prompt
+ "gk" 'term-previous-prompt
+ "gj" 'term-next-prompt
+ ;; "0" 'term-bol ; "0" is meant to really go at the beginning of line.
+ "^" 'term-bol
+ "$" 'term-show-maximum-output)
+
+ ;; https://github.com/emacs-evil/evil-collection/issues/235
+ (with-eval-after-load 'multi-term
+ (evil-collection-define-key 'normal 'term-mode-map
+ (kbd "M-DEL") 'term-send-backward-kill-word)
+ (evil-collection-define-key 'insert 'term-raw-map
+ (kbd "M-DEL") 'term-send-backward-kill-word)))
+
+(provide 'evil-collection-term)
+;;; evil-collection-term.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tetris/README.org b/.config/emacs/lisp/evil-collection/modes/tetris/README.org
new file mode 100644
index 0000000..5adab75
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tetris/README.org
@@ -0,0 +1,18 @@
+* tetris
+
+ Evil bindings for =tetris=, the built-in implementation of the falling-blocks game.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------+-----------+-----------------|
+ | =tetris-move-left= | =<left>= | =h= |
+ | =tetris-move-right= | =<right>= | =l= |
+ | =tetris-rotate-next= | n/a | =k= |
+ | =tetris-rotate-prev= | =<up>= | =K= |
+ | =tetris-move-down= | =<down>= | =j= |
+ | =tetris-move-bottom= | =SPC= | =J=, =G=, =TAB= |
+ | =tetris-start-game= | =n= | =gr= |
+ | =tetris-pause-game= | =p= | =p= |
+ | =tetris-end-game= | =q= | =ZZ= |
+ | =quit-window= | n/a | =q=, =ZQ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/tetris/evil-collection-tetris.el b/.config/emacs/lisp/evil-collection/modes/tetris/evil-collection-tetris.el
new file mode 100644
index 0000000..682b275
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tetris/evil-collection-tetris.el
@@ -0,0 +1,55 @@
+;;; evil-collection-tetris.el --- Bindings for `tetris' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: MaxSt
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `tetris'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'tetris nil t)
+
+(defconst evil-collection-tetris-maps '(tetris-mode-map))
+
+;;;###autoload
+(defun evil-collection-tetris-setup ()
+ "Set up `evil' bindings for `tetris'."
+ (evil-set-initial-state 'tetris-mode 'normal)
+ (evil-collection-define-key 'normal 'tetris-mode-map
+ "h" 'tetris-move-left
+ "l" 'tetris-move-right
+ "k" 'tetris-rotate-next
+ "K" 'tetris-rotate-prev
+ "j" 'tetris-move-down
+ "J" 'tetris-move-bottom
+ "G" 'tetris-move-bottom
+ "gr" 'tetris-start-game
+ (kbd "TAB") 'tetris-move-bottom
+ "p" 'tetris-pause-game
+ "q" 'quit-window
+ "ZQ" 'quit-window
+ "ZZ" 'tetris-end-game))
+
+(provide 'evil-collection-tetris)
+;;; evil-collection-tetris.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/thread/README.org b/.config/emacs/lisp/evil-collection/modes/thread/README.org
new file mode 100644
index 0000000..1b51bed
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/thread/README.org
@@ -0,0 +1,14 @@
+* thread
+
+ Evil bindings for =thread-list-mode=, the built-in =M-x list-threads= buffer.
+
+** Key bindings
+
+ Inherits the standard =tabulated-list-mode= bindings (=S=, ={=, =}=, =gh=,
+ =gl=, =q=). evil-collection only rebinds the thread-specific actions.
+
+ | Command | Original | Evil |
+ |---------------------------------+----------+------|
+ | =thread-list-pop-to-backtrace= | =b= | =B= |
+ | =thread-list-send-quit-signal= | =s q= | =Q= |
+ | =thread-list-send-error-signal= | =s e= | =E= |
diff --git a/.config/emacs/lisp/evil-collection/modes/thread/evil-collection-thread.el b/.config/emacs/lisp/evil-collection/modes/thread/evil-collection-thread.el
new file mode 100644
index 0000000..848b035
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/thread/evil-collection-thread.el
@@ -0,0 +1,45 @@
+;;; evil-collection-thread.el --- Evil bindings for `thread' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `thread'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'thread nil t)
+
+(defconst evil-collection-thread-maps '(thread-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-thread-setup ()
+ "Set up `evil' bindings for `thread'."
+ (evil-set-initial-state 'thread-list-mode 'normal)
+ (evil-collection-define-key 'normal 'thread-list-mode-map
+ "B" 'thread-list-pop-to-backtrace
+ "Q" 'thread-list-send-quit-signal
+ "E" 'thread-list-send-error-signal))
+
+(provide 'evil-collection-thread)
+;;; evil-collection-thread.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tide/evil-collection-tide.el b/.config/emacs/lisp/evil-collection/modes/tide/evil-collection-tide.el
new file mode 100644
index 0000000..abce9c4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tide/evil-collection-tide.el
@@ -0,0 +1,64 @@
+;;; evil-collection-tide.el --- Bindings for `tide-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tide, typescript, languages
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `tide-mode'.
+
+;;; Code:
+(require 'tide nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-tide-maps '(tide-mode-map
+ tide-references-mode-map
+ tide-project-errors-mode-map))
+
+;;;###autoload
+(defun evil-collection-tide-setup ()
+ "Set up `evil' bindings for `tide'."
+ (evil-collection-define-key 'normal 'tide-mode-map
+ "gd" 'tide-jump-to-definition
+ (kbd "C-t") 'tide-jump-back
+ "K" 'tide-documentation-at-point)
+
+ (evil-collection-define-key 'normal 'tide-references-mode-map
+ "gj" 'tide-find-next-reference
+ "gk" 'tide-find-previous-reference
+ (kbd "C-j") 'tide-find-next-reference
+ (kbd "C-k") 'tide-find-previous-reference
+ (kbd "RET") 'tide-goto-line-reference
+ ;; quit
+ "q" 'quit-window)
+
+ (evil-collection-define-key 'normal 'tide-project-errors-mode-map
+ "gj" 'tide-find-next-error
+ "gk" 'tide-find-previous-error
+ (kbd "C-j") 'tide-find-next-error
+ (kbd "C-k") 'tide-find-previous-error
+ (kbd "RET") 'tide-goto-error
+ ;; quit
+ (kbd "q") 'quit-window))
+
+(provide 'evil-collection-tide)
+;;; evil-collection-tide.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/timer-list/README.org b/.config/emacs/lisp/evil-collection/modes/timer-list/README.org
new file mode 100644
index 0000000..65f5174
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/timer-list/README.org
@@ -0,0 +1,12 @@
+* timer-list
+
+ Evil bindings for =timer-list-mode=, the built-in =M-x list-timers= buffer.
+
+** Key bindings
+
+ Inherits the standard =tabulated-list-mode= bindings (=S=, ={=, =}=, =gh=,
+ =gl=, =q=).
+
+ | Command | Original | Evil |
+ |---------------------+----------+------|
+ | =timer-list-cancel= | =c= | =C= |
diff --git a/.config/emacs/lisp/evil-collection/modes/timer-list/evil-collection-timer-list.el b/.config/emacs/lisp/evil-collection/modes/timer-list/evil-collection-timer-list.el
new file mode 100644
index 0000000..aff8127
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/timer-list/evil-collection-timer-list.el
@@ -0,0 +1,43 @@
+;;; evil-collection-timer-list.el --- Evil bindings for `timer-list' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `timer-list'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'timer-list)
+
+(defconst evil-collection-timer-list-maps '(timer-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-timer-list-setup ()
+ "Set up `evil' bindings for `timer-list'."
+ (evil-set-initial-state 'timer-list-mode 'normal)
+ (evil-collection-define-key 'normal 'timer-list-mode-map
+ "C" 'timer-list-cancel))
+
+(provide 'evil-collection-timer-list)
+;;; evil-collection-timer-list.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/transmission/evil-collection-transmission.el b/.config/emacs/lisp/evil-collection/modes/transmission/evil-collection-transmission.el
new file mode 100644
index 0000000..547bc10
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/transmission/evil-collection-transmission.el
@@ -0,0 +1,163 @@
+;;; evil-collection-transmission.el --- Evil bindings for transmission.el -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, transmission, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+;; Evil bindings for `transmission'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'transmission nil t)
+
+(defvar transmission-mode-map)
+(defvar transmission-files-mode-map)
+(defvar transmission-info-mode-map)
+(defvar transmission-peers-mode-map)
+
+(defconst evil-collection-transmission-maps '(transmission-mode-map
+ transmission-files-mode-map
+ transmission-info-mode-map
+ transmission-peers-mode-map))
+
+;;;###autoload
+(defun evil-collection-transmission-setup ()
+ "Set up `evil' bindings for `transmission'."
+
+ (evil-collection-inhibit-insert-state 'transmission-mode-map)
+ (evil-set-initial-state 'transmission-mode 'normal)
+ (evil-collection-define-key 'normal 'transmission-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<delete>") 'scroll-down-command
+
+ ;; sort
+ "o" 'tabulated-list-sort
+
+ (kbd "RET") 'transmission-files
+ "p" 'transmission-peers
+ "i" 'transmission-info
+
+ "a" 'transmission-add
+ "D" 'transmission-delete
+ "r" 'transmission-move ; "r" for "[r]ename"
+ "R" 'transmission-remove
+ "x" 'transmission-toggle ; EMMS has "x" for pause.
+ "t" 'transmission-trackers-add
+ "c" 'transmission-verify ; "c" for "[c]heck".
+ "d" 'transmission-set-download
+ "u" 'transmission-set-upload
+ "S" 'transmission-set-ratio ; "S" for "[S]eed"
+ "P" 'transmission-set-bandwidth-priority
+ "I" 'transmission-label ; "I" for "[I]nput labels"
+
+ ;; mark
+ "m" 'transmission-toggle-mark
+ "U" 'transmission-unmark-all
+ "~" 'transmission-invert-marks
+
+ ;; refresh
+ "gr" 'revert-buffer
+
+ ;; quit
+ "q" 'transmission-quit
+ "ZQ" 'evil-quit
+ "ZZ" 'transmission-quit)
+
+ (evil-collection-inhibit-insert-state 'transmission-files-mode-map)
+ (evil-set-initial-state 'transmission-files-mode 'normal)
+ (evil-collection-define-key 'normal 'transmission-files-mode-map
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<delete>") 'scroll-down-command
+
+ ;; sort
+ "o" 'tabulated-list-sort
+
+ "p" 'transmission-peers
+ "i" 'transmission-info
+
+ "r" 'transmission-move
+ "P" 'transmission-files-priority
+
+ ;; mark
+ "u" 'transmission-files-unwant
+ "m" 'transmission-files-want
+
+ ;; open
+ (kbd "RET") 'transmission-find-file
+ (kbd "S-<return>") 'transmission-find-file-other-window
+ (kbd "M-<return>") 'transmission-display-file
+ "go" 'transmission-find-file-other-window
+
+ "v" 'transmission-view-file
+
+ "!" 'transmission-files-command
+ ;; "X" 'transmission-files-command
+ "t" 'transmission-trackers-add
+ "T" 'transmission-trackers-remove
+
+ ;; goto URL
+ "gx" 'transmission-browse-url-of-file ; See mu4e.
+
+ ;; quit
+ "q" 'transmission-quit
+ "ZQ" 'evil-quit
+ "ZZ" 'transmission-quit)
+
+ (evil-collection-define-key 'visual 'transmission-files-mode-map
+ "r" 'transmission-move
+ "P" 'transmission-files-priority
+ "u" 'transmission-files-unwant
+ "m" 'transmission-files-want)
+
+ (evil-collection-set-readonly-bindings 'transmission-info-mode-map)
+ (evil-set-initial-state 'transmission-info-mode 'normal)
+ (evil-collection-define-key 'normal 'transmission-info-mode-map
+ "p" 'transmission-peers
+
+ "t" 'transmission-trackers-add
+ "T" 'transmission-trackers-remove
+ "D" 'transmission-set-torrent-download
+ "U" 'transmission-set-torrent-upload
+ "S" 'transmission-set-torrent-ratio ; "S" for "[S]eed"
+ "I" 'transmission-label ; "I" for "[I]nput labels"
+ "P" 'transmission-set-bandwidth-priority
+ "r" 'transmission-move)
+
+ ;; yu, Like `eww'.
+ (evil-collection-define-operator-key 'yank 'transmission-info-mode-map
+ "u" 'transmission-copy-magnet)
+
+ (evil-collection-set-readonly-bindings 'transmission-peers-mode-map)
+ (evil-set-initial-state 'transmission-peers-mode 'normal)
+ (evil-collection-define-key 'normal 'transmission-peers-mode-map
+ ;; sort
+ "o" 'tabulated-list-sort
+
+ "i" 'transmission-info))
+
+(provide 'evil-collection-transmission)
+;;; evil-collection-transmission.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/trashed/evil-collection-trashed.el b/.config/emacs/lisp/evil-collection/modes/trashed/evil-collection-trashed.el
new file mode 100644
index 0000000..89c014c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/trashed/evil-collection-trashed.el
@@ -0,0 +1,87 @@
+;;; evil-collection-trashed.el --- Evil bindings for trashed.el -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.3
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, files, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `trashed'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'trashed nil t)
+
+(defconst evil-collection-trashed-maps '(trashed-mode-map))
+
+;;;###autoload
+(defun evil-collection-trashed-setup ()
+ "Set up `evil' bindings for `trashed'."
+ (evil-collection-set-readonly-bindings 'trashed-mode-map)
+ (evil-collection-define-key 'normal 'trashed-mode-map
+ ;; motion
+ (kbd "SPC") 'scroll-up-command
+ (kbd "S-SPC") 'scroll-down-command
+ (kbd "<tab>") 'trashed-forward-column
+ (kbd "<backtab>") 'trashed-backward-column
+
+ (kbd "RET") 'trashed-find-file
+ (kbd "S-RET") 'trashed-find-file-other-window
+ (kbd "go") 'trashed-find-file-other-window
+ (kbd "gO") 'trashed-display-file
+ (kbd "gw") 'trashed-browse-url-of-file
+ (kbd "M-RET") 'trashed-display-file
+
+ "S" 'tabulated-list-sort
+
+ "m" 'trashed-mark
+ "M" 'trashed-mark-all
+ "u" 'trashed-unmark
+ "U" 'trashed-unmark-all
+ "~" 'trashed-toggle-marks
+
+ "$ m" 'trashed-mark-files-by-date
+ "$ u" 'trashed-unmark-files-by-date
+ "$ d" 'trashed-flag-delete-files-by-date
+ "$ r" 'trashed-flag-restore-files-by-date
+
+ "% m" 'trashed-mark-files-regexp
+ "% u" 'trashed-unmark-files-regexp
+ "% d" 'trashed-flag-delete-files-regexp
+ "% r" 'trashed-flag-restore-files-regexp
+
+ "d" 'trashed-flag-delete
+ "r" 'trashed-flag-restore
+
+ "zb" 'trashed-flag-backup-files
+ "za" 'trashed-flag-auto-save-files
+
+ "x" 'trashed-do-execute
+ "D" 'trashed-do-delete
+ "R" 'trashed-do-restore
+
+ "v" 'trashed-view-file
+
+ "g?" 'describe-mode
+ "gr" 'revert-buffer))
+
+(provide 'evil-collection-trashed)
+;;; evil-collection-trashed.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/tuareg/README.org b/.config/emacs/lisp/evil-collection/modes/tuareg/README.org
new file mode 100644
index 0000000..589da60
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tuareg/README.org
@@ -0,0 +1,9 @@
+* tuareg
+
+ Evil bindings for [[https://github.com/ocaml/tuareg][tuareg-mode]] (OCaml).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------+-----------+------|
+ | =tuareg-run-ocaml= | =C-c C-s= | =gz= |
diff --git a/.config/emacs/lisp/evil-collection/modes/tuareg/evil-collection-tuareg.el b/.config/emacs/lisp/evil-collection/modes/tuareg/evil-collection-tuareg.el
new file mode 100644
index 0000000..b283fb1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/tuareg/evil-collection-tuareg.el
@@ -0,0 +1,44 @@
+;;; evil-collection-tuareg.el --- Evil bindings for `tuareg-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Zhiwei Chen
+
+;; Author: Zhiwei Chen <condy0919@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `tuareg-mode'.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'tuareg nil t)
+
+(defconst evil-collection-tuareg-maps '(tuareg-mode-map))
+
+;;;###autoload
+(defun evil-collection-tuareg-setup ()
+ "Set up `evil' bindings for `tuareg'."
+ (evil-collection-define-key 'normal 'tuareg-mode-map
+ "gz" 'tuareg-run-ocaml))
+
+(provide 'evil-collection-tuareg)
+
+;;; evil-collection-tuareg.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/typescript-mode/README.org b/.config/emacs/lisp/evil-collection/modes/typescript-mode/README.org
new file mode 100644
index 0000000..f6bdc37
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/typescript-mode/README.org
@@ -0,0 +1,13 @@
+* typescript-mode
+
+ Evil integration for [[https://github.com/emacs-typescript/typescript.el][typescript-mode]].
+
+ No key bindings are added. The setup installs a hook that sets
+ =evil-shift-width= to =typescript-indent-level= in =typescript-mode=
+ buffers so that evil shift operators match the mode's indentation.
+
+** New commands
+
+ - =evil-collection-typescript-mode-set-evil-shift-width= — sync
+ =evil-shift-width= with =typescript-indent-level= (added to
+ =typescript-mode-hook=).
diff --git a/.config/emacs/lisp/evil-collection/modes/typescript-mode/evil-collection-typescript-mode.el b/.config/emacs/lisp/evil-collection/modes/typescript-mode/evil-collection-typescript-mode.el
new file mode 100644
index 0000000..47366e6
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/typescript-mode/evil-collection-typescript-mode.el
@@ -0,0 +1,46 @@
+;;; evil-collection-typescript-mode.el --- Bindings for `typescript-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, evil, tools, typescript
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `typescript-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'typescript-mode nil t)
+
+(defvar typescript-indent-level)
+
+(defun evil-collection-typescript-mode-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `typescript-indent-level'."
+ (setq-local evil-shift-width typescript-indent-level))
+
+;;;###autoload
+(defun evil-collection-typescript-mode-setup ()
+ "Set up `evil' bindings for `typescript-mode'."
+ (add-hook 'typescript-mode-hook
+ #'evil-collection-typescript-mode-set-evil-shift-width))
+
+(provide 'evil-collection-typescript-mode)
+;;; evil-collection-typescript-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ultra-scroll/evil-collection-ultra-scroll.el b/.config/emacs/lisp/evil-collection/modes/ultra-scroll/evil-collection-ultra-scroll.el
new file mode 100644
index 0000000..fcc4aec
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ultra-scroll/evil-collection-ultra-scroll.el
@@ -0,0 +1,58 @@
+;;; evil-collection-ultra-scroll.el --- Evil integration for ultra-scroll -*- lexical-binding: t -*-
+
+;; Copyright (C) 2025 Steven Allen
+
+;; Author: Steven Allen <steven@stebalien.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, ultra-scroll, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil integration for ultra-scroll.
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'ultra-scroll nil t)
+
+(defvar evil-collection-ultra-scroll-hide-cursor-states
+ '(evil-motion-state-cursor evil-normal-state-cursor)
+ "States in which to hide the cursor when scrolling.")
+
+(defun evil-collection-ultra-scroll--hide-cursor ()
+ "A special Evil cursor type that simply hides the cursor."
+ (setq cursor-type nil))
+
+(defun evil-collection-ultra-scroll--set-cursor-visible (arg)
+ "Make the cursor invisible when called with ARG < 1, or visible otherwise."
+ (when (bound-and-true-p evil-local-mode)
+ (if (and (numberp arg) (< arg 1))
+ (dolist (var evil-collection-ultra-scroll-hide-cursor-states)
+ (make-local-variable var)
+ (set var #'evil-collection-ultra-scroll--hide-cursor))
+ (mapc #'kill-local-variable evil-collection-ultra-scroll-hide-cursor-states)
+ (evil-refresh-cursor))))
+
+(defun evil-collection-ultra-scroll-setup ()
+ "Set up `evil' integration for `ultra-scroll'."
+ (add-hook 'ultra-scroll-hide-functions #'evil-collection-ultra-scroll--set-cursor-visible))
+
+(provide 'evil-collection-ultra-scroll)
+
+;;; evil-collection-ultra-scroll.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/unimpaired/evil-collection-unimpaired.el b/.config/emacs/lisp/evil-collection/modes/unimpaired/evil-collection-unimpaired.el
new file mode 100644
index 0000000..4d9710f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/unimpaired/evil-collection-unimpaired.el
@@ -0,0 +1,313 @@
+;;; evil-collection-unimpaired.el --- Evil Collection port of Unimpaired -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, unimpaired, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; `evil' port of unimpaired for `evil-collection'.
+;; https://github.com/tpope/vim-unimpaired
+
+;;; Code:
+(require 'evil-collection)
+
+;; Externals
+(defvar flycheck-current-errors)
+
+(defgroup evil-collection-unimpaired nil
+ "Evil port of unimpaired for `evil-collection'."
+ :group 'evil-collection)
+
+(defcustom evil-collection-unimpaired-want-repeat-mode-integration nil
+ "Whether or not to enable `repeat-mode' integration."
+ :type 'boolean
+ :group 'evil-collection)
+
+(defconst evil-collection-unimpaired-maps '(evil-collection-unimpaired-mode-map))
+
+(defvar evil-collection-unimpaired-mode-map (make-sparse-keymap)
+ "Keymap for `evil-collection-unimpaired-mode'.")
+
+(define-minor-mode evil-collection-unimpaired-mode
+ "Evil port of unimpaired."
+ :lighter " unimpaired"
+ :group 'evil-collection-unimpaired)
+
+;;;###autoload
+(define-globalized-minor-mode global-evil-collection-unimpaired-mode
+ evil-collection-unimpaired-mode evil-collection-unimpaired-mode-on
+ :group 'evil-collection-unimpaired)
+
+(defun evil-collection-unimpaired-mode-on ()
+ "Turn on `evil-collection-unimpaired-mode'."
+ (evil-collection-unimpaired-mode 1))
+
+(evil-define-motion evil-collection-unimpaired-next-error (count)
+ "Go to next error."
+ :jump t
+ (setq count (or count 1))
+ (cond
+ ((and (bound-and-true-p flycheck-mode)
+ (fboundp 'flycheck-next-error))
+ (flycheck-next-error count))
+ ((and (bound-and-true-p flymake-mode)
+ (fboundp 'flymake-goto-next-error))
+ (flymake-goto-next-error count))
+ (:default
+ (message "No linting modes are on."))))
+
+(evil-define-motion evil-collection-unimpaired-previous-error (count)
+ "Go to previous error."
+ :jump t
+ (evil-collection-unimpaired-next-error (- (or count 1))))
+
+(defun evil-collection-unimpaired--flycheck-count-errors ()
+ "Count the number of flycheck errors."
+ (length (delete-dups (mapcar 'flycheck-error-line flycheck-current-errors))))
+
+(evil-define-motion evil-collection-unimpaired-first-error ()
+ "Go to the first error."
+ :jump t
+ (cond
+ ((and (bound-and-true-p flycheck-mode)
+ (fboundp 'flycheck-first-error))
+ (flycheck-first-error))
+ ((bound-and-true-p flymake-mode)
+ (message "flymake unsupported."))
+ (:default
+ (message "No linting modes are on."))))
+
+(evil-define-motion evil-collection-unimpaired-last-error ()
+ "Go to the last error."
+ :jump t
+ (cond
+ ((and (bound-and-true-p flycheck-mode)
+ (fboundp 'flycheck-first-error))
+ (flycheck-first-error (evil-collection-unimpaired--flycheck-count-errors)))
+ ((bound-and-true-p flymake-mode)
+ (message "flymake unsupported."))
+ (:default
+ (message "No linting modes are on."))))
+
+(defconst evil-collection-unimpaired--SCM-conflict-marker "^\\(@@@ .* @@@\\|[<=>]\\{7\\}\\)"
+ "A regexp to match SCM conflict marker.")
+
+(evil-define-motion evil-collection-unimpaired-previous-SCM-conflict-marker (count)
+ "Go to the previous SCM conflict marker or diff/patch hunk."
+ :jump t
+ (evil-collection-unimpaired-next-SCM-conflict-marker (- (or count 1))))
+
+(evil-define-motion evil-collection-unimpaired-next-SCM-conflict-marker (count)
+ "Go to the next SCM conflict marker or diff/patch hunk."
+ :jump t
+ (evil-motion-loop (dir (or count 1))
+ (cond
+ ((> dir 0)
+ (forward-line 1)
+ (when (not (search-forward-regexp evil-collection-unimpaired--SCM-conflict-marker nil t))
+ (forward-line -1))
+ (move-beginning-of-line nil))
+ (t
+ (search-backward-regexp evil-collection-unimpaired--SCM-conflict-marker nil t)
+ (move-beginning-of-line nil)))))
+
+(defun evil-collection-unimpaired-paste-above ()
+ "Paste above current line with preserving indentation."
+ (interactive)
+ (let ((indent (current-indentation))
+ (column (current-column)))
+ (evil-insert-newline-above)
+ (indent-to indent)
+ (evil-paste-after 1)
+ (move-to-column column)))
+
+(defun evil-collection-unimpaired-paste-below ()
+ "Paste below current line with preserving indentation."
+ (interactive)
+ (let ((indent (current-indentation))
+ (column (current-column)))
+ (evil-insert-newline-below)
+ (indent-to indent)
+ (evil-paste-after 1)
+ (move-to-column column)))
+
+(defun evil-collection-unimpaired-insert-newline-above (count)
+ "Insert COUNT blank line(s) above current line."
+ (interactive "p")
+ (save-excursion (dotimes (_ count) (evil-insert-newline-above)))
+ (when (bolp) (forward-char count)))
+
+(defun evil-collection-unimpaired-insert-newline-below (count)
+ "Insert COUNT blank line(s) below current line."
+ (interactive "p")
+ (save-excursion (dotimes (_ count) (evil-insert-newline-below))))
+
+(defun evil-collection-unimpaired--encode (beg end fn)
+ "Apply FN from BEG to END."
+ (save-excursion
+ (goto-char beg)
+ (let* ((end (if (eq evil-this-type 'line) (1- end) end))
+ (text (buffer-substring-no-properties beg end)))
+ (delete-region beg end)
+ (insert (funcall fn text)))))
+
+(evil-define-operator evil-collection-unimpaired-url-encode (count &optional beg end)
+ "Encode a URL string."
+ (interactive "<c><r>")
+ (ignore count)
+ (evil-collection-unimpaired--encode beg end #'url-encode-url))
+
+(evil-define-operator evil-collection-unimpaired-url-decode (count &optional beg end)
+ "Decode a URL string."
+ (interactive "<c><r>")
+ (ignore count)
+ (evil-collection-unimpaired--encode beg end #'url-unhex-string))
+
+(evil-define-operator evil-collection-unimpaired-b64-encode (count &optional beg end)
+ "Encode a base64 string."
+ (interactive "<c><r>")
+ (ignore count)
+ (evil-collection-unimpaired--encode beg end #'base64-encode-string))
+
+(evil-define-operator evil-collection-unimpaired-b64-decode (count &optional beg end)
+ "Decode a base64 string."
+ (interactive "<c><r>")
+ (ignore count)
+ (evil-collection-unimpaired--encode beg end #'base64-decode-string))
+
+;; https://stackoverflow.com/questions/2423834/move-line-region-up-and-down-in-emacs
+(defun evil-collection-unimpaired--move-text (arg)
+ "Move text down if ARG is positive, otherwise move text up."
+ (cond
+ ((and mark-active transient-mark-mode)
+ (when (> (point) (mark))
+ (exchange-point-and-mark))
+ (let ((column (current-column))
+ (text (delete-and-extract-region (point) (mark))))
+ (forward-line arg)
+ (move-to-column column :force)
+ (set-mark (point))
+ (insert text)
+ (exchange-point-and-mark)
+ (setq deactivate-mark nil)))
+ (t
+ (let ((column (current-column)))
+ (beginning-of-line)
+ (when (or (> arg 0) (not (bobp)))
+ (forward-line)
+ (when (or (< arg 0) (not (eobp)))
+ (transpose-lines arg))
+ (forward-line -1))
+ (move-to-column column)))))
+
+(defun evil-collection-unimpaired-move-text-down (arg)
+ "Move region (transient-mark-mode active) or current line ARG lines down."
+ (interactive "*p")
+ (evil-collection-unimpaired--move-text arg))
+
+(defun evil-collection-unimpaired-move-text-up (arg)
+ "Move region (transient-mark-mode active) or current line ARG lines up."
+ (interactive "*p")
+ (evil-collection-unimpaired--move-text (- arg)))
+
+;;; 'repeat-mode' integration. Emacs 28+
+(defmacro evil-collection-unimpaired-defvar-keymap (name &rest bindings)
+ "Define NAME a keymap with BINDINGS."
+ (declare (indent 1))
+ (cl-assert (cl-evenp (length bindings)))
+ `(progn
+ (defvar ,name
+ (let ((map (make-sparse-keymap)))
+ map))
+ (evil-collection-define-key nil ',name ,@bindings)))
+
+;; "[b" and "]b"
+(evil-collection-unimpaired-defvar-keymap evil-prev-buffer-repeat-map
+ "b" #'evil-prev-buffer
+ "B" #'evil-next-buffer)
+(evil-collection-unimpaired-defvar-keymap evil-next-buffer-repeat-map
+ "b" #'evil-next-buffer
+ "B" #'evil-prev-buffer)
+
+;; "[e" and "]e"
+(evil-collection-unimpaired-defvar-keymap evil-collection-unimpaired-move-text-up-repeat-map
+ "e" #'evil-collection-unimpaired-move-text-up
+ "E" #'evil-collection-unimpaired-move-text-down)
+(evil-collection-unimpaired-defvar-keymap evil-collection-unimpaired-move-text-down-repeat-map
+ "e" #'evil-collection-unimpaired-move-text-down
+ "E" #'evil-collection-unimpaired-move-text-up)
+
+;; "[q" and "]q"
+(evil-collection-unimpaired-defvar-keymap evil-collection-unimpaired-previous-error-repeat-map
+ "q" #'evil-collection-unimpaired-previous-error
+ "Q" #'evil-collection-unimpaired-next-error)
+(evil-collection-unimpaired-defvar-keymap evil-collection-unimpaired-next-error-repeat-map
+ "q" #'evil-collection-unimpaired-next-error
+ "Q" #'evil-collection-unimpaired-previous-error)
+
+;;;###autoload
+(defun evil-collection-unimpaired-setup ()
+ "Set up unimpaired-like bindings."
+ (global-evil-collection-unimpaired-mode 1)
+ (evil-collection-define-key 'normal 'evil-collection-unimpaired-mode-map
+ "[b" 'evil-prev-buffer
+ "]b" 'evil-next-buffer
+ "[e" 'evil-collection-unimpaired-move-text-up
+ "]e" 'evil-collection-unimpaired-move-text-down
+ "[l" 'evil-collection-unimpaired-previous-error
+ "]l" 'evil-collection-unimpaired-next-error
+ "[L" 'evil-collection-unimpaired-first-error
+ "]L" 'evil-collection-unimpaired-last-error
+ "[q" 'evil-collection-unimpaired-previous-error
+ "]q" 'evil-collection-unimpaired-next-error
+ "[Q" 'evil-collection-unimpaired-first-error
+ "]Q" 'evil-collection-unimpaired-last-error
+ "[n" 'evil-collection-unimpaired-previous-SCM-conflict-marker
+ "]n" 'evil-collection-unimpaired-next-SCM-conflict-marker
+ "[p" 'evil-collection-unimpaired-paste-above
+ "]p" 'evil-collection-unimpaired-paste-below
+ "[P" 'evil-collection-unimpaired-paste-above
+ "]P" 'evil-collection-unimpaired-paste-below
+ (kbd "[ SPC") 'evil-collection-unimpaired-insert-newline-above
+ (kbd "] SPC") 'evil-collection-unimpaired-insert-newline-below)
+ (evil-collection-define-key 'visual 'evil-collection-unimpaired-mode-map
+ "[e" 'evil-collection-unimpaired-move-text-up
+ "]e" 'evil-collection-unimpaired-move-text-down
+ "[n" 'evil-collection-unimpaired-previous-SCM-conflict-marker
+ "]n" 'evil-collection-unimpaired-next-SCM-conflict-marker)
+ (evil-collection-define-key 'motion 'evil-collection-unimpaired-mode-map
+ "[u" 'evil-collection-unimpaired-url-encode
+ "]u" 'evil-collection-unimpaired-url-decode
+ "[6" 'evil-collection-unimpaired-b64-encode
+ "]6" 'evil-collection-unimpaired-b64-decode)
+
+ (when evil-collection-unimpaired-want-repeat-mode-integration
+ (dolist (cmd '(evil-prev-buffer
+ evil-next-buffer
+ evil-collection-unimpaired-move-text-up
+ evil-collection-unimpaired-move-text-down
+ evil-collection-unimpaired-previous-error
+ evil-collection-unimpaired-next-error))
+ (put cmd 'repeat-map (intern (format "%s-repeat-map" cmd))))))
+
+(provide 'evil-collection-unimpaired)
+;;; evil-collection-unimpaired.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vc-annotate/README.org b/.config/emacs/lisp/evil-collection/modes/vc-annotate/README.org
new file mode 100644
index 0000000..c53e62f
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vc-annotate/README.org
@@ -0,0 +1,23 @@
+* vc-annotate
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Old-Revisions.html][vc-annotate]] (=C-x v g=), Emacs' built-in
+ blame view.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------------------------------+----------+-------------------|
+ | =quit-window= | =q= | =q= |
+ | =vc-annotate-revision-previous-to-line= | =P= | =a= |
+ | =vc-annotate-show-diff-revision-at-line= | === | =d=, === |
+ | =vc-annotate-show-changeset-diff-revision-at-line= | =D= | =D= |
+ | =vc-annotate-find-revision-at-line= | =f= | =F= |
+ | =vc-annotate-revision-at-line= | =J= | =J= |
+ | =vc-annotate-show-log-revision-at-line= | =l= | =L= |
+ | =vc-annotate-next-revision= | =n= | =gj=, =]]=, =C-j= |
+ | =vc-annotate-prev-revision= | =p= | =gk=, =[[=, =C-k= |
+ | =vc-annotate-working-revision= | =w= | =W= |
+ | =vc-annotate-toggle-annotation-visibility= | =A= | =A= |
+ | =vc-annotate-goto-line= | =RET= | =RET= |
+
+ Initial state is normal.
diff --git a/.config/emacs/lisp/evil-collection/modes/vc-annotate/evil-collection-vc-annotate.el b/.config/emacs/lisp/evil-collection/modes/vc-annotate/evil-collection-vc-annotate.el
new file mode 100644
index 0000000..4334be1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vc-annotate/evil-collection-vc-annotate.el
@@ -0,0 +1,59 @@
+;;; evil-collection-vc-annotate.el --- Bindings for `vc-annotate' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `vc-annotate'
+
+;;; Code:
+(require 'evil-collection)
+(require 'vc-annotate)
+
+(defconst evil-collection-vc-annotate-maps '(vc-annotate-mode-map))
+
+;;;###autoload
+(defun evil-collection-vc-annotate-setup ()
+ "Set up `evil' bindings for `vc-annotate'."
+ (evil-set-initial-state 'vc-annotate-mode 'normal)
+ (evil-collection-define-key 'normal 'vc-annotate-mode-map
+ "q" 'quit-window
+ "a" 'vc-annotate-revision-previous-to-line
+ "d" 'vc-annotate-show-diff-revision-at-line
+ "=" 'vc-annotate-show-diff-revision-at-line
+ "D" 'vc-annotate-show-changeset-diff-revision-at-line
+ "F" 'vc-annotate-find-revision-at-line
+ "J" 'vc-annotate-revision-at-line
+ "L" 'vc-annotate-show-log-revision-at-line
+ "gj" 'vc-annotate-next-revision
+ "gk" 'vc-annotate-prev-revision
+ "]]" 'vc-annotate-next-revision
+ "[[" 'vc-annotate-prev-revision
+ (kbd "C-j") 'vc-annotate-next-revision
+ (kbd "C-k") 'vc-annotate-prev-revision
+ "W" 'vc-annotate-working-revision
+ "A" 'vc-annotate-toggle-annotation-visibility
+ (kbd "RET") 'vc-annotate-goto-line))
+
+(provide 'evil-collection-vc-annotate)
+;;; evil-collection-vc-annotate.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vc-dir/README.org b/.config/emacs/lisp/evil-collection/modes/vc-dir/README.org
new file mode 100644
index 0000000..98e36b4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vc-dir/README.org
@@ -0,0 +1,47 @@
+* vc-dir
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/VC-Directory-Mode.html][vc-dir]] (=C-x v d=).
+
+** Key bindings
+
+ Standard read-only motion / quit bindings come from
+ =evil-collection-set-readonly-bindings=.
+
+ | Command | Original | Evil |
+ |----------------------------------+---------------+-------------------|
+ | =vc-next-action= | =v= | =c= |
+ | =vc-diff= | === | =d=, =TAB= |
+ | =vc-root-diff= | =D= | =D=, =S-TAB= |
+ | =vc-register= | =i= | =R=, =s= |
+ | =vc-update= | =+= | =gu=, =F= |
+ | =revert-buffer= | =g= | =gr= |
+ | =vc-push= | =P= | =p=, =P= |
+ | =vc-print-log= | =l= | =Lf=, =Ll= |
+ | =vc-print-root-log= | =L= | =Lr=, =LL= |
+ | =vc-log-incoming= | =Ii= | =Li= |
+ | =vc-log-outgoing= | =Io= | =Lo= |
+ | =vc-revert= | =N= | =x= |
+ | =vc-annotate= | =A= | =b= |
+ | =vc-dir-mark= | =m= | =m= |
+ | =vc-dir-mark-all-files= | =M m= | =M= |
+ | =vc-dir-unmark= | =u= | =u= |
+ | =vc-dir-unmark-all-files= | =M u= | =U= |
+ | =vc-dir-next-directory= | =M-n= | =]]=, =gj=, =C-j= |
+ | =vc-dir-previous-directory= | =M-p= | =[[=, =gk=, =C-k= |
+ | =vc-dir-find-file= | =f=, =RET= | =gf=, =RET= |
+ | =vc-dir-find-file-other-window= | =o= | =go=, =S-RET= |
+ | =vc-dir-display-file= | =SPC= | =gO=, =M-RET= |
+ | =vc-dir-kill-dir-status-process= | =C-c C-c= | =C-c C-c= |
+ | =vc-dir-toggle-mark= | =SPC= | =t= |
+ | =vc-dir-hide-up-to-date= | =x= | =(=, =o= |
+ | =vc-dir-kill-line= | =k= | =X= |
+ | =vc-dir-search= | =S= | =S= |
+ | =vc-dir-query-replace-regexp= | =Q= | =Q= |
+ | =vc-dir-isearch= | =M-s a C-s= | =M-s a C-s= |
+ | =vc-dir-isearch-regexp= | =M-s a M-C-s= | =M-s a M-C-s= |
+ | =vc-dir-ignore= | =G= | =i= |
+ | =vc-create-tag= | =B c= | =Bc= |
+ | =vc-print-branch-log= | =B l= | =Bl= |
+ | =vc-retrieve-tag= | =B s= | =Bs= |
+
+ Initial state is normal.
diff --git a/.config/emacs/lisp/evil-collection/modes/vc-dir/evil-collection-vc-dir.el b/.config/emacs/lisp/evil-collection/modes/vc-dir/evil-collection-vc-dir.el
new file mode 100644
index 0000000..a9d1504
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vc-dir/evil-collection-vc-dir.el
@@ -0,0 +1,113 @@
+;;; evil-collection-vc-dir.el --- Evil bindings for Vc-Dir -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <ambrevar@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, vc-dir, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Vc-Dir.
+
+;;; Code:
+(require 'vc-dir)
+(require 'evil-collection)
+
+(defconst evil-collection-vc-dir-maps '(vc-dir-mode-map))
+
+;;;###autoload
+(defun evil-collection-vc-dir-setup ()
+ "Set up `evil' bindings for `vc-dir'."
+ (evil-set-initial-state 'vc-dir-mode 'normal)
+ (evil-collection-set-readonly-bindings 'vc-dir-mode-map)
+ (evil-collection-define-key 'normal 'vc-dir-mode-map
+ ;; VC commands
+ "c" 'vc-next-action
+
+ "d" 'vc-diff
+ "D" 'vc-root-diff
+ "\t" 'vc-diff
+ [backtab] 'vc-root-diff
+
+ "R" 'vc-register
+ "s" 'vc-register ;; Like `magit-stage'?
+ "gu" 'vc-update
+ "gr" 'revert-buffer
+
+ "F" 'vc-update ;; This is the same as `vc-update' bound to "gu".
+ "p" 'vc-push
+ "P" 'vc-push
+
+ "Lf" 'vc-print-log ;; Log File.
+ "Ll" 'vc-print-log
+ "Lr" 'vc-print-root-log
+ "LL" 'vc-print-root-log
+ "Li" 'vc-log-incoming
+ "Lo" 'vc-log-outgoing
+
+ "x" 'vc-revert
+ "b" 'vc-annotate ;; Like `magit-blame'
+
+ ;; Marking.
+ "m" 'vc-dir-mark
+ "M" 'vc-dir-mark-all-files
+ "u" 'vc-dir-unmark
+ "U" 'vc-dir-unmark-all-files
+
+ ;; Rebind paragraph-movement commands.
+ "]]" 'vc-dir-next-directory
+ "[[" 'vc-dir-previous-directory
+ "gj" 'vc-dir-next-directory
+ "gk" 'vc-dir-previous-directory
+ (kbd "C-j") 'vc-dir-next-directory
+ (kbd "C-k") 'vc-dir-previous-directory
+
+ ;; The remainder.
+ "gf" 'vc-dir-find-file
+ "\C-m" 'vc-dir-find-file
+
+ (kbd "S-<return>") 'vc-dir-find-file-other-window
+ "go" 'vc-dir-find-file-other-window
+ "gO" 'vc-dir-display-file
+ (kbd "M-<return>") 'vc-dir-display-file
+
+ "\C-c\C-c" 'vc-dir-kill-dir-status-process
+ [down-mouse-3] 'vc-dir-menu
+ [mouse-2] 'vc-dir-find-file-other-window
+ "t" 'vc-dir-toggle-mark
+ [follow-link] 'mouse-face
+
+ "(" 'vc-dir-hide-up-to-date
+ "o" 'vc-dir-hide-up-to-date
+
+ "X" 'vc-dir-kill-line
+ "S" 'vc-dir-search
+ "Q" 'vc-dir-query-replace-regexp
+ (kbd "M-s a C-s") 'vc-dir-isearch
+ (kbd "M-s a M-C-s") 'vc-dir-isearch-regexp
+ "i" 'vc-dir-ignore
+
+ ;; Branching
+ "Bc" 'vc-create-tag
+ "Bl" 'vc-print-branch-log
+ "Bs" 'vc-retrieve-tag))
+
+(provide 'evil-collection-vc-dir)
+;;; evil-collection-vc-dir.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vc-git/README.org b/.config/emacs/lisp/evil-collection/modes/vc-git/README.org
new file mode 100644
index 0000000..4d4e8bb
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vc-git/README.org
@@ -0,0 +1,16 @@
+* vc-git
+
+ Evil bindings for the vc-git log view (=vc-git-log-view-mode=).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------------------------+----------+-------|
+ | =quit-window= | =q= | =q= |
+ | =log-view-diff= | ===, =d= | =d= |
+ | =log-view-diff-changeset= | =D= | =D= |
+ | =log-view-msg-next= | =n= | =C-j= |
+ | =log-view-msg-prev= | =p= | =C-k= |
+ | =log-view-toggle-entry-display= | =RET= | =TAB= |
+
+ Initial state for =vc-git-log-view-mode= is normal.
diff --git a/.config/emacs/lisp/evil-collection/modes/vc-git/evil-collection-vc-git.el b/.config/emacs/lisp/evil-collection/modes/vc-git/evil-collection-vc-git.el
new file mode 100644
index 0000000..4f002be
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vc-git/evil-collection-vc-git.el
@@ -0,0 +1,48 @@
+;;; evil-collection-vc-git.el --- Evil bindings for Vc-Git -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <ambrevar@gmail.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, vc-git, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Vc-Git.
+
+;;; Code:
+(require 'vc-git)
+(require 'evil-collection)
+
+(defconst evil-collection-vc-git-maps '(vc-git-mode-map))
+
+;;;###autoload
+(defun evil-collection-vc-git-setup ()
+ "Set up `evil' bindings for `vc-git'."
+ (evil-set-initial-state 'vc-git-log-view-mode 'normal)
+ (evil-collection-define-key 'normal 'vc-git-log-view-mode-map
+ "q" 'quit-window
+ "d" 'log-view-diff
+ "D" 'log-view-diff-changeset
+ (kbd "C-j") 'log-view-msg-next
+ (kbd "C-k") 'log-view-msg-prev
+ (kbd "<tab>") 'log-view-toggle-entry-display))
+
+(provide 'evil-collection-vc-git)
+;;; evil-collection-vc-git.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vdiff/README.org b/.config/emacs/lisp/evil-collection/modes/vdiff/README.org
new file mode 100644
index 0000000..3ba3adf
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vdiff/README.org
@@ -0,0 +1,18 @@
+* vdiff
+
+ Evil bindings for [[https://github.com/justbur/emacs-vdiff][vdiff]], a vimdiff-style diff/merge interface.
+
+ Applied to both =vdiff-mode-map= and =vdiff-3way-mode-map=.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-------------------------+----------+------|
+ | =vdiff-next-hunk= | (varies) | =]c= |
+ | =vdiff-previous-hunk= | (varies) | =[c= |
+ | =vdiff-receive-changes= | =do= | =do= |
+ | =vdiff-send-changes= | =dp= | =dp= |
+
+ =do= / =dp= are installed as evil operator-keys via
+ =evil-collection-define-operator-key= so they compose with motions like
+ vim's =do= (diff obtain) and =dp= (diff put).
diff --git a/.config/emacs/lisp/evil-collection/modes/vdiff/evil-collection-vdiff.el b/.config/emacs/lisp/evil-collection/modes/vdiff/evil-collection-vdiff.el
new file mode 100644
index 0000000..393061a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vdiff/evil-collection-vdiff.el
@@ -0,0 +1,54 @@
+;;; evil-collection-vdiff.el --- Evil bindings for vdiff -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Evgeni Kolev <evgenysw@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, vdiff, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for vdiff.el https://github.com/justbur/emacs-vdiff
+
+;;; Code:
+(require 'vdiff nil t)
+(require 'evil-collection)
+
+(defconst evil-collection-vdiff-maps '(vdiff-mode-map
+ vdiff-3way-mode-map))
+
+;;;###autoload
+(defun evil-collection-vdiff-setup ()
+ "Set up `evil' bindings for `vdiff-mode'."
+ (add-hook 'vdiff-mode-hook 'evil-normalize-keymaps)
+ (add-hook 'vdiff-3way-mode-hook 'evil-normalize-keymaps)
+
+ (dolist (keymap evil-collection-vdiff-maps)
+ (evil-collection-define-key 'normal keymap
+ "]c" 'vdiff-next-hunk
+ "[c" 'vdiff-previous-hunk)
+
+ ;; define `do' (diff obtain) and `dp' (diff put) bindings
+ (evil-collection-define-operator-key 'delete keymap
+ "o" 'vdiff-receive-changes
+ "p" 'vdiff-send-changes)))
+
+(provide 'evil-collection-vdiff)
+
+;;; evil-collection-vdiff.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vertico/README.org b/.config/emacs/lisp/evil-collection/modes/vertico/README.org
new file mode 100644
index 0000000..5ea5d14
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vertico/README.org
@@ -0,0 +1,40 @@
+* vertico
+
+ Evil bindings for [[https://github.com/minad/vertico][vertico]].
+
+ Bindings only take effect when =evil-collection-setup-minibuffer= is non-nil
+ (excluding the global =<escape>= → =abort-recursive-edit=).
+
+** Key bindings
+
+*** vertico-map (normal state)
+
+ | Command | Original | Evil |
+ |--------------------------+-----------------+------------|
+ | =abort-recursive-edit= | =C-g= | =<escape>= |
+ | =vertico-first= | =M-<= | =gg= |
+ | =vertico-last= | =M->= | =G= |
+ | =vertico-next= | =<down>=, =C-n= | =j= |
+ | =vertico-previous= | =<up>=, =C-p= | =k= |
+ | =vertico-next-group= | =M-}= | =gj= |
+ | =vertico-previous-group= | =M-{= | =gk= |
+ | =vertico-scroll-down= | =M-v= | =C-u= |
+ | =vertico-scroll-up= | =C-v= | =C-d= |
+
+ =C-u= is gated on =evil-want-C-u-scroll=; =C-d= on =evil-want-C-d-scroll=.
+
+*** vertico-map (insert state)
+
+ | Command | Original | Evil |
+ |--------------------+----------+-------|
+ | =vertico-next= | =C-n= | =C-n= |
+ | =vertico-previous= | =C-p= | =C-p= |
+
+ With =evil-collection-vertico-want-want-C-u-in-insert= and
+ =evil-want-C-u-delete= unset, =C-u= → =vertico-scroll-down= in insert state.
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |---------------------------------------------------+---------+-------------------------------------|
+ | =evil-collection-vertico-want-want-C-u-in-insert= | =nil= | Allow =C-u= scroll in insert state. |
diff --git a/.config/emacs/lisp/evil-collection/modes/vertico/evil-collection-vertico.el b/.config/emacs/lisp/evil-collection/modes/vertico/evil-collection-vertico.el
new file mode 100644
index 0000000..521e1a1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vertico/evil-collection-vertico.el
@@ -0,0 +1,68 @@
+;;; evil-collection-vertico.el --- Evil bindings for vertico -*- lexical-binding: t -*-
+
+;; Copyright (C) 2021 Kisaragi Hiu
+
+;; Author: Kisaragi Hiu <mail@kisaragi-hiu.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, vertico, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `vertico'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'vertico nil t)
+
+(defcustom evil-collection-vertico-want-want-C-u-in-insert nil
+ "When non nil, C-u may be bound in insert state."
+ :group 'evil-collection
+ :type 'boolean)
+
+;;;###autoload
+(defun evil-collection-vertico-setup ()
+ "Set up `evil' bindings for `vertico'."
+ (evil-collection-define-key nil 'vertico-map
+ (kbd "<escape>") 'abort-recursive-edit)
+
+ (defvar evil-collection-setup-minibuffer)
+ (when evil-collection-setup-minibuffer
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'normal 'vertico-map
+ (kbd "C-u") 'vertico-scroll-down))
+ (when evil-collection-vertico-want-want-C-u-in-insert
+ (unless evil-want-C-u-delete
+ (evil-collection-define-key 'insert 'vertico-map
+ (kbd "C-u") 'vertico-scroll-down)))
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'normal 'vertico-map
+ (kbd "C-d") 'vertico-scroll-up))
+
+ (evil-collection-define-key 'normal 'vertico-map
+ "gg" 'vertico-first
+ "G" 'vertico-last
+ "gj" 'vertico-next-group
+ "gk" 'vertico-previous-group
+ "j" 'vertico-next
+ "k" 'vertico-previous)
+
+ (evil-collection-define-key 'insert 'vertico-map
+ (kbd "C-n") 'vertico-next
+ (kbd "C-p") 'vertico-previous)))
+
+(provide 'evil-collection-vertico)
+;;; evil-collection-vertico.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/view/README.org b/.config/emacs/lisp/evil-collection/modes/view/README.org
new file mode 100644
index 0000000..39a990c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/view/README.org
@@ -0,0 +1,14 @@
+* view
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/View-Mode.html][View mode]].
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |-----------------------------+----------+---------|
+ | =View-quit= | =q= | =q= |
+ | =View-scroll-page-forward= | =SPC= | =SPC= |
+ | =View-scroll-page-backward= | =S-SPC= | =S-SPC= |
+ | =revert-buffer= | =g= | =gr= |
+
+ View mode starts in evil normal state.
diff --git a/.config/emacs/lisp/evil-collection/modes/view/evil-collection-view.el b/.config/emacs/lisp/evil-collection/modes/view/evil-collection-view.el
new file mode 100644
index 0000000..70c66ed
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/view/evil-collection-view.el
@@ -0,0 +1,49 @@
+;;; evil-collection-view.el --- Evil bindings for view -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, bindings, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for View.
+
+;;; Code:
+(require 'evil-collection)
+(require 'view)
+
+(defconst evil-collection-view-maps '(view-mode-map))
+
+;;;###autoload
+(defun evil-collection-view-setup ()
+ "Set up `evil' bindings for `view'."
+ (add-hook 'view-mode-hook 'evil-normalize-keymaps)
+ (evil-set-initial-state 'view-mode 'normal)
+ (evil-collection-define-key 'normal 'view-mode-map
+ "q" 'View-quit
+ (kbd "SPC") 'View-scroll-page-forward
+ (kbd "S-SPC") 'View-scroll-page-backward
+
+ ;; refresh
+ (kbd "gr") 'revert-buffer))
+
+(provide 'evil-collection-view)
+;;; evil-collection-view.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vlf/README.org b/.config/emacs/lisp/evil-collection/modes/vlf/README.org
new file mode 100644
index 0000000..05842c4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vlf/README.org
@@ -0,0 +1,46 @@
+* vlf
+
+ Evil bindings for [[https://github.com/m00natic/vlfi][vlf]] (View Large Files). Bindings are added to
+ =vlf-prefix-map= (the =C-c C-v= prefix).
+
+** Key bindings
+
+ Always installed:
+
+ | Command | Original | Evil |
+ |-------------------------------------------+----------+-------------------|
+ | =vlf-next-batch= | =n= | =gj=, =C-j=, =]]= |
+ | =vlf-prev-batch= | =p= | =gk=, =C-k=, =[[= |
+ | =vlf-change-batch-size= | =+= | =+= |
+ | =evil-collection-vlf-decrease-batch-size= | =-= | =-= |
+ | =vlf-next-batch-from-point= | =SPC= | === |
+ | =vlf-revert= | =g= | =gr= |
+ | =vlf-query-replace= | =%= | =g%= |
+ | =vlf-occur= | =o= | =go= |
+
+ When =evil-collection-want-g-bindings= is non-nil:
+
+ | Command | Original | Evil |
+ |--------------------------+----------+------|
+ | =vlf-re-search-forward= | =s= | =g/= |
+ | =vlf-re-search-backward= | =r= | =g?= |
+ | =vlf-jump-to-chunk= | =j= | =gJ= |
+ | =vlf-ediff-buffers= | =e= | =gE= |
+ | =vlf-goto-line= | =l= | =g:= |
+ | =vlf-toggle-follow= | =f= | =gF= |
+
+ When =evil-collection-want-g-bindings= is nil:
+
+ | Command | Original | Evil |
+ |--------------------------+----------+------|
+ | =vlf-re-search-forward= | =s= | =s= |
+ | =vlf-re-search-backward= | =r= | =S= |
+ | =vlf-jump-to-chunk= | =j= | =J= |
+ | =vlf-ediff-buffers= | =e= | =E= |
+ | =vlf-goto-line= | =l= | =L= |
+ | =vlf-toggle-follow= | =f= | =F= |
+
+** New commands
+
+ - =evil-collection-vlf-decrease-batch-size= - Halve the vlf batch size
+ (mirror of =vlf-change-batch-size= with a prefix arg), bound to =-=.
diff --git a/.config/emacs/lisp/evil-collection/modes/vlf/evil-collection-vlf.el b/.config/emacs/lisp/evil-collection/modes/vlf/evil-collection-vlf.el
new file mode 100644
index 0000000..b1482e2
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vlf/evil-collection-vlf.el
@@ -0,0 +1,86 @@
+;;; evil-collection-vlf.el --- Evil bindings for vlf -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, vlf, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `vlf'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'vlf nil t)
+
+(defvar vlf-mode-map)
+(declare-function vlf-change-batch-size "vlf")
+
+(defconst evil-collection-vlf-maps '(vlf-mode-map))
+
+(define-obsolete-variable-alias 'evil-collection-vlf-want-g-bindings
+ 'evil-collection-want-g-bindings "0.0.11")
+
+(defun evil-collection-vlf-decrease-batch-size ()
+ "Decrease vlf batch size by factor of 2."
+ (interactive)
+ (vlf-change-batch-size t))
+
+;;; Code:
+;;;###autoload
+(defun evil-collection-vlf-setup ()
+ "Set up `evil' bindings for `vlf'."
+ (evil-set-initial-state 'vlf-mode 'normal)
+
+ (add-hook 'vlf-mode-hook #'evil-normalize-keymaps)
+
+ (evil-collection-define-key 'normal 'vlf-prefix-map
+ "gj" 'vlf-next-batch
+ "gk" 'vlf-prev-batch
+ (kbd "C-j") 'vlf-next-batch
+ (kbd "C-k") 'vlf-prev-batch
+ "]]" 'vlf-next-batch
+ "[[" 'vlf-prev-batch
+ "+" 'vlf-change-batch-size
+ "-" 'evil-collection-vlf-decrease-batch-size
+ "=" 'vlf-next-batch-from-point
+ ;; refresh
+ "gr" 'vlf-revert
+ "g%" 'vlf-query-replace
+ "go" 'vlf-occur)
+
+ (if evil-collection-want-g-bindings
+ (evil-collection-define-key 'normal 'vlf-prefix-map
+ "g/" 'vlf-re-search-forward
+ "g?" 'vlf-re-search-backward
+ "gJ" 'vlf-jump-to-chunk
+ "gE" 'vlf-ediff-buffers
+ "g:" 'vlf-goto-line
+ "gF" 'vlf-toggle-follow)
+ (evil-collection-define-key 'normal 'vlf-prefix-map
+ "s" 'vlf-re-search-forward
+ "S" 'vlf-re-search-backward
+ "J" 'vlf-jump-to-chunk
+ "E" 'vlf-ediff-buffers
+ "L" 'vlf-goto-line
+ "F" 'vlf-toggle-follow)))
+
+(provide 'evil-collection-vlf)
+;;; evil-collection-vlf.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vterm/README.org b/.config/emacs/lisp/evil-collection/modes/vterm/README.org
new file mode 100644
index 0000000..c6133fd
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vterm/README.org
@@ -0,0 +1,55 @@
+* vterm
+
+ Evil bindings for [[https://github.com/akermu/emacs-libvterm][vterm]].
+
+ Initial state is =insert=. Normal state adds the bindings below and uses
+ vterm-aware operators that respect the prompt boundary.
+
+** Key bindings (normal state)
+
+ | Command | Original | Evil |
+ |-----------------------------------------+-----------+------|
+ | =vterm-previous-prompt= | =C-c C-p= | =[[= |
+ | =vterm-next-prompt= | =C-c C-n= | =]]= |
+ | =vterm-yank= (paste before) | =C-y= | =P= |
+ | =evil-collection-vterm-paste-after= | n/a | =p= |
+ | =evil-collection-vterm-insert= | n/a | =i= |
+ | =evil-collection-vterm-insert-line= | n/a | =I= |
+ | =evil-collection-vterm-append= | n/a | =a= |
+ | =evil-collection-vterm-append-line= | n/a | =A= |
+ | =evil-collection-vterm-first-non-blank= | n/a | =^= |
+ | =vterm-undo= | n/a | =u= |
+ | =vterm-reset-cursor-point= | =C-c C-r= | =G= |
+
+ =RET= sends to the terminal in the state named by =evil-collection-repl-submit-state=.
+
+** Insert state
+
+ To preserve terminal control sequences, the following are forwarded raw to
+ the terminal via =vterm--self-insert=: =C-a=, =C-b=, =C-d=, =C-e=, =C-f=,
+ =C-k=, =C-l=, =C-n=, =C-o=, =C-p=, =C-q=, =C-r=, =C-s=, =C-t=, =C-u=, =C-v=,
+ =C-w=, =C-y=, =C-z=. =C-c= (prefix) and =C-h= (help) are not forwarded.
+
+ =<delete>= → =vterm-send-delete=.
+
+** New commands
+
+ | Command | Key | |
+ |----------------------------------------------+-----------+--------------------------------------------|
+ | =evil-collection-vterm-delete= | =d= | delete operator, clamped to current line |
+ | =evil-collection-vterm-delete-line= | =D= | delete to end-of-line |
+ | =evil-collection-vterm-delete-char= | =x= | delete forward char |
+ | =evil-collection-vterm-delete-backward-char= | =X= | delete backward char |
+ | =evil-collection-vterm-change= | =c= | change operator |
+ | =evil-collection-vterm-change-line= | =C= | change to end-of-line |
+ | =evil-collection-vterm-substitute= | =s= | |
+ | =evil-collection-vterm-substitute-line= | =S= | |
+ | =evil-collection-vterm-replace= | =r= | |
+ | =evil-collection-vterm-next-line= | =j= | won't move below last prompt line |
+ | =evil-collection-vterm-toggle-send-escape= | =C-c C-z= | toggle whether =ESC= goes to vterm or evil |
+
+** Customization
+
+ | Variable | Default | Purpose |
+ |------------------------------------------+---------+--------------------------------------------------------|
+ | =evil-collection-vterm-move-cursor-back= | =nil= | Move cursor back one column when leaving insert state. |
diff --git a/.config/emacs/lisp/evil-collection/modes/vterm/evil-collection-vterm.el b/.config/emacs/lisp/evil-collection/modes/vterm/evil-collection-vterm.el
new file mode 100644
index 0000000..d66dde8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vterm/evil-collection-vterm.el
@@ -0,0 +1,308 @@
+;;; evil-collection-vterm.el --- Bindings for `vterm' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2019 James Nguyen
+;; Copyright (C) 2020 Alex Griffin <a@ajgrf.com>
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, vterm, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `vterm'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'vterm nil t)
+
+(defconst evil-collection-vterm-maps '(vterm-mode-map))
+
+(declare-function vterm-goto-char "vterm")
+(declare-function vterm--get-prompt-point "vterm")
+(declare-function vterm--get-end-of-line "vterm")
+(declare-function vterm-delete-region "vterm")
+
+(defvar vterm--process)
+
+(defcustom evil-collection-vterm-move-cursor-back nil
+ "Whether the cursor is moved backwards when exiting insert state."
+ :type 'boolean
+ :group 'vterm)
+
+(defun evil-collection-vterm-escape-stay ()
+ "Go back to normal state but don't move cursor backwards.
+Moving cursor backwards is the default vim behavior but
+it is not appropriate in some cases like terminals."
+ (setq-local evil-move-cursor-back
+ evil-collection-vterm-move-cursor-back))
+
+(defvar-local evil-collection-vterm-send-escape-to-vterm-p nil
+ "Track whether or not we send ESC to `vterm' or `emacs'.")
+
+(defun evil-collection-vterm-toggle-send-escape ()
+ "Toggle where ESC is sent between `vterm' and `emacs'.
+
+This is needed for programs that use ESC, e.g. vim or an ssh'd emacs that
+also uses `evil-mode'."
+ (interactive)
+ (if evil-collection-vterm-send-escape-to-vterm-p
+ (evil-collection-define-key 'insert 'vterm-mode-map (kbd "<escape>")
+ (lookup-key evil-insert-state-map (kbd "<escape>")))
+ (evil-collection-define-key 'insert 'vterm-mode-map
+ (kbd "<escape>") 'vterm--self-insert))
+ (setq evil-collection-vterm-send-escape-to-vterm-p
+ (not evil-collection-vterm-send-escape-to-vterm-p))
+ (message (format "Sending ESC to %s."
+ (if evil-collection-vterm-send-escape-to-vterm-p
+ "vterm"
+ "emacs"))))
+
+(declare-function vterm-cursor-in-command-buffer-p "vterm")
+(declare-function vterm-beginning-of-line "vterm")
+(declare-function vterm-insert "vterm")
+
+(evil-define-motion evil-collection-vterm-first-non-blank ()
+ "Move the cursor to the first non-blank character
+after the prompt."
+ :type exclusive
+ (if (vterm-cursor-in-command-buffer-p (point))
+ (vterm-beginning-of-line)
+ (evil-first-non-blank)))
+
+(defun evil-collection-vterm-insert ()
+ "Insert character before cursor."
+ (interactive)
+ (vterm-goto-char (point))
+ (call-interactively #'evil-insert))
+
+(defun evil-collection-vterm-insert-line ()
+ "Insert character at beginning of prompt."
+ (interactive)
+ (vterm-goto-char (vterm--get-prompt-point))
+ (call-interactively #'evil-insert))
+
+(defun evil-collection-vterm-append ()
+ "Append character after cursor."
+ (interactive)
+ (vterm-goto-char (1+ (point)))
+ (call-interactively #'evil-insert))
+
+(defun evil-collection-vterm-append-line ()
+ "Append character at end-of-line."
+ (interactive)
+ (vterm-goto-char (vterm--get-end-of-line))
+ (call-interactively #'evil-insert))
+
+(declare-function vterm-yank "vterm")
+
+(defun evil-collection-vterm-paste-after (&optional arg)
+ (interactive "P")
+ (vterm-goto-char (+ 1 (point)))
+ (call-interactively #'vterm-yank arg))
+
+(declare-function vterm-reset-cursor-point "vterm")
+
+(evil-define-operator evil-collection-vterm-delete (beg end type register yank-handler)
+ "Modification of evil-delete to work in vterm buffer.
+Delete text from BEG to END with TYPE.
+Save in REGISTER or in the kill-ring with YANK-HANDLER."
+ (interactive "<R><x><y>")
+ (let* ((beg (max (or beg (point)) (vterm--get-prompt-point)))
+ (end (min (or end beg) (vterm--get-end-of-line))))
+ (unless register
+ (let ((text (filter-buffer-substring beg end)))
+ (unless (string-match-p "\n" text)
+ ;; set the small delete register
+ (evil-set-register ?- text))))
+ (let ((evil-was-yanked-without-register nil))
+ (evil-yank beg end type register yank-handler))
+ (cond
+ ((eq type 'block)
+ (evil-apply-on-block #'vterm-delete-region beg end nil))
+ ((and (eq type 'line)
+ (= end (point-max))
+ (or (= beg end)
+ (/= (char-before end) ?\n))
+ (/= beg (point-min))
+ (= (char-before beg) ?\n))
+ (vterm-delete-region (1- beg) end))
+ (t
+ (vterm-delete-region beg end)))
+ ;; place cursor on beginning of line
+ (when (and (called-interactively-p 'any)
+ (eq type 'line))
+ (vterm-reset-cursor-point))))
+
+(evil-define-operator evil-collection-vterm-delete-backward-char (beg end type register)
+ "Delete previous character."
+ :motion evil-backward-char
+ (interactive "<R><x>")
+ (evil-collection-vterm-delete beg end type register))
+
+(evil-define-operator evil-collection-vterm-delete-char (beg end type register)
+ "Delete current character."
+ :motion evil-forward-char
+ (interactive "<R><x>")
+ (evil-collection-vterm-delete beg end type register))
+
+(evil-define-operator evil-collection-vterm-delete-line (beg end type register yank-handler)
+ "Modification of evil-delete line to work in vterm bufer. Delete to end of line."
+ :motion nil
+ :keep-visual t
+ (interactive "<R><x>")
+ ;; act linewise in Visual state
+ (let* ((beg (or beg (point)))
+ (end (or end beg))
+ (visual-line-mode (and evil-respect-visual-line-mode
+ visual-line-mode))
+ (line-end (if visual-line-mode
+ (save-excursion
+ (end-of-visual-line)
+ (point))
+ (line-end-position))))
+ (when (evil-visual-state-p)
+ (unless (memq type '(line screen-line block))
+ (let ((range (evil-expand beg end
+ (if visual-line-mode
+ 'screen-line
+ 'line))))
+ (setq beg (evil-range-beginning range)
+ end (evil-range-end range)
+ type (evil-type range))))
+ (evil-exit-visual-state))
+ (cond
+ ((eq type 'block)
+ ;; equivalent to $d, i.e., we use the block-to-eol selection and
+ ;; call `evil-collection-vterm-delete'. In this case we fake the call to
+ ;; `evil-end-of-line' by setting `temporary-goal-column' and
+ ;; `last-command' appropriately as `evil-end-of-line' would do.
+ (let ((temporary-goal-column most-positive-fixnum)
+ (last-command 'next-line))
+ (evil-collection-vterm-delete beg end 'block register yank-handler)))
+ ((memq type '(line screen-line))
+ (evil-collection-vterm-delete beg end type register yank-handler))
+ (t
+ (evil-collection-vterm-delete beg line-end type register yank-handler)))))
+
+(evil-define-operator evil-collection-vterm-replace (beg end type register yank-handler)
+ :motion evil-forward-char
+ (interactive "<R>")
+ (let ((replacement (make-string (- end beg) (read-char))))
+ (evil-collection-vterm-delete beg end type register yank-handler)
+ (vterm-insert replacement)
+ (vterm-goto-char (1- end))))
+
+(evil-define-operator evil-collection-vterm-change (beg end type register yank-handler)
+ (evil-collection-vterm-delete beg end type register yank-handler)
+ (evil-collection-vterm-insert))
+
+(evil-define-operator evil-collection-vterm-change-line (beg end type register yank-handler)
+ :motion evil-end-of-line-or-visual-line
+ (evil-collection-vterm-delete-line beg end type register yank-handler)
+ (evil-collection-vterm-insert))
+
+(evil-define-operator evil-collection-vterm-substitute (beg end type register)
+ :motion evil-forward-char
+ (interactive "<R><x>")
+ (evil-collection-vterm-change beg end type register))
+
+(evil-define-operator evil-collection-vterm-substitute-line (beg end register yank-handler)
+ :motion evil-line-or-visual-line
+ :type line
+ (interactive "<r><x>")
+ (evil-collection-vterm-change beg end 'line register yank-handler))
+
+(evil-define-motion evil-collection-vterm-next-line (count)
+ "Move the cursor COUNT lines down.
+But don't allow the cursor to move bellow the last prompt line."
+ :type line
+ ;; This successfully prevents the `j' button from moving to an empty line
+ ;; bellow the last prompt. However, it still can be bugged for example by
+ ;; going to the one line above the last prompt and doing `10j'.
+ (when (> (count-words (point) (point-max)) 0)
+ (evil-next-line count)))
+
+;;;###autoload
+(defun evil-collection-vterm-setup ()
+ "Set up `evil' bindings for `vterm'."
+ (evil-set-initial-state 'vterm-mode 'insert)
+
+ (add-hook 'vterm-mode-hook #'evil-collection-vterm-escape-stay)
+
+ ;; Open to a better binding...
+ (evil-collection-define-key '(normal insert) 'vterm-mode-map
+ (kbd "C-c C-z") 'evil-collection-vterm-toggle-send-escape)
+
+ ;; Evil has some "C-" bindings in insert state that shadow regular terminal
+ ;; bindings. Don't raw-send "C-c" (prefix key) nor "C-h" (help prefix).
+ (evil-collection-define-key 'insert 'vterm-mode-map
+ (kbd "C-a") 'vterm--self-insert
+ (kbd "C-b") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-d") 'vterm--self-insert
+ (kbd "C-e") 'vterm--self-insert
+ (kbd "C-f") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-k") 'vterm--self-insert
+ (kbd "C-l") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-n") 'vterm--self-insert
+ (kbd "C-o") 'vterm--self-insert
+ (kbd "C-p") 'vterm--self-insert
+ (kbd "C-q") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-r") 'vterm--self-insert
+ (kbd "C-s") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-t") 'vterm--self-insert
+ (kbd "C-u") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-v") 'vterm--self-insert ; Should not be necessary.
+ (kbd "C-w") 'vterm--self-insert
+ (kbd "C-y") 'vterm--self-insert
+ (kbd "C-z") 'vterm--self-insert
+ (kbd "<delete>") 'vterm-send-delete)
+
+ (let* ((submit evil-collection-repl-submit-state))
+ (evil-collection-define-key submit 'vterm-mode-map
+ (kbd "RET") 'vterm-send-return))
+
+ (evil-collection-define-key 'normal 'vterm-mode-map
+ "[[" 'vterm-previous-prompt
+ "]]" 'vterm-next-prompt
+ "p" 'evil-collection-vterm-paste-after
+ "P" 'vterm-yank
+ "a" 'evil-collection-vterm-append
+ "A" 'evil-collection-vterm-append-line
+ "d" 'evil-collection-vterm-delete
+ "D" 'evil-collection-vterm-delete-line
+ "x" 'evil-collection-vterm-delete-char
+ "X" 'evil-collection-vterm-delete-backward-char
+ "^" 'evil-collection-vterm-first-non-blank
+ "i" 'evil-collection-vterm-insert
+ "I" 'evil-collection-vterm-insert-line
+ "u" 'vterm-undo
+ "r" 'evil-collection-vterm-replace
+ "c" 'evil-collection-vterm-change
+ "C" 'evil-collection-vterm-change-line
+ "s" 'evil-collection-vterm-substitute
+ "S" 'evil-collection-vterm-substitute-line
+ "j" 'evil-collection-vterm-next-line
+ "G" 'vterm-reset-cursor-point)
+
+ (evil-collection-define-key 'visual 'vterm-mode-map
+ "d" 'evil-collection-vterm-delete
+ "x" 'evil-collection-vterm-delete-backward-char))
+
+(provide 'evil-collection-vterm)
+;;; evil-collection-vterm.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/vundo/README.org b/.config/emacs/lisp/evil-collection/modes/vundo/README.org
new file mode 100644
index 0000000..04e505b
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vundo/README.org
@@ -0,0 +1,31 @@
+* vundo
+
+ Evil bindings for [[https://github.com/casouri/vundo][vundo]], visual undo tree.
+
+ Upstream defaults to emacs state; evil-collection forces normal state on
+ entry, hides the evil cursor, and disables =hl-line-mode= locally.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |---------------------+--------------+--------------------------------|
+ | =vundo-forward= | =f=, =right= | =l=, =C-f=, =right= |
+ | =vundo-backward= | =b=, =left= | =h=, =C-b=, =left=, =DEL= |
+ | =vundo-next= | =n= | =j=, =C-n=, =C-j=, =M-j= |
+ | =vundo-previous= | =p= | =k=, =C-p=, =C-k=, =M-k= |
+ | =vundo-stem-root= | =a= | =H= (evil-window-top remap) |
+ | =vundo-stem-end= | =e= | =L= (evil-window-bottom remap) |
+ | =vundo-next-root= | =w= | =w= |
+ | =vundo-confirm= | =RET= | =RET=, =ZZ= |
+ | =vundo-quit= | =q=, =C-g= | =q=, =ZQ= |
+ | =vundo-diff= | =d= | =d= |
+ | =vundo-diff-mark= | =m= | =m= |
+ | =vundo-diff-unmark= | =u= | =u= |
+ | =vundo--inspect= | =i= | =i= |
+ | =vundo--debug= | =D= | =D= |
+
+ Direction keys are wired via =[remap]= against the corresponding evil
+ motion command (=evil-backward-char=, =evil-forward-char=, etc.) so they
+ follow any user rebinding of those motions. =vundo-goto-last-saved= (=l=
+ upstream) and =vundo-goto-next-saved= (=r= upstream) are shadowed by the
+ evil motion remaps; call them via =M-x= if needed.
diff --git a/.config/emacs/lisp/evil-collection/modes/vundo/evil-collection-vundo.el b/.config/emacs/lisp/evil-collection/modes/vundo/evil-collection-vundo.el
new file mode 100644
index 0000000..e02c110
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/vundo/evil-collection-vundo.el
@@ -0,0 +1,93 @@
+;;; evil-collection-vundo.el --- Bindings for `vundo-mode' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, vundo, convenience
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `vundo-mode'.
+
+;;; Code:
+(require 'vundo nil t)
+(require 'evil-collection)
+
+(defgroup evil-collection-vundo nil
+ "Evil bindings for `vundo-mode'."
+ :group 'evil-collection)
+
+(defvar vundo-mode-map)
+
+(defconst evil-collection-vundo-maps '(vundo-mode-map))
+
+(defun evil-collection-vundo--hide-evil-cursor ()
+ "Hide the evil cursor."
+ (setq-local evil-default-cursor '(nil))
+ (setq-local evil-motion-state-cursor nil)
+ (setq-local evil-visual-state-cursor nil)
+ (setq-local evil-normal-state-cursor nil)
+ (setq-local evil-insert-state-cursor nil)
+ (setq-local evil-emacs-state-cursor nil))
+
+(defun evil-collection-vundo--disable-hl-line-mode ()
+ "Disable `hl-line-mode'."
+ (setq-local global-hl-line-mode nil))
+
+;;;###autoload
+(defun evil-collection-vundo-setup ()
+ "Set up `evil' bindings for `vundo'."
+ (add-hook 'vundo-mode-hook #'evil-normalize-keymaps)
+ ;; `vundo' defaults to emacs state.
+ (add-hook 'vundo-mode-hook #'evil-normal-state)
+ ;; hide evil cursor
+ (add-hook 'vundo-mode-hook #'evil-collection-vundo--hide-evil-cursor)
+ ;; disable hl-line-mode
+ (add-hook 'vundo-mode-hook #'evil-collection-vundo--disable-hl-line-mode)
+
+ (evil-collection-define-key 'normal 'vundo-mode-map
+ [remap evil-backward-char] 'vundo-backward
+ [remap evil-forward-char] 'vundo-forward
+ [remap evil-next-line] 'vundo-next
+ [remap evil-previous-line] 'vundo-previous
+ [remap evil-window-top] 'vundo-stem-root
+ [remap evil-window-bottom] 'vundo-stem-end
+ [remap evil-ret] 'vundo-confirm
+ [remap evil-quit] 'vundo-quit
+ [remap evil-save-and-close] 'vundo-confirm
+ [remap evil-save-modified-and-close] 'vundo-confirm
+ [remap evil-delete-backward-char] 'vundo-backward
+ (kbd "C-n") 'vundo-next
+ (kbd "C-p") 'vundo-previous
+ (kbd "C-j") 'vundo-next
+ (kbd "C-k") 'vundo-previous
+ (kbd "M-j") 'vundo-next
+ (kbd "M-k") 'vundo-previous
+ "i" 'vundo--inspect
+ "D" 'vundo--debug
+ "d" 'vundo-diff
+ "m" 'vundo-diff-mark
+ "u" 'vundo-diff-unmark
+ "w" 'vundo-next-root
+ "q" 'vundo-quit
+ "ZZ" 'vundo-quit
+ "ZQ" 'vundo-quit))
+
+(provide 'evil-collection-vundo)
+;;; evil-collection-vundo.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/w3m/evil-collection-w3m.el b/.config/emacs/lisp/evil-collection/modes/w3m/evil-collection-w3m.el
new file mode 100644
index 0000000..ecdff0d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/w3m/evil-collection-w3m.el
@@ -0,0 +1,87 @@
+;;; evil-collection-w3m.el --- Evil bindings for w3m -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, w3m, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `w3m'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'w3m nil t)
+
+(defconst evil-collection-w3m-maps '(w3m-mode-map))
+
+;;;###autoload
+(defun evil-collection-w3m-setup ()
+ "Set up `evil' bindings for `w3m'."
+ (evil-set-initial-state 'w3m-mode 'normal)
+ (evil-collection-define-key 'normal 'w3m-mode-map
+ (kbd "S-SPC") 'w3m-scroll-down-or-previous-url
+ (kbd "SPC") 'w3m-scroll-up-or-next-url
+
+ (kbd "RET") 'w3m-view-this-url
+ "o" 'w3m-goto-url
+ "O" 'w3m-goto-url-new-session
+
+ "]]" 'w3m-next-form
+ "[[" 'w3m-previous-form
+
+ "H" 'w3m-view-previous-page
+ "L" 'w3m-view-next-page
+ "^" 'w3m-view-parent-page
+
+ "gf" 'w3m-view-source
+ "gh" 'w3m-view-header
+
+ "d" 'w3m-download-this-url
+ "M-d" 'w3m-download
+
+ "I" 'w3m-view-image
+ "M-i" 'w3m-save-image
+ "zi" 'w3m-toggle-inline-image
+ "zI" 'w3m-toggle-inline-images
+ "M-T" 'w3m-turnoff-inline-images
+
+ ;; bookmarks
+ "gb" 'w3m-bookmark-view
+ "gB" 'w3m-bookmark-view-new-session
+ "a" 'w3m-bookmark-add-current-url
+
+ ;; refresh
+ "gr" 'w3m-reload-this-page
+ "gR" 'w3m-reload-all-pages
+
+ ;; quit
+ "q" 'w3m-close-window
+ "ZQ" 'w3m-quit
+ "ZZ" 'quit-window)
+
+ (evil-collection-define-operator-key 'yank 'w3m-mode-map
+ ;; yt
+ "t" 'w3m-print-this-url
+ ;; yu
+ "u" 'w3m-print-current-url))
+
+(provide 'evil-collection-w3m)
+;;; evil-collection-w3m.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/wdired/README.org b/.config/emacs/lisp/evil-collection/modes/wdired/README.org
new file mode 100644
index 0000000..9a16e3d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/wdired/README.org
@@ -0,0 +1,14 @@
+* wdired
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Wdired.html][Wdired]] (writable Dired).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------+-----------+------------|
+ | =wdired-finish-edit= | =C-c C-c= | =ZZ=, =:w= |
+ | =wdired-abort-changes= | =C-c C-k= | =ZQ= |
+ | =wdired-exit= | =C-x C-q= | =<escape>= |
+
+ =wdired-finish-edit= is also bound to =[remap evil-write]= so =:w= commits
+ the rename. Initial state in wdired-mode is normal.
diff --git a/.config/emacs/lisp/evil-collection/modes/wdired/evil-collection-wdired.el b/.config/emacs/lisp/evil-collection/modes/wdired/evil-collection-wdired.el
new file mode 100644
index 0000000..e968b1e
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/wdired/evil-collection-wdired.el
@@ -0,0 +1,49 @@
+;;; evil-collection-wdired.el --- Bindings for `wdired' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `wdired'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'wdired)
+
+(defconst evil-collection-wdired-maps '(wdired-mode-map))
+
+;;;###autoload
+(defun evil-collection-wdired-setup ()
+ "Set up `evil' bindings for `wdired'."
+ (evil-set-initial-state 'wdired-mode 'normal)
+
+ (evil-collection-define-key nil 'wdired-mode-map
+ [remap evil-write] 'wdired-finish-edit)
+
+ (evil-collection-define-key 'normal 'wdired-mode-map
+ "ZQ" 'wdired-abort-changes
+ "ZZ" 'wdired-finish-edit
+ (kbd "<escape>") 'wdired-exit))
+
+(provide 'evil-collection-wdired)
+;;; evil-collection-wdired.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/wgrep/README.org b/.config/emacs/lisp/evil-collection/modes/wgrep/README.org
new file mode 100644
index 0000000..ca985ae
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/wgrep/README.org
@@ -0,0 +1,19 @@
+* wgrep
+
+ Evil bindings for [[https://github.com/mhayashi1120/Emacs-wgrep][wgrep]] (writable grep buffers).
+
+ Upstream only binds finish / abort / toggle commands under =C-c= and
+ =C-x= prefixes. evil-collection layers the usual evil quit-and-save
+ bindings on top and remaps =evil-write= to finish the edit.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |------------------------------+---------------------------------+------------|
+ | =wgrep-finish-edit= | =C-c C-c=, =C-c C-e=, =C-x C-s= | =ZZ=, =:w= |
+ | =wgrep-abort-changes= | =C-c C-k= | =ZQ= |
+ | =wgrep-exit= | =C-x C-q= | =<escape>= |
+ | =wgrep-mark-deletion= | =C-c C-d= | =C-c C-d= |
+ | =wgrep-remove-change= | =C-c C-r= | =C-c C-r= |
+ | =wgrep-remove-all-change= | =C-c C-u= | =C-c C-u= |
+ | =wgrep-toggle-readonly-area= | =C-c C-p= | =C-c C-p= |
diff --git a/.config/emacs/lisp/evil-collection/modes/wgrep/evil-collection-wgrep.el b/.config/emacs/lisp/evil-collection/modes/wgrep/evil-collection-wgrep.el
new file mode 100644
index 0000000..fd4d73a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/wgrep/evil-collection-wgrep.el
@@ -0,0 +1,49 @@
+;;; evil-collection-wgrep.el --- Bindings for `wgrep' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `wgrep'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'wgrep nil t)
+
+(defvar wgrep-mode-map)
+
+(defconst evil-collection-wgrep-maps '(wgrep-mode-map))
+
+;;;###autoload
+(defun evil-collection-wgrep-setup ()
+ "Set up `evil' bindings for `wgrep'."
+ (evil-collection-define-key nil 'wgrep-mode-map
+ [remap evil-write] 'wgrep-finish-edit)
+
+ (evil-collection-define-key 'normal 'wgrep-mode-map
+ "ZQ" 'wgrep-abort-changes
+ "ZZ" 'wgrep-finish-edit
+ (kbd "<escape>") 'wgrep-exit))
+
+(provide 'evil-collection-wgrep)
+;;; evil-collection-wgrep.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/which-key/README.org b/.config/emacs/lisp/evil-collection/modes/which-key/README.org
new file mode 100644
index 0000000..17dd24a
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/which-key/README.org
@@ -0,0 +1,17 @@
+* which-key
+
+ Evil bindings for [[https://github.com/justbur/emacs-which-key][which-key]] paging popup.
+
+ Only =which-key-C-h-map= (the paging popup invoked from inside a prefix)
+ is modified; the global which-key triggers themselves are untouched.
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |--------------------------------------+------------+------------|
+ | =which-key-abort= | =a=, =C-a= | =q= |
+ | =which-key-show-next-page-cycle= | =n=, =C-n= | =j=, =C-n= |
+ | =which-key-show-previous-page-cycle= | =p=, =C-p= | =k=, =C-p= |
+ | =which-key-show-standard-help= | =h=, =C-h= | =?=, =C-h= |
+ | =which-key-undo-key= | =u=, =C-u= | =u=, =C-u= |
+ | =which-key-toggle-docstrings= | =d=, =C-d= | =d=, =C-d= |
diff --git a/.config/emacs/lisp/evil-collection/modes/which-key/evil-collection-which-key.el b/.config/emacs/lisp/evil-collection/modes/which-key/evil-collection-which-key.el
new file mode 100644
index 0000000..e0b8b9d
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/which-key/evil-collection-which-key.el
@@ -0,0 +1,52 @@
+;;; evil-collection-which-key.el --- Evil bindings for which-key -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Maximiliano Sandoval <msandova@protonmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, which-key, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `which-key'
+
+;;; Code:
+
+(require 'evil-collection)
+(require 'which-key nil t)
+
+(defvar which-key-C-h-map)
+
+(defconst evil-collection-which-key-maps '(which-key-C-h-map))
+
+;; `which-key'is coded so that the prompt properly shows j and k as
+;; the bindings.
+;;;###autoload
+(defun evil-collection-which-key-setup ()
+ "Set up `evil' bindings for `which-key'."
+
+ ;; (evil-collection-define-key nil 'which-key-C-h-map "u" 'which-key-undo-key)
+ (evil-collection-define-key nil 'which-key-C-h-map
+ "q" 'which-key-abort
+ "j" 'which-key-show-next-page-cycle
+ "k" 'which-key-show-previous-page-cycle
+ "?" 'which-key-show-standard-help))
+
+(provide 'evil-collection-which-key)
+;;; evil-collection-which-key.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/with-editor/README.org b/.config/emacs/lisp/evil-collection/modes/with-editor/README.org
new file mode 100644
index 0000000..7007a69
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/with-editor/README.org
@@ -0,0 +1,17 @@
+* with-editor
+
+ Evil bindings for [[https://github.com/magit/with-editor][with-editor]], used for editing git commit messages
+ and similar =$EDITOR= sessions inside Emacs.
+
+ Upstream already remaps =evil-quit=, =evil-save-and-close= and
+ =evil-save-modified-and-close= to =with-editor-cancel= /
+ =with-editor-finish=, so =:q=, =:wq= and =ZZ=/=ZQ= work out of the box.
+ evil-collection adds explicit normal-state =ZQ= and =ZZ= so they are
+ not subject to evil's save-modified semantics.
+
+** with-editor-mode-map (normal state)
+
+ | Command | Original | Evil |
+ |----------------------+-----------+------|
+ | =with-editor-cancel= | =C-c C-k= | =ZQ= |
+ | =with-editor-finish= | =C-c C-c= | =ZZ= |
diff --git a/.config/emacs/lisp/evil-collection/modes/with-editor/evil-collection-with-editor.el b/.config/emacs/lisp/evil-collection/modes/with-editor/evil-collection-with-editor.el
new file mode 100644
index 0000000..91199a1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/with-editor/evil-collection-with-editor.el
@@ -0,0 +1,45 @@
+;;; evil-collection-with-editor.el --- Bindings for `with-editor' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2024 Tianshu Wang
+
+;; Author: Tianshu Wang <dev@wang.tianshu.me>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Bindings for `with-editor'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'with-editor nil t)
+
+(defvar with-editor-mode-map)
+
+(defconst evil-collection-with-editor-maps '(with-editor-mode-map))
+
+;;;###autoload
+(defun evil-collection-with-editor-setup ()
+ "Set up `evil' bindings for `with-editor'."
+ (evil-collection-define-key 'normal 'with-editor-mode-map
+ "ZQ" 'with-editor-cancel
+ "ZZ" 'with-editor-finish))
+
+(provide 'evil-collection-with-editor)
+;;; evil-collection-with-editor.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/woman/README.org b/.config/emacs/lisp/evil-collection/modes/woman/README.org
new file mode 100644
index 0000000..c929d47
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/woman/README.org
@@ -0,0 +1,13 @@
+* woman
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/woman/index.html][WoMan]] (manpage viewer, no external tools).
+
+** Key bindings
+
+ | Command | Original | Evil |
+ |----------------------------+----------+------|
+ | =WoMan-next-manpage= | =n= | =]]= |
+ | =WoMan-previous-manpage= | =p= | =[[= |
+ | =woman-reformat-last-file= | =R= | =gr= |
+
+ Standard motion / quit bindings are inherited from =evil-collection-man=.
diff --git a/.config/emacs/lisp/evil-collection/modes/woman/evil-collection-woman.el b/.config/emacs/lisp/evil-collection/modes/woman/evil-collection-woman.el
new file mode 100644
index 0000000..d7e889c
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/woman/evil-collection-woman.el
@@ -0,0 +1,51 @@
+;;; evil-collection-woman.el --- Evil bindings for WoMan -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, woman, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `woman'.
+
+;;; Code:
+(require 'evil-collection)
+(evil-collection-require 'man)
+(require 'woman)
+
+(defconst evil-collection-woman-maps '(woman-mode-map))
+
+;;;###autoload
+(defun evil-collection-woman-setup ()
+ "Set up `evil' bindings for `woman'."
+ (evil-set-initial-state 'woman-mode 'normal)
+ (evil-collection-define-key 'normal 'woman-mode-map
+ (kbd "]]") 'WoMan-next-manpage
+ (kbd "[[") 'WoMan-previous-manpage
+
+ ;; goto
+ ;; "gm" 'woman
+
+ ;; refresh
+ "gr" 'woman-reformat-last-file))
+
+(provide 'evil-collection-woman)
+;;; evil-collection-woman.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/xref/README.org b/.config/emacs/lisp/evil-collection/modes/xref/README.org
new file mode 100644
index 0000000..36e32c9
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/xref/README.org
@@ -0,0 +1,26 @@
+* xref
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html][xref]].
+
+** xref--xref-buffer-mode-map
+
+ | Command | Original | Evil |
+ |----------------------------------+----------+--------------------------|
+ | =xref-next-line= | =n=, =.= | =gj=, =C-j=, =C-n=, =]]= |
+ | =xref-prev-line= | =p=, =,= | =gk=, =C-k=, =C-p=, =[[= |
+ | #ERROR | =N= | =]]= |
+ | =xref-prev-group= (Emacs 28+) | =P= | =[[= |
+ | =xref-query-replace-in-results= | =r= | =r=, =Q= |
+ | =xref-goto-xref= | =RET= | =RET= |
+ | =xref-quit-and-goto-xref= | =TAB= | =S-RET= |
+ | =xref-show-location-at-point= | =C-o= | =o=, =go= |
+ | =xref-revert-buffer= (Emacs 27+) | n/a | =gr= |
+ #+TBLFM: $1=xref-next-group= (Emacs 28+)
+
+** xref--transient-buffer-mode-map
+
+ (Emacs 27+)
+
+ | Command | Original | Evil |
+ |---------------------------+--------------+-------|
+ | =xref-quit-and-goto-xref= | =RET=, =TAB= | =RET= |
diff --git a/.config/emacs/lisp/evil-collection/modes/xref/evil-collection-xref.el b/.config/emacs/lisp/evil-collection/modes/xref/evil-collection-xref.el
new file mode 100644
index 0000000..1c9ea17
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/xref/evil-collection-xref.el
@@ -0,0 +1,76 @@
+;;; evil-collection-xref.el --- Evil bindings for xref -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017, 2021 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, xref, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for `xref'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'xref)
+
+(defconst evil-collection-xref-maps `(xref--xref-buffer-mode-map
+ ,@(when (>= emacs-major-version 27) '(xref--transient-buffer-mode-map))))
+
+;;;###autoload
+(defun evil-collection-xref-setup ()
+ "Set up `evil' bindings for `xref'."
+ (evil-set-initial-state 'xref--xref-buffer-mode 'normal)
+ (evil-collection-set-readonly-bindings 'xref--xref-buffer-mode-map)
+ (evil-collection-define-key 'normal 'xref--xref-buffer-mode-map
+ "gj" 'xref-next-line
+ "gk" 'xref-prev-line
+ (kbd "C-j") 'xref-next-line
+ (kbd "C-k") 'xref-prev-line
+ (kbd "C-n") 'xref-next-line
+ (kbd "C-p") 'xref-prev-line
+ "]]" 'xref-next-line
+ "[[" 'xref-prev-line
+ "r" 'xref-query-replace-in-results
+
+ ;; Match `dired''s `dired-do-find-regexp-and-replace'.
+ "Q" 'xref-query-replace-in-results
+
+ ;; open
+ (kbd "RET") 'xref-goto-xref
+ (kbd "S-<return>") 'xref-quit-and-goto-xref ;; In Emacs mode map, TAB binds to `xref-quit-and-goto-xref'
+ "o" 'xref-show-location-at-point
+ "go" 'xref-show-location-at-point)
+
+ (when (>= emacs-major-version 27)
+ (evil-collection-define-key 'normal 'xref--xref-buffer-mode-map
+ "gr" 'xref-revert-buffer))
+
+ (when (>= emacs-major-version 28)
+ (evil-collection-define-key 'normal 'xref--xref-buffer-mode-map
+ "[[" 'xref-prev-group
+ "]]" 'xref-next-group))
+
+ (when (>= emacs-major-version 27)
+ (evil-set-initial-state 'xref--transient-buffer-mode 'normal)
+ (evil-collection-define-key 'normal 'xref--transient-buffer-mode-map
+ (kbd "RET") 'xref-quit-and-goto-xref)))
+
+(provide 'evil-collection-xref)
+;;; evil-collection-xref.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/xwidget/README.org b/.config/emacs/lisp/evil-collection/modes/xwidget/README.org
new file mode 100644
index 0000000..5825785
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/xwidget/README.org
@@ -0,0 +1,43 @@
+* xwidget
+
+ Evil bindings for [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Embedded-WebKit-Widgets.html][xwidget-webkit]], modeled after vimium.
+
+** Key bindings
+
+ Standard read-only motion / quit bindings come from
+ =evil-collection-set-readonly-bindings=.
+
+ | Command | Original | Evil |
+ |--------------------------------------------------+----------+----------------|
+ | =xwidget-webkit-scroll-up-line= | =C-n= | =j= |
+ | =xwidget-webkit-scroll-down-line= | =C-p= | =k= |
+ | =xwidget-webkit-scroll-top= | =M-<= | =gg= |
+ | =xwidget-webkit-scroll-bottom= | =M->= | =G= |
+ | =xwidget-webkit-scroll-backward= | =B= | =h= |
+ | =xwidget-webkit-scroll-forward= | =F= | =l= |
+ | =xwidget-webkit-scroll-up= | =SPC= | =C-f= |
+ | =xwidget-webkit-scroll-down= | =S-SPC= | =C-b= |
+ | =xwidget-webkit-back= | =r= | =H=, =<= |
+ | =xwidget-webkit-forward= | =R= | =L=, =>= |
+ | =xwidget-webkit-reload= | =g= | =r=, =gr= |
+ | =xwidget-webkit-current-url= | =u= | =yy= |
+ | =xwidget-webkit-browse-url= | =a= | =o=, =gu=, =J= |
+ | =xwidget-webkit-copy-selection-as-kill= (visual) | =w= | =y= |
+ | =xwidget-webkit-insert-string= | =i= | =RET= |
+ | =xwidget-webkit-zoom-in= | =+= | =+=, === |
+ | =xwidget-webkit-zoom-out= | =-= | =-= |
+ | =describe-mode= | =C-h m= | =?= |
+
+** New commands
+
+ | Command | Key | Notes |
+ |----------------------------------------------------------+-----------+--------------------------------|
+ | =evil-collection-xwidget-webkit-scroll-half-page-up= | =d= | half-page down (vim semantics) |
+ | =evil-collection-xwidget-webkit-scroll-half-page-down= | =u= | half-page up (vim semantics) |
+ | =evil-collection-xwidget-webkit-new-tab= | =t= | prompt URL in new buffer |
+ | =evil-collection-xwidget-webkit-close-tab= | =x= | kill current buffer |
+ | =evil-collection-xwidget-webkit-restore-last-closed-tab= | =X= | reopen last closed |
+ | =evil-collection-xwidget-webkit-search-tabs= | =T=, =gt= | switch via =completing-read= |
+
+ When =evil-want-C-d-scroll= / =evil-want-C-u-scroll= are non-nil, =C-d= and
+ =C-u= scroll the page.
diff --git a/.config/emacs/lisp/evil-collection/modes/xwidget/evil-collection-xwidget.el b/.config/emacs/lisp/evil-collection/modes/xwidget/evil-collection-xwidget.el
new file mode 100644
index 0000000..ab197f1
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/xwidget/evil-collection-xwidget.el
@@ -0,0 +1,184 @@
+;;; evil-collection-xwidget.el --- Evil bindings for Xwidget -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020, 2022, 2024 Ruslan Kamashev
+
+;; Author: Ruslan Kamashev <rynffoll@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, xwidget, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for Xwidget.
+
+;;; Code:
+(require 'xwidget)
+(require 'evil-collection)
+
+(defvar evil-collection-xwidget-maps '(xwidget-webkit-mode-map))
+
+;; Silence compile errors
+(declare-function xwidget-webkit-uri "xwidget")
+(declare-function xwidget-window-inside-pixel-height "xwidget")
+
+;; HACK: elisp byte-opt can't optimize 'format' out, so it's checked at runtime.
+(defun evil-collection-xwidget-webkit--scroll-trampoline (f n)
+ "Compatible wrapper for `xwidget-webkit-scroll-up' and so on.
+
+F is the name of function, N is the pixel height."
+ (let ((realf (intern (format "%s" f))))
+ (if (>= emacs-major-version 28)
+ (funcall realf n)
+ (funcall realf))))
+
+(defun evil-collection-xwidget-webkit-scroll-half-page-up ()
+ "Compatible wrapper for `xwidget-webkit-scroll-up'."
+ (interactive)
+ (evil-collection-xwidget-webkit--scroll-trampoline
+ "xwidget-webkit-scroll-up"
+ (/ (xwidget-window-inside-pixel-height (selected-window)) 2)))
+
+(defun evil-collection-xwidget-webkit-scroll-half-page-down ()
+ "Compatible wrapper for `xwidget-webkit-scroll-down'."
+ (interactive)
+ (evil-collection-xwidget-webkit--scroll-trampoline
+ "xwidget-webkit-scroll-down"
+ (/ (xwidget-window-inside-pixel-height (selected-window)) 2)))
+
+(defun evil-collection-xwidget-webkit-new-tab (url)
+ "New tab (new buffer) of URL."
+ (interactive "s(New Tab) xwidget-webkit URL: ")
+ (xwidget-webkit-browse-url url :new-session))
+
+(defvar evil-collection-xwidget-webkit-last-closed-tab-url nil)
+(defun evil-collection-xwidget-webkit-close-tab ()
+ "Close tab (kill buffer) without confirmation."
+ (interactive)
+ (setq evil-collection-xwidget-webkit-last-closed-tab-url
+ (xwidget-webkit-uri (xwidget-webkit-current-session)))
+ (let ((kill-buffer-query-functions nil))
+ (kill-current-buffer)))
+
+(defun evil-collection-xwidget-webkit-restore-last-closed-tab ()
+ "Restore last closed tab."
+ (interactive)
+ (if (null evil-collection-xwidget-webkit-last-closed-tab-url)
+ (message "No url to restore.")
+ (message (format "Restoring last closed tab %s"
+ evil-collection-xwidget-webkit-last-closed-tab-url))
+ (xwidget-webkit-browse-url
+ evil-collection-xwidget-webkit-last-closed-tab-url :new-session)
+ (setq evil-collection-xwidget-webkit-last-closed-tab-url nil)))
+
+(defun evil-collection-xwidget-webkit-search-tabs ()
+ "Search tabs (buffers) with `buffer-name'."
+ (interactive)
+ (cl-flet ((is-xwidget-webkit-buffer?
+ (b) (with-current-buffer b
+ (equal major-mode 'xwidget-webkit-mode))))
+ (let ((bufs (cl-loop for b in (buffer-list)
+ when (is-xwidget-webkit-buffer? b)
+ collect (buffer-name b))))
+ (switch-to-buffer (completing-read "Switch to Tab: " bufs nil t)))))
+
+;;;###autoload
+(defun evil-collection-xwidget-setup ()
+ "Set up `evil' bindings for `xwidget'."
+ (evil-collection-set-readonly-bindings 'xwidget-webkit-mode-map)
+
+ (evil-collection-define-key 'visual 'xwidget-webkit-mode-map
+ "y" 'xwidget-webkit-copy-selection-as-kill)
+
+ (evil-collection-define-key 'normal 'xwidget-webkit-mode-map
+ ;; Mimic vimium (a browser extension)
+ ;;
+ ;; Since xwidget has no tab concept, `open-url-new-tab' etc are not
+ ;; supported.
+ ;;
+ ;; TODO: edit-mode, visual-mode
+ ;;
+ ;; Navigating the page
+ "j" 'xwidget-webkit-scroll-up-line
+ "k" 'xwidget-webkit-scroll-down-line
+ "gg" 'xwidget-webkit-scroll-top
+ "G" 'xwidget-webkit-scroll-bottom
+ "d" 'evil-collection-xwidget-webkit-scroll-half-page-up
+ "u" 'evil-collection-xwidget-webkit-scroll-half-page-down
+ "h" 'xwidget-webkit-scroll-backward
+ "l" 'xwidget-webkit-scroll-forward
+ "r" 'xwidget-webkit-reload
+ "yy" 'xwidget-webkit-current-url
+ ;; TODO `first-text-input', `open-link-in-current-tab'
+ "gi" 'undefined
+ "f" 'undefined
+
+ ;; Using the vomnibar
+ ;;
+ ;; For bookmark, use C-x r m, C-x r j.
+ "o" 'xwidget-webkit-browse-url
+ "T" 'evil-collection-xwidget-webkit-search-tabs
+
+ ;; Using find
+ ;;
+ ;; TODO
+
+ ;; Navigating history
+ "H" 'xwidget-webkit-back
+ "L" 'xwidget-webkit-forward
+
+ ;; Manipulating tabs (actually buffers)
+ ;;
+ ;; Only `new-tab' and `close-tab' are supported.
+ "t" 'evil-collection-xwidget-webkit-new-tab
+ "x" 'evil-collection-xwidget-webkit-close-tab
+ "X" 'evil-collection-xwidget-webkit-restore-last-closed-tab
+
+ ;; Miscellaneous
+ "?" 'describe-mode
+
+ ;; Evil style
+
+ "<" 'xwidget-webkit-back
+ ">" 'xwidget-webkit-forward
+
+ ;; Additional bindings to browse url.
+ "gu" 'xwidget-webkit-browse-url
+ "J" 'xwidget-webkit-browse-url
+
+ ;; Additional binding to browse tabs.
+ "gt" 'evil-collection-xwidget-webkit-search-tabs
+
+ "gr" 'xwidget-webkit-reload
+ (kbd "C-f") 'xwidget-webkit-scroll-up
+ (kbd "C-b") 'xwidget-webkit-scroll-down
+ (kbd "RET") 'xwidget-webkit-insert-string
+
+ ;; zoom
+ "+" 'xwidget-webkit-zoom-in
+ "=" 'xwidget-webkit-zoom-in
+ "-" 'xwidget-webkit-zoom-out)
+
+ (when evil-want-C-d-scroll
+ (evil-collection-define-key 'normal 'xwidget-webkit-mode-map
+ (kbd "C-d") 'xwidget-webkit-scroll-up))
+ (when evil-want-C-u-scroll
+ (evil-collection-define-key 'normal 'xwidget-webkit-mode-map
+ (kbd "C-u") 'xwidget-webkit-scroll-down)))
+
+(provide 'evil-collection-xwidget)
+;;; evil-collection-xwidget.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/yaml-mode/README.org b/.config/emacs/lisp/evil-collection/modes/yaml-mode/README.org
new file mode 100644
index 0000000..33d13ad
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/yaml-mode/README.org
@@ -0,0 +1,15 @@
+* yaml-mode
+
+ Evil setup for [[https://github.com/yoshiki/yaml-mode][yaml-mode]].
+
+ No keys are rebound. =evil-shift-width= is set buffer-locally to
+ =yaml-indent-offset= so that =>>= / =<<= produce indentation that
+ matches yaml-mode's own electric keys.
+
+** New commands
+
+ | Command | Purpose |
+ |--------------------------------------------------+-------------------------------------------------|
+ | =evil-collection-yaml-mode-set-evil-shift-width= | Set =evil-shift-width= to =yaml-indent-offset=. |
+
+ Installed on =yaml-mode-hook=.
diff --git a/.config/emacs/lisp/evil-collection/modes/yaml-mode/evil-collection-yaml-mode.el b/.config/emacs/lisp/evil-collection/modes/yaml-mode/evil-collection-yaml-mode.el
new file mode 100644
index 0000000..3bf6667
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/yaml-mode/evil-collection-yaml-mode.el
@@ -0,0 +1,42 @@
+;;; evil-collection-yaml-mode.el --- Bindings for `yaml-mode' -*- lexical-binding: t -*-
+
+;; Author: Frédéric Giquel
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: emacs, tools, yaml
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for `yaml-mode'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'yaml-mode nil t)
+
+(defconst evil-collection-yaml-mode-maps nil)
+
+(defvar yaml-indent-offset)
+(defun evil-collection-yaml-mode-set-evil-shift-width ()
+ "Set `evil-shift-width' according to `yaml-indent-offset'."
+ (setq-local evil-shift-width yaml-indent-offset))
+
+;;;###autoload
+(defun evil-collection-yaml-mode-setup ()
+ "Set up `evil' bindings for `yaml'."
+ (add-hook 'yaml-mode-hook #'evil-collection-yaml-mode-set-evil-shift-width))
+
+(provide 'evil-collection-yaml-mode)
+;;; evil-collection-yaml-mode.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/youtube-dl/evil-collection-youtube-dl.el b/.config/emacs/lisp/evil-collection/modes/youtube-dl/evil-collection-youtube-dl.el
new file mode 100644
index 0000000..d9337ca
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/youtube-dl/evil-collection-youtube-dl.el
@@ -0,0 +1,67 @@
+;;; evil-collection-youtube-dl.el --- Evil bindings for youtube-dl -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>, Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, youtube, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for youtube-dl.
+
+;;; Code:
+(require 'evil-collection)
+(require 'youtube-dl nil t)
+
+(defvar youtube-dl-list-mode-map)
+
+(defconst evil-collection-youtube-dl-maps '(youtube-dl-list-mode-map))
+
+;;;###autoload
+(defun evil-collection-youtube-dl-setup ()
+ "Set up `evil' bindings for `youtube-dl'."
+
+ (evil-collection-set-readonly-bindings 'youtube-dl-list-mode-map)
+ (evil-collection-define-key 'normal 'youtube-dl-list-mode-map
+ (kbd "S-SPC") 'scroll-down-command
+
+ "gr" 'youtube-dl-list-redisplay
+
+ "g?" 'describe-mode
+
+ "p" 'youtube-dl-list-toggle-pause
+ "s" 'youtube-dl-list-toggle-slow
+ "S" 'youtube-dl-list-toggle-slow-all
+ "y" 'youtube-dl-list-yank
+
+ "i" 'youtube-dl-list-log
+ "I" 'youtube-dl-list-kill-log
+
+ "a" 'youtube-dl
+ "d" 'youtube-dl-list-kill
+
+ "[[" 'youtube-dl-list-priority-down
+ "]]" 'youtube-dl-list-priority-up
+ "gj" 'youtube-dl-list-priority-down
+ "gk" 'youtube-dl-list-priority-up
+ (kbd "C-j") 'youtube-dl-list-priority-down
+ (kbd "C-k") 'youtube-dl-list-priority-up))
+
+(provide 'evil-collection-youtube-dl)
+;;; evil-collection-youtube-dl.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/zmusic/evil-collection-zmusic.el b/.config/emacs/lisp/evil-collection/modes/zmusic/evil-collection-zmusic.el
new file mode 100644
index 0000000..4fb06a8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/zmusic/evil-collection-zmusic.el
@@ -0,0 +1,49 @@
+;;; evil-collection-zmusic.el --- Bindings for `zmusic' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2020 Carla Cao
+
+;; Author: Carla Cao <ccao001@gmail.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, emacs, tools, minimalist, presentation
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for`zmusic'.
+
+;;; Code:
+(require 'evil-collection)
+(require 'zmusic nil t)
+
+(defvar zmusic-mode-map)
+
+(defconst evil-collection-zmusic-maps '(zmusic-mode-map))
+
+;;;###autoload
+(defun evil-collection-zmusic-setup ()
+ "Set up `evil' bindings for `zmusic'."
+ (evil-collection-define-key 'normal 'zmusic-mode-map
+ (kbd "RET") 'zmusic/toggle-play
+ "j" 'zmusic/next-beat
+ "k" 'zmusic/previous-beat
+ "h" 'zmusic/backward-degree
+ "l" 'zmusic/forward-degree
+ "d" 'zmusic/kill-beat))
+
+(provide 'evil-collection-zmusic)
+;;; evil-collection-zmusic.el ends here
diff --git a/.config/emacs/lisp/evil-collection/modes/ztree/evil-collection-ztree.el b/.config/emacs/lisp/evil-collection/modes/ztree/evil-collection-ztree.el
new file mode 100644
index 0000000..4dfd324
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/modes/ztree/evil-collection-ztree.el
@@ -0,0 +1,68 @@
+;;; evil-collection-ztree.el --- Evil bindings for ztree -*- lexical-binding: t -*-
+
+;; Copyright (C) 2017 Pierre Neidhardt
+
+;; Author: Pierre Neidhardt <mail@ambrevar.xyz>
+;; Maintainer: James Nguyen <james@jojojames.com>, Pierre Neidhardt <mail@ambrevar.xyz>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.1
+;; Package-Requires: ((emacs "26.3"))
+;; Keywords: evil, ztree, tools
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;; Evil bindings for ztree.
+
+;;; Code:
+(require 'evil-collection)
+(require 'ztree nil t)
+
+(defvar ztree-mode-map)
+(defvar ztreediff-mode-map)
+
+(defconst evil-collection-ztree-maps '(ztree-mode-map ztreediff-mode-map))
+
+;;;###autoload
+(defun evil-collection-ztree-setup ()
+ "Set up `evil' bindings for `ztree'."
+
+ (evil-collection-set-readonly-bindings 'ztree-mode-map)
+ (evil-set-initial-state 'ztree-mode 'normal)
+ (evil-collection-define-key 'normal 'ztree-mode-map
+ (kbd "<tab>") 'ztree-jump-side
+ (kbd "RET") 'ztree-perform-action
+ (kbd "SPC") 'ztree-perform-soft-action
+
+ "x" 'ztree-toggle-expand-subtree
+
+ ;; refresh
+ "gr" 'ztree-refresh-buffer)
+
+ (evil-collection-set-readonly-bindings 'ztreediff-mode-map)
+ (evil-set-initial-state 'ztree-mode 'normal)
+ (evil-define-minor-mode-key 'normal 'ztreediff-mode
+ "C" 'ztree-diff-copy
+ "D" 'ztree-diff-delete-file
+ "zH" 'ztree-diff-toggle-show-filtered-files
+ "d" 'ztree-diff-simple-diff-files
+ "zh" 'ztree-diff-toggle-show-equal-files
+ "gf" 'ztree-diff-view-file
+
+ ;; refresh
+ "gr" 'ztree-diff-partial-rescan
+ "gR" 'ztree-diff-full-rescan))
+
+(provide 'evil-collection-ztree)
+;;; evil-collection-ztree.el ends here
diff --git a/.config/emacs/lisp/evil-collection/test/evil-collection-magit-tests.el b/.config/emacs/lisp/evil-collection/test/evil-collection-magit-tests.el
new file mode 100644
index 0000000..9b4c892
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/test/evil-collection-magit-tests.el
@@ -0,0 +1,112 @@
+;;; evil-collection-magit-tests.el --- evil-based key bindings for magit
+
+;; Copyright (C) 2015-2016 Justin Burkett
+
+;; Author: Justin Burkett <justin@burkett.cc>
+;; Homepage: https://github.com/emacs-evil/evil-collection
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 3, or (at your
+;; option) any later version.
+;;
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; For a full copy of the GNU General Public License
+;; see <http://www.gnu.org/licenses/>.
+(require 'evil-collection)
+(evil-collection-require 'magit)
+
+(ert-deftest evil-collection-magit-mode-map-tests ()
+ "Test that original bindings in `evil-collection-magit-mode-map-bindings'
+are correct."
+ (dolist (binding evil-collection-magit-mode-map-bindings)
+ (when (nth 4 binding)
+ (should (eq (lookup-key (symbol-value (nth 1 binding)) (kbd (nth 4 binding)))
+ (nth 3 binding)))))
+ (dolist (binding evil-collection-magit-minor-mode-map-bindings)
+ (when (nth 4 binding)
+ (should (eq (lookup-key (symbol-value (nth 1 binding)) (kbd (nth 4 binding)))
+ (nth 3 binding))))))
+
+(ert-deftest evil-collection-magit-section-map-tests ()
+ "Test that original bindings in
+`evil-collection-magit-original-section-bindings' are correct."
+ (dolist (binding evil-collection-magit-original-section-bindings)
+ (should (eq (lookup-key (nth 0 binding) (nth 1 binding))
+ (nth 2 binding)))))
+
+;; (ert-deftest evil-collection-magit-popup-action-tests ()
+;; "Test that bindings are as expected in popups."
+;; (when evil-collection-magit-popup-keys-changed
+;; (dolist (change evil-collection-magit-popup-changes)
+;; (let ((alist (plist-get (symbol-value (nth 0 change)) (nth 1 change))))
+;; (should
+;; (eq (nth 2 (assoc (string-to-char (nth 3 change)) alist))
+;; (nth 4 change)))))))
+
+(defun evil-collection-magit-collect-magit-section-maps ()
+ (let (res)
+ (mapatoms
+ (lambda (sym)
+ (when (string-match-p "^magit-.*-section-map$" (symbol-name sym))
+ (push sym res))))
+ res))
+
+(setq evil-collection-magit-section-maps-test (evil-collection-magit-collect-magit-section-maps))
+;; (setq evil-collection-magit-commands-in-section-maps
+;; (let (res)
+;; (dolist (map evil-collection-magit-section-maps-test)
+;; (when (and (boundp map) (keymapp (symbol-value map)))
+;; (map-keymap
+;; (lambda (_ def)
+;; (when (commandp def)
+;; (if res
+;; (add-to-list 'res def)
+;; (setq res (list def)))))
+;; (symbol-value map))))
+;; res))
+
+(ert-deftest evil-collection-magit-section-maps-accounted-for ()
+ "Check that `evil-collection-magit-section-maps' includes all section-maps
+we can find."
+ (dolist (map evil-collection-magit-section-maps-test)
+ (when (and (boundp map) (keymapp (symbol-value map)))
+ (should (memq map evil-collection-magit-section-maps)))))
+
+(defun evil-collection-magit-collect-git-magit-modes ()
+ (let (res)
+ (mapatoms
+ (lambda (sym)
+ (when (and (or (boundp sym)
+ (fboundp sym))
+ (string-match-p "^\\(git\\|magit\\)-.*-mode$" (symbol-name sym)))
+ (push sym res))))
+ res))
+
+(ert-deftest evil-collection-magit-all-modes-accounted-for ()
+ "Check that mode lists include all modes we can find."
+ (let ((modes (evil-collection-magit-collect-git-magit-modes))
+ res)
+ (dolist (mode modes)
+ (when (boundp mode)
+ (should (memq mode
+ (append
+ evil-collection-magit-emacs-to-default-state-modes
+ evil-collection-magit-emacs-to-evil-collection-magit-state-modes
+ evil-collection-magit-default-to-evil-collection-magit-state-modes
+ evil-collection-magit-untouched-modes
+ evil-collection-magit-ignored-modes)))))))
+
+(ert-deftest evil-collection-magit-expand-region-arg-number ()
+ "Check that the number of args accepted by
+`evil-visual-expand-region' does not change."
+ (should-not (evil-visual-expand-region))
+ (should-not (evil-visual-expand-region t))
+ (should-error (evil-visual-expand-region t t) :type
+ 'wrong-number-of-arguments))
+
+;;; evil-collection-magit-tests.el ends here
diff --git a/.config/emacs/lisp/evil-collection/test/evil-collection-test.el b/.config/emacs/lisp/evil-collection/test/evil-collection-test.el
new file mode 100644
index 0000000..a88fce4
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/test/evil-collection-test.el
@@ -0,0 +1,41 @@
+;;; evil-collection-test.el --- Tests for evil-collection -*- lexical-binding: t -*-
+(require 'evil-collection)
+
+(ert-deftest evil-collection-zero-test ()
+ "Zero check blank test."
+ (should (equal 0 0)))
+
+(ert-deftest evil-collection-filtering-states-test ()
+ "Test `evil-collection--filter-states'."
+ (let ((evil-collection-state-denylist '())
+ (evil-collection-state-passlist '()))
+ (should
+ (equal nil
+ (evil-collection--filter-states nil)))
+ (should
+ (equal '(normal)
+ (evil-collection--filter-states 'normal)))
+ (should
+ (equal '(normal)
+ (evil-collection--filter-states '(normal)))))
+ (let ((evil-collection-state-denylist '(insert))
+ (evil-collection-state-passlist '()))
+ (should
+ (equal '()
+ (evil-collection--filter-states 'insert)))
+ (should
+ (equal '(visual)
+ (evil-collection--filter-states '(visual insert)))))
+ (let ((evil-collection-state-denylist '(insert))
+ (evil-collection-state-passlist '(normal visual)))
+ (should
+ (equal '()
+ (evil-collection--filter-states '())))
+ (should
+ (equal '(visual)
+ (evil-collection--filter-states '(insert visual))))
+ (should
+ (seq-set-equal-p '(visual normal)
+ (evil-collection--filter-states '(motion normal visual insert))))))
+
+;;; evil-collection-test.el ends here
diff --git a/.config/emacs/lisp/evil-collection/test/test-helper.el b/.config/emacs/lisp/evil-collection/test/test-helper.el
new file mode 100644
index 0000000..b5d9e63
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/test/test-helper.el
@@ -0,0 +1,9 @@
+;;; test-helper.el --- Helpers for evil-collection-test.el -*- lexical-binding: t -*-
+(require 'ert)
+
+;; FIXME: Adding `f' as a dependency just for this line.
+(require 'f)
+(let ((evil-collection-dir (f-parent (f-dirname (f-this-file)))))
+ (add-to-list 'load-path evil-collection-dir))
+(require 'evil-collection)
+;;; test-helper.el ends here
diff --git a/.config/emacs/lisp/evil-collection/yasnippet_evil-collection b/.config/emacs/lisp/evil-collection/yasnippet_evil-collection
new file mode 100644
index 0000000..b57c8f8
--- /dev/null
+++ b/.config/emacs/lisp/evil-collection/yasnippet_evil-collection
@@ -0,0 +1,45 @@
+# -*- mode: snippet -*-
+# name: yasnippet_evil-collection
+# key: yasnippet_evil-collection
+# --
+;;; ${1:`(file-name-sans-extension (file-name-nondirectory buffer-file-name))`}.el --- Bindings for \`${2:`(string-trim-left (file-name-sans-extension (file-name-nondirectory buffer-file-name)) "evil-collection-")`}' -*- lexical-binding: t -*-
+
+;; Copyright (C) 2022 James Nguyen
+
+;; Author: James Nguyen <james@jojojames.com>
+;; Maintainer: James Nguyen <james@jojojames.com>
+;; URL: https://github.com/emacs-evil/evil-collection
+;; Version: 0.0.2
+;; Package-Requires: ((emacs "27.1"))
+;; Keywords: evil, emacs, convenience, tools
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;; Bindings for $2.
+
+;;; Code:
+(require 'evil-collection)
+(require '$2 nil t)
+
+(defvar $2-mode-map)
+(defconst evil-collection-$2-maps '($2-mode-map))
+
+(defun $1-setup ()
+ "Set up `evil' bindings for $2."
+ (evil-collection-define-key 'normal '$2-mode-map
+ $0))
+
+(provide '$1)
+;;; $1.el ends here \ No newline at end of file