summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmin Bandali <bandali@gnu.org>2018-11-18 00:12:59 -0500
committerAmin Bandali <bandali@gnu.org>2018-11-18 00:18:48 -0500
commit3e03ee8497f674cd4cbe43fd65cb7d554b93c05b (patch)
treef886e4c3ef17f611b697020f1bd5e3649917d497
parente8a7d9af83b8f8869a02322bc670f3f7904f6027 (diff)
downloadconfigs-3e03ee8497f674cd4cbe43fd65cb7d554b93c05b.tar.gz
configs-3e03ee8497f674cd4cbe43fd65cb7d554b93c05b.tar.xz
configs-3e03ee8497f674cd4cbe43fd65cb7d554b93c05b.zip
[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.
Diffstat (limited to '')
-rw-r--r--.gitmodules9
-rw-r--r--init.org235
m---------lib/evil0
m---------lib/evil-escape0
m---------lib/general0
5 files changed, 183 insertions, 61 deletions
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)
("<home>" . 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
+Subproject 99bcf8c31ee72a3a571e013f40d105618fb92d1
diff --git a/lib/evil-escape b/lib/evil-escape
new file mode 160000
+Subproject f4e9116bfbaac8c9d210c17ad488e0982291245
diff --git a/lib/general b/lib/general
new file mode 160000
+Subproject f48c43c4449677fa629aac2693ffcb850ca58c8