From: Amin Bandali Date: Sun, 18 Nov 2018 05:12:59 +0000 (-0500) Subject: [emacs] add general and evil{,-escape}, with *lots* of enhancements X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/configs/commitdiff_plain/3e03ee8497f674cd4cbe43fd65cb7d554b93c05b?ds=inline;hp=e8a7d9af83b8f8869a02322bc670f3f7904f6027 [emacs] add general and evil{,-escape}, with *lots* of enhancements extremely happy with how this has turned out so far. after all, i may be able to use and stick with evil. --- diff --git a/.gitmodules b/.gitmodules index 914abe7..9923021 100644 --- a/.gitmodules +++ b/.gitmodules @@ -85,6 +85,12 @@ [submodule "epl"] path = lib/epl url = git@github.com:cask/epl.git +[submodule "evil"] + path = lib/evil + url = git@github.com:emacs-evil/evil.git +[submodule "evil-escape"] + path = lib/evil-escape + url = git@github.com:syl20bnr/evil-escape.git [submodule "exec-path-from-shell"] path = lib/exec-path-from-shell url = git@github.com:purcell/exec-path-from-shell.git @@ -97,6 +103,9 @@ [submodule "flycheck-haskell"] path = lib/flycheck-haskell url = git@github.com:flycheck/flycheck-haskell.git +[submodule "general"] + path = lib/general + url = git@github.com:noctuid/general.el.git [submodule "ghub"] path = lib/ghub url = git@github.com:magit/ghub.git diff --git a/init.org b/init.org index 221335c..9457e5f 100644 --- a/init.org +++ b/init.org @@ -240,12 +240,12 @@ can then be managed with the help of Magit or other tools. (with-eval-after-load 'bind-key (bind-keys :package borg - ("C-c B A" . borg-activate) - ("C-c B a" . borg-assimilate) - ("C-c B b" . borg-build) - ("C-c B c" . borg-clone) - ("C-c B m" . borg-insert-update-message) - ("C-c B r" . borg-remove))) + ("C-c b A" . borg-activate) + ("C-c b a" . borg-assimilate) + ("C-c b b" . borg-build) + ("C-c b c" . borg-clone) + ("C-c b m" . borg-insert-update-message) + ("C-c b r" . borg-remove))) #+end_src *** =use-package= @@ -283,9 +283,9 @@ database, low-level functions for querying the database, and a (use-package epkg :defer t :bind - (("C-c B d" . epkg-describe-package) - ("C-c B p" . epkg-list-packages) - ("C-c B u" . epkg-update))) + (("C-c b d" . epkg-describe-package) + ("C-c b p" . epkg-list-packages) + ("C-c b u" . epkg-update))) #+end_src ** No littering in =~/.emacs.d= @@ -649,12 +649,6 @@ Enable =winner-mode=. #+begin_src emacs-lisp (bind-keys - ("C-c b k" . kill-this-buffer) - ("C-c b s" . save-buffer) - ("C-c S" . save-buffer) - ("C-c o" . other-window) - ("C-c q q" . save-buffers-kill-terminal) - ("C-c F m" . make-frame-command) ("C-c F d" . delete-frame) ("C-c F D" . delete-other-frames) @@ -690,6 +684,98 @@ customizing it. 'auto-compile-inhibit-compile-detached-git-head)) #+end_src +*** [[https://github.com/noctuid/general.el][general]] + +#+begin_src emacs-lisp +(use-package general + :demand t + :config + (general-evil-setup t) + (general-override-mode) + + (general-create-definer + amin--leader-keys + :keymaps 'override + :states '(emacs normal visual motion insert) + :non-normal-prefix "M-m" + :prefix "SPC")) +#+end_src + +*** [[https://github.com/emacs-evil/evil][evil]] + +#+begin_src emacs-lisp +(use-package evil + :demand t + ;; :hook (org-src-mode . evil-motion-state) + :init + (setq evil-want-integration nil) + :config + (evil-mode 1) + (general-swap-key nil '(normal motion) ";" ":") + + (setq + evil-want-visual-char-semi-exclusive t + evil-move-beyond-eol t + ;; evil-move-cursor-back nil + ) + + ;; motion state modes + (dolist (mode '(ebdb-mode + helpful-mode + view-mode)) + (evil-set-initial-state mode 'motion)) + + ;; fix tab and indentation in src blocks inside org-mode buffer + ;; also see https://git.sr.ht/~bandali/dotfiles/commit/0e2ffd584aafdd4cf256bcdf2473f01c3aaaed55 + (unbind-key "TAB" evil-motion-state-map)) +#+end_src + +#+begin_src emacs-lisp +(use-package evil-escape + :after evil + :init + (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) + evil-escape-excluded-major-modes '(neotree-mode) + evil-escape-key-sequence "jk" + evil-escape-delay 0.25) + ;; :general + ;; (:states '(insert replace visual operator) + ;; "C-g" #'evil-escape) + :config + (evil-escape-mode 1) + ;; no `evil-escape' in minibuffer + (push #'minibufferp evil-escape-inhibit-functions)) +#+end_src + +#+begin_src emacs-lisp +(amin--leader-keys + "/" '(:ignore t :wk "search") + + "b" '(:ignore t :wk "buffers") + "b k" 'kill-this-buffer + "b s" 'save-buffer + + "f" '(:ignore t :wk "files") + + "h" '(:ignore t :wk "help(ful)") + "h c" 'describe-char + "h f" 'describe-function + "h F" 'describe-face + "h H" 'view-hello-file + "h i" 'info + "h k" 'describe-key + "h l" 'view-lossage + "h v" 'describe-variable + + "o" 'other-window + + "w" '(:ignore t :wk "window") + "w o" 'other-window + + "q" '(:ignore t :wk "quit") + "q q" 'save-buffers-kill-terminal) +#+end_src + *** [[https://orgmode.org/][Org mode]] #+begin_quote @@ -703,6 +789,22 @@ In short, my favourite way of life. #+begin_src emacs-lisp (use-package org :defer 3 + :general + (amin--leader-keys + :states 'normal + :keymaps 'org-mode-map + "'" 'org-edit-special) + (amin--leader-keys + :definer 'minor-mode + :states 'normal + :keymaps 'org-src-mode + "'" 'org-edit-src-exit + "k" 'org-edit-src-abort) + (general-define-key + :definer 'minor-mode + :states 'normal + :keymaps 'org-src-mode + "q" 'org-edit-src-exit) :config (setq org-src-tab-acts-natively t org-src-preserve-indentation nil @@ -710,6 +812,17 @@ In short, my favourite way of life. org-email-link-description-format "Email %c: %s" ; %.30s org-log-done 'time) (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t) + (after! org-src + (define-key org-src-mode-map [remap evil-write] 'org-edit-src-save) + (define-key org-src-mode-map [remap evil-save-and-close] + (lambda () (interactive) + (org-edit-src-save) + (org-edit-src-exit))) + (define-key org-src-mode-map [remap evil-save-modified-and-close] + (lambda () (interactive) + (org-edit-src-save) + (org-edit-src-exit))) + (define-key org-src-mode-map [remap evil-quit] 'org-edit-src-abort)) :bind (:map org-mode-map ("M-L" . org-insert-last-stored-link)) :hook ((org-mode . org-indent-mode) (org-mode . auto-fill-mode) @@ -737,6 +850,13 @@ In short, my favourite way of life. (use-package ox-beamer :after ox) +(use-package ob-tangle + :general + (amin--leader-keys + :states 'normal + :keymaps 'org-mode-map + "b t" 'org-babel-tangle)) + (use-package orgalist :after message :hook (message-mode . orgalist-mode)) @@ -801,23 +921,8 @@ Not just how I do git, but /the/ way to do git. #+begin_src emacs-lisp (use-package magit :defer 2 - :bind - (("s-g" . magit-status) - :prefix-map amin--magit-prefix-map - :prefix "C-c g" - ("SPC" . magit-status) - ("s" . magit-status) - ("S" . magit-status-prefix) - ("B" . magit-blame-addition) - ("C" . magit-clone) - ("f" . magit-fetch-other) - ("F" . magit-pull-branch) - ("P" . magit-push-other) - ("p" . magit-dispatch-popup) - ("c c" . magit-commit-create) - ("c a" . magit-commit-amend) - ("b b" . magit-checkout) - ("b c" . magit-branch-create)) + :general (amin--leader-keys "g s" 'magit-status) + :bind ("s-g" . magit-status) :config (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-modules @@ -840,9 +945,9 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ivy :defer 1 + :general (amin--leader-keys "," 'ivy-switch-buffer) :bind - (("C-c b b" . ivy-switch-buffer) - :map ivy-minibuffer-map + (:map ivy-minibuffer-map ([escape] . keyboard-escape-quit) ([S-up] . ivy-previous-history-element) ([S-down] . ivy-next-history-element) @@ -860,6 +965,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package swiper + :general (:states '(normal motion) "/" 'swiper) :bind (("C-s" . swiper) ("C-r" . swiper))) #+end_src @@ -869,6 +975,11 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package counsel :defer 1 + :general + (amin--leader-keys + "r" 'counsel-recentf + "SPC" 'counsel-M-x + "." 'counsel-find-file) :bind (([remap execute-extended-command] . counsel-M-x) ([remap find-file] . counsel-find-file) ("s-r" . counsel-recentf) @@ -914,9 +1025,9 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ibuffer :defer t + :general (amin--leader-keys "b b" 'ibuffer-other-window) :bind (("C-x C-b" . ibuffer-other-window) - ("C-c b B" . ibuffer-other-window) :map ibuffer-mode-map ("P" . ibuffer-backward-filter-group) ("N" . ibuffer-forward-filter-group) @@ -1019,7 +1130,9 @@ TODO: break this giant source block down into individual org sections. (use-package help :defer t - :config (temp-buffer-resize-mode)) + :config + (temp-buffer-resize-mode) + (setq help-window-select t)) (progn ; `isearch' (setq isearch-allow-scroll t)) @@ -1534,13 +1647,15 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package crux :defer 1 - :bind (("C-c d" . crux-duplicate-current-line-or-region) - ("C-c M-d" . crux-duplicate-and-comment-current-line-or-region) - ("C-c b K" . crux-kill-other-buffers) - ("C-c f C" . crux-copy-file-preserve-attributes) - ("C-c f D" . crux-delete-file-and-buffer) - ("C-c f R" . crux-rename-file-and-buffer) - ("C-S-j" . crux-top-join-line) + :general + (amin--leader-keys + "b K" 'crux-kill-other-buffers + "c d" 'crux-duplicate-current-line-or-region + "c D" 'crux-duplicate-and-comment-current-line-or-region + "f c" 'crux-copy-file-preserve-attributes + "f d" 'crux-delete-file-and-buffer + "f r" 'crux-rename-file-and-buffer) + :bind (("C-S-j" . crux-top-join-line) ("C-c j" . crux-top-join-line))) #+end_src @@ -1548,6 +1663,10 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package mwim + :general + (:states '(normal visual) + "0" 'mwim-beginning-of-code-or-line + "$" 'mwim-end-of-code-or-line) :bind (("C-a" . mwim-beginning-of-code-or-line) ("C-e" . mwim-end-of-code-or-line) ("" . mwim-beginning-of-line-or-code) @@ -1580,24 +1699,14 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package helpful :defer 1 - :bind - (;; ("C-h F" . helpful-function) - ("C-h f" . helpful-callable) - ("C-h v" . helpful-variable) - ("C-h k" . helpful-key) - ("C-c C-d" . helpful-at-point) - ("C-h C" . helpful-command) - ("C-h c" . describe-char) - ("C-h F" . describe-face))) - -(use-package help - :bind - (("C-S-h f" . describe-function) - ("C-S-h v" . describe-variable) - ("C-S-h k" . describe-key) - ("C-S-h C" . describe-coding-system) - ("C-S-h c" . describe-key-briefly)) - :config (setq help-window-select t)) + :general + (amin--leader-keys + "h h" '(:ignore t :wk "helpful") + "h h c" 'helpful-command + "h h f" 'helpful-callable ; helpful-function + "h h v" 'helpful-variable + "h h k" 'helpful-key + "h h p" 'helpful-at-point)) #+end_src ** [[https://github.com/kyagi/shell-pop-el][shell-pop]] @@ -1844,6 +1953,10 @@ For when I /have to/ use GH. read-mail-command 'gnus) (use-package gnus + :general + (amin--leader-keys + "m" 'gnus + "M" 'gnus-unplugged) :bind (("s-m" . gnus) ("s-M" . gnus-unplugged)) :init diff --git a/lib/evil b/lib/evil new file mode 160000 index 0000000..99bcf8c --- /dev/null +++ b/lib/evil @@ -0,0 +1 @@ +Subproject commit 99bcf8c31ee72a3a571e013f40d105618fb92d19 diff --git a/lib/evil-escape b/lib/evil-escape new file mode 160000 index 0000000..f4e9116 --- /dev/null +++ b/lib/evil-escape @@ -0,0 +1 @@ +Subproject commit f4e9116bfbaac8c9d210c17ad488e0982291245f diff --git a/lib/general b/lib/general new file mode 160000 index 0000000..f48c43c --- /dev/null +++ b/lib/general @@ -0,0 +1 @@ +Subproject commit f48c43c4449677fa629aac2693ffcb850ca58c89