branch: elpa/casual
commit 63f6ef03d76b401fc8eb246da14d7f08b5218eb8
Author: Charles Choi <[email protected]>
Commit: Charles Choi <[email protected]>
Support more structure predicates
- org-at-property-drawer-p
- org-at-drawer-p
- org-at-property-p
- org-at-clock-log-p
- org-in-src-block-p
---
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:
+