From c12ffd9028b1c51eb07e559d31d07a8eb943cc27 Mon Sep 17 00:00:00 2001 From: Howard Abrams Date: Mon, 16 May 2022 13:34:05 -0700 Subject: [PATCH] Convert evil-define-key to :general extension This seems to look easier on the eyes. --- ha-config.org | 189 ++++++++++++++++++++++++--------------------- ha-feed-reader.org | 34 ++++---- ha-org.org | 16 ++-- ha-programming.org | 11 ++- 4 files changed, 132 insertions(+), 118 deletions(-) diff --git a/ha-config.org b/ha-config.org index eee08be..99b3cb9 100644 --- a/ha-config.org +++ b/ha-config.org @@ -347,7 +347,7 @@ Oh, and let’s not close the frame, but instead, the window: #+BEGIN_SRC emacs-lisp (global-set-key (kbd "s-w") 'delete-window) #+END_SRC -*** Undo +** Undo I mean, I /always/ use ~C-/~ for [[help:undo][undo]] (and ~C-?~ for [[help:undo-redo][redo]]), but since I’m on the Mac quite a bit, I want to cover my bases. Why use [[https://gitlab.com/ideasman42/emacs-undo-fu][undo-fu]] instead of the built-in undo functionality? Well, there isn’t much to the project (that’s a good thing), but It basically doesn’t /cycle/ around the redo, which annoying. @@ -361,12 +361,6 @@ Why use [[https://gitlab.com/ideasman42/emacs-undo-fu][undo-fu]] instead of the (global-set-key (kbd "s-z") 'undo-fu-only-undo) (global-set-key (kbd "s-S-z") 'undo-fu-only-redo)) #+END_SRC -*** Expand Region -Magnar Sveen's [[https://github.com/magnars/expand-region.el][expand-region]] project allows me to hit ~v~ repeatedly, having the selection grow by syntactical units. -#+BEGIN_SRC emacs-lisp -(use-package expand-region - :bind ("C-=" . er/expand-region)) -#+END_SRC ** Evil-Specific Keybindings Can we change Evil at this point? Some tips: - [[https://github.com/noctuid/evil-guide]] @@ -395,11 +389,6 @@ Can we change Evil at this point? Some tips: (let ((mode (make-symbol (format "%s-mode" name)))) (add-to-list 'evil-emacs-state-modes mode))) - ;; Use escape to get out of visual mode, but hitting v again expands the selection. - (evil-define-key 'visual global-map (kbd "v") 'er/expand-region) - - ;; While I normally just use `link-hint', the gx keybinding is used by evil-exchange: - (evil-define-key 'normal global-map (kbd "gz") 'browse-url-at-point) (evil-mode)) #+END_SRC @@ -428,7 +417,7 @@ I'm not trying an experiment where specially-placed function keys on my fancy er #+BEGIN_SRC emacs-lisp (use-package general :custom - (general-use-package-emit-autoloads nil) + (general-use-package-emit-autoloads t) :config (general-evil-setup t) @@ -895,7 +884,6 @@ Let's make Info behave a little more VI-like: The [[https://github.com/minad/consult][consult project]] aims to use the libraries like [[*Vertico][Vertico]] to enhance specific, built-in, Emacs functions. I particularly appreciate the feature that when selecting an element in the minibuffer, it displays what you are looking at… for instance, it previews a buffer before choosing it. Unlike /Vertico/ and /Orderless/, you need to bind keys to its special functions (or rebind existing keys that do something similar). #+BEGIN_SRC emacs-lisp (use-package consult - :after general ;; Enable automatic preview at point in the *Completions* buffer. This is ;; relevant when you use the default completion UI. :hook (completion-list-mode . consult-preview-at-point-mode) @@ -905,16 +893,17 @@ The [[https://github.com/minad/consult][consult project]] aims to use the librar (setq xref-show-xrefs-function #'consult-xref xref-show-definitions-function #'consult-xref) - :config - (ha-leader - "RET" '("bookmark" . consult-bookmark) - "o i" '("imenu" . consult-imenu) - "x y" '("preview yank" . consult-yank-pop)) + :bind ("s-v" . consult-yank-pop) :general - (:states 'normal :keymaps 'global-mode-map + (:states 'normal "gp" 'consult-yank-pop - "gs" 'consult-line)) + "gs" 'consult-line) + :config + (ha-leader + "RET" '("bookmark" . consult-bookmark) + "o i" '("imenu" . consult-imenu) + "x y" '("preview yank" . consult-yank-pop))) #+END_SRC *** Consult for Projects One of the reasons that Consult hasn’t been too important to me, is that I often narrow my searching based on projectile. So let’s see what the [[https://gitlab.com/OlMon/consult-projectile][consult-projectile]] can offer. @@ -1009,8 +998,11 @@ In other words, typing ~s-;~ to call Embark, specifies the options in a buffer, *** Evil Exchange I often use the Emacs commands, ~M-t~ and whatnot to exchange words and whatnot, but this requires a drop out of normal state mode. The [[https://github.com/Dewdrops/evil-exchange][evil-exchange]] project attempts to do something similar, but in a VI-way. #+BEGIN_SRC emacs-lisp -(use-package evil-exchange - :config (evil-exchange-install)) + (use-package evil-exchange + ;; While I normally just use `link-hint', the gx keybinding is used by evil-exchange: + :general (:states 'normal "gz" 'browse-url-at-point) + + :config (evil-exchange-install)) #+END_SRC Let’s explain how this works as the documentation assumes some previous knowledge. If you had a sentence: @@ -1054,8 +1046,7 @@ Not sure what is in a register? Have it show you when you hit ~”~ or ~@~ with (evil-owl-mode)) #+END_SRC *** Evil Snipe -Doom introduced me to [[https://github.com/hlissner/evil-snipe][evil-snipe]] which is similar to =f= and =t=, but does two characters, and can, when configured, search more than the current line. When I use it, I stop and analyze to see the two characters to work on, so I’ve changed from the default, single ~s~, to ~g s~ so as not to get it confused with the =evil-surround=. - +Doom introduced me to [[https://github.com/hlissner/evil-snipe][evil-snipe]] which is similar to =f= and =t=, but does two characters, and can, when configured, search more than the current line. My issue is that [[Evil Surround]] uses the same keybindings. #+BEGIN_SRC emacs-lisp (use-package evil-snipe :after evil @@ -1063,16 +1054,17 @@ Doom introduced me to [[https://github.com/hlissner/evil-snipe][evil-snipe]] whi (setq evil-snipe-scope 'visible) :general - (:states '(normal motion operator visual) :keymaps 'global-mode-map - "gs" 'evil-snipe-s - "gS" 'evil-snipe-S)) + (:states '(normal motion operator visual) + "s" 'evil-snipe-s + "S" 'evil-snipe-S) + :config + (evil-snipe-mode +1))) #+END_SRC It highlights all potential matches, use ~;~ to skip to the next match, and ~,~ to jump back. *** Evil Surround -I like both [[https://github.com/emacs-evil/evil-surround][evil-surround]] and Henrik's [[https://github.com/hlissner/evil-snipe][evil-snipe]], however, they both start with ~s~, and conflict, and getting them to work together means I have to remember when does ~s~ call sniper and when calls surround. As an original Emacs person, I am not bound by that key history, but I do need them consistent, so I’m choosing the ~s~ to be /surround/. +I like both [[https://github.com/emacs-evil/evil-surround][evil-surround]] and Henrik's [[https://github.com/hlissner/evil-snipe][evil-snipe]], however, they both start with ~s~, and conflict, and getting them to work together means I have to remember when does ~s~ call sniper and when it calls surround. As an original Emacs person, I am not bound by that key history, but I do need them consistent, so I’m choosing the ~s~ to be /surround/. - -#+BEGIN_SRC emacs-lisp +#+BEGIN_SRC emacs-lisp :tangle no (use-package evil-surround :after evil-snipe :config @@ -1085,16 +1077,32 @@ I like both [[https://github.com/emacs-evil/evil-surround][evil-surround]] and H (push '(?/ . ("/" . "/")) evil-surround-pairs-alist) (push '(?= . ("=" . "=")) evil-surround-pairs-alist) (push '(?~ . ("~" . "~")) evil-surround-pairs-alist) + + :general + (:states 'operator :keymaps 'evil-surround-mode-map + "z" 'evil-surround-edit + "Z" 'evil-Surround-edit) + :hook (text-mode . evil-surround-mode)) ; Don't globally use it on Magit, et. al #+END_SRC Notes: - - ~cs({~ :: to convert surrounding parens to curly braces. - - ~ds"~ :: to delete the surrounding *double* quotes. - - ~yse"~ :: puts double quotes around the next word… but only if you are at the beginning of the word, otherwise, - - ~ysiw'~ :: puts single quotes around the word, no matter where the point is positioned. - - ~yS$

