[emacs] more bindings
[~bandali/configs] / init.org
index b7506e1..69ae88f 100644 (file)
--- a/init.org
+++ b/init.org
@@ -188,6 +188,13 @@ but for now I've decided to keep them enabled. See documentation for
 ;;       '(not free-vars unresolved noruntime lexical make-local))
 #+end_src
 
+** whoami
+
+#+begin_src emacs-lisp
+(setq user-full-name "Amin Bandali"
+      user-mail-address "amin@aminb.org")
+#+end_src
+
 ** Package management
 
 *** No =package.el=
@@ -241,7 +248,7 @@ and without compromising on performance.
 
 #+begin_src emacs-lisp
 (require 'use-package)
-(if nil                                    ; set to t when need to debug init
+(if nil  ; set to t when need to debug init
     (setq use-package-verbose t
           use-package-expand-minimally nil
           use-package-compute-statistics t
@@ -419,7 +426,7 @@ compilation."
                  (setq body `(after! ,next ,@body)))
                body)
               ((listp features)
-              `(after! (:all ,@features) ,@body)))))
+               `(after! (:all ,@features) ,@body)))))
 #+end_src
 
 * Core
@@ -574,67 +581,69 @@ customizing it.
   (auto-compile-on-load-mode)
   (auto-compile-on-save-mode)
   (setq auto-compile-display-buffer               nil
-       auto-compile-mode-line-counter            t
-       auto-compile-source-recreate-deletes-dest t
-       auto-compile-toggle-deletes-nonlib-dest   t
-       auto-compile-update-autoloads             t)
+        auto-compile-mode-line-counter            t
+        auto-compile-source-recreate-deletes-dest t
+        auto-compile-toggle-deletes-nonlib-dest   t
+        auto-compile-update-autoloads             t)
   (add-hook 'auto-compile-inhibit-compile-hook
             'auto-compile-inhibit-compile-detached-git-head))
 #+end_src
 
-*** [[https://github.com/noctuid/general.el][general]]
+*** [[https://github.com/Kungsgeten/ryo-modal][ryo-modal]]
 
 #+begin_quote
 Roll your own modal mode
 #+end_quote
 
 #+begin_src emacs-lisp
-(use-package general
-  :demand t
-  :config
-  (general-evil-setup t)
-
-  (general-override-mode)
-
-  (general-create-definer
-    ab--mode-leader-keys
-    :keymaps 'override
-    :states '(emacs normal visual motion insert)
-    :non-normal-prefix "C-,"
-    :prefix ",")
-
-  (general-create-definer
-    ab--leader-keys
-    :keymaps 'override
-    :states '(emacs normal visual motion insert)
-    :non-normal-prefix "M-m"
-    :prefix "SPC"))
-#+end_src
-
-*** evil
-
-#+begin_src emacs-lisp
-(use-package evil
-  :demand t
-  :hook (view-mode . evil-motion-state)
-  :config (evil-mode 1))
-#+end_src
-
-#+begin_src emacs-lisp
-(use-package evil-escape
-  :demand t
-  :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)
+(use-package ryo-modal
+  :commands ryo-modal-mode
+  :bind ("M-m" . ryo-modal-mode)
+  :after which-key
   :config
-  (evil-escape-mode 1)
-  ;; no `evil-escape' in minibuffer
-  (push #'minibufferp evil-escape-inhibit-functions))
+  (push '((nil . "ryo:.*:") . (nil . "")) which-key-replacement-alist)
+  (ryo-modal-keys
+   ("," ryo-modal-repeat)
+   ("b" backward-char)
+   ("n" next-line)
+   ("p" previous-line)
+   ("f" forward-char)
+   ("a" move-beginning-of-line)
+   ("e" move-end-of-line)
+   ("SPC" (("b" (("b" ibuffer-list-buffers)
+                 ("k" kill-this-buffer)
+                 ("o" other-window)
+                 ("s" save-buffer)))
+           ("h" (("c" describe-char)
+                 ("f" describe-function)
+                 ("F" describe-face)
+                 ("i" info)
+                 ("k" describe-key)
+                 ("l" view-lossage)
+                 ("v" describe-variable)))
+           ("q" (("q" save-buffers-kill-terminal)))))
+   ("d" (("w" kill-word)
+         ("d" kill-whole-line)
+         ("b" backward-kill-word)))
+   ("c" (("w" kill-word :exit t)
+         ("c" kill-whole-line :exit t))))
+
+  (ryo-modal-keys
+   ;; First argyment to ryo-modal-keys may be a list of keywords.
+   ;; These keywords will be applied to all keybindings.
+   (:norepeat t)
+   ("0" "M-0")
+   ("1" "M-1")
+   ("2" "M-2")
+   ("3" "M-3")
+   ("4" "M-4")
+   ("5" "M-5")
+   ("6" "M-6")
+   ("7" "M-7")
+   ("8" "M-8")
+   ("9" "M-9"))
+  :hook ((text-mode . ryo-modal-mode)
+         (prog-mode . ryo-modal-mode)))
 #+end_src
 
 *** [[https://orgmode.org/][Org mode]]
@@ -648,17 +657,23 @@ system.
 In short, my favourite way of life.
 
 #+begin_src emacs-lisp
-(setq org-src-tab-acts-natively t
-      org-src-preserve-indentation nil
-      org-edit-src-content-indentation 0
-      org-html-divs '((preamble  "header" "preamble")
-                      (content   "main"   "content")
-                      (postamble "footer" "postamble"))
-      org-html-doctype "html5"
-      org-html-html5-fancy t
-      org-html-postamble nil)
-(add-hook 'org-mode-hook 'org-indent-mode)
-(use-package htmlize)
+(use-package org
+  :ryo ("SPC b t" org-babel-tangle)
+  :config
+  (setq org-src-tab-acts-natively t
+        org-src-preserve-indentation nil
+        org-edit-src-content-indentation 0
+        org-html-divs '((preamble  "header" "preamble")
+                        (content   "main"   "content")
+                        (postamble "footer" "postamble"))
+        org-html-doctype "html5"
+        org-html-html5-fancy t
+        org-html-postamble nil)
+  :hook (org-mode . org-indent-mode))
+(use-package htmlize
+  :after org)
+(use-package org-notmuch
+  :after (:any org notmuch))
 #+end_src
 
 *** [[https://magit.vc/][Magit]]
@@ -671,10 +686,10 @@ Not just how I do git, but /the/ way to do git.
 
 #+begin_src emacs-lisp
 (use-package magit
-  :general (ab--leader-keys "g s" 'magit-status)
+  :ryo ("SPC" (("g s" magit-status)))
   :defer t
   :bind (("s-g"     . magit-status)
-        ("C-x g"   . magit-status)
+         ("C-x g"   . magit-status)
          ("C-x M-g" . magit-dispatch-popup))
   :config
   (magit-add-section-hook 'magit-status-sections-hook
@@ -705,6 +720,7 @@ There's no way I could top that, so I won't attempt to.
         ([S-up]   . ivy-previous-history-element)
         ([S-down] . ivy-next-history-element)
         ("DEL"    . ivy-backward-delete-char))
+  :ryo ("SPC ," ivy-switch-buffer)
   :config
   (setq ivy-wrap t)
   (ivy-mode 1))
@@ -714,9 +730,11 @@ There's no way I could top that, so I won't attempt to.
 
 #+begin_src emacs-lisp
 (use-package swiper
-  :general (:states 'normal "/" 'swiper)
+  :ryo
+  ("SPC /" swiper)
+  ("s" swiper)
   :bind (([remap isearch-forward]  . swiper)
-        ([remap isearch-backward] . swiper)))
+         ([remap isearch-backward] . swiper)))
 #+end_src
 
 **** Counsel
@@ -724,15 +742,15 @@ There's no way I could top that, so I won't attempt to.
 #+begin_src emacs-lisp
 (use-package counsel
   :defer 1
-  :general (ab--leader-keys
-    "f r" 'counsel-recentf
-    "SPC" 'counsel-M-x
-    "."   'counsel-find-file)
+  :ryo
+  ("SPC" (("f 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)
          :map minibuffer-local-map
-        ("C-r" . counsel-minibuffer-history))
+         ("C-r" . counsel-minibuffer-history))
   :config
   (counsel-mode 1)
   (defalias 'locate #'counsel-locate))
@@ -814,6 +832,11 @@ TODO: break this giant source block down into individual org sections.
                (list (regexp-quote (system-name)) nil nil)))
 
 (use-package undo-tree
+  :ryo
+  ("/" undo-tree-undo)
+  ("_" undo-tree-redo)
+  :bind (("C-/" . undo-tree-undo)
+         ("M-_" . undo-tree-redo))
   :config
   (global-undo-tree-mode)
   (setq undo-tree-mode-lighter ""))
@@ -828,7 +851,7 @@ TODO: break this giant source block down into individual org sections.
   :defer 5
   :bind
   (:map company-active-map
-       ([tab] . company-complete-common-or-cycle))
+        ([tab] . company-complete-common-or-cycle))
   :custom
   (company-idle-delay 0.3)
   (company-minimum-prefix-length 1)
@@ -838,17 +861,6 @@ TODO: break this giant source block down into individual org sections.
   (global-company-mode t))
 #+end_src
 
-** Customizations
-
-#+begin_src emacs-lisp
-(ab--leader-keys
-  "b s" 'save-buffer
-  "b b" 'ivy-switch-buffer
-  ","   'ivy-switch-buffer
-  "b k" 'kill-this-buffer
-  "q q" 'evil-save-and-quit)
-#+end_src
-
 * Syntax and spell checking
 #+begin_src emacs-lisp
 (use-package flycheck
@@ -881,7 +893,7 @@ TODO: break this giant source block down into individual org sections.
 #+begin_src emacs-lisp
 (use-package lean-mode
   :bind (:map lean-mode-map
-             ("S-SPC" . company-complete)))
+              ("S-SPC" . company-complete)))
 #+end_src
 
 ** Haskell
@@ -893,8 +905,8 @@ TODO: break this giant source block down into individual org sections.
   :config
   (setq haskell-indentation-layout-offset 4
         haskell-indentation-left-offset 4
-       flycheck-checker 'haskell-hlint
-       flycheck-disabled-checkers '(haskell-stack-ghc haskell-ghc)))
+        flycheck-checker 'haskell-hlint
+        flycheck-disabled-checkers '(haskell-stack-ghc haskell-ghc)))
 #+end_src
 
 *** [[https://github.com/jyp/dante][dante]]
@@ -914,8 +926,8 @@ executable from [[https://github.com/mpickering/apply-refact][apply-refact]].
 #+begin_src emacs-lisp
 (use-package hlint-refactor
   :bind (:map hlint-refactor-mode-map
-             ("C-c l b" . hlint-refactor-refactor-buffer)
-             ("C-c l r" . hlint-refactor-refactor-at-point))
+              ("C-c l b" . hlint-refactor-refactor-buffer)
+              ("C-c l r" . hlint-refactor-refactor-at-point))
   :hook (haskell-mode . hlint-refactor-mode))
 #+end_src
 
@@ -1016,8 +1028,8 @@ instead.
           (new-old-code ""))
       (save-excursion
         (switch-to-buffer (get-file-buffer fname))
-       (goto-char (point-min))
-       (forward-line (1- fline))
+        (goto-char (point-min))
+        (forward-line (1- fline))
         (beginning-of-line)
         (setf bline (point))
         (when (or hs-lint-replace-without-ask
@@ -1109,6 +1121,8 @@ Emacs package that displays available keybindings in popup
 * Email
 ** [[https://notmuchmail.org][notmuch]]
 
+See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
+
 #+begin_src emacs-lisp
 (defun ab/notmuch ()
   "Delete other windows, then launch `notmuch'."
@@ -1117,11 +1131,6 @@ Emacs package that displays available keybindings in popup
   (delete-other-windows)
   (notmuch))
 
-;; (ab--leader-keys
-;;   "m"   'ab/notmuch
-;;   "s"   'save-buffer
-;;   "SPC" 'counsel-M-x)
-
 ;; (map!
 ;;  :leader
 ;;  :desc "notmuch" :n "m" #'ab/notmuch
@@ -1146,7 +1155,7 @@ Emacs package that displays available keybindings in popup
         message-send-mail-function 'message-send-mail-with-sendmail
         message-sendmail-envelope-from 'header
         message-directory "drafts"
-        message-user-fqdn "fencepost.gnu.org")
+        message-user-fqdn "aminb.org")
   (add-hook 'message-mode-hook
             (lambda () (setq fill-column 65
                         message-fill-column 65)))
@@ -1169,7 +1178,7 @@ Emacs package that displays available keybindings in popup
         mml-secure-openpgp-sign-with-sender t))
 
 (use-package notmuch
-  :general (ab--leader-keys "m" 'ab/notmuch)
+  :ryo ("SPC m" ab/notmuch)
   :config
   (setq notmuch-hello-sections
         '(notmuch-hello-insert-header
@@ -1178,6 +1187,8 @@ Emacs package that displays available keybindings in popup
           notmuch-hello-insert-alltags)
         notmuch-search-oldest-first nil
         notmuch-show-all-tags-list t
+        notmuch-message-headers  ; see bug follow-up above
+        '("Subject" "To" "Cc" "Date" "List-Id" "X-RT-Originator")
         notmuch-hello-thousands-separator ","
         notmuch-fcc-dirs
         '(("amin@aminb.org"            . "amin/Sent")
@@ -1200,49 +1211,53 @@ Emacs package that displays available keybindings in popup
   ;;             :override #'kill-this-buffer)
   :bind
   (:map notmuch-hello-mode-map
-       ("g" . notmuch-poll-and-refresh-this-buffer)
-       ("i" . (lambda ()
-                "Search for `inbox' tagged messages"
-                (interactive)
-                (notmuch-hello-search "tag:inbox")))
-       ("u" . (lambda ()
-                "Search for `unread' tagged messages"
-                (interactive)
-                (notmuch-hello-search "tag:unread")))
-       ("M" . (lambda ()
-                "Compose new mail and prompt for sender"
-                (interactive)
-                (let ((current-prefix-arg t))
-                  (call-interactively #'notmuch-mua-new-mail)))))
+        ("g" . notmuch-poll-and-refresh-this-buffer)
+        ("i" . (lambda ()
+                 "Search for `inbox' tagged messages"
+                 (interactive)
+                 (notmuch-hello-search "tag:inbox")))
+        ("u" . (lambda ()
+                 "Search for `unread' tagged messages"
+                 (interactive)
+                 (notmuch-hello-search "tag:unread")))
+        ("l" . (lambda ()
+                 "Search for `latest tagged messages"
+                 (interactive)
+                 (notmuch-hello-search "tag:latest")))
+        ("M" . (lambda ()
+                 "Compose new mail and prompt for sender"
+                 (interactive)
+                 (let ((current-prefix-arg t))
+                   (call-interactively #'notmuch-mua-new-mail)))))
   (:map notmuch-search-mode-map
-       ("g" . notmuch-poll-and-refresh-this-buffer)
-       ("k" . (lambda ()
-                "Mark message read"
-                (interactive)
-                (notmuch-search-tag '("-unread"))
-                ;; (notmuch-search-archive-thread)
-                (notmuch-search-next-thread)))
-       ("u" . (lambda ()
-                "Mark message unread"
-                (interactive)
-                (notmuch-search-tag '("+unread"))
-                (notmuch-search-next-thread)))
-       ("K" . (lambda ()
-                "Mark message deleted"
-                (interactive)
-                (notmuch-search-tag '("-unread" "-inbox" "+deleted"))
-                (notmuch-search-archive-thread)))
-       ("S" . (lambda ()
-                "Mark message as spam"
-                (interactive)
-                (notmuch-search-tag '("-unread" "-inbox" "-webmasters" "+spam"))
-                (notmuch-search-archive-thread))))
+        ("g" . notmuch-poll-and-refresh-this-buffer)
+        ("k" . (lambda ()
+                 "Mark message read"
+                 (interactive)
+                 (notmuch-search-tag '("-unread"))
+                 ;; (notmuch-search-archive-thread)
+                 (notmuch-search-next-thread)))
+        ("u" . (lambda ()
+                 "Mark message unread"
+                 (interactive)
+                 (notmuch-search-tag '("+unread"))
+                 (notmuch-search-next-thread)))
+        ("K" . (lambda ()
+                 "Mark message deleted"
+                 (interactive)
+                 (notmuch-search-tag '("-unread" "-inbox" "+deleted"))
+                 (notmuch-search-archive-thread)))
+        ("S" . (lambda ()
+                 "Mark message as spam"
+                 (interactive)
+                 (notmuch-search-tag '("-unread" "-inbox" "-webmasters" "+spam"))
+                 (notmuch-search-archive-thread))))
   (:map notmuch-tree-mode-map  ; TODO: additional bindings
-       ("S" . (lambda ()
-                "Mark message as spam"
-                (interactive)
-                (notmuch-tree-tag '("-unread" "-inbox" "-webmasters" "+spam"))
-                (notmuch-tree-archive-thread))))
+        ("S" . (lambda ()
+                 "Mark message as spam"
+                 (interactive)
+                 (notmuch-tree-tag '("-unread" "-inbox" "-webmasters" "+spam"))
+                 (notmuch-tree-archive-thread))))
 )
 
 ;; (use-package counsel-notmuch
@@ -1312,6 +1327,14 @@ variables.  This is useful for a regi `begin' frame-entry."
 nil))
 #+end_src
 
+* Blogging
+** [[https://ox-hugo.scripter.co][ox-hugo]]
+
+#+begin_src emacs-lisp
+(use-package ox-hugo
+  :after ox)
+#+end_src
+
 * Post initialization
 :PROPERTIES:
 :CUSTOM_ID: post-initialization