emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Herbert Sitz <hesitz@gmail.com>
To: emacs-orgmode@gnu.org
Subject: adding custom org-keymaps for EVIL Vim emulator
Date: Tue, 28 Feb 2012 23:50:33 +0000 (UTC)	[thread overview]
Message-ID: <loom.20120229T004428-203@post.gmane.org> (raw)

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) 

             reply	other threads:[~2012-02-28 23:50 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-28 23:50 Herbert Sitz [this message]
2012-02-28 23:59 ` adding custom org-keymaps for EVIL Vim emulator Herbert Sitz
2012-05-07  5:12 ` Eric S Fraga

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=loom.20120229T004428-203@post.gmane.org \
    --to=hesitz@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).