diff --git a/layers/org/extensions/evil-org/evil-org.el b/layers/org/extensions/evil-org/evil-org.el new file mode 100644 index 000000000..1095eeddf --- /dev/null +++ b/layers/org/extensions/evil-org/evil-org.el @@ -0,0 +1,172 @@ +;;; 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)))) + "H" 'org-beginning-of-line + "L" 'org-end-of-line + "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)) + +(provide 'evil-org) +;;; evil-org.el ends here diff --git a/layers/org/packages.el b/layers/org/packages.el index 6884c85f4..c451f3221 100644 --- a/layers/org/packages.el +++ b/layers/org/packages.el @@ -15,7 +15,7 @@ company company-emoji emoji-cheat-sheet-plus - evil-org + (evil-org :location local) gnuplot htmlize ;; org is installed by `org-plus-contrib' @@ -48,16 +48,7 @@ :config (progn (evil-leader/set-key-for-mode 'org-mode - "mC" 'evil-org-recompute-clocks - - ;; evil-org binds these keys, so we bind them back to their original - ;; value - "t" (lookup-key evil-leader--default-map "t") - "a" (lookup-key evil-leader--default-map "a") - "b" (lookup-key evil-leader--default-map "b") - "c" (lookup-key evil-leader--default-map "c") - "l" (lookup-key evil-leader--default-map "l") - "o" (lookup-key evil-leader--default-map "o")) + "mC" 'evil-org-recompute-clocks) (evil-define-key 'normal evil-org-mode-map "O" 'evil-open-above) (spacemacs|diminish evil-org-mode " ⓔ" " e"))))