'auto-compile-inhibit-compile-detached-git-head))
#+end_src
-*** [[https://github.com/Kungsgeten/ryo-modal][ryo-modal]]
+*** [[https://github.com/noctuid/general.el][general]]
-#+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
+ amin--mode-leader-keys
+ :keymaps 'override
+ :states '(emacs normal visual motion insert)
+ :non-normal-prefix "C-,"
+ :prefix ",")
+
+ (general-create-definer
+ amin--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)
+ (general-swap-key nil '(normal motion) ";" ":")
+ (setq evil-want-visual-char-semi-exclusive t))
+#+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)
+ :config
+ (evil-escape-mode 1)
+ ;; no `evil-escape' in minibuffer
+ (push #'minibufferp evil-escape-inhibit-functions))
+#+end_src
#+begin_src emacs-lisp
-(use-package ryo-modal
- :commands ryo-modal-mode
- :bind ("M-m" . ryo-modal-mode)
- :after which-key
+(use-package evil-org
+ :hook (org-mode . evil-org-mode)
+ :general
+ (nvmap evil-org-mode-map
+ "TAB" 'org-cycle
+ "S-TAB" 'org-cycle)
:config
- (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)
- ("/" undo)
- ("i" ryo-modal-mode)
- ("l" recenter-top-bottom)
- ("v" scroll-up-command)
- ("V" scroll-down-command)
- ("x" delete-forward-char)
- ("SPC" (("b" (("b" ibuffer-list-buffers)
- ("k" kill-this-buffer)
- ("o" other-window)
- ("s" save-buffer)))
- ("B" (("A" borg-activate)
- ("a" borg-assimilate)
- ("b" borg-build)
- ("c" borg-clone)
- ("r" borg-remove)))
- ("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)
- ("b" backward-kill-word)))
- ("c w" kill-word :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)))
+ (evil-org-set-key-theme)
+ (require 'evil-org-agenda)
+ (evil-org-agenda-set-keys)
+ (nmap evil-org-mode-map
+ [backtab] 'org-shifttab)
+ (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)))))
+#+end_src
+
+#+begin_src emacs-lisp
+(amin--leader-keys
+ "B" '(:ignore t :wk "Borg")
+ "BA" 'borg-activate
+ "Ba" 'borg-assimilate
+ "Bb" 'borg-build
+ "Bc" 'borg-clone
+ "Bd" 'epkg-describe-package
+ "Bp" 'epkg-list-packages
+ "Br" 'borg-remove
+ "Bu" 'epkg-update
+
+ "b" '(:ignore t :wk "buffers")
+ "bb" 'ibuffer-list-buffers
+ "bk" 'kill-this-buffer
+ "bs" 'save-buffer
+
+ "f" '(:ignore t :wk "files")
+
+ "h" '(:ignore t :wk "help")
+ "hc" 'describe-char
+ "hf" 'describe-function
+ "hF" 'describe-face
+ "hi" 'info
+ "hk" 'describe-key
+ "hl" 'view-lossage
+ "hv" 'describe-variable
+
+ "o" 'other-window
+
+ "w" '(:ignore t :wk "window")
+ "wo" 'other-window
+
+ "q" '(:ignore t :wk "quit")
+ "qq" 'save-buffers-kill-terminal)
#+end_src
*** [[https://orgmode.org/][Org mode]]
#+begin_src emacs-lisp
(use-package org
- :ryo ("SPC b t" org-babel-tangle)
+ :general
+ (amin--leader-keys "bt" 'org-babel-tangle)
+ (amin--leader-keys org-mode-map "i" 'org-edit-special)
:config
(setq org-src-tab-acts-natively t
org-src-preserve-indentation nil
org-edit-src-content-indentation 0)
:hook (org-mode . org-indent-mode))
+
(use-package org-notmuch
:after (:any org notmuch))
#+end_src
#+begin_src emacs-lisp
(use-package magit
- :ryo ("SPC" (("g s" magit-status)))
+ :general
+ (amin--leader-keys
+ "g" '(:ignore t :wk "magit")
+ "g SPC" 'magit-status
+ "gs" 'magit-status
+ "gS" 'magit-status-prefix
+ "gB" 'magit-blame
+ "gC" 'magit-clone
+ "gf" 'magit-fetch
+ "gF" 'magit-pull
+ "gP" 'magit-push
+ "gcc" 'magit-commit
+ "gca" 'magit-commit-amend
+ "gbb" 'magit-checkout
+ "gbc" 'magit-branch)
:defer t
:bind (("s-g" . magit-status)
("C-x g" . magit-status)
([S-up] . ivy-previous-history-element)
([S-down] . ivy-next-history-element)
("DEL" . ivy-backward-delete-char))
- :ryo ("SPC ," ivy-switch-buffer)
+ :general (amin--leader-keys "," 'ivy-switch-buffer)
:config
(setq ivy-wrap t)
(ivy-mode 1))
#+begin_src emacs-lisp
(use-package swiper
- :ryo
- ("SPC /" swiper)
- ("s" swiper)
+ :general (:states 'normal "/" 'swiper)
:bind (([remap isearch-forward] . swiper)
([remap isearch-backward] . swiper)))
#+end_src
#+begin_src emacs-lisp
(use-package counsel
:defer 1
- :ryo
- ("SPC" (("f r" counsel-recentf)
- ("SPC" counsel-M-x)
- ("." counsel-find-file)))
+ :general
+ (amin--leader-keys
+ "fr" '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)
(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
(use-package crux
:bind (("C-c d" . crux-duplicate-current-line-or-region)
("C-c M-d" . crux-duplicate-and-comment-current-line-or-region))
- :ryo
- ("o" crux-smart-open-line :exit t)
- ("O" crux-smart-open-line-above :exit t)
- ("SPC b K" crux-kill-other-buffers)
- ("d d" crux-kill-whole-line)
- ("c c" crux-kill-whole-line :then '(crux-smart-open-line-above) :exit t)
- ("SPC f" (("c" crux-copy-file-preserve-attributes)
- ("D" crux-delete-file-and-buffer)
- ("R" crux-rename-file-and-buffer))))
+ :general
+ (amin--leader-keys
+ "bK" 'crux-kill-other-buffers
+ "fc" 'crux-copy-file-preserve-attributes
+ "fD" 'crux-delete-file-and-buffer
+ "fR" 'crux-rename-file-and-buffer))
#+end_src
** [[https://github.com/alezost/mwim.el][mwim]]
("C-e" . mwim-end-of-code-or-line)
("<home>" . mwim-beginning-of-line-or-code)
("<end>" . mwim-end-of-line-or-code))
- :ryo
- ("a" mwim-beginning-of-code-or-line)
- ("e" mwim-end-of-code-or-line))
-#+end_src
-
-** [[https://www.emacswiki.org/emacs/KeyChord][key-chord]]
-
-#+begin_src emacs-lisp
-(use-package key-chord
- :demand t
- :config
- (key-chord-mode 1)
- (key-chord-define-global "jk" 'ryo-modal-mode)
- (setq key-chord-one-key-delay 0 ; i don't need one-key chords for now
- key-chord-two-keys-delay 0.005))
+ :general (:states '(normal visual)
+ "0" 'mwim-beginning-of-code-or-line
+ "$" 'mwim-end-of-code-or-line))
#+end_src
* Email
mml-secure-openpgp-sign-with-sender t))
(use-package notmuch
- :ryo ("SPC m" amin/notmuch)
+ :general (amin--leader-keys "m" 'amin/notmuch)
:config
(setq notmuch-hello-sections
'(notmuch-hello-insert-header