From mboxrd@z Thu Jan 1 00:00:00 1970 From: Herbert Sitz Subject: adding custom org-keymaps for EVIL Vim emulator Date: Tue, 28 Feb 2012 23:50:33 +0000 (UTC) Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Return-path: Received: from eggs.gnu.org ([208.118.235.92]:58931) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S2Woh-0003Em-Sp for emacs-orgmode@gnu.org; Tue, 28 Feb 2012 18:50:50 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S2Woe-0004vL-Jw for emacs-orgmode@gnu.org; Tue, 28 Feb 2012 18:50:47 -0500 Received: from plane.gmane.org ([80.91.229.3]:47075) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S2Woe-0004ux-6H for emacs-orgmode@gnu.org; Tue, 28 Feb 2012 18:50:44 -0500 Received: from list by plane.gmane.org with local (Exim 4.69) (envelope-from ) id 1S2Woc-0002PH-6V for emacs-orgmode@gnu.org; Wed, 29 Feb 2012 00:50:42 +0100 Received: from c-24-22-131-140.hsd1.wa.comcast.net ([24.22.131.140]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 29 Feb 2012 00:50:42 +0100 Received: from hesitz by c-24-22-131-140.hsd1.wa.comcast.net with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 29 Feb 2012 00:50:42 +0100 List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org 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 ',' keys give quick and easy way to hide/reveal outline ; structure of entire document (analogous to ); (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 ',,' 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)