summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.org87
-rw-r--r--evil-org.el222
2 files changed, 201 insertions, 108 deletions
diff --git a/README.org b/README.org
index 80db90b..ead903a 100644
--- a/README.org
+++ b/README.org
@@ -1,12 +1,14 @@
#+TITLE: evil-org-mode
-Supplemental evil-mode key-bindings to Emacs org-mode. This is a work in progress, expect improvements and don't be afraid to contribute patches.
+Supplemental evil-mode key-bindings to Emacs org-mode.
+This is an extended and actively maintained version of https://github.com/edwtjo/evil-org-mode/blob/master/evil-org.el that was originally created by Edward Tjörnhammar.
-* Introduction
+* New features since evil-org-mode
+- [X] key themes
+- [X] customizable movement keys
+- [ ] operators
+- [ ] text objects
-This is an extended and actively maintained version of
- https://github.com/edwtjo/evil-org-mode/blob/master/evil-org.el by Edward
- Tjörnhammar. It's purpose is to be more configurable.
* Requirements
- org-mode, git://orgmode.org/org-mode.git
@@ -24,34 +26,42 @@ This is an extended and actively maintained version of
#+begin_src emacs-lisp
(add-to-list 'load-path "~/.emacs.d/plugins/evil-org-mode")
(require 'evil-org)
+ (evil-org-set-key-theme '(additional))
#+end_src
-* Keys
-Here are the keys introduced by evil-org
+* Keythemes
+The new config is set up in keythemes
- | gh | outline-up-heading |
- | gj | org-forward-heading-same-level |
- | gk | org-backward-heading-same-level |
- | gl | outline-next-visible-heading |
- | t | org-todo |
- | T | org-insert-todo-heading nil |
- | H | org-shiftleft |
- | J | org-shiftdown |
- | K | org-shiftup |
- | L | org-shiftright |
- | o | always-insert-item |
- | O | org-insert-heading |
+To enable all bindings use:
+#+begin_src emacs-lisp
+ (evil-org-set-key-theme '(additional shift leader todo heading))
+#+end_src
+
+
+ |-----------+--------------------------------------------|
+** Basic
+These keys are always enabled
+
+ | 'x' | org-delete-previous-char |
+ | 'X' | org-delete-char |
| '$' | org-end-of-line |
| '^' | org-beginning-of-line |
| < | org-metaleft |
| > | org-metaright |
- | <leader>a | org-agenda |
- | <leader>t | org-show-todo-tree |
- | <leader>c | org-archive-subtree |
- | <leader>l | evil-org-open-links |
- | <leader>o | evil-org-recompute-clocks |
- |-----------+--------------------------------------------|
+ | ( | org-forward-sentence |
+ | ) | org-backward-sentence |
+ | { | org-forward-paragraph |
+ | } | org-backward-paragraph |
| TAB | org-cycle |
+ | o | always-insert-item |
+
+** Additional
+If you don't want to use hjkl, you can customize evil-org-movement-bindings.
+
+ | gh | outline-up-heading |
+ | gj | org-forward-heading-same-level |
+ | gk | org-backward-heading-same-level |
+ | gl | outline-next-visible-heading |
| M-l | org-metaright |
| M-h | org-metaleft |
| M-k | org-metaup |
@@ -60,9 +70,34 @@ Here are the keys introduced by evil-org
| M-H | org-shiftmetaleft |
| M-K | org-shiftmetaup |
| M-J | org-shiftmetadown |
- | M-o | org-insert-heading+org-metaright |
| M-t | org-insert-todo-heading nil+ org-metaright |
+** Shift
+If you don't want to use hjkl, you can customize evil-org-movement-bindings.
+
+ | H | org-shiftleft |
+ | J | org-shiftdown |
+ | K | org-shiftup |
+ | L | org-shiftright |
+
+** Leader
+
+ | <leader>a | org-agenda |
+ | <leader>t | org-show-todo-tree |
+ | <leader>c | org-archive-subtree |
+ | <leader>l | evil-org-open-links |
+ | <leader>o | evil-org-recompute-clocks |
+
+** Todo
+
+ | t | org-todo |
+ | T | org-insert-todo-heading nil |
+
+** Heading
+
+ | O | org-insert-heading |
+ | M-o | org-insert-heading+org-metaright |
+
* License
Gnu General Public License v3.0, http://www.gnu.org/copyleft/gpl.html
diff --git a/evil-org.el b/evil-org.el
index 9e1ddbf..55d4382 100644
--- a/evil-org.el
+++ b/evil-org.el
@@ -6,7 +6,7 @@
;; Git-Repository; git://github.com/Somelauw/evil-org-improved.git
;; Created: 2012-06-14
;; Forked since 2017-02-12
-;; Version: 0.1.3
+;; Version: 0.2.0
;; Package-Requires: ((evil "0") (org "0") (evil-leader "0"))
;; Keywords: evil vim-emulation org-mode key-bindings presets
@@ -34,11 +34,31 @@
(require 'evil)
(require 'org)
+(defgroup evil-org nil
+ "Provides integration of org-mode and evil."
+ :group 'org
+ :prefix "evil-org-")
+
+(defcustom evil-org-movement-bindings
+ '((up . "k")
+ (down . "j")
+ (left . "h")
+ (right . "l"))
+ "AList of normal keys to use for arrows.
+
+ This can be used by non-qwerty users who don't use hjkl."
+ :group 'evil-org
+ :type '(alist :key-type symbol :value-type string)
+ :options '(up down left right))
+
+(defvar evil-org-mode-map (make-sparse-keymap))
+
+;;;###autoload
(define-minor-mode evil-org-mode
"Buffer local minor mode for evil-org"
:init-value nil
:lighter " EvilOrg"
- :keymap (make-sparse-keymap) ; defines evil-org-mode-map
+ :keymap evil-org-mode-map
:group 'evil-org)
(add-hook 'org-mode-hook 'evil-org-mode) ;; only load with org-mode
@@ -47,16 +67,14 @@
"Clever insertion of org item."
(if (not (org-in-item-p))
(insert "\n")
- (org-insert-item))
- )
+ (org-insert-item)))
(defun evil-org-eol-call (fun)
"Go to end of line and call provided function.
FUN function callback"
(end-of-line)
(funcall fun)
- (evil-append nil)
- )
+ (evil-append nil))
;; recompute clocks in visual selection
(evil-define-operator evil-org-recompute-clocks (beg end type register yank-handler)
@@ -64,13 +82,12 @@ FUN function callback"
:move-point nil
(interactive "<r>")
(progn
- (message "start!" )
- (save-excursion
- (while (< (point) end)
- (org-evaluate-time-range)
- (next-line)
- (message "at position %S" (point))
- ))))
+ (message "start!")
+ (save-excursion
+ (while (< (point) end)
+ (org-evaluate-time-range)
+ (next-line)
+ (message "at position %S" (point))))))
;; open org-mode links in visual selection
(defun evil-org-generic-open-links (beg end type register yank-handler incog)
@@ -82,8 +99,8 @@ FUN function callback"
(org-next-link)
;;; break from outer loop when there are no more
;;; org links
- (when (or
- (not (< (point) end))
+ (when (or
+ (not (< (point) end))
(not (null org-link-search-failed)))
(throw 'break 0))
@@ -109,81 +126,122 @@ FUN function callback"
:keep-visual t
:move-point nil
(interactive "<r>")
- (evil-org-generic-open-links beg end type register yank-handler nil)
-)
+ (evil-org-generic-open-links beg end type register yank-handler nil))
;;; open links in visual selection in incognito mode
(evil-define-operator evil-org-open-links-incognito (beg end type register yank-handler)
:keep-visual t
:move-point nil
(interactive "<r>")
- (evil-org-generic-open-links beg end type register yank-handler t)
-)
-
-;; normal state shortcuts
-(evil-define-key 'normal evil-org-mode-map
- "gh" 'outline-up-heading
- "gp" 'outline-previous-heading
- "gj" (if (fboundp 'org-forward-same-level) ;to be backward compatible with older org version
- 'org-forward-same-level
- 'org-forward-heading-same-level)
- "gk" (if (fboundp 'org-backward-same-level)
- 'org-backward-same-level
- 'org-backward-heading-same-level)
- "gl" 'outline-next-visible-heading
- "t" 'org-todo
- "T" '(lambda () (interactive) (evil-org-eol-call (lambda() (org-insert-todo-heading nil))))
- "H" 'org-shiftleft
- "J" 'org-shiftdown
- "K" 'org-shiftup
- "L" 'org-shiftright
- "o" '(lambda () (interactive) (evil-org-eol-call 'clever-insert-item))
- "O" '(lambda () (interactive) (evil-org-eol-call 'org-insert-heading))
- "x" 'org-delete-char
- "X" 'org-delete-backward-char
- "$" 'org-end-of-line
- "^" 'org-beginning-of-line
- "<" 'org-metaleft
- ">" 'org-metaright
- "-" 'org-cycle-list-bullet
- "(" 'org-backward-sentence
- ")" 'org-forward-sentence
- "{" 'org-backward-paragraph
- "}" 'org-forward-paragraph
- (kbd "<tab>") 'org-cycle)
+ (evil-org-generic-open-links beg end type register yank-handler t))
+
+
+
+(defun evil-org--populate-base-bindings ()
+ (let-alist evil-org-movement-bindings
+ (dolist (state '(normal visual operator motion))
+ (evil-define-key state evil-org-mode-map
+ (kbd "$") 'org-end-of-line
+ (kbd "^") 'org-beginning-of-line
+ (kbd "x") 'org-delete-char
+ (kbd "X") 'org-delete-backward-char
+ (kbd ")") 'org-forward-sentence
+ (kbd "(") 'org-backward-sentence
+ (kbd "}") 'org-forward-paragraph
+ (kbd "{") 'org-backward-paragraph))
+ (dolist (state '(normal visual))
+ (evil-define-key state evil-org-mode-map
+ (kbd "<") 'org-metaleft
+ (kbd ">") 'org-metaright
+ (kbd "<tab>") 'org-cycle
+ (kbd "<S-tab>") 'org-shifttab))
+ (evil-define-key 'normal evil-org-mode-map
+ (kbd "o") '(lambda ()
+ (interactive)
+ (evil-org-eol-call 'clever-insert-item)))))
+
+(defun evil-org--populate-additional-bindings ()
+ (let-alist evil-org-movement-bindings
+ (dolist (state '(motion))
+ (evil-define-key state evil-org-mode-map
+ (kbd (concat "g" .left)) 'org-up-element
+ (kbd (concat "g" .right)) 'org-down-element
+ (kbd (concat "g" .up)) (if (fboundp 'org-backward-same-level)
+ 'org-backward-same-level
+ 'org-backward-heading-same-level)
+ (kbd (concat "g" .down)) (if (fboundp 'org-forward-same-level) ;to be backward compatible with older org version
+ 'org-forward-same-level
+ 'org-forward-heading-same-level)))
+ (dolist (state '(normal visual))
+ (evil-define-key state evil-org-mode-map
+ (kbd (concat "M-" .left)) 'org-metaleft
+ (kbd (concat "M-" .right)) 'org-metaright
+ (kbd (concat "M-" .up)) 'org-metaup
+ (kbd (concat "M-" .down)) 'org-metadown
+ (kbd (concat "M-" (capitalize .left))) 'org-shiftmetaleft
+ (kbd (concat "M-" (capitalize .right))) 'org-shiftmetaright
+ (kbd (concat "M-" (capitalize .up))) 'org-shiftmetaup
+ (kbd (concat "M-" (capitalize .down))) 'org-shiftmetadown
+ (kbd (concat "C-" (capitalize .left))) 'org-shiftcontrolleft
+ (kbd (concat "C-" (capitalize .right))) 'org-shiftcontrolright
+ (kbd (concat "C-" (capitalize .up))) 'org-shiftcontrolup
+ (kbd (concat "C-" (capitalize .down))) 'org-shiftcontroldown))))
+
+(defun evil-org--populate-shift-bindings ()
+ (let-alist evil-org-movement-bindings
+ (evil-define-key 'normal evil-org-mode-map
+ (capitalize .left) 'org-shiftleft
+ (capitalize .right) 'org-shiftright
+ (capitalize .down) 'org-shiftdown
+ (capitalize .up) 'org-shiftup)))
;; leader maps
-(evil-leader/set-key-for-mode 'org-mode
- "t" 'org-show-todo-tree
- "a" 'org-agenda
- "c" 'org-archive-subtree
- "l" 'evil-org-open-links
- "o" 'evil-org-recompute-clocks
-)
-
-;; normal & insert state shortcuts.
-(mapc (lambda (state)
- (evil-define-key state evil-org-mode-map
- (kbd "M-l") 'org-metaright
- (kbd "M-h") 'org-metaleft
- (kbd "M-k") 'org-metaup
- (kbd "M-j") 'org-metadown
- (kbd "M-L") 'org-shiftmetaright
- (kbd "M-H") 'org-shiftmetaleft
- (kbd "M-K") 'org-shiftmetaup
- (kbd "M-J") 'org-shiftmetadown
- (kbd "M-o") '(lambda () (interactive)
- (evil-org-eol-call
- '(lambda()
- (org-insert-heading)
- (org-metaright))))
- (kbd "M-t") '(lambda () (interactive)
- (evil-org-eol-call
- '(lambda()
- (org-insert-todo-heading nil)
- (org-metaright))))
- ))
- '(normal insert))
+(defun evil-org--populate-leader-bindings ()
+ (evil-leader/set-key-for-mode 'org-mode
+ "t" 'org-show-todo-tree
+ "a" 'org-agenda
+ "c" 'org-archive-subtree
+ "l" 'evil-org-open-links
+ "o" 'evil-org-recompute-clocks))
+
+(defun evil-org--populate-todo-bindings ()
+ (evil-define-key 'normal evil-org-mode-map
+ "t" 'org-todo
+ "T" '(lambda ()
+ (interactive)
+ (evil-org-eol-call
+ (lambda ()
+ (org-insert-todo-heading nil))))))
+
+(defun evil-org--populate-heading-bindings ()
+ (evil-define-key 'normal evil-org-mode-map
+ (kbd "O") '(lambda ()
+ (interactive)
+ (evil-org-eol-call
+ (evil-org-eol-call
+ (lambda ()
+ (org-insert-heading)))))
+ (kbd "M-o") '(lambda () (interactive)
+ (evil-org-eol-call
+ '(lambda ()
+ (org-insert-heading)
+ (org-metaright))))))
+
+;;;###autoload
+(defun evil-org-set-key-theme (theme)
+ (setq evil-org-mode-map (make-sparse-keymap))
+ (evil-org--populate-base-bindings)
+ (when (memq 'additional theme) (evil-org--populate-additional-bindings))
+ (when (memq 'shift theme) (evil-org--populate-shift-bindings))
+ (when (memq 'leader theme) (evil-org--populate-leader-bindings))
+ (when (memq 'todo theme) (evil-org--populate-todo-bindings))
+ (when (memq 'heading theme) (evil-org--populate-heading-bindings))
+ (setcdr
+ (assq 'evil-org-mode minor-mode-map-alist)
+ evil-org-mode-map))
+
+;; This default will soon be changed to '(additional)
+(evil-org-set-key-theme '(additional shift leader todo heading))
(provide 'evil-org)
;;; evil-org.el ends here