diff --git a/modules/lib/defuns-org.el b/modules/lib/defuns-org.el index 0104baaab..636b538d3 100644 --- a/modules/lib/defuns-org.el +++ b/modules/lib/defuns-org.el @@ -1,81 +1,69 @@ ;;; defuns-org.el ;;;###autoload -(defun narf/org-cycle-hide-drawers (state) - "Re-hide all drawers after a visibility state change. Hides properties permanently." - (when (and (derived-mode-p 'org-mode) - (not (memq state '(overview folded contents)))) - (save-excursion - (let* ((globalp (memq state '(contents all))) - (beg (if globalp (point-min) (point))) - (end (if globalp (point-max) - (if (eq state 'children) - (save-excursion (outline-next-heading) (point)) - (org-end-of-subtree t))))) - (goto-char beg) - (while (re-search-forward org-drawer-regexp end t) - (save-excursion - (beginning-of-line 1) - (backward-char 1) - (let ((b (point))) - (if (re-search-forward - "^[ \t]*:END:" - (save-excursion (outline-next-heading) (point)) t) - (outline-flag-region b (point-at-eol) t) - (user-error ":END: line missing at position %s" b))))))))) - -(defun narf--org-in-list-p () - (and (save-excursion (search-backward-regexp "^ *\\([0-9]+[\.)]\\|[-*+]\\) " - (line-beginning-position) t)) - (org-in-item-p))) - -;;;###autoload -(defun narf/org-insert-item-after () +(defun narf/org-insert-item (direction) "Inserts a new heading or item, depending on the context." (interactive) - (org-end-of-line) - (cond ((org-at-item-checkbox-p) - (org-insert-heading) - (insert "[ ] ")) - ((narf--org-in-list-p) - (org-insert-heading)) - ((org-on-heading-p) - (org-insert-heading-respect-content)) - (t - (org-insert-heading-after-current) - (delete-char 1))) - (evil-insert-state)) - -;; TODO Check if this and -forward can be combined -;;;###autoload -(defun narf/org-insert-item-before () - "Inserts a new heading or item, depending on the context." - (interactive) - (evil-first-non-blank) - (cond ((org-at-item-checkbox-p) - (org-insert-heading) - (insert "[ ] ")) - ((narf--org-in-list-p) - (org-insert-heading)) - (t (org-insert-heading))) - (evil-insert-state)) + (let* ((context (org-element-lineage + (org-element-context) + '(table table-row headline inlinetask + item plain-list) + t)) + (type (org-element-type context))) + (cond ((eq type 'item) + (cl-case direction + ('below + (org-end-of-line) + (org-insert-heading)) + ('above + (evil-first-non-blank) + (org-insert-heading))) + (when (org-element-property :checkbox context) + (insert "[ ] "))) + ((memq type '(table table-row)) + (cl-case direction + ('below + (org-table-insert-row)) + ('above + (narf/org-table-prepend-row-or-shift-up)))) + (t + (org-back-to-heading) + (let ((first-p (org-first-sibling-p)) + (orig-char (point))) + (cl-case direction + ('below + (org-insert-heading-after-current) + (unless first-p + (save-excursion + (goto-char orig-char) + (evil-insert-newline-above))) + (save-excursion + (evil-insert-newline-below))) + ('above + (save-excursion + (evil-insert-newline-below)) + (unless first-p + (save-excursion + (evil-insert-newline-above)))))))) + (evil-append-line 1))) ;;;###autoload (defun narf/org-toggle-checkbox () (interactive) - (save-excursion - (org-end-of-line) - (cond ((org-in-item-p) - (if (search-backward-regexp "\\[[ +-]\\]" (line-beginning-position) t) - (delete-char 4) - (org-beginning-of-line))) - (t (org-insert-heading))) - (insert "[ ] "))) + (let ((context (org-element-lineage (org-element-context) '(item) t))) + (when context + (org-end-of-line) + (org-beginning-of-line) + (if (org-element-property :checkbox context) + (when (search-backward-regexp "\\[[ +-]\\]" (line-beginning-position) t) + (delete-char 4)) + (insert "[ ] "))))) ;;;###autoload -(defun narf/org-execute-at-point () +(defun narf/org-dwim-at-point () (interactive) - (let* ((context (org-element-lineage + (let* ((scroll-pt (window-start)) + (context (org-element-lineage (org-element-context) '(table table-row clock comment comment-block footnote-definition footnote-reference headline inlinetask keyword link @@ -95,9 +83,15 @@ ((and (memq type '(headline)) (org-element-property :todo-type context)) - (if (eq (org-element-property :todo-type context) 'done) - (org-todo 'todo) - (org-todo 'done))) + (org-todo + (if (eq (org-element-property :todo-type context) 'done) 'todo 'done))) + + ((memq type '(headline)) + (org-remove-latex-fragment-image-overlays + (save-excursion (org-beginning-of-line) (point)) + (save-excursion (org-end-of-subtree) (point))) + (org-map-entries 'org-toggle-latex-fragment t 'tree) + (narf/org-refresh-inline-images)) ((memq type '(babel-call)) (org-babel-lob-execute-maybe)) @@ -111,14 +105,18 @@ ((memq type '(link)) (org-open-at-point)) - (t (org-toggle-inline-images))))) + (t (narf/org-refresh-inline-images))) + (set-window-start nil scroll-pt))) ;;;###autoload -(defun narf/org-toggle-inline-images-at-point () +(defun narf/org-refresh-inline-images () (interactive) (if (> (length org-inline-image-overlays) 0) (org-remove-inline-images) - (org-display-inline-images nil t (line-beginning-position) (line-end-position)))) + (org-display-inline-images + nil t + (save-excursion (org-back-to-heading) (point)) + (save-excursion (org-end-of-subtree) (point))))) ;; Formatting shortcuts ;;;###autoload @@ -291,26 +289,26 @@ COUNT-FOOTNOTES? is non-nil." ;;;###autoload -(defun narf/org-table-append-row-or-shift-right () +(defun narf/org-table-append-field-or-shift-right () (interactive) (org-shiftmetaright) (when (org-at-table-p) (org-metaright))) ;;;###autoload -(defun narf/org-table-prepend-row-or-shift-left () +(defun narf/org-table-prepend-field-or-shift-left () (interactive) (if (org-at-table-p) (org-shiftmetaright) (org-shiftmetaleft))) ;;;###autoload -(defun narf/org-table-append-field-or-shift-down () +(defun narf/org-table-append-row-or-shift-down () (interactive) (org-shiftmetadown) (when (org-at-table-p) (org-metadown))) ;;;###autoload -(defun narf/org-table-prepend-field-or-shift-up () +(defun narf/org-table-prepend-row-or-shift-up () (interactive) (if (org-at-table-p) (org-shiftmetadown) diff --git a/modules/module-org.el b/modules/module-org.el index ab4264243..ed72de90b 100644 --- a/modules/module-org.el +++ b/modules/module-org.el @@ -397,120 +397,120 @@ (define-text-object! "=" "=" "=") (define-text-object! "~" "~" "~") + (define-key org-mode-map (kbd "RET") nil) + (define-key org-mode-map (kbd "C-j") nil) + (define-key org-mode-map (kbd "C-k") nil) ;; Keybinds - (bind! - (:map org-mode-map - "RET" nil - "C-j" nil - "C-k" nil + (bind! (:map org-mode-map + :i [remap narf/inflate-space-maybe] 'org-self-insert-command + :i "RET" 'org-return-indent) - :i [remap narf/inflate-space-maybe] 'org-self-insert-command - :i "RET" 'org-return-indent) + (:map evil-org-mode-map + :ni "A-l" 'org-metaright + :ni "A-h" 'org-metaleft + :ni "A-k" 'org-metaup + :ni "A-j" 'org-metadown + ;; Expand tables (or shiftmeta move) + :ni "A-L" 'narf/org-table-append-field-or-shift-right + :ni "A-H" 'narf/org-table-prepend-field-or-shift-left + :ni "A-K" 'narf/org-table-prepend-row-or-shift-up + :ni "A-J" 'narf/org-table-append-row-or-shift-down - (:map evil-org-mode-map - :ni "A-l" 'org-metaright - :ni "A-h" 'org-metaleft - :ni "A-k" 'org-metaup - :ni "A-j" 'org-metadown - ;; Expand tables (or shiftmeta move) - :ni "A-L" 'narf/org-table-append-row-or-shift-right - :ni "A-H" 'narf/org-table-prepend-row-or-shift-left - :ni "A-K" 'narf/org-table-prepend-field-or-shift-up - :ni "A-J" 'narf/org-table-append-field-or-shift-down + :i "C-L" 'narf/org-table-next-field + :i "C-H" 'narf/org-table-previous-field + :i "C-K" 'narf/org-table-previous-row + :i "C-J" 'narf/org-table-next-row - :i "C-L" 'narf/org-table-next-field - :i "C-H" 'narf/org-table-previous-field - :i "C-K" 'narf/org-table-previous-row - :i "C-J" 'narf/org-table-next-row + :i "C-e" 'org-end-of-line + :i "C-a" 'org-beginning-of-line - :i "C-e" 'org-end-of-line - :i "C-a" 'org-beginning-of-line + :nv "j" 'evil-next-visual-line + :nv "k" 'evil-previous-visual-line + :v "" 'narf/yas-insert-snippet - :nv "j" 'evil-next-visual-line - :nv "k" 'evil-previous-visual-line - :v "" 'narf/yas-insert-snippet + :i "M-a" (λ (evil-visual-state) (org-mark-element)) + :n "M-a" 'org-mark-element + :v "M-a" 'mark-whole-buffer - :i "M-a" (λ (evil-visual-state) (org-mark-element)) - :n "M-a" 'org-mark-element - :v "M-a" 'mark-whole-buffer + :i "" (λ (narf/org-insert-item 'below)) + :i "" (λ (narf/org-insert-item 'above)) - :i "" 'narf/org-insert-item-after - :i "" 'narf/org-insert-item-before + :i "M-b" (λ (narf/org-surround "*")) ; bold + :i "M-u" (λ (narf/org-surround "_")) ; underline + :i "M-i" (λ (narf/org-surround "/")) ; italics + :i "M-`" (λ (narf/org-surround "+")) ; strikethrough - :i "M-b" (λ (narf/org-surround "*")) ; bold - :i "M-u" (λ (narf/org-surround "_")) ; underline - :i "M-i" (λ (narf/org-surround "/")) ; italics - :i "M-`" (λ (narf/org-surround "+")) ; strikethrough + :v "M-b" "S*" + :v "M-u" "S_" + :v "M-i" "S/" + :v "M-`" "S+" - :v "M-b" "S*" - :v "M-u" "S_" - :v "M-i" "S/" - :v "M-`" "S+" + :n ",;" 'helm-org-in-buffer-headings + :nv ",l" 'org-insert-link + :n ",L" 'org-store-link + ;; TODO narf/org-replace-link-by-link-description + :n ",=" 'org-align-all-tags + :n ",f" 'org-sparse-tree + :n ",?" 'org-tags-view + :n ",a" 'org-attach + :n ",A" 'org-agenda + :n ",D" 'org-time-stamp-inactive + :n ",i" 'narf/org-toggle-inline-images-at-point + :n ",t" 'org-todo + :n ",T" 'org-show-todo-tree + :n ",d" 'org-time-stamp + :n ",r" 'org-refile + :n ",s" 'org-schedule + :n ", SPC" 'narf/org-toggle-checkbox + :n ", RET" 'org-archive-subtree - :n ",;" 'helm-org-in-buffer-headings - :nv ",l" 'org-insert-link - :nv ",L" 'narf/org-replace-link-by-link-description - :n ",=" 'org-align-all-tags - :n ",f" 'org-sparse-tree - :n ",?" 'org-tags-view - :n ",a" 'org-attach - :n ",A" 'org-agenda - :n ",D" 'org-time-stamp-inactive - :n ",i" 'narf/org-toggle-inline-images-at-point - :n ",t" 'org-todo - :n ",T" 'org-show-todo-tree - :n ",d" 'org-time-stamp - :n ",r" 'org-refile - :n ",s" 'org-schedule - :n ",SPC" 'narf/org-toggle-checkbox - :n "," 'org-archive-subtree + :n "za" 'org-cycle + :n "zA" 'org-shifttab + :n "zm" 'hide-body + :n "zr" 'show-all + :n "zo" 'show-subtree + :n "zO" 'show-all + :n "zc" 'hide-subtree + :n "zC" 'hide-all - :n "za" 'org-cycle - :n "zA" 'org-shifttab - :n "zm" 'hide-body - :n "zr" 'show-all - :n "zo" 'show-subtree - :n "zO" 'show-all - :n "zc" 'hide-subtree - :n "zC" 'hide-all + :m "]]" (λ (call-interactively 'org-forward-heading-same-level) (org-beginning-of-line)) + :m "[[" (λ (call-interactively 'org-backward-heading-same-level) (org-beginning-of-line)) + :m "]l" 'org-next-link + :m "[l" 'org-previous-link - :m "]]" (λ (call-interactively 'org-forward-heading-same-level) (org-beginning-of-line)) - :m "[[" (λ (call-interactively 'org-backward-heading-same-level) (org-beginning-of-line)) - :m "]l" 'org-next-link - :m "[l" 'org-previous-link + :n "RET" 'narf/org-dwim-at-point - :n "RET" 'narf/org-execute-at-point + :m "gh" 'outline-up-heading + :m "gj" (λ (hide-subtree) (call-interactively 'org-forward-heading-same-level) (show-children)) + :m "gk" (λ (hide-subtree) (call-interactively 'org-backward-heading-same-level) (show-children)) + :m "gl" (λ (call-interactively 'outline-next-visible-heading) (show-children)) - :m "gh" 'outline-up-heading - :m "gj" (λ (hide-subtree) (call-interactively 'org-forward-heading-same-level) (show-children)) - :m "gk" (λ (hide-subtree) (call-interactively 'org-backward-heading-same-level) (show-children)) - :m "gl" (λ (call-interactively 'outline-next-visible-heading) (show-children)) + :n "go" 'org-open-at-point + :n "gO" (λ (let ((org-link-frame-setup (append '((file . find-file-other-window)) org-link-frame-setup)) + (org-file-apps '(("\\.org$" . emacs) + (t . "qlmanage -p \"%s\"")))) + (call-interactively 'org-open-at-point))) - :n "go" 'org-open-at-point - :n "gO" (λ (let ((org-link-frame-setup (append '((file . find-file-other-window)) org-link-frame-setup)) - (org-file-apps '(("\\.org$" . emacs) - (t . "qlmanage -p \"%s\"")))) - (call-interactively 'org-open-at-point))) + :n "gQ" 'org-fill-paragraph + :m "$" 'org-end-of-line + :m "^" 'org-beginning-of-line + :n "<" 'org-metaleft + :n ">" 'org-metaright + :v "<" (λ (org-metaleft) (evil-visual-restore)) + :v ">" (λ (org-metaright) (evil-visual-restore)) + :n "-" 'org-cycle-list-bullet + :n "" 'narf/org-insert-item-before + :n "" 'narf/org-insert-item-after + :n [tab] 'org-cycle) - :n "gQ" 'org-fill-paragraph - :m "$" 'org-end-of-line - :m "^" 'org-beginning-of-line - :n "<" 'org-metaleft - :n ">" 'org-metaright - :v "<" (λ (org-metaleft) (evil-visual-restore)) - :v ">" (λ (org-metaright) (evil-visual-restore)) - :n "-" 'org-cycle-list-bullet - :n "" 'narf/org-insert-item-before - :n "" 'narf/org-insert-item-after - :n [tab] 'org-cycle) + (:after org-agenda + (:map org-agenda-mode-map + :e "" 'org-agenda-Quit + :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))) - (:after org-agenda - (:map org-agenda-mode-map - :e "" 'org-agenda-Quit - :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))) (progn ;; Org hacks ;; Redefining this function so it doesn't open that "links" help buffer