I was playing around with Evil and like it quite a bit. It feels better than
the previous Viper/Vimpulse package I was using, plus documentation is good,
clear, and it seems easy to customize.
One problem with Org for me has been keybindings. Even with a Vim emulator that
does a decent job of vim-ifying Emacs, it still leaves all of the (numerous)
Org-specific keymappings to deal with. It turns out to be quite easy to add
custom keymappings to Org-mode to make commands accessible in a more Vim-like
way. I've added the code below to my .emacs and it's a good start. Maybe some
vim-friendly Org users will have ideas on how to grow it from here:
(define-minor-mode evil-org-mode
minor mode to add evil keymappings to Org-mode.
:keymap (make-sparse-keymap)
(evil-local-mode t))
; the ',num' keys give quick and easy way to hide/reveal outline
; structure of entire document (analogous to shift-tab);
(evil-define-key 'normal evil-org-mode-map ,1 '(lambda()
(interactive)(hide-sublevels 1)))
(evil-define-key 'normal evil-org-mode-map ,2 '(lambda()
(interactive)(hide-sublevels 2)))
(evil-define-key 'normal evil-org-mode-map ,3 '(lambda()
(interactive)(hide-sublevels 3)))
(evil-define-key 'normal evil-org-mode-map ,4 '(lambda()
(interactive)(hide-sublevels 4)))
(evil-define-key 'normal evil-org-mode-map ,5 '(lambda()
(interactive)(hide-sublevels 5)))
(evil-define-key 'normal evil-org-mode-map ,6 '(lambda()
(interactive)(hide-sublevels 6)))
(evil-define-key 'normal evil-org-mode-map ,7 '(lambda()
(interactive)(hide-sublevels 7)))
(evil-define-key 'normal evil-org-mode-map ,8 '(lambda()
(interactive)(hide-sublevels 8)))
; the ',,num' maps below give quick and easy way to hide/reveal outline
; structure of single subtree. depending on what sort of org
; documents you have, and how you use them, you may prefer
; to have these mappings use single ',' and have entire-document
; mappings use ',,' prefix.
(evil-define-key 'normal evil-org-mode-map ,,1 '(lambda()
(interactive)(hide-sublevels 1)))
(evil-define-key 'normal evil-org-mode-map ,,2 '(lambda()
(interactive)(hide-sublevels 1)(show-children 1)))
(evil-define-key 'normal evil-org-mode-map ,,3 '(lambda()
(interactive)(hide-sublevels 1)(show-children 2)))
(evil-define-key 'normal evil-org-mode-map ,,4 '(lambda()
(interactive)(hide-sublevels 1)(show-children 3)))
(evil-define-key 'normal evil-org-mode-map ,,5 '(lambda()
(interactive)(hide-sublevels 1)(show-children 4)))
(evil-define-key 'normal evil-org-mode-map ,,6 '(lambda()
(interactive)(hide-sublevels 1)(show-children 5)))
(evil-define-key 'normal evil-org-mode-map ,,7 '(lambda()
(interactive)(hide-sublevels 1)(show-children 6)))
(evil-define-key 'normal evil-org-mode-map ,,8 '(lambda()
(interactive)(hide-sublevels 1)(show-children 7)))
; various commands mapped below
(evil-define-key 'normal evil-org-mode-map ,dd 'org-deadline)
(evil-define-key 'normal evil-org-mode-map ,ds 'org-schedule)
(evil-define-key 'normal evil-org-mode-map ,te 'org-set-tags-command)
(evil-define-key 'normal evil-org-mode-map ,ts 'org-todo)
(evil-define-key 'normal evil-org-mode-map ,r 'org-refile)
(evil-define-key 'normal evil-org-mode-map ,c 'org-capture)
(evil-define-key 'normal evil-org-mode-map ,ag 'org-agenda)
(evil-define-key 'normal evil-org-mode-map 'org-promote-subtree)
(evil-define-key 'normal evil-org-mode-map 'org-demote-subtree)
(evil-define-key 'normal evil-org-mode-map . 'org-move-subtree-down)
(evil-define-key 'normal evil-org-mode-map , 'org-move-subtree-up)
(evil-define-key 'normal evil-org-mode-map gj 'org-forward-same-level)
(evil-define-key 'normal evil-org-mode-map gk 'org-backward-same-level)
(evil-define-key 'normal evil-org-mode-map gh 'outline-up-heading)
(evil-define-key 'normal evil-org-mode-map gl 'outline-next-visible-heading)
(evil-define-key 'normal evil-org-mode-map ,g 'org-goto)
(evil-define-key 'normal evil-org-mode-map ,ex 'org-export)
(evil-define-key 'normal evil-org-mode-map ,ns 'org-narrow-to-subtree)
(evil-define-key 'normal evil-org-mode-map ,nw 'widen)
(evil-define-key 'normal evil-org-mode-map [(return)]
'org-insert-heading-respect-content)
; add hook to load evil-org mappings in all org documents
(add-hook 'org-mode-hook 'evil-org-mode)