lang/org: redo evil integration; add evil-org package

lang/org has now adopted much of evil-org, which introduces better evil
integration for org-mode. More testing is required.
This commit is contained in:
Henrik Lissner 2018-02-18 00:26:27 -05:00
parent 0b2a61593e
commit a01320deeb
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
3 changed files with 53 additions and 52 deletions

View file

@ -203,25 +203,19 @@ wrong places)."
(evil-insert 1)))) (evil-insert 1))))
;;;###autoload ;;;###autoload
(defun +org/shifttab (&optional arg) (defun +org/dedent ()
"An alternative to `org-shifttab' which performs smart indentation if in "TODO"
insert mode (evil). Otherwise, forwards to the original `org-shifttab'."
(interactive) (interactive)
(cond ((org-at-table-p) (cond ((org-at-item-p)
(call-interactively #'org-table-previous-field)) (org-list-indent-item-generic
((and (bound-and-true-p evil-mode) -1 nil
(evil-insert-state-p)) (save-excursion
(cond ((org-at-item-p) (when (org-region-active-p)
(org-list-indent-item-generic (goto-char (region-beginning)))
-1 nil (org-list-struct))))
(save-excursion ((org-at-heading-p)
(when (org-region-active-p) (ignore-errors (org-promote)))
(goto-char (region-beginning))) ((call-interactively #'self-insert-command))))
(org-list-struct))))
((org-at-heading-p)
(ignore-errors (org-promote)))
(t (call-interactively #'self-insert-command))))
(t (org-shifttab arg))))
;;;###autoload ;;;###autoload
(defun +org/refresh-inline-images () (defun +org/refresh-inline-images ()

View file

@ -29,6 +29,15 @@
(def-package! org-bullets (def-package! org-bullets
:commands org-bullets-mode) :commands org-bullets-mode)
(def-package! evil-org
:when (featurep! :feature evil)
:commands evil-org-mode
:config
(evil-org-set-key-theme '(navigation insert textobjects))
(after! org-agenda
(require 'evil-org-agenda)
(evil-org-agenda-set-keys)))
;; ;;
;; Bootstrap ;; Bootstrap
@ -47,6 +56,7 @@
org-indent-mode ; margin-based indentation org-indent-mode ; margin-based indentation
toc-org-enable ; auto-table of contents toc-org-enable ; auto-table of contents
visual-line-mode ; line wrapping visual-line-mode ; line wrapping
evil-org-mode ; evil-mode integration
+org|enable-auto-reformat-tables +org|enable-auto-reformat-tables
+org|enable-auto-update-cookies +org|enable-auto-update-cookies
@ -207,46 +217,55 @@ unfold to point on startup."
(defun +org|setup-keybinds () (defun +org|setup-keybinds ()
"Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies "Sets up org-mode and evil keybindings. Tries to fix the idiosyncrasies
between the two." between the two."
(defun +org|remove-occur-highlights ()
"Remove org occur highlights on ESC in normal mode."
(when (and (derived-mode-p 'org-mode)
org-occur-highlights)
(org-remove-occur-highlights)))
(add-hook 'doom-escape-hook #'+org|remove-occur-highlights)
;; C-a & C-e act like `doom/backward-to-bol-or-indent' and
;; `doom/forward-to-last-non-comment-or-eol', but with more org awareness.
(setq org-special-ctrl-a/e t)
(add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe)) (add-hook! 'org-tab-first-hook #'(+org|indent-maybe +org|yas-expand-maybe))
(require 'evil-org)
(map! :map org-mode-map (map! :map org-mode-map
[remap org-shifttab] #'+org/shifttab
[backspace] #'org-delete-backward-char
"C-c C-S-l" #'+org/remove-link "C-c C-S-l" #'+org/remove-link
"C-c C-i" #'org-toggle-inline-images "C-c C-i" #'org-toggle-inline-images
:i "RET" #'org-return-indent :map evil-org-mode-map
:n "RET" #'+org/dwim-at-point :i [backtab] #'+org/dedent
:i [backspace] #'evil-org-delete-backward-char
;; Navigate table cells (from insert-mode) ;; navigate table cells (from insert-mode)
:i "C-l" #'+org/table-next-field :i "C-l" #'+org/table-next-field
:i "C-h" #'+org/table-previous-field :i "C-h" #'+org/table-previous-field
:i "C-k" #'+org/table-previous-row :i "C-k" #'+org/table-previous-row
:i "C-j" #'+org/table-next-row :i "C-j" #'+org/table-next-row
;; Expand tables (or shiftmeta move) ;; expand tables (or shiftmeta move)
:ni "C-S-l" #'+org/table-append-field-or-shift-right :ni "C-S-l" #'+org/table-append-field-or-shift-right
:ni "C-S-h" #'+org/table-prepend-field-or-shift-left :ni "C-S-h" #'+org/table-prepend-field-or-shift-left
:ni "C-S-k" #'org-metaup :ni "C-S-k" #'org-metaup
:ni "C-S-j" #'org-metadown :ni "C-S-j" #'org-metadown
;; toggle local fold, instead of all children
:n [tab] #'+org/toggle-fold :n [tab] #'+org/toggle-fold
;; more intuitive RET keybinds
:i "RET" #'org-return-indent
:n "RET" #'+org/dwim-at-point
:ni [M-return] (λ! (+org/insert-item 'below)) :ni [M-return] (λ! (+org/insert-item 'below))
:ni [S-M-return] (λ! (+org/insert-item 'above)) :ni [S-M-return] (λ! (+org/insert-item 'above))
;; more org-ish vim motion keys
;; Fix vim motion keys
:m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line)) :m "]]" (λ! (org-forward-heading-same-level nil) (org-beginning-of-line))
:m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line)) :m "[[" (λ! (org-backward-heading-same-level nil) (org-beginning-of-line))
:m "]h" #'org-next-visible-heading
:m "[h" #'org-previous-visible-heading
:m "]l" #'org-next-link :m "]l" #'org-next-link
:m "[l" #'org-previous-link :m "[l" #'org-previous-link
:m "$" #'org-end-of-line :m "]s" #'org-babel-next-src-block
:m "^" #'org-beginning-of-line :m "[s" #'org-babel-previous-src-block
:n "gQ" #'org-fill-paragraph :n "gQ" #'org-fill-paragraph
:n "<" #'org-metaleft ;; sensible code-folding vim keybinds
:n ">" #'org-metaright
:v "<" (λ! (org-metaleft) (evil-visual-restore))
:v ">" (λ! (org-metaright) (evil-visual-restore))
;; Fix code-folding keybindings
:n "za" #'+org/toggle-fold :n "za" #'+org/toggle-fold
:n "zA" #'org-shifttab :n "zA" #'org-shifttab
:n "zc" #'outline-hide-subtree :n "zc" #'outline-hide-subtree
@ -255,15 +274,7 @@ between the two."
:n "zm" (λ! (outline-hide-sublevels 1)) :n "zm" (λ! (outline-hide-sublevels 1))
:n "zo" #'outline-show-subtree :n "zo" #'outline-show-subtree
:n "zO" #'outline-show-all :n "zO" #'outline-show-all
:n "zr" #'outline-show-all :n "zr" #'outline-show-all))
(:after org-agenda
(:map org-agenda-mode-map
:e "m" #'org-agenda-month-view
:e "C-j" #'org-agenda-next-item
:e "C-k" #'org-agenda-previous-item
:e "C-n" #'org-agenda-next-item
:e "C-p" #'org-agenda-previous-item))))
(defun +org|setup-hacks () (defun +org|setup-hacks ()
"Getting org to behave." "Getting org to behave."
@ -287,13 +298,6 @@ between the two."
(t . ,(cond (IS-MAC "open -R \"%s\"") (t . ,(cond (IS-MAC "open -R \"%s\"")
(IS-LINUX "xdg-open \"%s\""))))) (IS-LINUX "xdg-open \"%s\"")))))
(defun +org|remove-occur-highlights ()
"Remove org occur highlights on ESC in normal mode."
(when (and (derived-mode-p 'org-mode)
org-occur-highlights)
(org-remove-occur-highlights)))
(add-hook 'doom-escape-hook #'+org|remove-occur-highlights)
(after! recentf (after! recentf
;; Don't clobber recentf with agenda files ;; Don't clobber recentf with agenda files
(defun +org-is-agenda-file (filename) (defun +org-is-agenda-file (filename)

View file

@ -7,6 +7,9 @@
(package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets")) (package! org-bullets :recipe (:fetcher github :repo "hlissner/org-bullets"))
(package! toc-org) (package! toc-org)
(when (featurep! :feature evil)
(package! evil-org))
(when (featurep! +attach) (when (featurep! +attach)
(package! org-download)) (package! org-download))