~ :: surrouds the line with HTML =

= tag (with extra carriage returns). + - ~cz'"~ :: to convert surrounding single quote string to double quotes. + - ~dz"~ :: to delete the surrounding double quotes. + - ~yze"~ :: puts single quotes around the next word. + - ~yziw'~ :: puts single quotes around the word, no matter where the point is positioned. + - ~yZ$

~ :: surrouds the line with HTML =

= tag (with extra carriage returns). - ~(~ :: puts spaces /inside/ the surrounding parens, but ~)~ doesn't. Same with ~[~ and ~]~. -** Jump with Avy +** Additional Global Packages +*** Visual Replace with Visual Regular Expressions +I really appreciated the [[https://github.com/benma/visual-regexp.el][visual-regexp package]] to see what will be changed /before/ executing the replace. +#+BEGIN_SRC emacs-lisp + (use-package visual-regexp + :bind (("C-c r" . vr/replace) + ("C-c q" . vr/query-replace)) + :general (:states 'normal "gR" '("replace" . vr/replace))) +#+END_SRC + +*** Jump with Avy While I grew up on =Control S=, I am liking the /mental model/ associated with the [[https://github.com/abo-abo/avy][avy project]] that allows a /jump/ among matches across all visible windows. I use the ~F18~ key on my keyboard that should be easy to use, but ~g o~ seems obvious. #+BEGIN_SRC emacs-lisp @@ -1109,13 +1117,15 @@ While I grew up on =Control S=, I am liking the /mental model/ associated with t :config (ha-leader "j" '("jump" . avy-goto-char-timer)) :general - (:states '(normal motion operator visual) :keymaps 'global-mode-map - "go" 'avy-goto-char-timer) + (:states 'normal "go" 'avy-goto-char-timer) :bind ("" . avy-goto-char-timer)) #+END_SRC *Note:* The links should be shorter near the point as opposed to starting from the top of the window. -** Link Hint, the Link Jumper + +Just realized that if you hit the following keys /before/ you select a target, you get a special action: + - ~n~ :: copies the matching target word +*** Link Hint, the Link Jumper I originally appreciated [[https://github.com/abo-abo/ace-link][ace-link]] to work with hyperlinks on Org, EWW and Info pages, however, the [[https://github.com/noctuid/link-hint.el][link-hint]] project works with more types of links: #+BEGIN_SRC emacs-lisp (use-package link-hint @@ -1124,26 +1134,25 @@ I originally appreciated [[https://github.com/abo-abo/ace-link][ace-link]] to wo ("C-c l o" . link-hint-open-link) ("C-c l c" . link-hint-copy-link) :general + (:states 'normal + "gl" 'link-hint-open-link + "gL" 'link-hint-copy-link) (:states 'normal :keymaps 'eww-mode-map "o" 'link-hint-open-link) (:states 'normal :keymaps 'Info-mode-map - "o" 'link-hint-open-link) - (:states 'normal :keymaps 'global-map - "gl" 'link-hint-open-link - "gL" 'link-hint-copy-link)) - - + "o" 'link-hint-open-link)) #+END_SRC -** Miscellaneous Keys -I really appreciated the [[https://github.com/benma/visual-regexp.el][visual-regexp package]]: - +*** Expand Region +Magnar Sveen's [[https://github.com/magnars/expand-region.el][expand-region]] project allows me to hit ~v~ repeatedly, having the selection grow by syntactical units. #+BEGIN_SRC emacs-lisp -(use-package visual-regexp - :bind (("C-c r" . vr/replace) - ("C-c q" . vr/query-replace))) -#+END_SRC + (use-package expand-region + :bind ("C-=" . er/expand-region) + :general + ;; Use escape to get out of visual mode, but hitting v again expands the selection. + (:states 'visual "v" 'er/expand-region)) +#+END_SRC * Working Layout While editing any file on disk is easy enough, I like the mental context switch associated with a full-screen window frame showing all the buffers of a /project task/ (often a direct link to a repository project, but not always). ** Projects @@ -1519,9 +1528,9 @@ Web pages look pretty good with EWW, but I'm having difficulty getting it to ren "u" 'eww-top-url "p" 'eww-previous-url "n" 'eww-next-url - "q" 'eww-buffer-kill) + "q" 'bury-buffer) (:states 'normal :keymaps 'eww-buffers-mode-map - "q" 'eww-buffer-kill)) + "q" 'bury-buffer)) #+END_SRC This function allows Imenu to offer HTML headings in EWW buffers, which is especially helpful for navigating long, technical documents. @@ -1562,35 +1571,37 @@ The [[https://github.com/alphapapa/pocket-reader.el][pocket-reader]] project con ;; Instead of jumping into Emacs mode to get the `pocket-mode-map', ;; we just add the keybindings to the normal mode that makes sense. - (evil-define-key 'normal pocket-reader-mode-map (kbd "RET") 'pocket-reader-open-url) - (evil-define-key 'normal pocket-reader-mode-map (kbd "TAB") 'pocket-reader-pop-to-url) + :general + (:states 'normal :keymaps 'pocket-reader-mode-map + "RET" 'pocket-reader-open-url + "TAB" 'pocket-reader-pop-to-url - (evil-define-key 'normal pocket-reader-mode-map (kbd "*") 'pocket-reader-toggle-favorite) - (evil-define-key 'normal pocket-reader-mode-map (kbd "B") 'pocket-reader-open-in-external-browser) - (evil-define-key 'normal pocket-reader-mode-map (kbd "D") 'pocket-reader-delete) - (evil-define-key 'normal pocket-reader-mode-map (kbd "E") 'pocket-reader-excerpt-all) - (evil-define-key 'normal pocket-reader-mode-map (kbd "F") 'pocket-reader-show-unread-favorites) - (evil-define-key 'normal pocket-reader-mode-map (kbd "M") 'pocket-reader-mark-all) - (evil-define-key 'normal pocket-reader-mode-map (kbd "R") 'pocket-reader-random-item) - (evil-define-key 'normal pocket-reader-mode-map (kbd "S") 'tabulated-list-sort) - (evil-define-key 'normal pocket-reader-mode-map (kbd "a") 'pocket-reader-toggle-archived) - (evil-define-key 'normal pocket-reader-mode-map (kbd "c") 'pocket-reader-copy-url) - (evil-define-key 'normal pocket-reader-mode-map (kbd "d") 'pocket-reader) - (evil-define-key 'normal pocket-reader-mode-map (kbd "e") 'pocket-reader-excerpt) - (evil-define-key 'normal pocket-reader-mode-map (kbd "f") 'pocket-reader-toggle-favorite) - (evil-define-key 'normal pocket-reader-mode-map (kbd "l") 'pocket-reader-limit) - (evil-define-key 'normal pocket-reader-mode-map (kbd "m") 'pocket-reader-toggle-mark) - (evil-define-key 'normal pocket-reader-mode-map (kbd "o") 'pocket-reader-more) - (evil-define-key 'normal pocket-reader-mode-map (kbd "q") 'quit-window) - (evil-define-key 'normal pocket-reader-mode-map (kbd "s") 'pocket-reader-search) - (evil-define-key 'normal pocket-reader-mode-map (kbd "u") 'pocket-reader-unmark-all) - (evil-define-key 'normal pocket-reader-mode-map (kbd "t a") 'pocket-reader-add-tags) - (evil-define-key 'normal pocket-reader-mode-map (kbd "t r") 'pocket-reader-remove-tags) - (evil-define-key 'normal pocket-reader-mode-map (kbd "t s") 'pocket-reader-tag-search) - (evil-define-key 'normal pocket-reader-mode-map (kbd "t t") 'pocket-reader-set-tags) + "*" 'pocket-reader-toggle-favorite + "B" 'pocket-reader-open-in-external-browser + "D" 'pocket-reader-delete + "E" 'pocket-reader-excerpt-all + "F" 'pocket-reader-show-unread-favorites + "M" 'pocket-reader-mark-all + "R" 'pocket-reader-random-item + "S" 'tabulated-list-sort + "a" 'pocket-reader-toggle-archived + "c" 'pocket-reader-copy-url + "d" 'pocket-reader + "e" 'pocket-reader-excerpt + "f" 'pocket-reader-toggle-favorite + "l" 'pocket-reader-limit + "m" 'pocket-reader-toggle-mark + "o" 'pocket-reader-more + "q" 'quit-window + "s" 'pocket-reader-search + "u" 'pocket-reader-unmark-all + "t a" 'pocket-reader-add-tags + "t r" 'pocket-reader-remove-tags + "t s" 'pocket-reader-tag-search + "t t" 'pocket-reader-set-tags - (evil-define-key 'normal pocket-reader-mode-map (kbd "g s") 'pocket-reader-resort) - (evil-define-key 'normal pocket-reader-mode-map (kbd "g r") 'pocket-reader-refresh)) + "g s" 'pocket-reader-resort + "g r" 'pocket-reader-refresh)) #+END_SRC Use these special keywords when searching: @@ -1605,14 +1616,12 @@ Use these special keywords when searching: I primarily use [[https://github.com/jaypei/emacs-neotree][Neotree]] when I am screen-sharing my Emacs session with collegues as it shows a /project/ like an IDE. #+BEGIN_SRC emacs-lisp (use-package neotree - ;; :bind (:neotree-mode-map ; Let evil-collection do its thing - ;; ("j" . 'neotree-next-line) - ;; ("k" . 'neotree-previous-line)) - :config ; evil-collection forget a couple: - (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter) - (evil-define-key 'normal neotree-mode-map (kbd "SPC") 'neotree-quick-look) - (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter) - (evil-define-key 'normal neotree-mode-map (kbd "H") 'neotree-hidden-file-toggle)) + :general ; evil-collection forgot a couple: + (:states 'normal :keymaps 'neotree-mode-map + "TAB" 'neotree-enter + "SPC" 'neotree-quick-look + "RET" 'neotree-enter + "H" 'neotree-hidden-file-toggle)) #+END_SRC ** Annotations Let's try [[https://github.com/bastibe/annotate.el][annotate-mode]], which allows you to drop "notes" and then move to them (yes, serious overlap with bookmarks, which we will return to). diff --git a/ha-feed-reader.org b/ha-feed-reader.org index 1785bd7..bfb6f8c 100644 --- a/ha-feed-reader.org +++ b/ha-feed-reader.org @@ -39,27 +39,29 @@ While I would like to share the /status/ of my reads, so ... (use-package elfeed :config (setq elfeed-db-directory "~/dropbox/.elfeed/") - (evil-define-key 'normal elfeed-show-mode-map (kbd "b") 'elfeed-show-visit) - (evil-define-key 'normal elfeed-show-mode-map (kbd "n") 'elfeed-show-next) - (evil-define-key 'normal elfeed-show-mode-map (kbd "p") 'elfeed-show-prev) - (evil-define-key 'normal elfeed-show-mode-map (kbd "y") 'elfeed-show-yank) - (evil-define-key 'normal elfeed-show-mode-map (kbd "q") 'evil-delete-buffer) - (evil-define-key 'normal elfeed-show-mode-map (kbd "Q") 'delete-window) - (evil-define-key 'normal elfeed-search-mode-map (kbd "r") 'ha-elfeed-tag-unread) - (evil-define-key 'normal elfeed-search-mode-map (kbd "R") 'elfeed-search-update--force) - (evil-define-key 'normal elfeed-search-mode-map (kbd "u") 'elfeed-update) - (evil-define-key 'normal elfeed-search-mode-map (kbd "U") 'elfeed-unjam) - - ;; This is why this package depends on link-hint: - (evil-define-key 'normal elfeed-show-mode-map (kbd "o") 'link-hint-open-link) ;; And let's make the Space pull of my general leader: (general-unbind elfeed-show-mode-map "SPC") (general-unbind elfeed-search-mode-map "SPC") - (use-package elfeed-org - :config - (elfeed-org))) + :general + (:states 'normal :keymaps 'elfeed-show-mode-map + "b" 'elfeed-show-visit + "n" 'elfeed-show-next + "p" 'elfeed-show-prev + "y" 'elfeed-show-yank + "q" 'evil-delete-buffer + "o" 'link-hint-open-link ; This is why this package depends on link-hint: + "Q" 'delete-window) + (:states 'normal :keymaps 'elfeed-search-mode-map + "r" 'ha-elfeed-tag-unread + "R" 'elfeed-search-update--force + "u" 'elfeed-update + "U" 'elfeed-unjam)) + + (use-package elfeed-org + :after elfeed + :config (elfeed-org)) (defun ha-elfeed-tag-unread () (interactive) diff --git a/ha-org.org b/ha-org.org index 4c9caa6..7f6948c 100644 --- a/ha-org.org +++ b/ha-org.org @@ -551,6 +551,10 @@ Let's hook some spell-checking into org files, and actually all text files. We'l (use-package flyspell :hook (text-mode . flyspell-mode) :bind ("M-S" . ha-fix-last-spelling) + + :general + (:states 'insert :keymaps 'text-mode-map + "M-s M-s" 'ha-fix-last-spelling) :init ;; Tell ispell.el that ’ can be part of a word. (setq ispell-local-dictionary-alist @@ -565,8 +569,6 @@ Let's hook some spell-checking into org files, and actually all text files. We'l (evil-prev-flyspell-error count) (ispell-word))) - (evil-define-key 'insert text-mode-map (kbd "M-s M-s") 'ha-fix-last-spelling) - (ha-local-leader :keymaps 'text-mode-map "s" '(:ignore t :which-key "spellcheck") "s s" '("correct last misspell" . ha-fix-last-spelling) @@ -749,10 +751,12 @@ Trying out [[https://protesilaos.com/][Protesilaos Stavrou]]’s [[https://prote logos-olivetti t) :config (ha-leader "t L" '("logos" . logos-focus-mode)) - (let ((map global-map)) - (define-key global-map [remap narrow-to-region] #'logos-narrow-dwim) - (evil-define-key 'normal map (kbd "g [") 'logos-backward-page-dwim) - (evil-define-key 'normal map (kbd "g ]") 'logos-forward-page-dwim))) + (define-key global-map [remap narrow-to-region] #'logos-narrow-dwim) + + :general + (:states 'normal + "g [" 'logos-backward-page-dwim + "g ]" 'logos-forward-page-dwim)) #+END_SRC * Technical Artifacts :noexport: Let's provide a name, to allow =require= to work: diff --git a/ha-programming.org b/ha-programming.org index f64dd1d..1461fdc 100644 --- a/ha-programming.org +++ b/ha-programming.org @@ -100,8 +100,7 @@ I’ve used the [[http://kapeli.com/][Dash]] API Documentation browser (an exter #+BEGIN_SRC emacs-lisp :tangle no (use-package dash-at-point :commands (dash-at-point) - :config - (define-key evil-normal-state-map (kbd "g D") 'dash-at-point)) + :general (:states 'normal "gD" 'dash-at-point)) #+END_SRC However, I’m interested in using [[https://devdocs.io/][devdocs]] instead, which is similar, but keeps it all /inside/ Emacs (and works on my Linux system). There are seems to be two competing Emacs projects for this. @@ -110,9 +109,9 @@ The Emacs [[https://github.com/astoff/devdocs.el][devdocs]] project is active, a #+BEGIN_SRC emacs-lisp (use-package devdocs :after evil - :config - (define-key evil-normal-state-map (kbd "g D") 'devdocs-lookup) + :general (:states 'normal "gD" 'devdocs-lookup) + :config (ha-prog-leader "d" '(:ignore t :which-key "docs") "d d" '("open" . devdocs-lookup) @@ -127,9 +126,9 @@ The [[https://github.com/blahgeek/emacs-devdocs-browser][devdocs-browser]] proje #+BEGIN_SRC emacs-lisp :tangle no (use-package devdocs-browser - :config - (define-key evil-normal-state-map (kbd "g D") 'devdocs-browser-open) + :general (:states 'normal "gD" 'devdocs-browser-open) + :config (ha-prog-leader "d" '(:ignore t :which-key "docs") "d d" '("open" . devdocs-browser-open)