branch: elpa/casual
commit 483600a941c125e404ca20dc0073512e5b74d364
Merge: bf2634148d 63f6ef03d7
Author: Charles Choi <[email protected]>
Commit: GitHub <[email protected]>
Merge pull request #390 from
kickingvegas/385-support-org-at-drawer-p-in-casual-org
Support more Org structure predicates
---
lisp/casual-org-utils.el | 108 ++++++++++++++++++++++++++++++++++++++++++----
tests/test-casual-org.el | 83 +++++++++++++++++++++++++++++++++--
tests/test-casual-org.org | 12 ++++++
3 files changed, 190 insertions(+), 13 deletions(-)
diff --git a/lisp/casual-org-utils.el b/lisp/casual-org-utils.el
index 67994c7f50..a9a1bb5f11 100644
--- a/lisp/casual-org-utils.el
+++ b/lisp/casual-org-utils.el
@@ -172,10 +172,35 @@ which is done with `org-ctrl-c-ctrl-c'."
(defun casual-org--body-description ()
"Description string for Org body."
- (let ((heading (org-get-heading t nil t t)))
- (if heading
- (format "Org Body: %s" (substring-no-properties heading))
- (format "Org Body: %s" (buffer-name)))))
+ (cond
+ ((org-at-property-drawer-p)
+ "Org Property Drawer")
+
+ ((org-at-drawer-p)
+ (let ((key (org-element-property :drawer-name (org-element-context)))
+ (structure-type "Drawer"))
+ (if key
+ (format "Org %s: %s" structure-type key)
+ (format "Org %s" structure-type))))
+
+ ((org-at-property-p)
+ (let ((key (org-element-property :key (org-element-context)))
+ (structure-type "Property"))
+ (if key
+ (format "Org %s: %s" structure-type key)
+ (format "Org %s" structure-type))))
+
+ ((org-at-clock-log-p)
+ "Org Clock Log")
+
+ ((org-in-src-block-p)
+ "Org Source Body")
+
+ (t
+ (let ((heading (org-get-heading t nil t t)))
+ (if heading
+ (format "Org Body: %s" (substring-no-properties heading))
+ (format "Org Body: %s" (buffer-name)))))))
(defun casual-org--keyword-description ()
"Description string for Org keyword."
@@ -588,7 +613,7 @@ See `casual-org-table--range' for more on RANGE object."
["Item"
:pad-keys t
:inapt-if casual-lib-buffer-read-only-p
- ("a" "Add" org-insert-todo-heading :transient t)
+ ("a" "Add" org-insert-item :transient t)
("c" "Cycle" org-cycle-list-bullet :transient t)
("b" "Toggle Checkbox" casual-org-toggle-list-to-checkbox :transient t)]
@@ -628,10 +653,71 @@ See `casual-org-table--range' for more on RANGE object."
:description casual-org--body-description
:inapt-if casual-lib-buffer-read-only-p
- [:if-not org-at-keyword-p
- ("*" "To Heading" org-ctrl-c-star :transient t)
- ("-" "To Item" org-ctrl-c-minus :transient t)]
- [("b" "Add Block…" org-insert-structure-template)]])
+ ;; !!!: Body
+ ["To"
+ :if-not (lambda () (or (org-at-keyword-p)
+ (org-at-drawer-p) ; covers property-drawer-p
+ (org-at-clock-log-p)
+ (org-in-src-block-p)
+ (org-at-property-p)))
+ ("*" "Heading" org-ctrl-c-star :transient t)
+ ("-" "Item" org-ctrl-c-minus :transient t)]
+
+ ["Add"
+ :if-not (lambda () (or (org-at-keyword-p)
+ (org-at-drawer-p) ; covers property-drawer-p
+ (org-at-clock-log-p)
+ (org-in-src-block-p)
+ (org-at-property-p)))
+ ("b" "Block…" org-insert-structure-template)
+ ("d" "Drawer…" org-insert-drawer)]
+
+
+ ;; !!!: org-in-src-block-p
+ [:if org-in-src-block-p
+ ("'" "Edit" org-edit-src-code :transient nil)]
+
+ [:if org-in-src-block-p
+ ("C-c" "Eval" org-ctrl-c-ctrl-c
+ :if (lambda () (or (eq (org-element-type (org-element-context))
'src-block)
+ (eq (org-element-type (org-element-context))
'dynamic-block)))
+ :transient t)]
+
+ ;; !!!: org-at-property-drawer-p
+ [:if org-at-property-drawer-p
+ ("p" "Add Property…" org-set-property)]
+
+ ;; !!!: org-at-property-p
+ [:if org-at-property-p
+ ("p" "Add Property…" org-set-property)]
+
+ [:if org-at-property-p
+ ("a" "Action…" org-property-action)]
+
+ ;; !!!: org-at-drawer-p
+ [:if (lambda () (and (org-at-drawer-p)
+ (not (org-at-property-drawer-p))))
+ ("TAB" "Cycle…" org-cycle :transient t)]
+
+ ;; !!!: org-at-clock-log-p
+ ["Clock"
+ :pad-keys t
+ :if org-at-clock-log-p
+ ("M-c" "🕘 in" org-clock-in
+ :description (lambda () (casual-org-unicode-get :clock-in))
+ :if-not org-clocking-p)
+ ("M-c" "🕔 out" org-clock-out
+ :description (lambda () (casual-org-unicode-get :clock-out))
+ :if org-clocking-p)]
+
+ ["Timestamp"
+ :if org-at-clock-log-p
+ ("u" "Adjust Up" org-clock-timestamps-up
+ :description (lambda () (format "Adjust %s" (casual-org-unicode-get :up)))
+ :transient t)
+ ("d" "Adjust Down" org-clock-timestamps-down
+ :description (lambda () (format "Adjust %s" (casual-org-unicode-get
:down)))
+ :transient t)]])
(transient-define-group casual-org-keyword-group
@@ -690,6 +776,10 @@ See `casual-org-table--range' for more on RANGE object."
[:if-not (lambda () (or (org-at-table-p)
(org-at-TBLFM-p)
(org-at-block-p)
+ (org-at-property-p)
+ (org-at-drawer-p)
+ (org-at-clock-log-p)
+ (org-in-src-block-p)
(org-at-keyword-p)))
["Link"
diff --git a/tests/test-casual-org.el b/tests/test-casual-org.el
index 05f724f588..47bee275dc 100644
--- a/tests/test-casual-org.el
+++ b/tests/test-casual-org.el
@@ -80,7 +80,7 @@
(casualt-org-setup)
(search-forward "- a" nil t)
- (cl-letf ((casualt-mock #'org-insert-todo-heading)
+ (cl-letf ((casualt-mock #'org-insert-item)
(casualt-mock #'org-cycle-list-bullet)
(casualt-mock #'casual-org-toggle-list-to-checkbox)
@@ -91,7 +91,7 @@
(let ((test-vectors
'(
- (:binding "a" :command org-insert-todo-heading)
+ (:binding "a" :command org-insert-item)
(:binding "c" :command org-cycle-list-bullet)
(:binding "b" :command casual-org-toggle-list-to-checkbox)
@@ -146,12 +146,14 @@
(cl-letf ((casualt-mock #'org-ctrl-c-star)
(casualt-mock #'org-ctrl-c-minus)
- (casualt-mock #'org-insert-structure-template))
+ (casualt-mock #'org-insert-structure-template)
+ (casualt-mock #'org-insert-drawer))
(let ((test-vectors
'((:binding "*" :command org-ctrl-c-star)
(:binding "-" :command org-ctrl-c-minus)
- (:binding "bc" :command org-insert-structure-template))))
+ (:binding "bc" :command org-insert-structure-template)
+ (:binding "d" :command org-insert-drawer))))
(casualt-suffix-testcase-runner test-vectors
#'casual-org-tmenu
@@ -172,6 +174,79 @@
'(lambda () (random 5000)))))
(casualt-org-breakdown))
+(ert-deftest test-casual-org-tmenu-body-in-src-block ()
+ (casualt-org-setup)
+ (search-forward "(message" nil t)
+
+ (cl-letf ((casualt-mock #'org-ctrl-c-ctrl-c))
+ (let ((test-vectors
+ '((:binding "C-c" :command org-ctrl-c-ctrl-c))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-org-tmenu
+ '(lambda () (random 5000)))))
+ (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-body-at-property-drawer ()
+ (casualt-org-setup)
+ (search-forward ":PROPERTIES:" nil t)
+
+ (cl-letf ((casualt-mock #'org-set-property))
+ (let ((test-vectors
+ '((:binding "p" :command org-set-property))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-org-tmenu
+ '(lambda () (random 5000)))))
+ (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-body-at-property ()
+ (casualt-org-setup)
+ (search-forward ":CREATED:" nil t)
+
+ (cl-letf ((casualt-mock #'org-set-property)
+ (casualt-mock #'org-property-action))
+ (let ((test-vectors
+ '((:binding "p" :command org-set-property)
+ (:binding "a" :command org-property-action))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-org-tmenu
+ '(lambda () (random 5000)))))
+ (casualt-org-breakdown))
+
+
+(ert-deftest test-casual-org-tmenu-body-at-drawer ()
+ (casualt-org-setup)
+ (search-forward ":LOGBOOK:" nil t)
+
+ (cl-letf ((casualt-mock #'org-cycle))
+ (let ((test-vectors
+ '((:binding "TAB" :command org-cycle))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-org-tmenu
+ '(lambda () (random 5000)))))
+ (casualt-org-breakdown))
+
+(ert-deftest test-casual-org-tmenu-body-at-clock-log ()
+ (casualt-org-setup)
+ (search-forward "CLOCK:" nil t)
+
+ (cl-letf ((casualt-mock #'org-clock-in)
+ (casualt-mock #'org-clock-timestamps-up)
+ (casualt-mock #'org-clock-timestamps-down))
+ (let ((test-vectors
+ '((:binding "M-c" :command org-clock-in)
+ (:binding "u" :command org-clock-timestamps-up)
+ (:binding "d" :command org-clock-timestamps-down))))
+
+ (casualt-suffix-testcase-runner test-vectors
+ #'casual-org-tmenu
+ '(lambda () (random 5000)))))
+ (casualt-org-breakdown))
(ert-deftest test-casual-org-tmenu-block ()
(casualt-org-setup)
(search-forward "#+BEGIN_SRC" nil t)
diff --git a/tests/test-casual-org.org b/tests/test-casual-org.org
index 830cc13110..ae422969a4 100644
--- a/tests/test-casual-org.org
+++ b/tests/test-casual-org.org
@@ -78,4 +78,16 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Maecenas rhoncus felis
Nullam ut enim vitae leo molestie viverra non ac lectus. Phasellus volutpat,
velit sit amet tempor suscipit, diam lectus vulputate sem, et pretium quam
ligula vel augue. Mauris vitae ligula neque. Maecenas ac lorem augue.
*** Heading 3
+
Donec feugiat ornare ornare. Aliquam hendrerit, elit id tempus iaculis, eros
nisl scelerisque quam, ac posuere turpis felis vitae odio. Phasellus volutpat,
velit sit amet tempor suscipit, diam lectus vulputate sem, et pretium quam
ligula vel augue.
+
+
+* WAITING Task
+:PROPERTIES:
+:CREATED: 2026-02-15 18:55:48
+:END:
+
+:LOGBOOK:
+CLOCK: [2026-02-16 Mon 18:19]--[2026-02-16 Mon 18:35] => 0:16
+:END:
+