;;; evil-org.el --- evil keybindings for org-mode ;; Copyright (C) 2012-2014 by Edward Tjörnhammar ;; Author: Edward Tjörnhammar ;; URL: https://github.com/edwtjo/evil-org-mode.git ;; Package-Version: 20150513.1610 ;; Git-Repository; git://github.com/edwtjo/evil-org-mode.git ;; Created: 2012-06-14 ;; Version: 0.1.1 ;; Package-Requires: ((evil "0") (org "0")) ;; Keywords: evil vim-emulation org-mode key-bindings presets ;; This file is not part of GNU Emacs ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;; ;; Known Bugs: ;; See, https://github.com/edwtjo/evil-org-mode/issues ;; ;;; Code: (require 'evil) (require 'org) (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 :group 'evil-org) (add-hook 'org-mode-hook 'evil-org-mode) ;; only load with org-mode (defun clever-insert-item () "Clever insertion of org item." (if (not (org-in-item-p)) (insert "\n") (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) ) ;; recompute clocks in visual selection (evil-define-operator evil-org-recompute-clocks (beg end type register yank-handler) :keep-visual t :move-point nil (interactive "") (progn (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) (progn (save-excursion (goto-char beg) (catch 'break (while t (org-next-link) ;;; break from outer loop when there are no more ;;; org links (when (or (not (< (point) end)) (not (null org-link-search-failed))) (throw 'break 0)) (if (not (null incog)) (let* ((new-arg ;;; if incog is true, decide which incognito settings to ;;; use dependening on the browser (cond ((not (null (string-match "^.*\\(iceweasel\\|firefox\\).*$" browse-url-generic-program))) "--private-window") ((not (null (string-match "^.*\\(chrome\\|chromium\\).*$" browse-url-generic-program))) "--incognito" ) (t "") )) (old-b (list browse-url-generic-args " " )) (browse-url-generic-args (add-to-ordered-list 'old-b new-arg 0))) (progn (org-open-at-point))) (let ((browse-url-generic-args '(""))) (org-open-at-point))) ))))) ;;; open links in visual selection (evil-define-operator evil-org-open-links (beg end type register yank-handler) :keep-visual t :move-point nil (interactive "") (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 "") (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)))) "o" '(lambda () (interactive) (evil-org-eol-call 'clever-insert-item)) "O" '(lambda () (interactive) (evil-org-eol-call 'org-insert-heading)) "$" 'org-end-of-line "^" 'org-beginning-of-line "<" 'org-metaleft ">" 'org-metaright "-" 'org-cycle-list-bullet (kbd "TAB") 'org-cycle) ;; 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)) ;; vim-like confirm/abort for capture and src (with-eval-after-load 'org-capture (define-key org-capture-mode-map [remap evil-save-and-close] 'org-capture-finalize) (define-key org-capture-mode-map [remap evil-save-modified-and-close] 'org-capture-finalize) (define-key org-capture-mode-map [remap evil-quit] 'org-capture-kill)) (with-eval-after-load 'org-src (define-key org-src-mode-map [remap evil-save-and-close] 'org-edit-src-exit) (define-key org-src-mode-map [remap evil-save-modified-and-close] 'org-edit-src-exit) (define-key org-src-mode-map [remap evil-quit] 'org-edit-src-abort)) (provide 'evil-org) ;;; evil-org.el ends here