about summary refs log tree commit diff stats
path: root/bash/acmetodo-toggle
diff options
context:
space:
mode:
Diffstat (limited to 'bash/acmetodo-toggle')
-rwxr-xr-xbash/acmetodo-toggle56
1 files changed, 56 insertions, 0 deletions
diff --git a/bash/acmetodo-toggle b/bash/acmetodo-toggle
new file mode 100755
index 0000000..bffccec
--- /dev/null
+++ b/bash/acmetodo-toggle
@@ -0,0 +1,56 @@
+#!/bin/sh
+# acmetodo-toggle: Toggles the status of a selected todo item.
+
+PLAN9=${PLAN9:-"/usr/local/plan9"}
+TODO_FILE="$PLAN9/lib/todo"
+ACME_BIN="$PLAN9/bin/acme"
+
+# Read the selected line(s) from standard input (Acme pipes the selection)
+selected_lines=$(cat)
+
+if [ -z "$selected_lines" ]; then
+    echo "No line selected to toggle." >/dev/stderr
+    exit 1
+fi
+
+# Process only the first line of the selection for toggling
+line_to_toggle=$(echo "$selected_lines" | head -n 1)
+
+new_line=""
+case "$line_to_toggle" in
+    '[] '*)
+        new_line="[>] ${line_to_toggle:3}" # Extract content after '[ ]'
+        ;;
+    '[>] '*)
+        new_line="[x] ${line_to_toggle:3}" # Extract content after '[>]'
+        ;;
+    '[x] '*)
+        new_line="[ ] ${line_to_toggle:3}" # Extract content after '[x]'
+        ;;
+    *)
+        echo "Warning: Selected line does not match a known todo item format: $line_to_toggle" >/dev/stderr
+        exit 0 # Exit gracefully if not a todo item
+        ;;
+esac
+
+if [ -n "$new_line" ]; then
+    # Use awk for a robust in-place replacement.
+    # It reads the entire file, replaces the first exact match, then prints.
+    awk -v old_line="$line_to_toggle" -v new_line="$new_line" '
+        BEGIN { replaced = 0 }
+        $0 == old_line && !replaced {
+            print new_line
+            replaced = 1
+            next
+        }
+        { print }
+    ' "$TODO_FILE" > "${TODO_FILE}.tmp" && mv "${TODO_FILE}.tmp" "$TODO_FILE"
+
+    # Find the winid of the main acmetodo window to refresh it.
+    MAIN_TODO_WINID=$($ACME_BIN -w | grep "^$TODO_FILE" | cut -d' ' -f1 | head -n 1)
+    if [ -n "$MAIN_TODO_WINID" ]; then
+        echo 'Get' | $ACME_BIN -a "$MAIN_TODO_WINID"
+    else
+        echo "Warning: Main acmetodo window not found to refresh." >/dev/stderr
+    fi
+fi
\ No newline at end of file