-
Notifications
You must be signed in to change notification settings - Fork 3
Advance Usage ‐ Behavior System Guide
yibie edited this page Jan 17, 2025
·
2 revisions
The Behavior System is one of the core features of org-supertag that enables tags to automatically execute predefined actions. In simple terms:
- It’s a “tag-driven” automation system
- When you add specific tags, the system automatically executes corresponding behaviors
- These behaviors can be single operations or combinations of multiple operations
- Direct behavior definition using Lambda functions in
:action
(org-supertag-behavior-register "@overdue-archive"
:trigger :on-schedule
:schedule "0 0 * * 0"
:action (lambda (node-id)
(org-supertag-behavior--check-deadline node-id
'(scope subtree
days 0
action (lambda (heading deadline)
(when (member (org-get-todo-state)
org-done-keywords)
(org-archive-subtree-default)))))))
Lambda function use cases:
- Complex conditional logic
- Multiple Emacs/Org API calls
- One-time special logic
- Need to capture external variables in closures
- Template-based behavior definition (covered in detail below)
- Serves as parameter definition layer, not recommended for direct use
- Defines parameter types and structures accepted by behaviors
- Provides parameter specifications for higher-level behaviors
;; @todo behavior defines that it accepts a 'state' parameter
(org-supertag-behavior-register "@todo"
:trigger :on-add
:action #'org-supertag-behavior--set-todo
:params '(state)) ; Parameter definition
;; @property behavior defines that it accepts 'name' and 'value' parameters
(org-supertag-behavior-register "@property"
:trigger :on-add
:action #'org-supertag-behavior--set-property
:params '(name value)) ; Parameter definition
- Built on basic behavior parameter definitions
- Preset specific parameter combinations
- Designed for daily use cases
;; Using @todo behavior's parameter definition, preset DONE state
(org-supertag-behavior-register "@done"
:trigger :on-add
:list '("@todo=DONE"))
;; Using @priority behavior's parameter definition, preset priority A
(org-supertag-behavior-register "@urgent"
:trigger :on-add
:list '("@priority=A"))
- Combines multiple shortcut behaviors
- Creates complete workflows
- Implements complex business scenarios
;; Meeting workflow: combining multiple preset behaviors
(org-supertag-behavior-register "@meeting"
:trigger :on-add
:list '("@todo=TODO" ; Using @todo parameter definition
"@property=TYPE,meeting" ; Using @property parameter definition
"@clock")) ; Using @clock parameter definition
Use `@behavior=parameter` format:
* A Task @todo=DONE ; Set task state to DONE @priority=A ; Set priority to A @timestamp=now ; Add current timestamp
- Single Parameter Format @todo=DONE ; One parameter
- Multiple Parameter Format @property=TYPE,meeting ; Two parameters, comma-separated
- No Parameter Format @clock ; Direct use, no equals sign needed
- Task Management
* Project Meeting @meeting ; Automatically adds meeting-related properties and states Meeting content...
- Time Tracking
* Coding Task @start ; Start task and record time Code implementation... @done ; Complete task and record time spent
- Archiving Operations
* Completed Task @archive ; Automatically complete archiving process
Behavior definitions are stored in `~/.emacs.d/org-supertag/org-supertag-custom-behavior.el`
(org-supertag-behavior-register "@todo"
:trigger :on-add ; Trigger condition
:action #'org-supertag-behavior--set-todo ; Execution function
:params '(state) ; Parameter definition
:style '(:face (:foreground "blue" :weight bold) ; Display style
:prefix "☐")) ; Prefix icon
The system supports multiple trigger types:
-
Event Triggers
-
:on-add
- Triggered when tag is added -
:on-remove
- Triggered when tag is removed -
:on-change
- Triggered when content changes -
:on-schedule
- Triggered on schedule -
:always
- Responds to all events
-
- Scheduled Triggers
(org-supertag-behavior-register "@daily-check"
:trigger :on-schedule
:schedule "0 9 * * *" ; Every day at 9:00 AM
:action #'check-function)
Workflow behaviors combine multiple behaviors using the :list
keyword:
(org-supertag-behavior-register "@meeting"
:trigger :on-add
:list '("@todo=TODO" ; Set TODO state
"@property=TYPE,meeting" ; Set meeting property
"@clock") ; Start time tracking
:style '(:face (:foreground "purple" :weight bold)
:prefix "📅"))
-
Time Format Support:
A. Cron-style Format:
- Format: “minute hour date month weekday”
- Examples:
-
"0 9 * * 1-5"
- 9:00 AM on weekdays -
"30 * * * *"
- The 30th minute of every hour -
"*/5 * * * *"
- Every 5 minutes
-
- Components:
- Minute: 0-59
- Hour: 0-23
- Date: 1-31
- Month: 1-12
- Weekday: 0-6 (0 represents Sunday)
- Special Characters:
-
*
- Any value -
-
- Range (e.g., 1-5) -
,
- List (e.g., 1,3,5)
-
B. Org Timestamp Integration:
- Native SCHEDULED/DEADLINE support:
-
"scheduled"
- Use node’s SCHEDULED timestamp -
"deadline"
- Use node’s DEADLINE timestamp
-
- Absolute timestamps:
- Format:
"<YYYY-MM-DD HH:MM>"
or"[YYYY-MM-DD HH:MM]"
- Example:
"<2024-03-20 Wed 14:30>"
- Format:
- Relative time expressions:
- Format:
"now±Nh/d/w/m/y"
- Examples:
-
"now+2h"
- 2 hours from now -
"now-1d"
- 1 day ago -
"now+1w"
- 1 week from now
-
- Format:
- Property-based timing:
- Format:
"${prop:PROPERTY}±Nh/d/w/m/y"
- Example:
"${prop:DEADLINE}-2h"
- 2 hours before DEADLINE
- Format:
-
Use Cases:
- Regular deadline checks
- Automated status updates
- Scheduled task execution
- Periodic reminders
- Time-based notifications
- Deadline-driven actions
-
Behavior Definition Examples:
;; Using cron format (org-supertag-behavior-register "@daily-check" :trigger :schedule :schedule "0 9 * * *" ; 9:00 AM every day :action #'some-function) ;; Using org timestamp (org-supertag-behavior-register "@meeting-reminder" :trigger :schedule :schedule "scheduled" ; Use node's SCHEDULED timestamp :list '("@notify=Meeting starting soon" "@todo=NEXT")) ;; Using deadline-based timing (org-supertag-behavior-register "@deadline-alert" :trigger :schedule :schedule "${prop:DEADLINE}-2h" ; 2 hours before deadline :list '("@notify=Deadline approaching" "@priority=A")) ;; Using relative time (org-supertag-behavior-register "@followup" :trigger :schedule :schedule "now+3d" ; 3 days from now :list '("@todo=NEXT" "@notify=Follow-up needed"))
Here’s a complete review process definition showcasing various uses of the template variable system:
(org-supertag-behavior-register "@review"
:trigger :on-add
:list '(
;; Get user input
"@property=REVIEWER=${input:Specify reviewer}"
;; Set time using date calculation
"@property=DUE=${date:now+3d}"
;; Use conditional logic
"@todo=REVIEW{if:REVIEWER}"
;; Use property values and context data
"@notify=${prop:REVIEWER}"))
This example demonstrates:
- Using
${input:}
for user input - Using
${date:}
for deadline calculation - Using
{if:}
for conditional logic - Using
${prop:}
to read property values
The template variable system makes behavior definitions more flexible and dynamic. It addresses:
- User interaction for input
- Dynamic time calculations
- Reading existing property values
- Data sharing in workflow behaviors
- Conditional behavior execution
-
User Input (
${input:prompt}
)- Purpose: Get user input during behavior execution
@property=REVIEWER=${input:Please specify reviewer}
-
Date Operations (
${date:format}
)- Purpose: Handle dates and times, supports current and relative time calculations
@property=DUE=${date:now+7d} ; 7 days later
-
Property Access (
${prop:property-name}
)- Purpose: Read existing node property values
@notify=${prop:REVIEWER} ; Use existing REVIEWER value
-
Context Data (
${context:key}
)- Purpose: Share data between steps in behavior chains
@property=INPUT=${input:input} ; Save input @notify=${context:INPUT} ; Use saved input
Use {if:condition}
to control behavior execution:
@todo=DONE{if:PRIORITY=A} ; Execute only if priority is A @notify{if:DEADLINE<${date:now}} ; Execute only if deadline has passed
-
Behavior Creation Guidelines
- Start new primitive operations with basic behaviors
- Create shortcut behaviors for common parameter combinations
- Use workflow behaviors for complex processes
-
Behavior Properties
- Each behavior should have a clear, single responsibility
- Parameters should be meaningful and well-documented
- Visual styling should indicate behavior type
- Hooks and triggers should be appropriate for use case
-
Development Flow
- First develop and test basic behaviors
- Then create common shortcut behaviors
- Finally compose workflow behaviors